From fd4a2ece76cf5e944384fbaa34371c765b3bd43d Mon Sep 17 00:00:00 2001 From: zhangdaihao <zhangdaiscott@163.com> Date: Sun, 14 Apr 2019 16:44:25 +0800 Subject: [PATCH] jeecgboot 1.1 稳定版本发布 --- .gitattributes | 4 ++++ README.md | 105 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------------------ ant-design-jeecg-vue/README.md | 14 ++++++++------ ant-design-jeecg-vue/package.json | 10 +++++++--- ant-design-jeecg-vue/public/color.less | 17 +++++++---------- ant-design-jeecg-vue/public/goright.png | Bin 0 -> 1105 bytes ant-design-jeecg-vue/public/index.html | 10 ++++++++-- ant-design-jeecg-vue/public/logo.png | Bin 20228 -> 0 bytes ant-design-jeecg-vue/public/tinymce/langs/zh_CN.js | 261 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/public/tinymce/skins/lightgray/content.min.css | 554 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/public/tinymce/skins/lightgray/skin.min.css | 2159 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/api/api.js | 76 ++++++++++++++++++++++++++++++++++++++++++---------------------------------- ant-design-jeecg-vue/src/api/index.js | 2 +- ant-design-jeecg-vue/src/api/login.js | 7 ++++--- ant-design-jeecg-vue/src/api/manage.js | 15 +++++++++++++++ ant-design-jeecg-vue/src/assets/less/common.css | 29 +++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/assets/less/index.less | 7 +++++++ ant-design-jeecg-vue/src/assets/logo.png | Bin 20228 -> 0 bytes ant-design-jeecg-vue/src/components/README.md | 41 +++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/components/_util/StringUtil.js | 12 +++++++++++- ant-design-jeecg-vue/src/components/chart/AreaChartTy.vue | 68 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/components/chart/Bar.vue | 55 ++++++++++++++++++------------------------------------- ant-design-jeecg-vue/src/components/chart/BarMultid.vue | 79 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/components/chart/DashChartDemo.vue | 190 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/components/chart/LineChartMultid.vue | 100 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/components/chart/Liquid.vue | 31 ++++++++++++++++++++++--------- ant-design-jeecg-vue/src/components/chart/MiniArea.vue | 72 +++++++++++++++++++++++++++++++++++++----------------------------------- ant-design-jeecg-vue/src/components/chart/MiniBar.vue | 48 ++++++++++++++++++++++++++++-------------------- ant-design-jeecg-vue/src/components/chart/MiniProgress.vue | 12 ++++++------ ant-design-jeecg-vue/src/components/chart/Pie.vue | 83 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/components/chart/README.md | 328 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/components/chart/Radar.vue | 46 ++++++++++++++++++++++++++++++++++------------ ant-design-jeecg-vue/src/components/chart/RankList.vue | 6 +++++- ant-design-jeecg-vue/src/components/chart/TransferBar.vue | 72 +++++++++++++++++++++++++++++++++++++----------------------------------- ant-design-jeecg-vue/src/components/chart/Trend.vue | 2 ++ 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/JDictSelectTag.vue | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/components/dict/JDictSelectUtil.js | 87 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/components/dict/README.md | 52 ++++++++++++++++++++++++++++++++++++---------------- ant-design-jeecg-vue/src/components/dict/UserInfoTag.vue | 22 ---------------------- ant-design-jeecg-vue/src/components/dict/index.js | 8 ++++---- ant-design-jeecg-vue/src/components/jeecg/JCheckbox.vue | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/components/jeecg/JDate.vue | 2 +- ant-design-jeecg-vue/src/components/jeecg/JEditableTable.vue | 1248 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/components/jeecg/JEditor.vue | 92 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/components/jeecg/JEllipsis.vue | 29 +++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/components/jeecg/JImportModal.vue | 110 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/components/jeecg/JSelectMultiple.vue | 65 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/components/jeecg/JSuperQuery.vue | 152 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/components/jeecg/README.md | 193 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------------------- ant-design-jeecg-vue/src/components/jeecg/README_JEditableTable.md | 396 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/components/jeecgbiz/JSearchUserByDep.vue | 309 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/components/jeecgbiz/JSearchUserByDepModal.vue | 309 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/components/jeecgbiz/JSelectUser.vue | 87 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/components/jeecgbiz/SearchUserByDepModal.vue | 308 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/components/jeecgbiz/SelectMultipleUserModal.vue | 276 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/components/jeecgbiz/modal/SelectUserListModal.vue | 122 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/components/layouts/TabLayout.vue | 166 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++---------------------------------------- ant-design-jeecg-vue/src/components/layouts/UserLayout.vue | 6 +++--- ant-design-jeecg-vue/src/components/menu/SideMenu.vue | 4 ++-- ant-design-jeecg-vue/src/components/menu/index.js | 44 ++++++++++++++++++++++++++++++++------------ ant-design-jeecg-vue/src/components/page/GlobalHeader.vue | 246 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--------------------------- ant-design-jeecg-vue/src/components/page/GlobalLayout.vue | 143 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------------------------------------------------- ant-design-jeecg-vue/src/components/page/PageLayout.vue | 2 +- ant-design-jeecg-vue/src/components/setting/SettingDrawer.vue | 18 ++++++++++++++++-- ant-design-jeecg-vue/src/components/tools/Logo.vue | 26 ++++++++++++++++++++++---- ant-design-jeecg-vue/src/components/tools/UserMenu.vue | 32 ++++++++++++++++++++------------ ant-design-jeecg-vue/src/config/router.config.js | 329 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--------------------------------------------------------- ant-design-jeecg-vue/src/defaultSettings.js | 1 + ant-design-jeecg-vue/src/main.js | 10 ++++++---- ant-design-jeecg-vue/src/mixins/JEditableTableOneToManyMixin.js | 160 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/mixins/JeecgListMixin.js | 220 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/store/modules/app.js | 9 ++++++--- ant-design-jeecg-vue/src/store/modules/user.js | 5 +++-- ant-design-jeecg-vue/src/utils/JEditableTableUtil.js | 97 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/utils/axios.js | 2 +- ant-design-jeecg-vue/src/utils/filter.js | 12 ++++++++++++ ant-design-jeecg-vue/src/utils/hasPermission.js | 3 ++- ant-design-jeecg-vue/src/utils/mixin.js | 1 + ant-design-jeecg-vue/src/utils/request.js | 9 ++++++++- ant-design-jeecg-vue/src/utils/util.js | 99 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-- ant-design-jeecg-vue/src/utils/validate.js | 31 +++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/views/account/center/Index.vue | 4 +--- ant-design-jeecg-vue/src/views/dashboard/Analysis.vue | 20 ++++++++++++++------ ant-design-jeecg-vue/src/views/dashboard/Workplace.vue | 27 +++++++++++++-------------- ant-design-jeecg-vue/src/views/jeecg/FlowTest.vue | 93 --------------------------------------------------------------------------------------------- ant-design-jeecg-vue/src/views/jeecg/InterfaceTest.vue | 93 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/views/jeecg/JSearchUserByDepList.vue | 43 +++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/views/jeecg/JeecgDemoList.vue | 253 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ant-design-jeecg-vue/src/views/jeecg/JeecgEditableTableExample.vue | 191 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/views/jeecg/JeecgOrderMainList.vue | 178 +++++++++++++++++++++++++++++++++++----------------------------------------------------------------------------------------------------------------------------------------------- ant-design-jeecg-vue/src/views/jeecg/JeecgOrderMainListForJEditableTable.vue | 217 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/views/jeecg/PrintDemo.vue | 166 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/views/jeecg/PrintDemoList.vue | 208 ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ant-design-jeecg-vue/src/views/jeecg/SearchUserByDepList.vue | 43 +++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/views/jeecg/SelectDemo.vue | 135 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/views/jeecg/TableExpandeSub.vue | 270 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/views/jeecg/helloworld.vue | 79 ++++++++++++++++++++++++++++++++++++++++++------------------------------------- ant-design-jeecg-vue/src/views/jeecg/modules/JeecgOrderMainModal.vue | 14 ++++++++------ ant-design-jeecg-vue/src/views/jeecg/modules/JeecgOrderModalForJEditableTable.vue | 340 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/views/jeecg/report/Analysis.vue | 698 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/views/jeecg/report/ArchivesStatisticst.vue | 315 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/views/jeecg/report/ViserChartDemo.vue | 136 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/views/jeecg/tablist/JeecgOrderCustomerList.vue | 212 ++++++++++++++++++++++++++++++++++++++++---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ant-design-jeecg-vue/src/views/jeecg/tablist/JeecgOrderDMainList.vue | 251 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------------------------------------------------------------------------------------------------------------------------------------------------------------- ant-design-jeecg-vue/src/views/jeecg/tablist/JeecgOrderTicketList.vue | 245 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ant-design-jeecg-vue/src/views/jeecg/tablist/form/JeecgOrderCustomerModal.vue | 296 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ant-design-jeecg-vue/src/views/jeecg/tablist/form/JeecgOrderDMainModal.vue | 274 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ant-design-jeecg-vue/src/views/jeecg/tablist/form/JeecgOrderTicketModal.vue | 110 +++++++++++++++++++++++++++++++++++++++++++++++++++----------------------------------------------------------- ant-design-jeecg-vue/src/views/modules/message/SysMessageList.vue | 261 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/views/modules/message/SysMessageTemplateList.vue | 250 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/views/modules/message/modules/SysMessageModal.vue | 184 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/views/modules/message/modules/SysMessageTemplateModal.vue | 156 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/views/modules/message/modules/SysMessageTestModal.vue | 122 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/views/modules/online/cgreport/OnlCgreportHeadList.vue | 218 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/views/modules/online/cgreport/auto/OnlCgreportAutoList.vue | 208 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/views/modules/online/cgreport/auto/OnlCgreportQueryFormItem.vue | 91 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/views/modules/online/cgreport/modules/OnlCgreportHeadModal.vue | 562 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/views/monitor/HttpTrace.vue | 150 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/views/monitor/JvmInfo.vue | 256 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/views/monitor/RedisInfo.vue | 216 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/views/monitor/RedisTerminal.vue | 13 +++++++++++++ ant-design-jeecg-vue/src/views/monitor/SystemInfo.vue | 125 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/views/monitor/TomcatInfo.vue | 202 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/views/system/DataLogList.vue | 173 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/views/system/DepartList.vue | 634 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ant-design-jeecg-vue/src/views/system/DepartList2.vue | 3 --- ant-design-jeecg-vue/src/views/system/DictItemList.vue | 203 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/views/system/DictList.vue | 518 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ant-design-jeecg-vue/src/views/system/LogList.vue | 103 +++++++++++++++++++++++++------------------------------------------------------------------------------ ant-design-jeecg-vue/src/views/system/PermissionDataRuleList.vue | 176 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/views/system/PermissionList.vue | 216 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-------------------------------------------------------------------------------------------------------------------------------------------------- ant-design-jeecg-vue/src/views/system/QuartzJobList.vue | 215 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-------------------------------------------------------------------------------------------------------------------------------------------------------- ant-design-jeecg-vue/src/views/system/RoleList.vue | 206 ++++++++++++++++++++++++++++++++++++++++++-------------------------------------------------------------------------------------------------------------------------------------------------------------------- ant-design-jeecg-vue/src/views/system/SysAnnouncementList.vue | 323 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ant-design-jeecg-vue/src/views/system/UserList.vue | 405 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ ant-design-jeecg-vue/src/views/system/modules/DataLogCompareModal.vue | 163 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/views/system/modules/DataLogModal.vue | 153 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/views/system/modules/DepartModal.vue | 1 - ant-design-jeecg-vue/src/views/system/modules/DepartWindow.vue | 5 +---- ant-design-jeecg-vue/src/views/system/modules/DictItemModal.vue | 91 +++++++++++++++++++++++++++++++++++++++++++++++++++++-------------------------------------- ant-design-jeecg-vue/src/views/system/modules/DictModal.vue | 75 +++++++++++++++++++++++++++++++++++++++++++++++---------------------------- ant-design-jeecg-vue/src/views/system/modules/PermissionDataRuleModal.vue | 162 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/views/system/modules/PermissionModal.vue | 62 ++++++++++++++++++++++++++++++++++++++++++++++++-------------- ant-design-jeecg-vue/src/views/system/modules/RoleDataruleModal.vue | 121 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ant-design-jeecg-vue/src/views/system/modules/UserModal.vue | 211 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------------------------------------------------ ant-design-jeecg-vue/src/views/system/modules/UserRoleModal.vue | 45 +++++++++++++++++++++++++++++++-------------- ant-design-jeecg-vue/src/views/user/Login.vue | 4 ++-- ant-design-jeecg-vue/vue.config.js | 3 ++- ant-design-jeecg-vue/yarn.lock | 818 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ jeecg-boot/README.md | 101 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/docs/- 项目说明 | 16 +++++++++++----- jeecg-boot/docs/db/jeecg-boot_1.1.0-20190415.sql | 2392 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/docs/db/sys-init-20190225.sql | 1342 ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- jeecg-boot/pom.xml | 84 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++---------------- jeecg-boot/src/main/java/org/jeecg/JeecgApplication.java | 4 ++-- jeecg-boot/src/main/java/org/jeecg/JeecgCodeGenerator.java | 46 ---------------------------------------------- jeecg-boot/src/main/java/org/jeecg/JeecgOneGUI.java | 18 ++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/JeecgOneToMainUtil.java | 65 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/common/api/vo/Result.java | 14 +++++++++----- jeecg-boot/src/main/java/org/jeecg/common/aspect/DictAspect.java | 126 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/common/aspect/PermissionDataAspect.java | 175 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/common/aspect/annotation/Dict.java | 42 ++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/common/aspect/annotation/PermissionData.java | 25 +++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/common/constant/CommonConstant.java | 2 +- jeecg-boot/src/main/java/org/jeecg/common/constant/DataBaseConstant.java | 103 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/common/jsonschema/CommonProperty.java | 140 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/common/jsonschema/JsonSchemaDescrip.java | 87 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/common/jsonschema/JsonschemaUtil.java | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/common/jsonschema/validate/NumberProperty.java | 139 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/common/jsonschema/validate/StringProperty.java | 100 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/common/system/controller/CommonController.java | 2 +- jeecg-boot/src/main/java/org/jeecg/common/system/query/QueryCondition.java | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/common/system/query/QueryGenerator.java | 484 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/common/system/query/QueryRuleEnum.java | 71 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/common/util/DateUtils.java | 5 +++-- jeecg-boot/src/main/java/org/jeecg/common/util/MD5Util.java | 12 +++++++----- jeecg-boot/src/main/java/org/jeecg/common/util/MyClassLoader.java | 19 ++++++++++++------- jeecg-boot/src/main/java/org/jeecg/common/util/RedisUtil.java | 9 ++++++--- jeecg-boot/src/main/java/org/jeecg/common/util/UUIDGenerator.java | 95 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/common/util/oConvertUtils.java | 18 +++++++++++++++--- jeecg-boot/src/main/java/org/jeecg/config/AutoPoiConfig.java | 28 ++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/config/RedisConfig.java | 81 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-------- jeecg-boot/src/main/java/org/jeecg/config/ShiroConfig.java | 39 ++++++++++++++++++--------------------- jeecg-boot/src/main/java/org/jeecg/config/WebMvcConfiguration.java | 61 +++++++++++++++++++++++++++++++++++++++++++++---------------- jeecg-boot/src/main/java/org/jeecg/config/mybatis/MybatisInterceptor.java | 2 +- jeecg-boot/src/main/java/org/jeecg/modules/demo/mock/MockController.java | 111 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/demo/mock/json/area.json | 13551 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/demo/mock/json/getCntrNoCountInfo.json | 27 +++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/demo/mock/json/graphreport_chart.json | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/demo/mock/json/sysdatalog.json | 12 ++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/demo/mock/json/task_process.json | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/demo/mock/json/user_info.json | 407 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 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 | 106 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++----- jeecg-boot/src/main/java/org/jeecg/modules/demo/test/controller/JeecgOrderDMainController.java | 736 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- jeecg-boot/src/main/java/org/jeecg/modules/demo/test/controller/JeecgOrderMainController.java | 224 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++---------------------------------------------------------- jeecg-boot/src/main/java/org/jeecg/modules/demo/test/entity/JeecgDemo.java | 11 +++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/demo/test/entity/JeecgOrderCustomer.java | 6 +++++- jeecg-boot/src/main/java/org/jeecg/modules/demo/test/entity/JeecgOrderTicket.java | 4 +++- jeecg-boot/src/main/java/org/jeecg/modules/demo/test/service/impl/JeecgDemoServiceImpl.java | 3 +++ jeecg-boot/src/main/java/org/jeecg/modules/demo/test/service/impl/JeecgOrderMainServiceImpl.java | 86 +++++++++++++++++++++++++++++++++++++++++++++++--------------------------------------- jeecg-boot/src/main/java/org/jeecg/modules/demo/test/vo/JeecgOrderMainPage.java | 32 ++++++++++++++++++++++++++++++-- jeecg-boot/src/main/java/org/jeecg/modules/message/controller/SysMessageController.java | 237 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/message/controller/SysMessageTemplateController.java | 267 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/message/entity/MsgParams.java | 23 +++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/message/entity/SysMessage.java | 75 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/message/entity/SysMessageTemplate.java | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/message/handle/ISendMsgHandle.java | 6 ++++++ jeecg-boot/src/main/java/org/jeecg/modules/message/handle/enums/SendMsgStatusEnum.java | 25 +++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/message/handle/enums/SendMsgTypeEnum.java | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/message/handle/impl/EmailSendMsgHandle.java | 22 ++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/message/handle/impl/SmsSendMsgHandle.java | 13 +++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/message/handle/impl/WxSendMsgHandle.java | 13 +++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/message/job/SendMsgJob.java | 72 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/message/mapper/SysMessageMapper.java | 17 +++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/message/mapper/SysMessageTemplateMapper.java | 18 ++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/message/mapper/xml/SysMessageMapper.xml | 5 +++++ jeecg-boot/src/main/java/org/jeecg/modules/message/mapper/xml/SysMessageTemplateMapper.xml | 5 +++++ jeecg-boot/src/main/java/org/jeecg/modules/message/service/ISysMessageService.java | 14 ++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/message/service/ISysMessageTemplateService.java | 16 ++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/message/service/impl/SysMessageServiceImpl.java | 19 +++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/message/service/impl/SysMessageTemplateServiceImpl.java | 29 +++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/message/util/PushMsgUtil.java | 63 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/monitor/controller/RedisController.java | 46 ++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/monitor/domain/RedisInfo.java | 137 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/monitor/exception/RedisConnectException.java | 13 +++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/monitor/service/RedisService.java | 33 +++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/monitor/service/impl/RedisServiceImpl.java | 75 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/ngalain/aop/LogRecordAspect.java | 46 ++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/ngalain/controller/NgAlainController.java | 85 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/ngalain/mapper/NgAlainMapper.java | 12 ++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/ngalain/mapper/xml/NgAlainMapper.xml | 7 +++++++ jeecg-boot/src/main/java/org/jeecg/modules/ngalain/service/NgAlainService.java | 12 ++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/ngalain/service/impl/NgAlainServiceImpl.java | 182 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/online/cgreport/controller/OnlCgreportAPI.java | 253 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/online/cgreport/controller/OnlCgreportHeadController.java | 269 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/online/cgreport/controller/OnlCgreportItemController.java | 183 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/online/cgreport/controller/OnlCgreportParamController.java | 183 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/online/cgreport/def/CgReportConstant.java | 70 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/online/cgreport/entity/OnlCgreportHead.java | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/online/cgreport/entity/OnlCgreportItem.java | 66 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/online/cgreport/entity/OnlCgreportParam.java | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/online/cgreport/mapper/OnlCgreportHeadMapper.java | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/online/cgreport/mapper/OnlCgreportItemMapper.java | 15 +++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/online/cgreport/mapper/OnlCgreportParamMapper.java | 15 +++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/online/cgreport/mapper/xml/OnlCgreportHeadMapper.xml | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/online/cgreport/mapper/xml/OnlCgreportItemMapper.xml | 5 +++++ jeecg-boot/src/main/java/org/jeecg/modules/online/cgreport/mapper/xml/OnlCgreportParamMapper.xml | 5 +++++ jeecg-boot/src/main/java/org/jeecg/modules/online/cgreport/model/OnlCgreportModel.java | 79 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/online/cgreport/service/CgReportExcelServiceI.java | 24 ++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/online/cgreport/service/IOnlCgreportHeadService.java | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/online/cgreport/service/IOnlCgreportItemService.java | 20 ++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/online/cgreport/service/IOnlCgreportParamService.java | 15 +++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/online/cgreport/service/impl/CgReportExcelServiceImpl.java | 144 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/online/cgreport/service/impl/OnlCgreportHeadServiceImpl.java | 242 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/online/cgreport/service/impl/OnlCgreportItemServiceImpl.java | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/online/cgreport/service/impl/OnlCgreportParamServiceImpl.java | 19 +++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/online/cgreport/util/BrowserType.java | 10 ++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/online/cgreport/util/BrowserUtils.java | 194 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/online/cgreport/util/CgReportQueryParamUtil.java | 178 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/online/cgreport/util/SqlUtil.java | 260 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/quartz/controller/QuartzJobController.java | 99 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--------------- jeecg-boot/src/main/java/org/jeecg/modules/quartz/entity/QuartzJob.java | 6 ++++++ jeecg-boot/src/main/java/org/jeecg/modules/shiro/authc/MyRealm.java | 6 ++++-- jeecg-boot/src/main/java/org/jeecg/modules/shiro/authc/util/JwtUtil.java | 92 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/system/controller/DuplicateCheckController.java | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 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 | 31 +++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/system/controller/SysAnnouncementController.java | 136 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------------------------------- jeecg-boot/src/main/java/org/jeecg/modules/system/controller/SysDataLogController.java | 94 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/system/controller/SysDepartController.java | 23 +++++++++++++++-------- jeecg-boot/src/main/java/org/jeecg/modules/system/controller/SysDictController.java | 177 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++---------------------------- jeecg-boot/src/main/java/org/jeecg/modules/system/controller/SysDictItemController.java | 31 +++++++++---------------------- jeecg-boot/src/main/java/org/jeecg/modules/system/controller/SysLogController.java | 22 +++------------------- jeecg-boot/src/main/java/org/jeecg/modules/system/controller/SysPermissionController.java | 182 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------------------------ jeecg-boot/src/main/java/org/jeecg/modules/system/controller/SysRoleController.java | 253 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------------------------ jeecg-boot/src/main/java/org/jeecg/modules/system/controller/SysUserController.java | 497 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-------------------------------------------------------------------------------------------------------------------------------------- jeecg-boot/src/main/java/org/jeecg/modules/system/entity/SysAnnouncement.java | 146 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------------------------------------------------ jeecg-boot/src/main/java/org/jeecg/modules/system/entity/SysDataLog.java | 36 ++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/system/entity/SysDepart.java | 16 +++++++++++++--- jeecg-boot/src/main/java/org/jeecg/modules/system/entity/SysDict.java | 8 ++++++++ jeecg-boot/src/main/java/org/jeecg/modules/system/entity/SysDictItem.java | 14 +++++++++++--- jeecg-boot/src/main/java/org/jeecg/modules/system/entity/SysLog.java | 3 +++ jeecg-boot/src/main/java/org/jeecg/modules/system/entity/SysPermission.java | 19 +++++++++++++++++-- jeecg-boot/src/main/java/org/jeecg/modules/system/entity/SysPermissionDataRule.java | 78 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/system/entity/SysRole.java | 4 ++++ jeecg-boot/src/main/java/org/jeecg/modules/system/entity/SysRolePermission.java | 5 +++++ jeecg-boot/src/main/java/org/jeecg/modules/system/entity/SysUser.java | 21 +++++++++++++++++---- jeecg-boot/src/main/java/org/jeecg/modules/system/entity/SysUserDepart.java | 29 +++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/system/mapper/SysDataLogMapper.java | 17 +++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/system/mapper/SysDepartMapper.java | 5 +++++ jeecg-boot/src/main/java/org/jeecg/modules/system/mapper/SysDictItemMapper.java | 8 ++++++-- jeecg-boot/src/main/java/org/jeecg/modules/system/mapper/SysDictMapper.java | 16 +++++++++++++++- jeecg-boot/src/main/java/org/jeecg/modules/system/mapper/SysPermissionDataRuleMapper.java | 28 ++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/system/mapper/SysPermissionMapper.java | 18 +++++++++++++++++- jeecg-boot/src/main/java/org/jeecg/modules/system/mapper/SysUserDepartMapper.java | 14 ++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/system/mapper/SysUserMapper.java | 1 + jeecg-boot/src/main/java/org/jeecg/modules/system/mapper/xml/SysDataLogMapper.xml | 10 ++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/system/mapper/xml/SysDepartMapper.xml | 6 ++++++ jeecg-boot/src/main/java/org/jeecg/modules/system/mapper/xml/SysDictMapper.xml | 20 ++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/system/mapper/xml/SysPermissionDataRuleMapper.xml | 16 ++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/system/mapper/xml/SysPermissionMapper.xml | 9 ++++++++- jeecg-boot/src/main/java/org/jeecg/modules/system/mapper/xml/SysUserDepartMapper.xml | 9 +++++++++ jeecg-boot/src/main/java/org/jeecg/modules/system/model/DepartIdModel.java | 16 +++++++++++++++- jeecg-boot/src/main/java/org/jeecg/modules/system/model/DuplicateCheckVo.java | 44 ++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/system/model/SysDepartTreeModel.java | 25 ++++++++++++++++++++----- jeecg-boot/src/main/java/org/jeecg/modules/system/model/SysDictTree.java | 7 +++++++ jeecg-boot/src/main/java/org/jeecg/modules/system/model/SysPermissionTree.java | 34 +++++++++++++++++++++++++++++----- jeecg-boot/src/main/java/org/jeecg/modules/system/model/SysUserCacheInfo.java | 73 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/system/model/SysUserDepartsVO.java | 23 +++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/system/model/TreeModel.java | 60 +++++++++++++++++++++++++++++++++++++++++++++++++----------- jeecg-boot/src/main/java/org/jeecg/modules/system/service/ISysDataLogService.java | 17 +++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/system/service/ISysDepartService.java | 7 +++++++ jeecg-boot/src/main/java/org/jeecg/modules/system/service/ISysDictItemService.java | 4 +++- jeecg-boot/src/main/java/org/jeecg/modules/system/service/ISysDictService.java | 27 ++++++++++++++++++++++++--- jeecg-boot/src/main/java/org/jeecg/modules/system/service/ISysPermissionDataRuleService.java | 41 +++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/system/service/ISysPermissionService.java | 14 ++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/system/service/ISysUserDepartService.java | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/system/service/ISysUserRoleService.java | 10 +++++++++- jeecg-boot/src/main/java/org/jeecg/modules/system/service/ISysUserService.java | 9 +++++++++ jeecg-boot/src/main/java/org/jeecg/modules/system/service/impl/AutoPoiDictService.java | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/system/service/impl/SysDataLogServiceImpl.java | 33 +++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/system/service/impl/SysDepartServiceImpl.java | 31 ++++++++++++++++++++++++++++++- jeecg-boot/src/main/java/org/jeecg/modules/system/service/impl/SysDictItemServiceImpl.java | 12 +++++++++++- jeecg-boot/src/main/java/org/jeecg/modules/system/service/impl/SysDictServiceImpl.java | 110 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------- jeecg-boot/src/main/java/org/jeecg/modules/system/service/impl/SysPermissionDataRuleImpl.java | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/system/service/impl/SysPermissionServiceImpl.java | 95 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++---------- jeecg-boot/src/main/java/org/jeecg/modules/system/service/impl/SysUserDepartServiceImpl.java | 138 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/system/service/impl/SysUserRoleServiceImpl.java | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/system/service/impl/SysUserServiceImpl.java | 38 +++++++++++++++++++++++++++++++++++--- jeecg-boot/src/main/java/org/jeecg/modules/system/util/FindsDepartsChildrenUtil.java | 105 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/system/util/JeecgDataAutorUtils.java | 90 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/system/util/PermissionDataUtil.java | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/java/org/jeecg/modules/system/vo/SysDictPage.java | 41 +++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/resources/application-dev.yml | 120 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/resources/application-prod.yml | 120 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/resources/application-test.yml | 122 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/resources/application.yml | 96 ++---------------------------------------------------------------------------------------------- jeecg-boot/src/main/resources/jeecg/code-template/one/java/${bussiPackage}/${entityPackage}/controller/${entityName}Controller.javai | 112 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-------------------- jeecg-boot/src/main/resources/jeecg/code-template/one/java/${bussiPackage}/${entityPackage}/entity/${entityName}.javai | 10 ++++++++-- jeecg-boot/src/main/resources/jeecg/code-template/one/java/${bussiPackage}/${entityPackage}/vue/${entityName}List.vuei | 194 ++++++++++++++++++++++++++++++++++++++++++++++---------------------------------------------------------------------------------------------------------------------------------------------------- jeecg-boot/src/main/resources/jeecg/code-template/one/java/${bussiPackage}/${entityPackage}/vue/modules/${entityName}Modal__Style@Drawer.vuei | 162 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/resources/jeecg/code-template/one2/java/${bussiPackage}/controller/${entityPackage}/${entityName}Controller.javai | 112 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------------------ jeecg-boot/src/main/resources/jeecg/code-template/one2/java/${bussiPackage}/entity/${entityPackage}/${entityName}.javai | 24 +++++++++++++++--------- jeecg-boot/src/main/resources/jeecg/code-template/one2/java/${bussiPackage}/vue/${entityPackage}/${entityName}List.vuei | 194 ++++++++++++++++++++++++++++++++++++++++++++++---------------------------------------------------------------------------------------------------------------------------------------------------- jeecg-boot/src/main/resources/jeecg/code-template/one2/java/${bussiPackage}/vue/${entityPackage}/modules/${entityName}Modal.vuei | 8 ++++---- jeecg-boot/src/main/resources/jeecg/code-template/one2/java/${bussiPackage}/vue/${entityPackage}/modules/${entityName}Modal__Style@Drawer.vuei | 162 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/resources/jeecg/code-template/onetomany/java/${bussiPackage}/${entityPackage}/controller/${entityName}Controller.javai | 250 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++----------------------------------------------------------------------------------------- jeecg-boot/src/main/resources/jeecg/code-template/onetomany/java/${bussiPackage}/${entityPackage}/entity/${entityName}.javai | 2 +- jeecg-boot/src/main/resources/jeecg/code-template/onetomany/java/${bussiPackage}/${entityPackage}/entity/[1-n]Entity.javai | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/resources/jeecg/code-template/onetomany/java/${bussiPackage}/${entityPackage}/mapper/${entityName}Mapper.javai | 12 +----------- jeecg-boot/src/main/resources/jeecg/code-template/onetomany/java/${bussiPackage}/${entityPackage}/mapper/[1-n]Mapper.javai | 21 +++++++++++++++++++++ jeecg-boot/src/main/resources/jeecg/code-template/onetomany/java/${bussiPackage}/${entityPackage}/mapper/xml/[1-n]Mapper.xml | 36 ++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/resources/jeecg/code-template/onetomany/java/${bussiPackage}/${entityPackage}/service/I${entityName}Service.javai | 19 ++++++++++--------- jeecg-boot/src/main/resources/jeecg/code-template/onetomany/java/${bussiPackage}/${entityPackage}/service/[1-n]Service.javai | 19 +++++++++++++++++++ jeecg-boot/src/main/resources/jeecg/code-template/onetomany/java/${bussiPackage}/${entityPackage}/service/impl/${entityName}ServiceImpl.javai | 98 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++------------------------------------------ jeecg-boot/src/main/resources/jeecg/code-template/onetomany/java/${bussiPackage}/${entityPackage}/service/impl/[1-n]ServiceImpl.javai | 30 ++++++++++++++++++++++++++++++ jeecg-boot/src/main/resources/jeecg/code-template/onetomany/java/${bussiPackage}/${entityPackage}/vo/${entityName}Page.javai | 44 ++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/resources/jeecg/code-template/onetomany/java/${bussiPackage}/${entityPackage}/vue/${entityName}List.vuei | 236 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-------------------------------------------------------------------------------------------------------------------------------------------------------------------- jeecg-boot/src/main/resources/jeecg/code-template/onetomany/java/${bussiPackage}/${entityPackage}/vue/modules/${entityName}Modal.vuei | 265 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++---------------------------------------------------------------------------------------------------------------------- jeecg-boot/src/main/resources/jeecg/code-template/onetomany2/java/${bussiPackage}/${entityPackage}/controller/${entityName}Controller.javai | 379 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/resources/jeecg/code-template/onetomany2/java/${bussiPackage}/${entityPackage}/entity/${entityName}.javai | 39 +++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/resources/jeecg/code-template/onetomany2/java/${bussiPackage}/${entityPackage}/entity/[1-n]Entity.javai | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/resources/jeecg/code-template/onetomany2/java/${bussiPackage}/${entityPackage}/mapper/${entityName}Mapper.javai | 17 +++++++++++++++++ jeecg-boot/src/main/resources/jeecg/code-template/onetomany2/java/${bussiPackage}/${entityPackage}/mapper/[1-n]Mapper.javai | 21 +++++++++++++++++++++ jeecg-boot/src/main/resources/jeecg/code-template/onetomany2/java/${bussiPackage}/${entityPackage}/mapper/xml/${entityName}Mapper.xml | 5 +++++ jeecg-boot/src/main/resources/jeecg/code-template/onetomany2/java/${bussiPackage}/${entityPackage}/mapper/xml/[1-n]Mapper.xml | 36 ++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/resources/jeecg/code-template/onetomany2/java/${bussiPackage}/${entityPackage}/service/I${entityName}Service.javai | 42 ++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/resources/jeecg/code-template/onetomany2/java/${bussiPackage}/${entityPackage}/service/[1-n]Service.javai | 19 +++++++++++++++++++ jeecg-boot/src/main/resources/jeecg/code-template/onetomany2/java/${bussiPackage}/${entityPackage}/service/impl/${entityName}ServiceImpl.javai | 101 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/resources/jeecg/code-template/onetomany2/java/${bussiPackage}/${entityPackage}/service/impl/[1-n]ServiceImpl.javai | 30 ++++++++++++++++++++++++++++++ jeecg-boot/src/main/resources/jeecg/code-template/onetomany2/java/${bussiPackage}/${entityPackage}/vo/${entityName}Page.javai | 43 +++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/resources/jeecg/code-template/onetomany2/java/${bussiPackage}/${entityPackage}/vue/${entityName}List.vuei | 258 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/resources/jeecg/code-template/onetomany2/java/${bussiPackage}/${entityPackage}/vue/[1-n]List.vuei | 140 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/resources/jeecg/code-template/onetomany2/java/${bussiPackage}/${entityPackage}/vue/modules/${entityName}Modal.vuei | 167 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/resources/jeecg/code-template/onetomany2/java/${bussiPackage}/${entityPackage}/vue/modules/[1-n]Modal.vuei | 183 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ jeecg-boot/src/main/resources/jeecg/jeecg_config.properties | 2 +- jeecg-boot/src/main/resources/logback-spring.xml | 193 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------------------------------------------------------------------------------------------------------ jeecg-boot/src/test/java/org/jeecg/SampleTest.java | 21 ++++++++++++++++++++- 381 files changed, 49193 insertions(+), 7928 deletions(-) create mode 100644 .gitattributes create mode 100644 ant-design-jeecg-vue/public/goright.png create mode 100644 ant-design-jeecg-vue/public/tinymce/langs/zh_CN.js create mode 100644 ant-design-jeecg-vue/public/tinymce/skins/lightgray/content.min.css create mode 100644 ant-design-jeecg-vue/public/tinymce/skins/lightgray/skin.min.css create mode 100644 ant-design-jeecg-vue/src/assets/less/common.css create mode 100644 ant-design-jeecg-vue/src/components/README.md create mode 100644 ant-design-jeecg-vue/src/components/chart/AreaChartTy.vue create mode 100644 ant-design-jeecg-vue/src/components/chart/BarMultid.vue create mode 100644 ant-design-jeecg-vue/src/components/chart/DashChartDemo.vue create mode 100644 ant-design-jeecg-vue/src/components/chart/LineChartMultid.vue create mode 100644 ant-design-jeecg-vue/src/components/chart/Pie.vue create mode 100644 ant-design-jeecg-vue/src/components/chart/README.md delete mode 100644 ant-design-jeecg-vue/src/components/dict/DictSelectTag.vue delete mode 100644 ant-design-jeecg-vue/src/components/dict/DictSelectUtil.js create mode 100644 ant-design-jeecg-vue/src/components/dict/JDictSelectTag.vue create mode 100644 ant-design-jeecg-vue/src/components/dict/JDictSelectUtil.js delete mode 100644 ant-design-jeecg-vue/src/components/dict/UserInfoTag.vue create mode 100644 ant-design-jeecg-vue/src/components/jeecg/JCheckbox.vue create mode 100644 ant-design-jeecg-vue/src/components/jeecg/JEditableTable.vue create mode 100644 ant-design-jeecg-vue/src/components/jeecg/JEditor.vue create mode 100644 ant-design-jeecg-vue/src/components/jeecg/JEllipsis.vue create mode 100644 ant-design-jeecg-vue/src/components/jeecg/JImportModal.vue create mode 100644 ant-design-jeecg-vue/src/components/jeecg/JSelectMultiple.vue create mode 100644 ant-design-jeecg-vue/src/components/jeecg/JSuperQuery.vue create mode 100644 ant-design-jeecg-vue/src/components/jeecg/README_JEditableTable.md create mode 100644 ant-design-jeecg-vue/src/components/jeecgbiz/JSearchUserByDep.vue create mode 100644 ant-design-jeecg-vue/src/components/jeecgbiz/JSearchUserByDepModal.vue create mode 100644 ant-design-jeecg-vue/src/components/jeecgbiz/JSelectUser.vue create mode 100644 ant-design-jeecg-vue/src/components/jeecgbiz/SearchUserByDepModal.vue create mode 100644 ant-design-jeecg-vue/src/components/jeecgbiz/SelectMultipleUserModal.vue create mode 100644 ant-design-jeecg-vue/src/components/jeecgbiz/modal/SelectUserListModal.vue create mode 100644 ant-design-jeecg-vue/src/mixins/JEditableTableOneToManyMixin.js create mode 100644 ant-design-jeecg-vue/src/mixins/JeecgListMixin.js create mode 100644 ant-design-jeecg-vue/src/utils/JEditableTableUtil.js create mode 100644 ant-design-jeecg-vue/src/utils/validate.js delete mode 100644 ant-design-jeecg-vue/src/views/jeecg/FlowTest.vue create mode 100644 ant-design-jeecg-vue/src/views/jeecg/InterfaceTest.vue create mode 100644 ant-design-jeecg-vue/src/views/jeecg/JSearchUserByDepList.vue create mode 100644 ant-design-jeecg-vue/src/views/jeecg/JeecgEditableTableExample.vue create mode 100644 ant-design-jeecg-vue/src/views/jeecg/JeecgOrderMainListForJEditableTable.vue create mode 100644 ant-design-jeecg-vue/src/views/jeecg/PrintDemo.vue delete mode 100644 ant-design-jeecg-vue/src/views/jeecg/PrintDemoList.vue create mode 100644 ant-design-jeecg-vue/src/views/jeecg/SearchUserByDepList.vue create mode 100644 ant-design-jeecg-vue/src/views/jeecg/SelectDemo.vue create mode 100644 ant-design-jeecg-vue/src/views/jeecg/TableExpandeSub.vue create mode 100644 ant-design-jeecg-vue/src/views/jeecg/modules/JeecgOrderModalForJEditableTable.vue create mode 100644 ant-design-jeecg-vue/src/views/jeecg/report/Analysis.vue create mode 100644 ant-design-jeecg-vue/src/views/jeecg/report/ArchivesStatisticst.vue create mode 100644 ant-design-jeecg-vue/src/views/jeecg/report/ViserChartDemo.vue create mode 100644 ant-design-jeecg-vue/src/views/modules/message/SysMessageList.vue create mode 100644 ant-design-jeecg-vue/src/views/modules/message/SysMessageTemplateList.vue create mode 100644 ant-design-jeecg-vue/src/views/modules/message/modules/SysMessageModal.vue create mode 100644 ant-design-jeecg-vue/src/views/modules/message/modules/SysMessageTemplateModal.vue create mode 100644 ant-design-jeecg-vue/src/views/modules/message/modules/SysMessageTestModal.vue create mode 100644 ant-design-jeecg-vue/src/views/modules/online/cgreport/OnlCgreportHeadList.vue create mode 100644 ant-design-jeecg-vue/src/views/modules/online/cgreport/auto/OnlCgreportAutoList.vue create mode 100644 ant-design-jeecg-vue/src/views/modules/online/cgreport/auto/OnlCgreportQueryFormItem.vue create mode 100644 ant-design-jeecg-vue/src/views/modules/online/cgreport/modules/OnlCgreportHeadModal.vue create mode 100644 ant-design-jeecg-vue/src/views/monitor/HttpTrace.vue create mode 100644 ant-design-jeecg-vue/src/views/monitor/JvmInfo.vue create mode 100644 ant-design-jeecg-vue/src/views/monitor/RedisInfo.vue create mode 100644 ant-design-jeecg-vue/src/views/monitor/RedisTerminal.vue create mode 100644 ant-design-jeecg-vue/src/views/monitor/SystemInfo.vue create mode 100644 ant-design-jeecg-vue/src/views/monitor/TomcatInfo.vue create mode 100644 ant-design-jeecg-vue/src/views/system/DataLogList.vue create mode 100644 ant-design-jeecg-vue/src/views/system/DictItemList.vue create mode 100644 ant-design-jeecg-vue/src/views/system/PermissionDataRuleList.vue create mode 100644 ant-design-jeecg-vue/src/views/system/modules/DataLogCompareModal.vue create mode 100644 ant-design-jeecg-vue/src/views/system/modules/DataLogModal.vue create mode 100644 ant-design-jeecg-vue/src/views/system/modules/PermissionDataRuleModal.vue create mode 100644 ant-design-jeecg-vue/src/views/system/modules/RoleDataruleModal.vue create mode 100644 jeecg-boot/README.md create mode 100644 jeecg-boot/docs/db/jeecg-boot_1.1.0-20190415.sql delete mode 100644 jeecg-boot/docs/db/sys-init-20190225.sql delete mode 100644 jeecg-boot/src/main/java/org/jeecg/JeecgCodeGenerator.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/JeecgOneGUI.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/JeecgOneToMainUtil.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/common/aspect/DictAspect.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/common/aspect/PermissionDataAspect.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/common/aspect/annotation/Dict.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/common/aspect/annotation/PermissionData.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/common/constant/DataBaseConstant.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/common/jsonschema/CommonProperty.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/common/jsonschema/JsonSchemaDescrip.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/common/jsonschema/JsonschemaUtil.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/common/jsonschema/validate/NumberProperty.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/common/jsonschema/validate/StringProperty.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/common/system/query/QueryCondition.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/common/system/query/QueryGenerator.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/common/system/query/QueryRuleEnum.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/common/util/UUIDGenerator.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/config/AutoPoiConfig.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/demo/mock/json/area.json create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/demo/mock/json/getCntrNoCountInfo.json create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/demo/mock/json/graphreport_chart.json create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/demo/mock/json/sysdatalog.json create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/demo/mock/json/task_process.json create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/demo/mock/json/user_info.json delete 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/message/controller/SysMessageController.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/message/controller/SysMessageTemplateController.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/message/entity/MsgParams.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/message/entity/SysMessage.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/message/entity/SysMessageTemplate.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/message/handle/ISendMsgHandle.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/message/handle/enums/SendMsgStatusEnum.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/message/handle/enums/SendMsgTypeEnum.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/message/handle/impl/EmailSendMsgHandle.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/message/handle/impl/SmsSendMsgHandle.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/message/handle/impl/WxSendMsgHandle.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/message/job/SendMsgJob.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/message/mapper/SysMessageMapper.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/message/mapper/SysMessageTemplateMapper.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/message/mapper/xml/SysMessageMapper.xml create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/message/mapper/xml/SysMessageTemplateMapper.xml create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/message/service/ISysMessageService.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/message/service/ISysMessageTemplateService.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/message/service/impl/SysMessageServiceImpl.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/message/service/impl/SysMessageTemplateServiceImpl.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/message/util/PushMsgUtil.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/monitor/controller/RedisController.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/monitor/domain/RedisInfo.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/monitor/exception/RedisConnectException.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/monitor/service/RedisService.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/monitor/service/impl/RedisServiceImpl.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/ngalain/aop/LogRecordAspect.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/ngalain/controller/NgAlainController.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/ngalain/mapper/NgAlainMapper.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/ngalain/mapper/xml/NgAlainMapper.xml create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/ngalain/service/NgAlainService.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/ngalain/service/impl/NgAlainServiceImpl.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/online/cgreport/controller/OnlCgreportAPI.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/online/cgreport/controller/OnlCgreportHeadController.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/online/cgreport/controller/OnlCgreportItemController.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/online/cgreport/controller/OnlCgreportParamController.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/online/cgreport/def/CgReportConstant.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/online/cgreport/entity/OnlCgreportHead.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/online/cgreport/entity/OnlCgreportItem.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/online/cgreport/entity/OnlCgreportParam.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/online/cgreport/mapper/OnlCgreportHeadMapper.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/online/cgreport/mapper/OnlCgreportItemMapper.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/online/cgreport/mapper/OnlCgreportParamMapper.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/online/cgreport/mapper/xml/OnlCgreportHeadMapper.xml create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/online/cgreport/mapper/xml/OnlCgreportItemMapper.xml create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/online/cgreport/mapper/xml/OnlCgreportParamMapper.xml create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/online/cgreport/model/OnlCgreportModel.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/online/cgreport/service/CgReportExcelServiceI.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/online/cgreport/service/IOnlCgreportHeadService.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/online/cgreport/service/IOnlCgreportItemService.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/online/cgreport/service/IOnlCgreportParamService.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/online/cgreport/service/impl/CgReportExcelServiceImpl.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/online/cgreport/service/impl/OnlCgreportHeadServiceImpl.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/online/cgreport/service/impl/OnlCgreportItemServiceImpl.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/online/cgreport/service/impl/OnlCgreportParamServiceImpl.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/online/cgreport/util/BrowserType.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/online/cgreport/util/BrowserUtils.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/online/cgreport/util/CgReportQueryParamUtil.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/online/cgreport/util/SqlUtil.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/system/controller/DuplicateCheckController.java delete 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/SysDataLogController.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/system/entity/SysDataLog.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/system/entity/SysPermissionDataRule.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/system/entity/SysUserDepart.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/system/mapper/SysDataLogMapper.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/system/mapper/SysPermissionDataRuleMapper.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/system/mapper/SysUserDepartMapper.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/system/mapper/xml/SysDataLogMapper.xml create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/system/mapper/xml/SysPermissionDataRuleMapper.xml create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/system/mapper/xml/SysUserDepartMapper.xml create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/system/model/DuplicateCheckVo.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/system/model/SysUserCacheInfo.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/system/model/SysUserDepartsVO.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/system/service/ISysDataLogService.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/system/service/ISysPermissionDataRuleService.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/system/service/ISysUserDepartService.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/system/service/impl/AutoPoiDictService.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/system/service/impl/SysDataLogServiceImpl.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/system/service/impl/SysPermissionDataRuleImpl.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/system/service/impl/SysUserDepartServiceImpl.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/system/util/FindsDepartsChildrenUtil.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/system/util/JeecgDataAutorUtils.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/system/util/PermissionDataUtil.java create mode 100644 jeecg-boot/src/main/java/org/jeecg/modules/system/vo/SysDictPage.java create mode 100644 jeecg-boot/src/main/resources/application-dev.yml create mode 100644 jeecg-boot/src/main/resources/application-prod.yml create mode 100644 jeecg-boot/src/main/resources/application-test.yml create mode 100644 jeecg-boot/src/main/resources/jeecg/code-template/one/java/${bussiPackage}/${entityPackage}/vue/modules/${entityName}Modal__Style@Drawer.vuei create mode 100644 jeecg-boot/src/main/resources/jeecg/code-template/one2/java/${bussiPackage}/vue/${entityPackage}/modules/${entityName}Modal__Style@Drawer.vuei create mode 100644 jeecg-boot/src/main/resources/jeecg/code-template/onetomany/java/${bussiPackage}/${entityPackage}/entity/[1-n]Entity.javai create mode 100644 jeecg-boot/src/main/resources/jeecg/code-template/onetomany/java/${bussiPackage}/${entityPackage}/mapper/[1-n]Mapper.javai create mode 100644 jeecg-boot/src/main/resources/jeecg/code-template/onetomany/java/${bussiPackage}/${entityPackage}/mapper/xml/[1-n]Mapper.xml create mode 100644 jeecg-boot/src/main/resources/jeecg/code-template/onetomany/java/${bussiPackage}/${entityPackage}/service/[1-n]Service.javai create mode 100644 jeecg-boot/src/main/resources/jeecg/code-template/onetomany/java/${bussiPackage}/${entityPackage}/service/impl/[1-n]ServiceImpl.javai create mode 100644 jeecg-boot/src/main/resources/jeecg/code-template/onetomany/java/${bussiPackage}/${entityPackage}/vo/${entityName}Page.javai create mode 100644 jeecg-boot/src/main/resources/jeecg/code-template/onetomany2/java/${bussiPackage}/${entityPackage}/controller/${entityName}Controller.javai create mode 100644 jeecg-boot/src/main/resources/jeecg/code-template/onetomany2/java/${bussiPackage}/${entityPackage}/entity/${entityName}.javai create mode 100644 jeecg-boot/src/main/resources/jeecg/code-template/onetomany2/java/${bussiPackage}/${entityPackage}/entity/[1-n]Entity.javai create mode 100644 jeecg-boot/src/main/resources/jeecg/code-template/onetomany2/java/${bussiPackage}/${entityPackage}/mapper/${entityName}Mapper.javai create mode 100644 jeecg-boot/src/main/resources/jeecg/code-template/onetomany2/java/${bussiPackage}/${entityPackage}/mapper/[1-n]Mapper.javai create mode 100644 jeecg-boot/src/main/resources/jeecg/code-template/onetomany2/java/${bussiPackage}/${entityPackage}/mapper/xml/${entityName}Mapper.xml create mode 100644 jeecg-boot/src/main/resources/jeecg/code-template/onetomany2/java/${bussiPackage}/${entityPackage}/mapper/xml/[1-n]Mapper.xml create mode 100644 jeecg-boot/src/main/resources/jeecg/code-template/onetomany2/java/${bussiPackage}/${entityPackage}/service/I${entityName}Service.javai create mode 100644 jeecg-boot/src/main/resources/jeecg/code-template/onetomany2/java/${bussiPackage}/${entityPackage}/service/[1-n]Service.javai create mode 100644 jeecg-boot/src/main/resources/jeecg/code-template/onetomany2/java/${bussiPackage}/${entityPackage}/service/impl/${entityName}ServiceImpl.javai create mode 100644 jeecg-boot/src/main/resources/jeecg/code-template/onetomany2/java/${bussiPackage}/${entityPackage}/service/impl/[1-n]ServiceImpl.javai create mode 100644 jeecg-boot/src/main/resources/jeecg/code-template/onetomany2/java/${bussiPackage}/${entityPackage}/vo/${entityName}Page.javai create mode 100644 jeecg-boot/src/main/resources/jeecg/code-template/onetomany2/java/${bussiPackage}/${entityPackage}/vue/${entityName}List.vuei create mode 100644 jeecg-boot/src/main/resources/jeecg/code-template/onetomany2/java/${bussiPackage}/${entityPackage}/vue/[1-n]List.vuei create mode 100644 jeecg-boot/src/main/resources/jeecg/code-template/onetomany2/java/${bussiPackage}/${entityPackage}/vue/modules/${entityName}Modal.vuei create mode 100644 jeecg-boot/src/main/resources/jeecg/code-template/onetomany2/java/${bussiPackage}/${entityPackage}/vue/modules/[1-n]Modal.vuei diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..d479839 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,4 @@ +*.js linguist-language=Java +*.css linguist-language=Java +*.html linguist-language=Java +*.vue linguist-language=Java diff --git a/README.md b/README.md index 190fc68..4c1998c 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ Jeecg-Boot 快速开发平台(前后端分离版本) =============== -当前最新版本: 1.0(发布日期:20190304) +当前最新版本: 1.1(发布日期:20190415) 项目介绍: ----------------------------------- @@ -69,7 +69,7 @@ JeecgBoot的宗旨是降低前后端分离的开发成本,提高UI能力的同 - 学习思路 : [跟着我们零基础学习前后端分离开发](http://jeecg-boot.mydoc.io/?t=340820) -- 常见问题 : [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) +- 常见问题 : [新手入门必看,汇总了常见各种问题](http://www.jeecg.org/forum.php?mod=viewthread&tid=7816&page=1&extra=#pid21237) - Angular版本 :[如果你更熟悉Angular,请点击这里找到jeecg-boot的对应版本](https://gitee.com/dangzhenghui/jeecg-boot) @@ -79,30 +79,87 @@ JeecgBoot的宗旨是降低前后端分离的开发成本,提高UI能力的同 ├─系统管理 │ ├─用户管理 │ ├─角色管理 -│ ├─菜单管理(权限设置) +│ ├─菜单管理 +│ ├─权限设置(支持按钮权限、数据权限) │ ├─部门管理 │ └─字典管理 ├─智能化功能 -│ ├─代码生成器功能(一键生成,包括前端页面也可以生成,绝对是后端开发福音) +│ ├─代码生成器功能(一键生成前后端代码,生成后无需修改直接用,绝对是后端开发福音) +│ ├─代码生成器模板(提供4套模板,分别支持单表和一对多模型,不同风格选择) +│ ├─代码生成器模板(生成代码,自带excel导入导出) +│ ├─查询过滤器(查询逻辑无需编码,系统根据页面配置自动生成) +│ ├─高级查询器(弹窗自动组合查询条件) +│ ├─Excel导入导出工具集成(支持单表,一对多 导入导出) +│ ├─平台移动自适应支持 +├─Online在线开发 +│ ├─Online在线表单 +│ ├─Online在线图表 +│ ├─Online在线报表 +│ ├─消息中心(支持短信、邮件、微信推送等等) ├─系统监控 +│ ├─性能扫描监控 +│ │ ├─监控 Redis +│ │ ├─Tomcat +│ │ ├─jvm +│ │ ├─服务器信息 +│ │ ├─请求追踪 │ ├─定时任务 │ ├─系统日志 +│ ├─数据日志(记录数据变更情况,可进行版本对比查看数据变更记录) │ ├─系统通知 │ ├─SQL监控 │ ├─swagger-ui(在线接口文档) +│─报表示例 +│ ├─曲线图 +│ └─饼状图 +│ └─柱状图 +│ └─折线图 +│ └─面积图 +│ └─雷达图 +│ └─仪表图 +│ └─进度条 +│ └─排名列表 +│ └─等等 │─常用示例 │ ├─单表模型例子 │ └─一对多模型例子 │ └─打印例子 │ └─一对多TAB例子 +│ └─内嵌table例子 +│ └─常用选择组件 +│ └─一对多JEditable +│ └─接口模拟测试 +│ └─一对多JEditable +│─封装通用组件 +│ ├─行编辑表格JEditableTable +│ └─省略显示组件 +│ └─时间控件 +│ └─高级查询 +│ └─通用选择用户组件 +│ └─通过组织机构选择用户组件 +│ └─报表组件封装 +│ └─等等组件 │─更多页面模板 │ ├─各种高级表单 │ ├─各种列表效果 │ └─结果页面 │ └─异常页面 │ └─个人页面 +│─流程模块功能(暂未开源) +│ ├─在线流程设计 +│ ├─在线表单设计 +│ └─我的任务 +│ └─历史流程 +│ └─历史流程 +│ └─流程实例管理 +│ └─流程监听管理 +│ └─流程表达式 +│ └─我发起的流程 +│ └─我的抄送 +│ └─流程委派、抄送、跳转 +│ └─。。。 └─其他模块 - └─其他 + └─更多功能开发中。。 ``` @@ -110,19 +167,31 @@ JeecgBoot的宗旨是降低前后端分离的开发成本,提高UI能力的同 系统效果 ---- - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + @@ -134,7 +203,7 @@ JeecgBoot的宗旨是降低前后端分离的开发成本,提高UI能力的同 - jdk8 - mysql - redis -- 数据库脚步:jeecg-boot\docs\dbsys-init-20190225.sql +- 数据库脚步:jeecg-boot\docs\jeecg-boot_1.1.0-20190415.sql - 默认登录账号: admin/123456 diff --git a/ant-design-jeecg-vue/README.md b/ant-design-jeecg-vue/README.md index e8835f0..8c71330 100644 --- a/ant-design-jeecg-vue/README.md +++ b/ant-design-jeecg-vue/README.md @@ -1,11 +1,13 @@ -Jeecg-Boot 快速开发平台(前后端分离版本) -=============== +Ant Design Jeecg Vue +==== -当前最新版本: 1.0(发布日期:20190225) +当前最新版本: 1.1(发布日期:20190415) -项目介绍: ------------------------------------ -Jeecg-boot 一个全新的版本,采用前后端分离方案,提供强大代码生成器的快速开发平台。 +Overview +---- + +基于 [Ant Design of Vue](https://vuecomponent.github.io/ant-design-vue/docs/vue/introduce-cn/) 实现的 Ant Design Pro Vue 版 +Jeecg-boot 的前段UI框架,采用前后端分离方案,提供强大代码生成器的快速开发平台。 前端页面代码和后端功能代码一键生成,不需要写任何代码,保持jeecg一贯的强大!! diff --git a/ant-design-jeecg-vue/package.json b/ant-design-jeecg-vue/package.json index 6d6baff..16020ed 100644 --- a/ant-design-jeecg-vue/package.json +++ b/ant-design-jeecg-vue/package.json @@ -1,6 +1,6 @@ { - "name": "vue-antd-pro", - "version": "1.1.0", + "name": "vue-antd-jeecg", + "version": "1.0.2", "private": true, "scripts": { "serve": "vue-cli-service serve --open", @@ -11,7 +11,9 @@ }, "dependencies": { "@antv/data-set": "^0.10.1", + "@tinymce/tinymce-vue": "^2.0.0", "ant-design-vue": "^1.3.1", + "apexcharts": "^3.6.5", "axios": "^0.18.0", "dayjs": "^1.8.0", "enquire.js": "^2.1.6", @@ -20,13 +22,15 @@ "lodash.pick": "^4.4.0", "md5": "^2.2.1", "nprogress": "^0.2.0", + "tinymce": "^5.0.2", "viser-vue": "^2.4.4", "vue": "^2.5.22", + "vue-apexcharts": "^1.3.2", "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-print-nb-jeecg": "^1.0.5", "vue-property-decorator": "^7.3.0", "vue-router": "^3.0.1", "vuex": "^3.0.1", diff --git a/ant-design-jeecg-vue/public/color.less b/ant-design-jeecg-vue/public/color.less index c7e6b1b..f41d377 100644 --- a/ant-design-jeecg-vue/public/color.less +++ b/ant-design-jeecg-vue/public/color.less @@ -2175,9 +2175,8 @@ this.tinycolor = tinycolor; .globalFooter .copyright { color: rgba(0, 0, 0, 0.45); } -.header { - background: #fff; - box-shadow: 0 1px 4px rgba(0, 21, 41, 0.08); +.layout .header { + background-color: @primary-color !important; } i.trigger:hover { background: rgba(0, 0, 0, 0.025); @@ -2342,24 +2341,22 @@ i.trigger:hover { border-radius: 2px; color: #fff; } -.logo { -} .logo h1 { color: white; } .sider { - box-shadow: 2px 0 6px rgba(0, 21, 41, 0.35); + box-shadow: 2px 116px 6px rgba(0, 21, 41, 0.35); } .sider.light { - box-shadow: 2px 0 8px 0 rgba(29, 35, 41, 0.05); + box-shadow: 2px 116px 8px 0 rgba(29, 35, 41, 0.05); background-color: white; } .sider.light .logo { - background: white; + background-color: @primary-color !important; box-shadow: 1px 1px 0 0 #e8e8e8; } .sider.light .logo h1 { - color: @primary-color; + color: white; } .sider.light :global(.ant-menu-light) { border-right-color: transparent; @@ -6808,7 +6805,7 @@ tr.ant-table-expanded-row:hover { } .ant-tabs.ant-tabs-card > .ant-tabs-bar .ant-tabs-tab-active { background: #fff; - border-color: #e8e8e8; + border-color: @primary-color !important; color: @primary-color; } .ant-tabs.ant-tabs-card > .ant-tabs-bar .ant-tabs-tab .ant-tabs-close-x { diff --git a/ant-design-jeecg-vue/public/goright.png b/ant-design-jeecg-vue/public/goright.png new file mode 100644 index 0000000..13c4b54 Binary files /dev/null and b/ant-design-jeecg-vue/public/goright.png differ diff --git a/ant-design-jeecg-vue/public/index.html b/ant-design-jeecg-vue/public/index.html index 05d0f5a..9b938e5 100644 --- a/ant-design-jeecg-vue/public/index.html +++ b/ant-design-jeecg-vue/public/index.html @@ -5,7 +5,7 @@ <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> + <title>Jeecg-Boot 快速开发平台</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> @@ -219,6 +219,12 @@ opacity: 0.5; } </style> + <!-- 全局配置 --> + <script> + window._CONFIG = {}; + window._CONFIG['domianURL'] = 'http://localhost:8080/jeecg-boot'; + window._CONFIG['imgDomainURL'] = 'http://localhost:8080/jeecg-boot/sys/common/view'; + </script> </head> <body> @@ -228,7 +234,7 @@ <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 class="load_title">正在加载 Jeecg-Boot 快速开发平台,请耐心等待 </div> </div> diff --git a/ant-design-jeecg-vue/public/logo.png b/ant-design-jeecg-vue/public/logo.png index e887375..1a55a53 100644 Binary files a/ant-design-jeecg-vue/public/logo.png and b/ant-design-jeecg-vue/public/logo.png differ diff --git a/ant-design-jeecg-vue/public/tinymce/langs/zh_CN.js b/ant-design-jeecg-vue/public/tinymce/langs/zh_CN.js new file mode 100644 index 0000000..0f3cf92 --- /dev/null +++ b/ant-design-jeecg-vue/public/tinymce/langs/zh_CN.js @@ -0,0 +1,261 @@ +tinymce.addI18n('zh_CN',{ +"Redo": "\u91cd\u590d", +"Undo": "\u64a4\u6d88", +"Cut": "\u526a\u5207", +"Copy": "\u590d\u5236", +"Paste": "\u7c98\u8d34", +"Select all": "\u5168\u9009", +"New document": "\u65b0\u6587\u6863", +"Ok": "\u786e\u5b9a", +"Cancel": "\u53d6\u6d88", +"Visual aids": "\u7f51\u683c\u7ebf", +"Bold": "\u7c97\u4f53", +"Italic": "\u659c\u4f53", +"Underline": "\u4e0b\u5212\u7ebf", +"Strikethrough": "\u5220\u9664\u7ebf", +"Superscript": "\u4e0a\u6807", +"Subscript": "\u4e0b\u6807", +"Clear formatting": "\u6e05\u9664\u683c\u5f0f", +"Align left": "\u5de6\u5bf9\u9f50", +"Align center": "\u5c45\u4e2d", +"Align right": "\u53f3\u5bf9\u9f50", +"Justify": "\u4e24\u7aef\u5bf9\u9f50", +"Bullet list": "\u9879\u76ee\u7b26\u53f7", +"Numbered list": "\u7f16\u53f7\u5217\u8868", +"Decrease indent": "\u51cf\u5c11\u7f29\u8fdb", +"Increase indent": "\u589e\u52a0\u7f29\u8fdb", +"Close": "\u5173\u95ed", +"Formats": "\u683c\u5f0f", +"Your browser doesn't support direct access to the clipboard. Please use the Ctrl+X\/C\/V keyboard shortcuts instead.": "\u4f60\u7684\u6d4f\u89c8\u5668\u4e0d\u652f\u6301\u5bf9\u526a\u8d34\u677f\u7684\u8bbf\u95ee\uff0c\u8bf7\u4f7f\u7528Ctrl+X\/C\/V\u952e\u8fdb\u884c\u590d\u5236\u7c98\u8d34\u3002", +"Headers": "\u6807\u9898", +"Header 1": "\u6807\u98981", +"Header 2": "\u6807\u98982", +"Header 3": "\u6807\u98983", +"Header 4": "\u6807\u98984", +"Header 5": "\u6807\u98985", +"Header 6": "\u6807\u98986", +"Headings": "\u6807\u9898", +"Heading 1": "\u6807\u98981", +"Heading 2": "\u6807\u98982", +"Heading 3": "\u6807\u98983", +"Heading 4": "\u6807\u98984", +"Heading 5": "\u6807\u98985", +"Heading 6": "\u6807\u98986", +"Preformatted": "\u9884\u683c\u5f0f\u5316", +"Div": "Div\u533a\u5757", +"Pre": "\u9884\u683c\u5f0f\u6587\u672c", +"Code": "\u4ee3\u7801", +"Paragraph": "\u6bb5\u843d", +"Blockquote": "\u5f15\u7528", +"Inline": "\u6587\u672c", +"Blocks": "\u533a\u5757", +"Paste is now in plain text mode. Contents will now be pasted as plain text until you toggle this option off.": "\u5f53\u524d\u4e3a\u7eaf\u6587\u672c\u7c98\u8d34\u6a21\u5f0f\uff0c\u518d\u6b21\u70b9\u51fb\u53ef\u4ee5\u56de\u5230\u666e\u901a\u7c98\u8d34\u6a21\u5f0f\u3002", +"Font Family": "\u5b57\u4f53", +"Font Sizes": "\u5b57\u53f7", +"Class": "Class", +"Browse for an image": "\u6d4f\u89c8\u56fe\u50cf", +"OR": "\u6216", +"Drop an image here": "\u62d6\u653e\u4e00\u5f20\u56fe\u50cf\u81f3\u6b64", +"Upload": "\u4e0a\u4f20", +"Block": "\u5757", +"Align": "\u5bf9\u9f50", +"Default": "\u9ed8\u8ba4", +"Circle": "\u7a7a\u5fc3\u5706", +"Disc": "\u5b9e\u5fc3\u5706", +"Square": "\u65b9\u5757", +"Lower Alpha": "\u5c0f\u5199\u82f1\u6587\u5b57\u6bcd", +"Lower Greek": "\u5c0f\u5199\u5e0c\u814a\u5b57\u6bcd", +"Lower Roman": "\u5c0f\u5199\u7f57\u9a6c\u5b57\u6bcd", +"Upper Alpha": "\u5927\u5199\u82f1\u6587\u5b57\u6bcd", +"Upper Roman": "\u5927\u5199\u7f57\u9a6c\u5b57\u6bcd", +"Anchor": "\u951a\u70b9", +"Name": "\u540d\u79f0", +"Id": "\u6807\u8bc6\u7b26", +"Id should start with a letter, followed only by letters, numbers, dashes, dots, colons or underscores.": "\u6807\u8bc6\u7b26\u5e94\u8be5\u4ee5\u5b57\u6bcd\u5f00\u5934\uff0c\u540e\u8ddf\u5b57\u6bcd\u3001\u6570\u5b57\u3001\u7834\u6298\u53f7\u3001\u70b9\u3001\u5192\u53f7\u6216\u4e0b\u5212\u7ebf\u3002", +"You have unsaved changes are you sure you want to navigate away?": "\u4f60\u8fd8\u6709\u6587\u6863\u5c1a\u672a\u4fdd\u5b58\uff0c\u786e\u5b9a\u8981\u79bb\u5f00\uff1f", +"Restore last draft": "\u6062\u590d\u4e0a\u6b21\u7684\u8349\u7a3f", +"Special character": "\u7279\u6b8a\u7b26\u53f7", +"Source code": "\u6e90\u4ee3\u7801", +"Insert\/Edit code sample": "\u63d2\u5165\/\u7f16\u8f91\u4ee3\u7801\u793a\u4f8b", +"Language": "\u8bed\u8a00", +"Code sample": "\u4ee3\u7801\u793a\u4f8b", +"Color": "\u989c\u8272", +"R": "R", +"G": "G", +"B": "B", +"Left to right": "\u4ece\u5de6\u5230\u53f3", +"Right to left": "\u4ece\u53f3\u5230\u5de6", +"Emoticons": "\u8868\u60c5", +"Document properties": "\u6587\u6863\u5c5e\u6027", +"Title": "\u6807\u9898", +"Keywords": "\u5173\u952e\u8bcd", +"Description": "\u63cf\u8ff0", +"Robots": "\u673a\u5668\u4eba", +"Author": "\u4f5c\u8005", +"Encoding": "\u7f16\u7801", +"Fullscreen": "\u5168\u5c4f", +"Action": "\u64cd\u4f5c", +"Shortcut": "\u5feb\u6377\u952e", +"Help": "\u5e2e\u52a9", +"Address": "\u5730\u5740", +"Focus to menubar": "\u79fb\u52a8\u7126\u70b9\u5230\u83dc\u5355\u680f", +"Focus to toolbar": "\u79fb\u52a8\u7126\u70b9\u5230\u5de5\u5177\u680f", +"Focus to element path": "\u79fb\u52a8\u7126\u70b9\u5230\u5143\u7d20\u8def\u5f84", +"Focus to contextual toolbar": "\u79fb\u52a8\u7126\u70b9\u5230\u4e0a\u4e0b\u6587\u83dc\u5355", +"Insert link (if link plugin activated)": "\u63d2\u5165\u94fe\u63a5 (\u5982\u679c\u94fe\u63a5\u63d2\u4ef6\u5df2\u6fc0\u6d3b)", +"Save (if save plugin activated)": "\u4fdd\u5b58(\u5982\u679c\u4fdd\u5b58\u63d2\u4ef6\u5df2\u6fc0\u6d3b)", +"Find (if searchreplace plugin activated)": "\u67e5\u627e(\u5982\u679c\u67e5\u627e\u66ff\u6362\u63d2\u4ef6\u5df2\u6fc0\u6d3b)", +"Plugins installed ({0}):": "\u5df2\u5b89\u88c5\u63d2\u4ef6 ({0}):", +"Premium plugins:": "\u4f18\u79c0\u63d2\u4ef6\uff1a", +"Learn more...": "\u4e86\u89e3\u66f4\u591a...", +"You are using {0}": "\u4f60\u6b63\u5728\u4f7f\u7528 {0}", +"Plugins": "\u63d2\u4ef6", +"Handy Shortcuts": "\u5feb\u6377\u952e", +"Horizontal line": "\u6c34\u5e73\u5206\u5272\u7ebf", +"Insert\/edit image": "\u63d2\u5165\/\u7f16\u8f91\u56fe\u7247", +"Image description": "\u56fe\u7247\u63cf\u8ff0", +"Source": "\u5730\u5740", +"Dimensions": "\u5927\u5c0f", +"Constrain proportions": "\u4fdd\u6301\u7eb5\u6a2a\u6bd4", +"General": "\u666e\u901a", +"Advanced": "\u9ad8\u7ea7", +"Style": "\u6837\u5f0f", +"Vertical space": "\u5782\u76f4\u8fb9\u8ddd", +"Horizontal space": "\u6c34\u5e73\u8fb9\u8ddd", +"Border": "\u8fb9\u6846", +"Insert image": "\u63d2\u5165\u56fe\u7247", +"Image": "\u56fe\u7247", +"Image list": "\u56fe\u7247\u5217\u8868", +"Rotate counterclockwise": "\u9006\u65f6\u9488\u65cb\u8f6c", +"Rotate clockwise": "\u987a\u65f6\u9488\u65cb\u8f6c", +"Flip vertically": "\u5782\u76f4\u7ffb\u8f6c", +"Flip horizontally": "\u6c34\u5e73\u7ffb\u8f6c", +"Edit image": "\u7f16\u8f91\u56fe\u7247", +"Image options": "\u56fe\u7247\u9009\u9879", +"Zoom in": "\u653e\u5927", +"Zoom out": "\u7f29\u5c0f", +"Crop": "\u88c1\u526a", +"Resize": "\u8c03\u6574\u5927\u5c0f", +"Orientation": "\u65b9\u5411", +"Brightness": "\u4eae\u5ea6", +"Sharpen": "\u9510\u5316", +"Contrast": "\u5bf9\u6bd4\u5ea6", +"Color levels": "\u989c\u8272\u5c42\u6b21", +"Gamma": "\u4f3d\u9a6c\u503c", +"Invert": "\u53cd\u8f6c", +"Apply": "\u5e94\u7528", +"Back": "\u540e\u9000", +"Insert date\/time": "\u63d2\u5165\u65e5\u671f\/\u65f6\u95f4", +"Date\/time": "\u65e5\u671f\/\u65f6\u95f4", +"Insert link": "\u63d2\u5165\u94fe\u63a5", +"Insert\/edit link": "\u63d2\u5165\/\u7f16\u8f91\u94fe\u63a5", +"Text to display": "\u663e\u793a\u6587\u5b57", +"Url": "\u5730\u5740", +"Target": "\u6253\u5f00\u65b9\u5f0f", +"None": "\u65e0", +"New window": "\u5728\u65b0\u7a97\u53e3\u6253\u5f00", +"Remove link": "\u5220\u9664\u94fe\u63a5", +"Anchors": "\u951a\u70b9", +"Link": "\u94fe\u63a5", +"Paste or type a link": "\u7c98\u8d34\u6216\u8f93\u5165\u94fe\u63a5", +"The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?": "\u4f60\u6240\u586b\u5199\u7684URL\u5730\u5740\u4e3a\u90ae\u4ef6\u5730\u5740\uff0c\u9700\u8981\u52a0\u4e0amailto:\u524d\u7f00\u5417\uff1f", +"The URL you entered seems to be an external link. Do you want to add the required http:\/\/ prefix?": "\u4f60\u6240\u586b\u5199\u7684URL\u5730\u5740\u5c5e\u4e8e\u5916\u90e8\u94fe\u63a5\uff0c\u9700\u8981\u52a0\u4e0ahttp:\/\/:\u524d\u7f00\u5417\uff1f", +"Link list": "\u94fe\u63a5\u5217\u8868", +"Insert video": "\u63d2\u5165\u89c6\u9891", +"Insert\/edit video": "\u63d2\u5165\/\u7f16\u8f91\u89c6\u9891", +"Insert\/edit media": "\u63d2\u5165\/\u7f16\u8f91\u5a92\u4f53", +"Alternative source": "\u955c\u50cf", +"Poster": "\u5c01\u9762", +"Paste your embed code below:": "\u5c06\u5185\u5d4c\u4ee3\u7801\u7c98\u8d34\u5728\u4e0b\u9762:", +"Embed": "\u5185\u5d4c", +"Media": "\u5a92\u4f53", +"Nonbreaking space": "\u4e0d\u95f4\u65ad\u7a7a\u683c", +"Page break": "\u5206\u9875\u7b26", +"Paste as text": "\u7c98\u8d34\u4e3a\u6587\u672c", +"Preview": "\u9884\u89c8", +"Print": "\u6253\u5370", +"Save": "\u4fdd\u5b58", +"Find": "\u67e5\u627e", +"Replace with": "\u66ff\u6362\u4e3a", +"Replace": "\u66ff\u6362", +"Replace all": "\u5168\u90e8\u66ff\u6362", +"Prev": "\u4e0a\u4e00\u4e2a", +"Next": "\u4e0b\u4e00\u4e2a", +"Find and replace": "\u67e5\u627e\u548c\u66ff\u6362", +"Could not find the specified string.": "\u672a\u627e\u5230\u641c\u7d22\u5185\u5bb9.", +"Match case": "\u533a\u5206\u5927\u5c0f\u5199", +"Whole words": "\u5168\u5b57\u5339\u914d", +"Spellcheck": "\u62fc\u5199\u68c0\u67e5", +"Ignore": "\u5ffd\u7565", +"Ignore all": "\u5168\u90e8\u5ffd\u7565", +"Finish": "\u5b8c\u6210", +"Add to Dictionary": "\u6dfb\u52a0\u5230\u5b57\u5178", +"Insert table": "\u63d2\u5165\u8868\u683c", +"Table properties": "\u8868\u683c\u5c5e\u6027", +"Delete table": "\u5220\u9664\u8868\u683c", +"Cell": "\u5355\u5143\u683c", +"Row": "\u884c", +"Column": "\u5217", +"Cell properties": "\u5355\u5143\u683c\u5c5e\u6027", +"Merge cells": "\u5408\u5e76\u5355\u5143\u683c", +"Split cell": "\u62c6\u5206\u5355\u5143\u683c", +"Insert row before": "\u5728\u4e0a\u65b9\u63d2\u5165", +"Insert row after": "\u5728\u4e0b\u65b9\u63d2\u5165", +"Delete row": "\u5220\u9664\u884c", +"Row properties": "\u884c\u5c5e\u6027", +"Cut row": "\u526a\u5207\u884c", +"Copy row": "\u590d\u5236\u884c", +"Paste row before": "\u7c98\u8d34\u5230\u4e0a\u65b9", +"Paste row after": "\u7c98\u8d34\u5230\u4e0b\u65b9", +"Insert column before": "\u5728\u5de6\u4fa7\u63d2\u5165", +"Insert column after": "\u5728\u53f3\u4fa7\u63d2\u5165", +"Delete column": "\u5220\u9664\u5217", +"Cols": "\u5217", +"Rows": "\u884c", +"Width": "\u5bbd", +"Height": "\u9ad8", +"Cell spacing": "\u5355\u5143\u683c\u5916\u95f4\u8ddd", +"Cell padding": "\u5355\u5143\u683c\u5185\u8fb9\u8ddd", +"Caption": "\u6807\u9898", +"Left": "\u5de6\u5bf9\u9f50", +"Center": "\u5c45\u4e2d", +"Right": "\u53f3\u5bf9\u9f50", +"Cell type": "\u5355\u5143\u683c\u7c7b\u578b", +"Scope": "\u8303\u56f4", +"Alignment": "\u5bf9\u9f50\u65b9\u5f0f", +"H Align": "\u6c34\u5e73\u5bf9\u9f50", +"V Align": "\u5782\u76f4\u5bf9\u9f50", +"Top": "\u9876\u90e8\u5bf9\u9f50", +"Middle": "\u5782\u76f4\u5c45\u4e2d", +"Bottom": "\u5e95\u90e8\u5bf9\u9f50", +"Header cell": "\u8868\u5934\u5355\u5143\u683c", +"Row group": "\u884c\u7ec4", +"Column group": "\u5217\u7ec4", +"Row type": "\u884c\u7c7b\u578b", +"Header": "\u8868\u5934", +"Body": "\u8868\u4f53", +"Footer": "\u8868\u5c3e", +"Border color": "\u8fb9\u6846\u989c\u8272", +"Insert template": "\u63d2\u5165\u6a21\u677f", +"Templates": "\u6a21\u677f", +"Template": "\u6a21\u677f", +"Text color": "\u6587\u5b57\u989c\u8272", +"Background color": "\u80cc\u666f\u8272", +"Custom...": "\u81ea\u5b9a\u4e49...", +"Custom color": "\u81ea\u5b9a\u4e49\u989c\u8272", +"No color": "\u65e0", +"Table of Contents": "\u5185\u5bb9\u5217\u8868", +"Show blocks": "\u663e\u793a\u533a\u5757\u8fb9\u6846", +"Show invisible characters": "\u663e\u793a\u4e0d\u53ef\u89c1\u5b57\u7b26", +"Words: {0}": "\u5b57\u6570\uff1a{0}", +"{0} words": "{0} \u5b57", +"File": "\u6587\u4ef6", +"Edit": "\u7f16\u8f91", +"Insert": "\u63d2\u5165", +"View": "\u89c6\u56fe", +"Format": "\u683c\u5f0f", +"Table": "\u8868\u683c", +"Tools": "\u5de5\u5177", +"Powered by {0}": "\u7531{0}\u9a71\u52a8", +"Rich Text Area. Press ALT-F9 for menu. Press ALT-F10 for toolbar. Press ALT-0 for help": "\u5728\u7f16\u8f91\u533a\u6309ALT-F9\u6253\u5f00\u83dc\u5355\uff0c\u6309ALT-F10\u6253\u5f00\u5de5\u5177\u680f\uff0c\u6309ALT-0\u67e5\u770b\u5e2e\u52a9" +}); \ No newline at end of file diff --git a/ant-design-jeecg-vue/public/tinymce/skins/lightgray/content.min.css b/ant-design-jeecg-vue/public/tinymce/skins/lightgray/content.min.css new file mode 100644 index 0000000..125b622 --- /dev/null +++ b/ant-design-jeecg-vue/public/tinymce/skins/lightgray/content.min.css @@ -0,0 +1,554 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + */ +.mce-content-body .mce-item-anchor { + background: transparent url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'8'%20height%3D'12'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20d%3D'M0%200L8%200%208%2012%204.09117821%209%200%2012z'%2F%3E%3C%2Fsvg%3E%0A") no-repeat center; + cursor: default; + display: inline-block; + height: 12px !important; + padding: 0 2px; + -webkit-user-modify: read-only; + -moz-user-modify: read-only; + -webkit-user-select: all; + -moz-user-select: all; + -ms-user-select: all; + user-select: all; + width: 8px !important; +} +.mce-content-body .mce-item-anchor[data-mce-selected] { + outline-offset: 1px; +} +.tox-comments-visible .tox-comment { + background-color: #fff0b7; +} +.tox-comments-visible .tox-comment--active { + background-color: #ffe168; +} +.tox-checklist > li:not(.tox-checklist--hidden) { + list-style: none; + margin: .25em 0; + position: relative; +} +.tox-checklist > li:not(.tox-checklist--hidden)::before { + background-image: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-unchecked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2215%22%20height%3D%2215%22%20x%3D%22.5%22%20y%3D%22.5%22%20fill-rule%3D%22nonzero%22%20stroke%3D%22%234C4C4C%22%20rx%3D%222%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A"); + background-size: 100%; + content: ''; + cursor: pointer; + height: 1em; + left: -1.5em; + position: absolute; + top: .125em; + width: 1em; +} +.tox-checklist li:not(.tox-checklist--hidden).tox-checklist--checked::before { + background-image: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-checked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2216%22%20height%3D%2216%22%20fill%3D%22%234099FF%22%20fill-rule%3D%22nonzero%22%20rx%3D%222%22%2F%3E%3Cpath%20id%3D%22Path%22%20fill%3D%22%23FFF%22%20fill-rule%3D%22nonzero%22%20d%3D%22M11.5703186%2C3.14417309%20C11.8516238%2C2.73724603%2012.4164781%2C2.62829933%2012.83558%2C2.89774797%20C13.260121%2C3.17069355%2013.3759736%2C3.72932262%2013.0909105%2C4.14168582%20L7.7580587%2C11.8560195%20C7.43776896%2C12.3193404%206.76483983%2C12.3852142%206.35607322%2C11.9948725%20L3.02491697%2C8.8138662%20C2.66090143%2C8.46625845%202.65798871%2C7.89594698%203.01850234%2C7.54483354%20C3.373942%2C7.19866177%203.94940006%2C7.19592841%204.30829608%2C7.5386474%20L6.85276923%2C9.9684299%20L11.5703186%2C3.14417309%20Z%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A"); +} +/* stylelint-disable */ +/* http://prismjs.com/ */ +/** + * prism.js default theme for JavaScript, CSS and HTML + * Based on dabblet (http://dabblet.com) + * @author Lea Verou + */ +code[class*="language-"], +pre[class*="language-"] { + color: black; + text-shadow: 0 1px white; + font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace; + font-size: .875rem; + direction: ltr; + text-align: left; + white-space: pre; + word-spacing: normal; + word-break: normal; + word-wrap: normal; + line-height: 1.5; + -moz-tab-size: 4; + tab-size: 4; + -webkit-hyphens: none; + -ms-hyphens: none; + hyphens: none; +} +pre[class*="language-"]::-moz-selection, +pre[class*="language-"] ::-moz-selection, +code[class*="language-"]::-moz-selection, +code[class*="language-"] ::-moz-selection { + text-shadow: none; + background: #b3d4fc; +} +pre[class*="language-"]::selection, +pre[class*="language-"] ::selection, +code[class*="language-"]::selection, +code[class*="language-"] ::selection { + text-shadow: none; + background: #b3d4fc; +} +@media print { + code[class*="language-"], + pre[class*="language-"] { + text-shadow: none; + } +} +/* Code blocks */ +pre[class*="language-"] { + padding: 1em; + margin: .5em 0; + overflow: auto; +} +:not(pre) > code[class*="language-"], +pre[class*="language-"] { + background: transparent !important; + border: 1px solid #ccc; +} +/* Inline code */ +:not(pre) > code[class*="language-"] { + padding: .1em; + border-radius: .3em; +} +.token.comment, +.token.prolog, +.token.doctype, +.token.cdata { + color: slategray; +} +.token.punctuation { + color: #999; +} +.namespace { + opacity: .7; +} +.token.property, +.token.tag, +.token.boolean, +.token.number, +.token.constant, +.token.symbol, +.token.deleted { + color: #905; +} +.token.selector, +.token.attr-name, +.token.string, +.token.char, +.token.builtin, +.token.inserted { + color: #690; +} +.token.operator, +.token.entity, +.token.url, +.language-css .token.string, +.style .token.string { + color: #a67f59; + background: rgba(255, 255, 255, 0.5); +} +.token.atrule, +.token.attr-value, +.token.keyword { + color: #07a; +} +.token.function { + color: #DD4A68; +} +.token.regex, +.token.important, +.token.variable { + color: #e90; +} +.token.important, +.token.bold { + font-weight: bold; +} +.token.italic { + font-style: italic; +} +.token.entity { + cursor: help; +} +/* stylelint-enable */ +.mce-content-body .mce-visual-caret { + background-color: black; + background-color: currentcolor; + position: absolute; +} +.mce-content-body .mce-visual-caret-hidden { + display: none; +} +.mce-content-body *[data-mce-caret] { + left: -1000px; + margin: 0; + padding: 0; + position: absolute; + right: auto; + top: 0; +} +.mce-content-body .mce-offscreen-selection { + left: -9999999999px; + max-width: 1000000px; + position: absolute; +} +.mce-content-body *[contentEditable=false] { + cursor: default; +} +.mce-content-body *[contentEditable=true] { + cursor: text; +} +.tox-cursor-format-painter { + cursor: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%20viewBox%3D%220%200%2024%2024%22%3E%0A%20%20%3Cg%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M15%2C6%20C15%2C5.45%2014.55%2C5%2014%2C5%20L6%2C5%20C5.45%2C5%205%2C5.45%205%2C6%20L5%2C10%20C5%2C10.55%205.45%2C11%206%2C11%20L14%2C11%20C14.55%2C11%2015%2C10.55%2015%2C10%20L15%2C9%20L16%2C9%20L16%2C12%20L9%2C12%20L9%2C19%20C9%2C19.55%209.45%2C20%2010%2C20%20L11%2C20%20C11.55%2C20%2012%2C19.55%2012%2C19%20L12%2C14%20L18%2C14%20L18%2C7%20L15%2C7%20L15%2C6%20Z%22%2F%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M1%2C1%20L8.25%2C1%20C8.66421356%2C1%209%2C1.33578644%209%2C1.75%20L9%2C1.75%20C9%2C2.16421356%208.66421356%2C2.5%208.25%2C2.5%20L2.5%2C2.5%20L2.5%2C8.25%20C2.5%2C8.66421356%202.16421356%2C9%201.75%2C9%20L1.75%2C9%20C1.33578644%2C9%201%2C8.66421356%201%2C8.25%20L1%2C1%20Z%22%2F%3E%0A%20%20%3C%2Fg%3E%0A%3C%2Fsvg%3E%0A"), default; +} +.mce-content-body figure.align-left { + float: left; +} +.mce-content-body figure.align-right { + float: right; +} +.mce-content-body figure.image.align-center { + display: table; + margin-left: auto; + margin-right: auto; +} +.mce-preview-object { + border: 1px solid gray; + display: inline-block; + line-height: 0; + margin: 0 2px 0 2px; + position: relative; +} +.mce-preview-object .mce-shim { + background: url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7); + height: 100%; + left: 0; + position: absolute; + top: 0; + width: 100%; +} +.mce-preview-object[data-mce-selected="2"] .mce-shim { + display: none; +} +.mce-object { + background: transparent url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%3E%3Cpath%20d%3D%22M4%203h16a1%201%200%200%201%201%201v16a1%201%200%200%201-1%201H4a1%201%200%200%201-1-1V4a1%201%200%200%201%201-1zm1%202v14h14V5H5zm4.79%202.565l5.64%204.028a.5.5%200%200%201%200%20.814l-5.64%204.028a.5.5%200%200%201-.79-.407V7.972a.5.5%200%200%201%20.79-.407z%22%2F%3E%3C%2Fsvg%3E%0A") no-repeat center; + border: 1px dashed #aaa; +} +.mce-pagebreak { + border: 1px dashed #aaa; + cursor: default; + display: block; + height: 5px; + margin-top: 15px; + page-break-before: always; + width: 100%; +} +@media print { + .mce-pagebreak { + border: 0; + } +} +.tiny-pageembed .mce-shim { + background: url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7); + height: 100%; + left: 0; + position: absolute; + top: 0; + width: 100%; +} +.tiny-pageembed[data-mce-selected="2"] .mce-shim { + display: none; +} +.tiny-pageembed { + display: inline-block; + position: relative; +} +.tiny-pageembed--21by9, +.tiny-pageembed--16by9, +.tiny-pageembed--4by3, +.tiny-pageembed--1by1 { + display: block; + overflow: hidden; + padding: 0; + position: relative; + width: 100%; +} +.tiny-pageembed--21by9::before, +.tiny-pageembed--16by9::before, +.tiny-pageembed--4by3::before, +.tiny-pageembed--1by1::before { + content: ""; + display: block; +} +.tiny-pageembed--21by9::before { + padding-top: 42.857143%; +} +.tiny-pageembed--16by9::before { + padding-top: 56.25%; +} +.tiny-pageembed--4by3::before { + padding-top: 75%; +} +.tiny-pageembed--1by1::before { + padding-top: 100%; +} +.tiny-pageembed--21by9 iframe, +.tiny-pageembed--16by9 iframe, +.tiny-pageembed--4by3 iframe, +.tiny-pageembed--1by1 iframe { + border: 0; + height: 100%; + left: 0; + position: absolute; + top: 0; + width: 100%; +} +.mce-content-body div.mce-resizehandle { + background-color: #4099ff; + border-color: #4099ff; + border-style: solid; + border-width: 1px; + box-sizing: border-box; + height: 10px; + position: absolute; + width: 10px; + z-index: 10000; +} +.mce-content-body div.mce-resizehandle:hover { + background-color: #4099ff; +} +.mce-content-body div.mce-resizehandle:nth-of-type(1) { + cursor: nwse-resize; +} +.mce-content-body div.mce-resizehandle:nth-of-type(2) { + cursor: nesw-resize; +} +.mce-content-body div.mce-resizehandle:nth-of-type(3) { + cursor: nwse-resize; +} +.mce-content-body div.mce-resizehandle:nth-of-type(4) { + cursor: nesw-resize; +} +.mce-content-body .mce-clonedresizable { + opacity: .5; + outline: 1px dashed black; + position: absolute; + z-index: 10000; +} +.mce-content-body .mce-resize-helper { + background: #555; + background: rgba(0, 0, 0, 0.75); + border: 1px; + border-radius: 3px; + color: white; + display: none; + font-family: sans-serif; + font-size: 12px; + line-height: 14px; + margin: 5px 10px; + padding: 5px; + position: absolute; + white-space: nowrap; + z-index: 10001; +} +.mce-match-marker { + background: #aaa; + color: #fff; +} +.mce-match-marker-selected { + background: #39f; + color: #fff; +} +.mce-content-body img[data-mce-selected], +.mce-content-body table[data-mce-selected] { + outline: 3px solid #b4d7ff; +} +.mce-content-body hr[data-mce-selected] { + outline: 3px solid #b4d7ff; + outline-offset: 1px; +} +.mce-content-body *[contentEditable=false] *[contentEditable=true]:focus { + outline: 3px solid #b4d7ff; +} +.mce-content-body *[contentEditable=false] *[contentEditable=true]:hover { + outline: 3px solid #b4d7ff; +} +.mce-content-body *[contentEditable=false][data-mce-selected] { + cursor: not-allowed; + outline: 3px solid #b4d7ff; +} +.mce-content-body.mce-content-readonly *[contentEditable=true]:focus, +.mce-content-body.mce-content-readonly *[contentEditable=true]:hover { + outline: none; +} +.mce-content-body *[data-mce-selected="inline-boundary"] { + background-color: #b4d7ff; +} +.mce-content-body .mce-edit-focus { + outline: 3px solid #b4d7ff; +} +.mce-content-body td[data-mce-selected], +.mce-content-body th[data-mce-selected] { + background-color: #b4d7ff !important; +} +.mce-content-body td[data-mce-selected]::-moz-selection, +.mce-content-body th[data-mce-selected]::-moz-selection { + background: none; +} +.mce-content-body td[data-mce-selected]::selection, +.mce-content-body th[data-mce-selected]::selection { + background: none; +} +.mce-content-body td[data-mce-selected] *, +.mce-content-body th[data-mce-selected] * { + -webkit-touch-callout: none; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} +.mce-content-body img::-moz-selection { + background: none; +} +.mce-content-body img::selection { + background: none; +} +.ephox-snooker-resizer-bar { + background-color: #b4d7ff; + opacity: 0; +} +.ephox-snooker-resizer-cols { + cursor: col-resize; +} +.ephox-snooker-resizer-rows { + cursor: row-resize; +} +.ephox-snooker-resizer-bar.ephox-snooker-resizer-bar-dragging { + opacity: 1; +} +.mce-spellchecker-word { + background-image: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%23ff0000'%20fill%3D'none'%20stroke-linecap%3D'round'%20stroke-opacity%3D'.5'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A"); + background-position: 0 calc(100% + 1px); + background-repeat: repeat-x; + background-size: auto 6px; + cursor: default; + height: 2rem; +} +.mce-spellchecker-grammar { + background-image: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%23008800'%20fill%3D'none'%20stroke-linecap%3D'round'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A"); + background-position: 0 calc(100% + 1px); + background-repeat: repeat-x; + background-size: auto 6px; + cursor: default; +} +.mce-toc { + border: 1px solid gray; +} +.mce-toc h2 { + margin: 4px; +} +.mce-toc li { + list-style-type: none; +} +.mce-item-table, +.mce-item-table td, +.mce-item-table th, +.mce-item-table caption { + border: 1px dashed #bbb; +} +.mce-visualblocks p, +.mce-visualblocks h1, +.mce-visualblocks h2, +.mce-visualblocks h3, +.mce-visualblocks h4, +.mce-visualblocks h5, +.mce-visualblocks h6, +.mce-visualblocks div:not([data-mce-bogus]), +.mce-visualblocks section, +.mce-visualblocks article, +.mce-visualblocks blockquote, +.mce-visualblocks address, +.mce-visualblocks pre, +.mce-visualblocks figure, +.mce-visualblocks figcaption, +.mce-visualblocks hgroup, +.mce-visualblocks aside, +.mce-visualblocks ul, +.mce-visualblocks ol, +.mce-visualblocks dl { + background-repeat: no-repeat; + border: 1px dashed #bbb; + margin-left: 3px; + padding-top: 10px; +} +.mce-visualblocks p { + background-image: url(data:image/gif;base64,R0lGODlhCQAJAJEAAAAAAP///7u7u////yH5BAEAAAMALAAAAAAJAAkAAAIQnG+CqCN/mlyvsRUpThG6AgA7); +} +.mce-visualblocks h1 { + background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGu1JuxHoAfRNRW3TWXyF2YiRUAOw==); +} +.mce-visualblocks h2 { + background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8Hybbx4oOuqgTynJd6bGlWg3DkJzoaUAAAOw==); +} +.mce-visualblocks h3 { + background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIZjI8Hybbx4oOuqgTynJf2Ln2NOHpQpmhAAQA7); +} +.mce-visualblocks h4 { + background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxInR0zqeAdhtJlXwV1oCll2HaWgAAOw==); +} +.mce-visualblocks h5 { + background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjane4iq5GlW05GgIkIZUAAAOw==); +} +.mce-visualblocks h6 { + background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjan04jep1iZ1XRlAo5bVgAAOw==); +} +.mce-visualblocks div:not([data-mce-bogus]) { + background-image: url(data:image/gif;base64,R0lGODlhEgAKAIABALu7u////yH5BAEAAAEALAAAAAASAAoAAAIfjI9poI0cgDywrhuxfbrzDEbQM2Ei5aRjmoySW4pAAQA7); +} +.mce-visualblocks section { + background-image: url(data:image/gif;base64,R0lGODlhKAAKAIABALu7u////yH5BAEAAAEALAAAAAAoAAoAAAI5jI+pywcNY3sBWHdNrplytD2ellDeSVbp+GmWqaDqDMepc8t17Y4vBsK5hDyJMcI6KkuYU+jpjLoKADs=); +} +.mce-visualblocks article { + background-image: url(data:image/gif;base64,R0lGODlhKgAKAIABALu7u////yH5BAEAAAEALAAAAAAqAAoAAAI6jI+pywkNY3wG0GBvrsd2tXGYSGnfiF7ikpXemTpOiJScasYoDJJrjsG9gkCJ0ag6KhmaIe3pjDYBBQA7); +} +.mce-visualblocks blockquote { + background-image: url(data:image/gif;base64,R0lGODlhPgAKAIABALu7u////yH5BAEAAAEALAAAAAA+AAoAAAJPjI+py+0Knpz0xQDyuUhvfoGgIX5iSKZYgq5uNL5q69asZ8s5rrf0yZmpNkJZzFesBTu8TOlDVAabUyatguVhWduud3EyiUk45xhTTgMBBQA7); +} +.mce-visualblocks address { + background-image: url(data:image/gif;base64,R0lGODlhLQAKAIABALu7u////yH5BAEAAAEALAAAAAAtAAoAAAI/jI+pywwNozSP1gDyyZcjb3UaRpXkWaXmZW4OqKLhBmLs+K263DkJK7OJeifh7FicKD9A1/IpGdKkyFpNmCkAADs=); +} +.mce-visualblocks pre { + background-image: url(data:image/gif;base64,R0lGODlhFQAKAIABALu7uwAAACH5BAEAAAEALAAAAAAVAAoAAAIjjI+ZoN0cgDwSmnpz1NCueYERhnibZVKLNnbOq8IvKpJtVQAAOw==); +} +.mce-visualblocks figure { + background-image: url(data:image/gif;base64,R0lGODlhJAAKAIAAALu7u////yH5BAEAAAEALAAAAAAkAAoAAAI0jI+py+2fwAHUSFvD3RlvG4HIp4nX5JFSpnZUJ6LlrM52OE7uSWosBHScgkSZj7dDKnWAAgA7); +} +.mce-visualblocks figcaption { + border: 1px dashed #bbb; +} +.mce-visualblocks hgroup { + background-image: url(data:image/gif;base64,R0lGODlhJwAKAIABALu7uwAAACH5BAEAAAEALAAAAAAnAAoAAAI3jI+pywYNI3uB0gpsRtt5fFnfNZaVSYJil4Wo03Hv6Z62uOCgiXH1kZIIJ8NiIxRrAZNMZAtQAAA7); +} +.mce-visualblocks aside { + background-image: url(data:image/gif;base64,R0lGODlhHgAKAIABAKqqqv///yH5BAEAAAEALAAAAAAeAAoAAAItjI+pG8APjZOTzgtqy7I3f1yehmQcFY4WKZbqByutmW4aHUd6vfcVbgudgpYCADs=); +} +.mce-visualblocks ul { + background-image: url(data:image/gif;base64,R0lGODlhDQAKAIAAALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGuYnqUVSjvw26DzzXiqIDlVwAAOw==); +} +.mce-visualblocks ol { + background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybH6HHt0qourxC6CvzXieHyeWQAAOw==); +} +.mce-visualblocks dl { + background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybEOnmOvUoWznTqeuEjNSCqeGRUAOw==); +} +.mce-nbsp, +.mce-shy { + background: #aaa; +} +.mce-shy::after { + content: '-'; +} +body { + font-family: sans-serif; +} +table { + border-collapse: collapse; +} diff --git a/ant-design-jeecg-vue/public/tinymce/skins/lightgray/skin.min.css b/ant-design-jeecg-vue/public/tinymce/skins/lightgray/skin.min.css new file mode 100644 index 0000000..3ea9b44 --- /dev/null +++ b/ant-design-jeecg-vue/public/tinymce/skins/lightgray/skin.min.css @@ -0,0 +1,2159 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + */ +.tox, +.tox *:not(svg) { + background: transparent; + border: 0; + box-sizing: content-box; + color: #222f3e; + cursor: auto; + direction: ltr; + float: none; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; + font-size: 16px; + font-style: normal; + font-weight: normal; + height: auto; + line-height: normal; + margin: 0; + max-width: none; + outline: 0; + padding: 0; + position: static; + -webkit-tap-highlight-color: transparent; + text-align: left; + text-decoration: none; + text-shadow: none; + text-transform: none; + vertical-align: initial; + white-space: normal; + width: auto; +} +.tox *:not(svg) { + color: inherit; + cursor: inherit; + font-size: inherit; +} +.tox-tinymce { + border: 1px solid #cccccc; + border-radius: 0; + box-shadow: none; + box-sizing: border-box; + display: flex; + flex-direction: column; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; + overflow: hidden; + visibility: inherit !important; +} +.tox-editor-container { + display: flex; + flex: 1 1 auto; + flex-direction: column; + overflow: hidden; +} +.tox-editor-container > *:first-child { + border-top: none !important; +} +.tox-tinymce-aux { + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; +} +.tox-tinymce *:focus, +.tox-tinymce-aux *:focus { + outline: none; +} +button::-moz-focus-inner { + border: 0; +} +.tox-silver-sink { + z-index: 1300; +} +.tox[dir='rtl'] { + direction: rtl; +} +.tox[dir='rtl'] .tox-statusbar__resize-handle { + justify-content: flex-start; + margin-left: -8px; + margin-right: 0; + padding-left: 0; + padding-right: 1ch; +} +.tox[dir='rtl'] .tox-statusbar .tox-statusbar__path { + text-align: right; +} +.tox .tox-anchorbar { + display: flex; + flex: 0 0 auto; +} +.tox .tox-bar { + display: flex; + flex: 0 0 auto; +} +.tox .tox-button { + background-color: #3498db; + background-image: none; + background-position: none; + background-repeat: none; + border-color: #3498db; + border-radius: 3px; + border-style: solid; + border-width: 1px; + box-shadow: none; + box-sizing: border-box; + color: #fff; + cursor: pointer; + display: inline-block; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; + font-size: 14px; + font-weight: bold; + letter-spacing: 1; + line-height: 24px; + margin: 0; + outline: none; + padding: 4px 16px; + text-align: center; + text-decoration: none; + text-transform: capitalize; + white-space: nowrap; +} +.tox .tox-button[disabled] { + background-color: #3498db; + background-image: none; + border-color: #3498db; + box-shadow: none; + color: rgba(255, 255, 255, 0.5); + cursor: not-allowed; +} +.tox .tox-button:focus:not(:disabled) { + background-color: #258cd1; + background-image: none; + border-color: #258cd1; + box-shadow: none; + color: #fff; +} +.tox .tox-button:hover:not(:disabled) { + background-color: #258cd1; + background-image: none; + border-color: #258cd1; + box-shadow: none; + color: #fff; +} +.tox .tox-button:active:not(:disabled) { + background-color: #217dbb; + background-image: none; + border-color: #217dbb; + box-shadow: none; + color: #fff; +} +.tox .tox-button--secondary { + background-color: #f0f0f0; + background-image: none; + background-position: none; + background-repeat: none; + border-color: #f0f0f0; + border-radius: 3px; + border-style: solid; + border-width: 1px; + box-shadow: none; + color: #222f3e; + outline: none; + padding: 4px 16px; + text-decoration: none; + text-transform: capitalize; +} +.tox .tox-button--secondary[disabled] { + background-color: #f0f0f0; + background-image: none; + border-color: #f0f0f0; + box-shadow: none; + color: rgba(34, 47, 62, 0.5); +} +.tox .tox-button--secondary:focus:not(:disabled) { + background-color: #e3e3e3; + background-image: none; + border-color: #e3e3e3; + box-shadow: none; + color: #222f3e; +} +.tox .tox-button--secondary:hover:not(:disabled) { + background-color: #e3e3e3; + background-image: none; + border-color: #e3e3e3; + box-shadow: none; + color: #222f3e; +} +.tox .tox-button--secondary:active:not(:disabled) { + background-color: #d6d6d6; + background-image: none; + border-color: #d6d6d6; + box-shadow: none; + color: #222f3e; +} +.tox .tox-button--icon, +.tox .tox-button.tox-button--icon, +.tox .tox-button.tox-button--secondary.tox-button--icon { + padding: 4px; +} +.tox .tox-button--icon .tox-icon svg, +.tox .tox-button.tox-button--icon .tox-icon svg, +.tox .tox-button.tox-button--secondary.tox-button--icon .tox-icon svg { + display: block; + fill: currentColor; +} +.tox .tox-button-link { + background: 0; + border: none; + box-sizing: border-box; + cursor: pointer; + display: inline-block; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; + font-size: 16px; + font-weight: normal; + line-height: 1.3; + margin: 0; + padding: 0; + white-space: nowrap; +} +.tox .tox-button-link--sm { + font-size: 14px; +} +.tox .tox-button--naked { + background-color: transparent; + border-color: transparent; + box-shadow: unset; + color: #222f3e; +} +.tox .tox-button--naked:hover:not(:disabled) { + background-color: #e3e3e3; + border-color: #e3e3e3; + box-shadow: none; + color: #222f3e; +} +.tox .tox-button--naked:focus:not(:disabled) { + background-color: #e3e3e3; + border-color: #e3e3e3; + box-shadow: none; + color: #222f3e; +} +.tox .tox-button--naked:active:not(:disabled) { + background-color: #d6d6d6; + border-color: #d6d6d6; + box-shadow: none; + color: #222f3e; +} +.tox .tox-button--naked .tox-icon svg { + fill: currentColor; +} +.tox .tox-button--naked.tox-button--icon { + color: currentColor; +} +.tox .tox-button--naked.tox-button--icon:hover:not(:disabled) { + color: #222f3e; +} +.tox .tox-checkbox { + align-items: center; + border-radius: 3px; + cursor: pointer; + display: flex; + height: 36px; + min-width: 36px; +} +.tox .tox-checkbox__input { + /* Hide from view but visible to screen readers */ + height: 1px; + left: -10000px; + overflow: hidden; + position: absolute; + top: auto; + width: 1px; +} +.tox .tox-checkbox__icons { + border-radius: 3px; + box-shadow: 0 0 0 2px transparent; + height: 24px; + padding: calc(3px); + width: 24px; +} +.tox .tox-checkbox__icons .tox-checkbox-icon__unchecked svg { + display: block; + fill: rgba(34, 47, 62, 0.3); +} +.tox .tox-checkbox__icons .tox-checkbox-icon__indeterminate svg { + display: none; + fill: #3498db; +} +.tox .tox-checkbox__icons .tox-checkbox-icon__checked svg { + display: none; + fill: #3498db; +} +.tox .tox-checkbox__label { + margin-left: 4px; +} +.tox input.tox-checkbox__input:checked + .tox-checkbox__icons .tox-checkbox-icon__unchecked svg { + display: none; +} +.tox input.tox-checkbox__input:checked + .tox-checkbox__icons .tox-checkbox-icon__checked svg { + display: block; +} +.tox input.tox-checkbox__input:indeterminate + .tox-checkbox__icons .tox-checkbox-icon__unchecked svg { + display: none; +} +.tox input.tox-checkbox__input:indeterminate + .tox-checkbox__icons .tox-checkbox-icon__indeterminate svg { + display: block; +} +.tox input.tox-checkbox__input:focus + .tox-checkbox__icons { + border-radius: 3px; + box-shadow: inset 0 0 0 1px #3498db; + padding: calc(3px); +} +.tox .tox-bar .tox-checkbox { + margin-left: 4px; +} +.tox .tox-collection--toolbar .tox-collection__group { + display: flex; + padding: 0; +} +.tox .tox-collection--grid .tox-collection__group { + display: flex; + flex-wrap: wrap; + max-height: 208px; + overflow-x: hidden; + overflow-y: auto; + padding: 0; +} +.tox .tox-collection--list .tox-collection__group { + border-bottom-width: 0; + border-color: #cccccc; + border-left-width: 0; + border-right-width: 0; + border-style: solid; + border-top-width: 1px; + padding: 4px 0; +} +.tox .tox-collection--list .tox-collection__group:first-child { + border-top-width: 0; +} +.tox .tox-collection__group-heading { + background-color: #e6e6e6; + color: rgba(34, 47, 62, 0.6); + cursor: default; + font-size: 12px; + font-style: normal; + font-weight: normal; + margin-bottom: 4px; + margin-top: -4px; + padding: 4px 8px; + text-transform: none; + -webkit-touch-callout: none; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} +.tox .tox-collection__item { + align-items: center; + color: #222f3e; + cursor: pointer; + display: flex; + -webkit-touch-callout: none; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} +.tox .tox-collection__item--state-disabled { + background-color: unset; + color: rgba(34, 47, 62, 0.5); + cursor: default; +} +.tox .tox-collection--list .tox-collection__item { + padding: 4px 8px; +} +.tox .tox-collection--toolbar .tox-collection__item { + border-radius: 3px; + padding: 4px; +} +.tox .tox-collection--grid .tox-collection__item { + border-radius: 3px; + padding: 4px; +} +.tox .tox-collection--list .tox-collection__item--enabled { + background-color: inherit; + color: contrast(inherit, #222f3e, #fff); +} +.tox .tox-collection--list .tox-collection__item--active { + background-color: #dee0e2; + color: #222f3e; +} +.tox .tox-collection--toolbar .tox-collection__item--enabled { + background-color: #c8cbcf; + color: #222f3e; +} +.tox .tox-collection--toolbar .tox-collection__item--active { + background-color: #dee0e2; + color: #222f3e; +} +.tox .tox-collection--grid .tox-collection__item--enabled { + background-color: #c8cbcf; + color: #222f3e; +} +.tox .tox-collection--grid .tox-collection__item--active { + background-color: #dee0e2; + color: #222f3e; +} +.tox .tox-collection__item-icon { + align-items: center; + display: flex; + height: 24px; + justify-content: center; + width: 24px; +} +.tox .tox-collection__item-icon svg { + fill: currentColor; +} +.tox .tox-collection--toolbar-lg .tox-collection__item-icon { + height: 48px; + width: 48px; +} +.tox .tox-collection--list .tox-collection__item > *:not(:first-child) { + margin-left: 8px; +} +.tox .tox-collection__item[role="menuitemcheckbox"]:not(.tox-collection__item--enabled) .tox-collection__item-checkmark svg { + display: none; +} +.tox .tox-collection__item-label { + color: currentColor; + display: inline-block; + flex: 1; + -ms-flex-preferred-size: auto; + font-size: 14px; + font-style: normal; + font-weight: normal; + line-height: 24px; + text-transform: none; + word-break: break-all; +} +.tox .tox-collection--list .tox-collection__item-label:first-child { + margin-left: 4px; +} +.tox .tox-collection__item-accessory { + color: rgba(34, 47, 62, 0.6); + display: inline-block; + font-size: 14px; + height: 24px; + line-height: 24px; + margin-left: 16px; + text-align: right; + text-transform: normal; +} +.tox .tox-collection__item-caret { + align-items: center; + display: flex; + margin-left: 16px; + min-height: 24px; +} +.tox .tox-color-picker-container { + display: flex; + flex-direction: row; + height: 225px; + margin: 0; +} +.tox .tox-sv-palette { + border: 1px solid black; + box-sizing: border-box; + display: flex; + height: 100%; + margin-right: 15px; +} +.tox .tox-sv-palette-spectrum { + height: 100%; +} +.tox .tox-sv-palette, +.tox .tox-sv-palette-spectrum { + width: 225px; +} +.tox .tox-sv-palette-thumb { + background: none; + border: 1px solid black; + border-radius: 50%; + height: 12px; + position: absolute; + width: 12px; +} +.tox .tox-sv-palette-inner-thumb { + border: 1px solid white; + border-radius: 50%; + height: 10px; + position: absolute; + width: 10px; +} +.tox .tox-hue-slider { + border: 1px solid black; + box-sizing: border-box; + height: 100%; + margin-right: 15px; + width: 25px; +} +.tox .tox-hue-slider-spectrum { + background: linear-gradient(to bottom, #f00, #ff0080, #f0f, #8000ff, #00f, #0080ff, #0ff, #00ff80, #0f0, #80ff00, #ff0, #ff8000, #f00); + height: 100%; + width: 100%; +} +.tox .tox-hue-slider, +.tox .tox-hue-slider-spectrum { + width: 20px; +} +.tox .tox-hue-slider-thumb { + background: white; + border: 1px solid black; + height: 4px; + margin-left: -1px; + width: 100%; +} +.tox .tox-rgb-form { + display: flex; + flex-direction: column; + justify-content: space-between; +} +.tox .tox-rgb-form div { + align-items: center; + display: flex; + justify-content: space-between; + margin-bottom: 5px; + width: inherit; +} +.tox .tox-rgb-form input { + width: 6em; +} +.tox .tox-rgb-form input.tox-invalid { + /* Need !important to override Chrome's focus styling unfortunately */ + border: 1px solid red !important; +} +.tox .tox-rgb-form label { + margin-right: .5em; +} +.tox .tox-rgb-form .tox-rgba-preview { + border: 1px solid black; + flex-grow: 2; + margin-bottom: 0; +} +.tox .tox-toolbar .tox-swatches, +.tox .tox-toolbar__primary .tox-swatches, +.tox .tox-toolbar__overflow .tox-swatches { + margin: 2px 0 3px 4px; +} +.tox .tox-swatches__row { + display: flex; +} +.tox .tox-swatch { + height: 30px; + transition: transform 0.15s, box-shadow 0.15s; + width: 30px; +} +.tox .tox-swatch:hover, +.tox .tox-swatch:focus { + box-shadow: 0 0 0 1px rgba(127, 127, 127, 0.3) inset; + transform: scale(0.8); +} +.tox .tox-swatch--remove { + align-items: center; + display: flex; + justify-content: center; +} +.tox .tox-swatch--remove svg path { + stroke: #e74c3c; +} +.tox .tox-swatches__picker-btn { + align-items: center; + background-color: transparent; + border: 0; + cursor: pointer; + display: flex; + height: 30px; + justify-content: center; + margin-left: auto; + outline: none; + padding: 0; + width: 30px; +} +.tox .tox-swatches__picker-btn svg { + height: 24px; + width: 24px; +} +.tox .tox-swatches__picker-btn:hover { + background: #dee0e2; +} +.tox .tox-comment-thread { + background: #fff; + position: relative; +} +.tox .tox-comment-thread > *:not(:first-child) { + margin-top: 8px; +} +.tox .tox-comment { + background: #fff; + border: 1px solid #cccccc; + border-radius: 3px; + box-shadow: 0 4px 8px 0 rgba(34, 47, 62, 0.1); + padding: 8px 8px 16px 8px; + position: relative; +} +.tox .tox-comment__header { + align-items: center; + color: #222f3e; + display: flex; + justify-content: space-between; +} +.tox .tox-comment__date { + color: rgba(34, 47, 62, 0.6); + font-size: 12px; +} +.tox .tox-comment__body { + color: #222f3e; + font-size: 14px; + font-style: normal; + font-weight: normal; + line-height: 1.3; + margin-top: 8px; + position: relative; + text-transform: initial; +} +.tox .tox-comment__body textarea { + resize: none; + white-space: normal; + width: 100%; +} +.tox .tox-comment__expander { + padding-top: 8px; +} +.tox .tox-comment__expander p { + color: rgba(34, 47, 62, 0.6); + font-size: 14px; + font-style: normal; +} +.tox .tox-comment__body p { + margin: 0; +} +.tox .tox-comment__buttonspacing { + padding-top: 16px; + text-align: center; +} +.tox .tox-comment__buttonspacing > *:last-child { + margin-left: 8px; +} +.tox .tox-comment-thread__overlay::after { + background: #fff; + bottom: 0; + content: ""; + display: flex; + left: 0; + opacity: .9; + position: absolute; + right: 0; + top: 0; + z-index: 5; +} +.tox .tox-comment__reply { + display: flex; + flex-shrink: 0; + flex-wrap: wrap; + justify-content: flex-end; + margin-top: 8px; +} +.tox .tox-comment__reply > *:first-child { + margin-bottom: 8px; + width: 100%; +} +.tox .tox-comment__reply > *:last-child { + margin-left: 8px; +} +.tox .tox-comment__edit { + display: flex; + flex-wrap: wrap; + justify-content: flex-end; + margin-left: 8px; + margin-top: 16px; +} +.tox .tox-comment__edit > *:last-child { + margin-left: 8px; +} +.tox .tox-comment__gradient::after { + background: linear-gradient(rgba(255, 255, 255, 0), #fff); + bottom: 0; + content: ""; + display: block; + height: 5em; + margin-top: -40px; + position: absolute; + width: 100%; +} +.tox .tox-comment__overlay { + background: #fff; + bottom: 0; + display: flex; + flex-direction: column; + flex-grow: 1; + left: 0; + opacity: .9; + position: absolute; + right: 0; + text-align: center; + top: 0; + z-index: 5; +} +.tox .tox-comment__loading-text { + align-items: center; + color: #222f3e; + display: flex; + flex-direction: column; + position: relative; +} +.tox .tox-comment__loading-text > div { + padding-bottom: 16px; +} +.tox .tox-comment__overlaytext { + bottom: 0; + flex-direction: column; + font-size: 14px; + left: 0; + padding: 1em; + position: absolute; + right: 0; + top: 0; + z-index: 10; +} +.tox .tox-comment__overlaytext p { + background-color: #fff; + box-shadow: 0 0 8px 8px #fff; + color: #222f3e; + text-align: center; +} +.tox .tox-comment__overlaytext div:nth-of-type(2) { + font-size: .8em; +} +.tox .tox-comment__busy-spinner { + align-items: center; + background-color: #fff; + bottom: 0; + display: flex; + justify-content: center; + left: 0; + position: absolute; + right: 0; + top: 0; + z-index: 1103; +} +.tox .tox-comment__scroll { + display: flex; + flex-direction: column; + flex-shrink: 1; + overflow: auto; +} +.tox .tox-conversations { + margin: 8px; +} +.tox .tox-user { + align-items: center; + display: flex; +} +.tox .tox-user__avatar svg { + fill: rgba(34, 47, 62, 0.6); + margin-right: 8px; +} +.tox .tox-user__name { + color: rgba(34, 47, 62, 0.6); + font-size: 12px; + font-style: normal; + font-weight: bold; + text-transform: uppercase; +} +.tox .tox-user__avatar + .tox-user__name { + margin-left: 8px; +} +.tox .tox-dialog-wrap { + align-items: center; + bottom: 0; + display: flex; + justify-content: center; + left: 0; + position: fixed; + right: 0; + top: 0; + z-index: 1100; +} +.tox .tox-dialog-wrap__backdrop { + background-color: rgba(255, 255, 255, 0.75); + bottom: 0; + left: 0; + position: absolute; + right: 0; + top: 0; + z-index: 1101; +} +.tox .tox-dialog { + background-color: #fff; + border-color: #cccccc; + border-radius: 3px; + border-style: solid; + border-width: 1px; + box-shadow: 0 16px 16px -10px rgba(34, 47, 62, 0.15), 0 0 40px 1px rgba(34, 47, 62, 0.15); + display: flex; + flex-direction: column; + max-height: 100%; + max-width: 480px; + overflow: hidden; + position: relative; + width: 95vw; + z-index: 1102; +} +.tox .tox-dialog__header { + align-items: center; + background-color: #fff; + border-bottom: none; + color: #222f3e; + display: flex; + font-size: 16px; + justify-content: space-between; + margin-bottom: 16px; + padding: 8px 16px 0 16px; + position: relative; +} +.tox .tox-dialog__header .tox-button { + z-index: 1; +} +.tox .tox-dialog__draghandle { + cursor: grab; + height: 100%; + left: 0; + position: absolute; + top: 0; + width: 100%; +} +.tox .tox-dialog__draghandle:active { + cursor: grabbing; +} +.tox .tox-dialog__dismiss { + margin-left: auto; +} +.tox .tox-dialog__title { + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; + font-size: 20px; + font-style: normal; + font-weight: normal; + line-height: 1.3; + margin: 0; + text-transform: normal; +} +.tox .tox-dialog__body { + color: #222f3e; + display: flex; + flex: 1; + -ms-flex-preferred-size: auto; + font-size: 16px; + font-style: normal; + font-weight: normal; + line-height: 1.3; + padding: 0 16px; + text-align: left; + text-transform: normal; +} +.tox .tox-dialog__body-nav { + align-items: flex-start; + display: flex; + flex-direction: column; + margin-right: 32px; +} +.tox .tox-dialog__body-nav-item { + border-bottom: 2px solid transparent; + color: rgba(34, 47, 62, 0.6); + display: inline-block; + font-size: 14px; + line-height: 1.3; + margin-bottom: 8px; + text-decoration: none; +} +.tox .tox-dialog__body-nav-item--active { + border-bottom: 2px solid #3498db; + color: #3498db; +} +.tox .tox-dialog__body-content { + display: flex; + flex: 1; + flex-direction: column; + -ms-flex-preferred-size: auto; + max-height: 650px; + overflow: auto; +} +.tox .tox-dialog__body-content > * { + margin-bottom: 0; + margin-top: 16px; +} +.tox .tox-dialog__body-content > *:first-child { + margin-top: 0; +} +.tox .tox-dialog__body-content > *:last-child { + margin-bottom: 0; +} +.tox .tox-dialog__body-content > *:only-child { + margin-bottom: 0; + margin-top: 0; +} +.tox .tox-dialog--width-lg { + height: 650px; + max-width: 1200px; +} +.tox .tox-dialog--width-md { + max-width: 800px; +} +.tox .tox-dialog--width-md .tox-dialog__body-content { + overflow: auto; +} +.tox .tox-dialog__body-content--centered { + text-align: center; +} +.tox .tox-dialog__body-content--spacious { + margin-bottom: 16px; +} +.tox .tox-dialog__footer { + align-items: center; + background-color: #fff; + border-top: 1px solid #cccccc; + display: flex; + justify-content: space-between; + margin-top: 16px; + padding: 8px 16px; +} +.tox .tox-dialog__footer .tox-dialog__footer-start > *, +.tox .tox-dialog__footer .tox-dialog__footer-end > * { + margin-left: 8px; +} +.tox .tox-dialog__busy-spinner { + align-items: center; + background-color: rgba(255, 255, 255, 0.75); + bottom: 0; + display: flex; + justify-content: center; + left: 0; + position: absolute; + right: 0; + top: 0; + z-index: 1103; +} +.tox .tox-dialog__table { + border-collapse: collapse; + width: 100%; +} +.tox .tox-dialog__table thead th { + font-weight: bold; + padding-bottom: 8px; +} +.tox .tox-dialog__table tbody tr { + border-bottom: 1px solid #cccccc; +} +.tox .tox-dialog__table tbody tr:last-child { + border-bottom: none; +} +.tox .tox-dialog__table td { + padding-bottom: 8px; + padding-top: 8px; +} +.tox .tox-dialog__popups { + position: absolute; + width: 100%; + z-index: 1100; +} +body.tox-dialog__disable-scroll { + overflow: hidden; +} +.tox .tox-dropzone-container { + display: flex; + flex: 1; + -ms-flex-preferred-size: auto; +} +.tox .tox-dropzone { + align-items: center; + background: #fff; + border: 2px dashed #cccccc; + box-sizing: border-box; + display: flex; + flex-direction: column; + flex-grow: 1; + justify-content: center; + min-height: 100px; + padding: 10px; +} +.tox .tox-dropzone p { + color: rgba(34, 47, 62, 0.6); + margin: 0 0 16px 0; +} +.tox .tox-edit-area { + border-top: 1px solid #cccccc; + display: flex; + flex: 1; + -ms-flex-preferred-size: auto; + overflow: hidden; + position: relative; +} +.tox .tox-edit-area__iframe { + background-color: #fff; + border: 0; + box-sizing: border-box; + flex: 1; + -ms-flex-preferred-size: auto; + height: 100%; + position: absolute; + width: 100%; +} +.tox.tox-inline-edit-area { + border: 1px dotted #cccccc; +} +.tox .tox-control-wrap { + flex: 1; + position: relative; +} +.tox .tox-control-wrap:not(.tox-control-wrap--status-invalid) .tox-control-wrap__status-icon-invalid, +.tox .tox-control-wrap:not(.tox-control-wrap--status-unknown) .tox-control-wrap__status-icon-unknown, +.tox .tox-control-wrap:not(.tox-control-wrap--status-valid) .tox-control-wrap__status-icon-valid { + display: none; +} +.tox .tox-control-wrap svg { + display: block; +} +.tox .tox-control-wrap .tox-textfield { + padding-right: 32px; +} +.tox .tox-control-wrap__status-icon-wrap { + position: absolute; + right: 4px; + top: 50%; + transform: translateY(-50%); +} +.tox .tox-control-wrap__status-icon-invalid svg { + fill: #c00; +} +.tox .tox-control-wrap__status-icon-unknown svg { + fill: orange; +} +.tox .tox-control-wrap__status-icon-valid svg { + fill: transparent; +} +.tox .tox-autocompleter { + max-width: 25em; +} +.tox .tox-autocompleter .tox-menu { + max-width: 25em; +} +.tox .tox-color-input { + display: flex; +} +.tox .tox-color-input .tox-textfield { + border-radius: 3px 0 0 3px; + display: flex; +} +.tox .tox-color-input span { + border-color: rgba(34, 47, 62, 0.2); + border-radius: 0 3px 3px 0; + border-style: solid; + border-width: 1px 1px 1px 0; + box-shadow: none; + box-sizing: border-box; + cursor: pointer; + display: flex; + width: 35px; +} +.tox .tox-color-input span:focus { + border-color: #3498db; +} +.tox .tox-label, +.tox .tox-toolbar-label { + color: rgba(34, 47, 62, 0.6); + display: block; + font-size: 14px; + font-style: normal; + font-weight: normal; + line-height: 1.3; + padding: 0 8px 0 0; + text-transform: normal; + white-space: nowrap; +} +.tox .tox-toolbar-label { + padding: 0 8px; +} +.tox .tox-form { + display: flex; + flex: 1; + flex-direction: column; + -ms-flex-preferred-size: auto; +} +.tox .tox-form__group { + box-sizing: border-box; + margin-bottom: 4px; +} +.tox .tox-form__group--error { + color: #c00; +} +.tox .tox-form__group--collection { + display: flex; +} +.tox .tox-form__grid { + display: flex; + flex-direction: row; + flex-wrap: wrap; + justify-content: space-between; +} +.tox .tox-form__grid--2col > .tox-form__group { + width: calc(50% - (8px / 2)); +} +.tox .tox-form__grid--3col > .tox-form__group { + width: calc(100% / 3 - (8px / 2)); +} +.tox .tox-form__grid--4col > .tox-form__group { + width: calc(25% - (8px / 2)); +} +.tox .tox-form__controls-h-stack { + align-items: center; + display: flex; +} +.tox .tox-form__controls-h-stack > *:not(:first-child) { + margin-left: 4px; +} +.tox .tox-form__group--inline { + align-items: center; + display: flex; +} +.tox .tox-form__group--stretched { + display: flex; + flex: 1; + flex-direction: column; + -ms-flex-preferred-size: auto; +} +.tox .tox-form__group--stretched .tox-textarea { + flex: 1; + -ms-flex-preferred-size: auto; +} +.tox .tox-form__group--stretched .tox-navobj { + display: flex; + flex: 1; + -ms-flex-preferred-size: auto; +} +.tox .tox-form__group--stretched .tox-navobj :nth-child(2) { + flex: 1; + -ms-flex-preferred-size: auto; + height: 100%; +} +.tox .tox-lock.tox-locked .tox-lock-icon__unlock, +.tox .tox-lock:not(.tox-locked) .tox-lock-icon__lock { + display: none; +} +.tox .tox-selectfield { + cursor: pointer; + position: relative; +} +.tox .tox-selectfield select { + padding-right: 24px; +} +.tox .tox-selectfield select::-ms-expand { + display: none; +} +.tox .tox-selectfield svg { + pointer-events: none; + position: absolute; + right: 8px; + top: 50%; + transform: translateY(-50%); +} +.tox .tox-textarea { + white-space: pre-wrap; +} +.tox .tox-textfield, +.tox .tox-selectfield select, +.tox .tox-textarea, +.tox .tox-toolbar-textfield { + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + background-color: #fff; + border-color: #cccccc; + border-radius: 3px; + border-style: solid; + border-width: 1px; + box-shadow: none; + box-sizing: border-box; + color: #222f3e; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; + font-size: 16px; + line-height: 24px; + margin: 0; + outline: none; + padding: 5px 4.75px; + resize: none; + width: 100%; +} +.tox .tox-textfield:focus, +.tox .tox-selectfield select:focus, +.tox .tox-textarea:focus { + border-color: #3498db; + box-shadow: none; + outline: none; +} +.tox .tox-toolbar-textfield { + border-width: 0; + margin-bottom: 3px; + margin-top: 2px; + max-width: 250px; +} +.tox .tox-toolbar-textfield + * { + margin-left: 4px; +} +.tox .tox-naked-btn { + background-color: transparent; + border: 0; + border-color: transparent; + box-shadow: unset; + color: #3498db; + cursor: pointer; + display: block; + margin: 0; + padding: 0; +} +.tox .tox-naked-btn svg { + display: block; + fill: #222f3e; +} +.tox-fullscreen { + border: 0; + height: 100%; + left: 0; + margin: 0; + overflow: hidden; + padding: 0; + position: fixed; + top: 0; + width: 100%; +} +.tox-fullscreen .tox .tox-statusbar__resize-handle { + display: none; +} +.tox-fullscreen .tox.tox-tinymce { + z-index: 1200; +} +.tox-fullscreen .tox.tox-tinymce-aux { + z-index: 1201; +} +.tox .tox-image-tools { + width: 100%; +} +.tox .tox-image-tools__toolbar { + align-items: center; + display: flex; + justify-content: center; +} +.tox .tox-image-tools__image { + background-color: #666; + height: 380px; + overflow: auto; + position: relative; + width: 100%; +} +.tox .tox-image-tools__image, +.tox .tox-image-tools__image + .tox-image-tools__toolbar { + margin-top: 8px; +} +.tox .tox-image-tools__image-bg { + background: url(data:image/gif;base64,R0lGODdhDAAMAIABAMzMzP///ywAAAAADAAMAAACFoQfqYeabNyDMkBQb81Uat85nxguUAEAOw==); +} +.tox .tox-image-tools__toolbar > .tox-slider:not(:first-of-type) { + margin-left: 8px; +} +.tox .tox-image-tools__toolbar > .tox-button + .tox-slider { + margin-left: 32px; +} +.tox .tox-image-tools__toolbar > .tox-slider + .tox-button { + margin-left: 32px; +} +.tox .tox-image-tools__toolbar > .tox-spacer { + flex: 1; + -ms-flex-preferred-size: auto; +} +.tox .tox-croprect-block { + background: black; + filter: alpha(opacity=50); + opacity: .5; + position: absolute; + zoom: 1; +} +.tox .tox-croprect-handle { + border: 2px solid white; + height: 20px; + left: 0; + position: absolute; + top: 0; + width: 20px; +} +.tox .tox-croprect-handle-move { + border: 0; + cursor: move; + position: absolute; +} +.tox .tox-croprect-handle-nw { + border-width: 2px 0 0 2px; + cursor: nw-resize; + left: 100px; + margin: -2px 0 0 -2px; + top: 100px; +} +.tox .tox-croprect-handle-ne { + border-width: 2px 2px 0 0; + cursor: ne-resize; + left: 200px; + margin: -2px 0 0 -20px; + top: 100px; +} +.tox .tox-croprect-handle-sw { + border-width: 0 0 2px 2px; + cursor: sw-resize; + left: 100px; + margin: -20px 2px 0 -2px; + top: 200px; +} +.tox .tox-croprect-handle-se { + border-width: 0 2px 2px 0; + cursor: se-resize; + left: 200px; + margin: -20px 0 0 -20px; + top: 200px; +} +.tox .tox-insert-table-picker { + display: flex; + flex-wrap: wrap; + width: 169px; +} +.tox .tox-insert-table-picker > div { + border-color: #cccccc; + border-style: solid; + border-width: 0 1px 1px 0; + box-sizing: content-box; + height: 16px; + width: 16px; +} +.tox .tox-insert-table-picker > div:nth-child(10n) { + border-right: 0; +} +.tox .tox-collection--list .tox-collection__group .tox-insert-table-picker { + margin: -4px 0; +} +.tox .tox-insert-table-picker .tox-insert-table-picker__selected { + background-color: rgba(52, 152, 219, 0.5); + border-color: rgba(52, 152, 219, 0.5); +} +.tox .tox-insert-table-picker__label { + color: rgba(34, 47, 62, 0.6); + display: block; + font-size: 14px; + padding: 4px; + text-align: center; + width: 100%; +} +.tox { + /* stylelint-disable */ + /* stylelint-enable */ +} +.tox .tox-menu { + background-color: #fff; + border: 1px solid #cccccc; + border-radius: 3px; + box-shadow: 0 4px 8px 0 rgba(34, 47, 62, 0.1); + display: inline-block; + overflow: hidden; + vertical-align: top; + z-index: 1; +} +.tox .tox-menu.tox-collection.tox-collection--list { + padding: 0; +} +.tox .tox-menu.tox-collection.tox-collection--toolbar { + padding: 4px; +} +.tox .tox-menu.tox-collection.tox-collection--grid { + padding: 4px; +} +.tox .tox-menu__label h1, +.tox .tox-menu__label h2, +.tox .tox-menu__label h3, +.tox .tox-menu__label h4, +.tox .tox-menu__label h5, +.tox .tox-menu__label h6, +.tox .tox-menu__label p, +.tox .tox-menu__label blockquote, +.tox .tox-menu__label code { + margin: 0; +} +.tox .tox-menubar { + background: url("data:image/svg+xml;charset=utf8,%3Csvg height='43px' viewBox='0 0 40 43px' width='40' xmlns='http://www.w3.org/2000/svg'%3E%3Crect x='0' y='42px' width='100' height='1' fill='%23cccccc'/%3E%3C/svg%3E") left 0 top 0 #fff; + background-color: #fff; + display: flex; + flex: 0 0 auto; + flex-shrink: 0; + flex-wrap: wrap; + margin-bottom: -1px; + padding: 0 4px; +} +.tox .tox-mbtn { + align-items: center; + background: none; + border: 0; + border-radius: 3px; + box-shadow: none; + color: #222f3e; + display: flex; + flex: 0 0 auto; + font-size: 14px; + font-style: normal; + font-weight: normal; + height: 34px; + justify-content: center; + margin: 2px 0 3px 0; + outline: none; + overflow: hidden; + padding: 0 4px; + text-transform: normal; + width: auto; +} +.tox .tox-mbtn[disabled] { + background-color: none; + border-color: none; + box-shadow: none; + color: rgba(34, 47, 62, 0.5); + cursor: not-allowed; +} +.tox .tox-mbtn:hover:not(:disabled) { + background: #dee0e2; + box-shadow: none; + color: #222f3e; +} +.tox .tox-mbtn:focus:not(:disabled) { + background: #dee0e2; + box-shadow: none; + color: #222f3e; +} +.tox .tox-mbtn--active { + background: #c8cbcf; + box-shadow: none; + color: #222f3e; +} +.tox .tox-mbtn__select-label { + cursor: default; + font-weight: normal; + margin: 0 4px; +} +.tox .tox-mbtn[disabled] .tox-mbtn__select-label { + cursor: not-allowed; +} +.tox .tox-mbtn__select-chevron { + align-items: center; + display: flex; + justify-content: center; + width: 16px; + display: none; +} +.tox .tox-notification { + background-color: #fff; + border-color: #c5c5c5; + border-style: solid; + border-width: 1px; + box-sizing: border-box; + display: -ms-grid; + display: grid; + -ms-grid-columns: minmax(40px, 1fr) auto minmax(40px, 1fr); + grid-template-columns: minmax(40px, 1fr) auto minmax(40px, 1fr); + margin-top: 5px; + opacity: 0; + padding: 5px; + transition: transform 100ms ease-in, opacity 150ms ease-in; +} +.tox .tox-notification--in { + opacity: 1; +} +.tox .tox-notification--success { + background-color: #dff0d8; + border-color: #d6e9c6; +} +.tox .tox-notification--error { + background-color: #f2dede; + border-color: #ebccd1; +} +.tox .tox-notification--warn { + background-color: #fcf8e3; + border-color: #faebcc; +} +.tox .tox-notification--info { + background-color: #d9edf7; + border-color: #779ecb; +} +.tox .tox-notification__body { + -ms-grid-row-align: center; + align-self: center; + color: #31708f; + font-size: 14px; + grid-column-end: 3; + -ms-grid-column-span: 1; + -ms-grid-column: 2; + grid-column-start: 2; + grid-row-end: 2; + -ms-grid-row: 1; + grid-row-start: 1; + text-align: center; + white-space: normal; + word-break: break-all; + word-break: break-word; +} +.tox .tox-notification__body > * { + margin: 0; +} +.tox .tox-notification__body > * + * { + margin-top: 1rem; +} +.tox .tox-notification__icon { + -ms-grid-row-align: center; + align-self: center; + -ms-grid-column-align: end; + grid-column-end: 2; + -ms-grid-column-span: 1; + -ms-grid-column: 1; + grid-column-start: 1; + grid-row-end: 2; + -ms-grid-row: 1; + grid-row-start: 1; + justify-self: end; +} +.tox .tox-notification__icon svg { + display: block; +} +.tox .tox-notification__dismiss { + -ms-grid-row-align: start; + align-self: start; + -ms-grid-column-align: end; + grid-column-end: 4; + -ms-grid-column-span: 1; + -ms-grid-column: 3; + grid-column-start: 3; + grid-row-end: 2; + -ms-grid-row: 1; + grid-row-start: 1; + justify-self: end; +} +.tox .tox-notification .tox-progress-bar { + -ms-grid-column-align: center; + grid-column-end: 4; + -ms-grid-column-span: 3; + -ms-grid-column: 1; + grid-column-start: 1; + grid-row-end: 3; + -ms-grid-row-span: 1; + -ms-grid-row: 2; + grid-row-start: 2; + justify-self: center; +} +.tox .tox-pop { + display: inline-block; + position: relative; +} +.tox .tox-pop--resizing { + transition: width .1s ease; +} +.tox .tox-pop--resizing .tox-toolbar { + flex-wrap: nowrap; +} +.tox .tox-pop__dialog { + background-color: #fff; + border: 1px solid #cccccc; + border-radius: 3px; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.15); + min-width: 0; + overflow: hidden; +} +.tox .tox-pop__dialog > *:not(.tox-toolbar) { + margin: 4px 4px 4px 8px; +} +.tox .tox-pop__dialog .tox-toolbar { + background-color: transparent; +} +.tox .tox-pop::before, +.tox .tox-pop::after { + border-style: solid; + content: ''; + display: block; + height: 0; + position: absolute; + width: 0; +} +.tox .tox-pop.tox-pop--bottom::before, +.tox .tox-pop.tox-pop--bottom::after { + left: 50%; + top: 100%; +} +.tox .tox-pop.tox-pop--bottom::after { + border-color: #fff transparent transparent transparent; + border-width: 8px; + margin-left: -8px; + margin-top: -1px; +} +.tox .tox-pop.tox-pop--bottom::before { + border-color: #cccccc transparent transparent transparent; + border-width: 9px; + margin-left: -9px; +} +.tox .tox-pop.tox-pop--top::before, +.tox .tox-pop.tox-pop--top::after { + left: 50%; + top: 0; + transform: translateY(-100%); +} +.tox .tox-pop.tox-pop--top::after { + border-color: transparent transparent #fff transparent; + border-width: 8px; + margin-left: -8px; + margin-top: 1px; +} +.tox .tox-pop.tox-pop--top::before { + border-color: transparent transparent #cccccc transparent; + border-width: 9px; + margin-left: -9px; +} +.tox .tox-pop.tox-pop--left::before, +.tox .tox-pop.tox-pop--left::after { + left: 0; + top: calc(50% - 1px); + transform: translateY(-50%); +} +.tox .tox-pop.tox-pop--left::after { + border-color: transparent #fff transparent transparent; + border-width: 8px; + margin-left: -15px; +} +.tox .tox-pop.tox-pop--left::before { + border-color: transparent #cccccc transparent transparent; + border-width: 10px; + margin-left: -19px; +} +.tox .tox-pop.tox-pop--right::before, +.tox .tox-pop.tox-pop--right::after { + left: 100%; + top: calc(50% + 1px); + transform: translateY(-50%); +} +.tox .tox-pop.tox-pop--right::after { + border-color: transparent transparent transparent #fff; + border-width: 8px; + margin-left: -1px; +} +.tox .tox-pop.tox-pop--right::before { + border-color: transparent transparent transparent #cccccc; + border-width: 10px; + margin-left: -1px; +} +.tox .tox-pop.tox-pop--align-left::before, +.tox .tox-pop.tox-pop--align-left::after { + left: 20px; +} +.tox .tox-pop.tox-pop--align-right::before, +.tox .tox-pop.tox-pop--align-right::after { + left: calc(100% - 20px); +} +.tox .tox-sidebar-wrap { + display: flex; + flex-direction: row; + flex-grow: 1; + min-height: 0; +} +.tox .tox-sidebar { + display: flex; + flex-direction: row; + justify-content: flex-end; +} +.tox .tox-sidebar__slider { + display: flex; + overflow: hidden; +} +.tox .tox-sidebar__pane-container { + display: flex; +} +.tox .tox-sidebar__pane { + display: flex; +} +.tox .tox-sidebar--sliding-closed { + opacity: 0; +} +.tox .tox-sidebar--sliding-open { + opacity: 1; +} +.tox .tox-sidebar--sliding-growing, +.tox .tox-sidebar--sliding-shrinking { + transition: width .5s ease, opacity .5s ease; +} +.tox .tox-slider { + align-items: center; + display: flex; + flex: 1; + -ms-flex-preferred-size: auto; + height: 24px; + justify-content: center; + position: relative; +} +.tox .tox-slider__rail { + background-color: transparent; + border: 1px solid #cccccc; + border-radius: 6px; + height: 6px; + min-width: 120px; + width: 100%; +} +.tox .tox-slider__handle { + background-color: #3498db; + border-radius: 1.5px; + box-shadow: none; + height: 24px; + left: 50%; + position: absolute; + top: 50%; + transform: translateX(-50%) translateY(-50%); + width: 3px; +} +.tox .tox-source-code { + overflow: auto; +} +.tox .tox-spinner { + display: flex; +} +.tox .tox-spinner > div { + animation: tam-bouncing-dots 1.5s ease-in-out 0s infinite both; + background-color: rgba(34, 47, 62, 0.6); + border-radius: 100%; + height: 8px; + width: 8px; +} +.tox .tox-spinner > div:nth-child(1) { + animation-delay: -0.32s; +} +.tox .tox-spinner > div:nth-child(2) { + animation-delay: -0.16s; +} +.tox .tox-spinner > div:not(:first-child) { + margin-left: 4px; +} +@keyframes tam-bouncing-dots { + 0%, + 80%, + 100% { + transform: scale(0); + } + 40% { + transform: scale(1); + } +} +.tox .tox-statusbar { + align-items: center; + background-color: #fff; + border-top: 1px solid #cccccc; + color: rgba(34, 47, 62, 0.6); + display: flex; + flex: 0 0 auto; + font-size: 12px; + height: 18px; + overflow: hidden; + padding: 0 8px; + position: relative; + text-transform: uppercase; +} +.tox .tox-statusbar a { + color: rgba(34, 47, 62, 0.6); + text-decoration: none; +} +.tox .tox-statusbar a:hover { + text-decoration: underline; +} +.tox .tox-statusbar__text-container { + display: flex; + flex: 1 1 auto; + justify-content: flex-end; + overflow: hidden; +} +.tox .tox-statusbar__path { + display: flex; + flex: 1 1 auto; + margin-right: auto; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} +.tox .tox-statusbar__path > * { + display: inline; + margin-right: 4px; + white-space: nowrap; +} +.tox .tox-statusbar__wordcount, +.tox .tox-statusbar__branding { + flex: 0 0 auto; + margin-left: 1ch; +} +.tox .tox-statusbar__resize-handle { + align-items: flex-end; + align-self: stretch; + cursor: nwse-resize; + display: flex; + flex: 0 0 auto; + justify-content: flex-end; + margin-left: auto; + margin-right: -8px; + padding-left: 1ch; +} +.tox .tox-statusbar__resize-handle svg { + display: block; + fill: rgba(34, 47, 62, 0.6); +} +.tox .tox-tbtn { + align-items: center; + background: none; + border: 0; + border-radius: 3px; + box-shadow: none; + color: #222f3e; + display: flex; + flex: 0 0 auto; + font-size: 14px; + font-style: normal; + font-weight: normal; + height: 34px; + justify-content: center; + margin: 2px 0 3px 0; + outline: none; + overflow: hidden; + padding: 0; + text-transform: normal; + width: 34px; +} +.tox .tox-tbtn svg { + display: block; + fill: #222f3e; +} +.tox .tox-tbtn.tox-tbtn-more { + padding-left: 5px; + padding-right: 5px; + width: inherit; +} +.tox .tox-tbtn + .tox-tbtn { + margin-left: 0; +} +.tox .tox-tbtn--enabled { + background: #c8cbcf; + box-shadow: none; + color: #222f3e; +} +.tox .tox-tbtn--enabled > * { + transform: none; +} +.tox .tox-tbtn--enabled svg { + fill: #222f3e; +} +.tox .tox-tbtn:hover { + background: #dee0e2; + box-shadow: none; + color: #222f3e; +} +.tox .tox-tbtn:hover svg { + fill: #222f3e; +} +.tox .tox-tbtn:focus { + background: #dee0e2; + box-shadow: none; + color: #222f3e; +} +.tox .tox-tbtn:focus svg { + fill: #222f3e; +} +.tox .tox-tbtn:active { + background: #c8cbcf; + box-shadow: none; + color: #222f3e; +} +.tox .tox-tbtn:active svg { + fill: #222f3e; +} +.tox .tox-tbtn--disabled, +.tox .tox-tbtn--disabled:hover, +.tox .tox-tbtn:disabled, +.tox .tox-tbtn:disabled:hover { + background: none; + box-shadow: none; + color: rgba(34, 47, 62, 0.5); + cursor: not-allowed; +} +.tox .tox-tbtn--disabled svg, +.tox .tox-tbtn--disabled:hover svg, +.tox .tox-tbtn:disabled svg, +.tox .tox-tbtn:disabled:hover svg { + /* stylelint-disable-line no-descending-specificity */ + fill: rgba(34, 47, 62, 0.5); +} +.tox .tox-tbtn:active > * { + transform: none; +} +.tox .tox-tbtn--md { + height: 51px; + width: 51px; +} +.tox .tox-tbtn--lg { + flex-direction: column; + height: 68px; + width: 68px; +} +.tox .tox-tbtn--return { + -ms-grid-row-align: stretch; + align-self: stretch; + height: unset; + width: 16px; +} +.tox .tox-tbtn--labeled { + padding: 0 4px; + width: unset; +} +.tox .tox-tbtn__vlabel { + display: block; + font-size: 10px; + font-weight: normal; + letter-spacing: -0.025em; + margin-bottom: 4px; + white-space: nowrap; +} +.tox .tox-tbtn--select { + margin: 2px 0 3px 0; + padding: 0 4px; + width: auto; +} +.tox .tox-tbtn__select-label { + cursor: default; + font-weight: normal; + margin: 0 4px; +} +.tox .tox-tbtn__select-chevron { + align-items: center; + display: flex; + justify-content: center; + width: 16px; +} +.tox .tox-tbtn__select-chevron svg { + fill: rgba(34, 47, 62, 0.6); +} +.tox .tox-tbtn--bespoke .tox-tbtn__select-label { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + width: 7em; +} +.tox .tox-split-button { + border: 0; + border-radius: 3px; + box-sizing: border-box; + display: flex; + margin: 2px 0 3px 0; + overflow: hidden; +} +.tox .tox-split-button:hover { + box-shadow: 0 0 0 1px #dee0e2 inset; +} +.tox .tox-split-button:focus { + background: #dee0e2; + box-shadow: none; + color: #222f3e; +} +.tox .tox-split-button > * { + border-radius: 0; +} +.tox .tox-split-button__chevron { + width: 16px; +} +.tox .tox-split-button__chevron svg { + fill: rgba(34, 47, 62, 0.6); +} +.tox .tox-pop .tox-split-button__chevron svg { + transform: rotate(-90deg); +} +.tox .tox-split-button .tox-tbtn { + margin: 0; +} +.tox .tox-split-button.tox-tbtn--disabled:hover, +.tox .tox-split-button.tox-tbtn--disabled:focus, +.tox .tox-split-button.tox-tbtn--disabled .tox-tbtn:hover, +.tox .tox-split-button.tox-tbtn--disabled .tox-tbtn:focus { + background: none; + box-shadow: none; + color: rgba(34, 47, 62, 0.5); +} +.tox .tox-toolbar, +.tox .tox-toolbar__primary, +.tox .tox-toolbar__overflow { + background: url("data:image/svg+xml;charset=utf8,%3Csvg height='39px' viewBox='0 0 40 39px' width='40' xmlns='http://www.w3.org/2000/svg'%3E%3Crect x='0' y='38px' width='100' height='1' fill='%23cccccc'/%3E%3C/svg%3E") left 0 top 0 #fff; + background-color: #fff; + border-top: 1px solid #cccccc; + display: flex; + flex: 0 0 auto; + flex-shrink: 0; + flex-wrap: wrap; + margin-bottom: -1px; + padding: 0 0; +} +.tox .tox-toolbar__overflow.tox-toolbar__overflow--closed { + display: none; +} +.tox .tox-pop .tox-toolbar { + border-width: 0; +} +.tox .tox-toolbar--no-divider { + background-image: none; +} +.tox.tox-tinymce-aux .tox-toolbar__overflow { + border-left: 1px solid #cccccc; + border-radius: 6px; + border-right: 1px solid #cccccc; +} +.tox .tox-toolbar__group { + align-items: center; + display: flex; + flex-wrap: wrap; + margin: 0 0; + padding: 0 4px; +} +.tox .tox-toolbar__group:not(:last-of-type) { + border-right: 1px solid #cccccc; +} +.tox .tox-toolbar__group--pull-right { + margin-left: auto; +} +.tox .tox-tooltip { + display: inline-block; + padding: 8px; + position: relative; +} +.tox .tox-tooltip__body { + background-color: #222f3e; + border-radius: 3px; + box-shadow: 0 2px 4px rgba(34, 47, 62, 0.3); + color: rgba(255, 255, 255, 0.75); + font-size: 14px; + font-style: normal; + font-weight: normal; + padding: 4px 8px; + text-transform: normal; +} +.tox .tox-tooltip__arrow { + position: absolute; +} +.tox .tox-tooltip--down .tox-tooltip__arrow { + border-left: 8px solid transparent; + border-right: 8px solid transparent; + border-top: 8px solid #222f3e; + bottom: 0; + left: 50%; + position: absolute; + transform: translateX(-50%); +} +.tox .tox-tooltip--up .tox-tooltip__arrow { + border-bottom: 8px solid #222f3e; + border-left: 8px solid transparent; + border-right: 8px solid transparent; + left: 50%; + position: absolute; + top: 0; + transform: translateX(-50%); +} +.tox .tox-tooltip--right .tox-tooltip__arrow { + border-bottom: 8px solid transparent; + border-left: 8px solid #222f3e; + border-top: 8px solid transparent; + position: absolute; + right: 0; + top: 50%; + transform: translateY(-50%); +} +.tox .tox-tooltip--left .tox-tooltip__arrow { + border-bottom: 8px solid transparent; + border-right: 8px solid #222f3e; + border-top: 8px solid transparent; + left: 0; + position: absolute; + top: 50%; + transform: translateY(-50%); +} +.tox .tox-well { + border: 1px solid #cccccc; + border-radius: 3px; + padding: 8px; + width: 100%; +} +.tox .tox-well > *:first-child { + margin-top: 0; +} +.tox .tox-well > *:last-child { + margin-bottom: 0; +} +.tox .tox-well > *:only-child { + margin: 0; +} +.tox .tox-custom-editor { + border: 1px solid #cccccc; + border-radius: 3px; + display: flex; + height: 525px; +} +/* stylelint-disable */ +.tox { + /* stylelint-enable */ +} +.tox .tox-dialog-loading::before { + background-color: rgba(0, 0, 0, 0.5); + content: ""; + height: 100%; + position: absolute; + width: 100%; + z-index: 1000; +} +.tox .tox-tab { + cursor: pointer; +} +.tox .tox-dialog__content-js { + display: flex; + flex: 1; + -ms-flex-preferred-size: auto; +} +.tox .tox-dialog__body-content .tox-collection { + display: flex; + flex: 1; + -ms-flex-preferred-size: auto; +} +.tox ul { + display: block; + list-style-type: disc; + -webkit-margin-before: 1em; + margin-block-start: 1em; + -webkit-margin-after: 1em; + margin-block-end: 1em; + -webkit-margin-start: 0px; + margin-inline-start: 0px; + -webkit-margin-end: 0px; + margin-inline-end: 0px; + -webkit-padding-start: 40px; + padding-inline-start: 40px; +} +.tox a { + cursor: pointer; + color: #2276d2; +} +.tox .tox-image-tools-edit-panel { + height: 60px; +} +.tox .tox-image-tools__sidebar { + height: 60px; +} diff --git a/ant-design-jeecg-vue/src/api/api.js b/ant-design-jeecg-vue/src/api/api.js index 19a4b00..5306ff0 100644 --- a/ant-design-jeecg-vue/src/api/api.js +++ b/ant-design-jeecg-vue/src/api/api.js @@ -1,17 +1,17 @@ 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 doMian = "/jeecg-boot/"; +////图片预览请求地址 +// const imgView = "http://localhost: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 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); @@ -20,8 +20,8 @@ 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 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); @@ -32,37 +32,41 @@ 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 deletePermission = (params)=>deleteAction("/sys/permission/delete",params); +// const deletePermissionList = (params)=>deleteAction("/sys/permission/deleteBatch",params); const queryTreeList = (params)=>getAction("/sys/permission/queryTreeList",params); +const queryTreeListForRole = (params)=>getAction("/sys/role/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 getPermissionRuleList = (params)=>getAction("/sys/permission/getPermRuleListByPermId",params); +const queryPermissionRule = (params)=>getAction("/sys/permission/queryPermissionRule",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 deleteByDepartId = (params)=>deleteAction("/sysdepart/sysDepart/delete",params); //日志管理 -const getLogList = (params)=>getAction("/sys/log/list",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 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 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); +//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); @@ -72,29 +76,32 @@ const doReleaseData = (params)=>getAction("/sys/annountCement/doReleaseData",par const doReovkeData = (params)=>getAction("/sys/annountCement/doReovkeData",params); //获取系统访问量 const getLoginfo = (params)=>getAction("/sys/loginfo",params); +//数据日志访问 +// const getDataLogList = (params)=>getAction("/sys/dataLog/list",params); + +// 根据部门主键查询用户信息 +const queryUserByDepId = (params)=>getAction("/sys/user/queryUserByDepId",params); + +// 查询用户角色表里的所有信息 +const queryUserRoleMap = (params)=>getAction("/sys/user/queryUserRoleMap",params); +// 重复校验 +const duplicateCheck = (params)=>getAction("/sys/duplicate/check",params); export { - imgView, - doMian, + // imgView, + // doMian, addRole, editRole, - getRoleList, - deleteRole, - deleteRoleList, checkRoleCode, addUser, editUser, queryUserRole, - queryall, getUserList, - deleteUser, - deleteUserList, + queryall, frozenBatch, checkUsername, changPassword, getPermissionList, - deletePermission, - deletePermissionList, addPermission, editPermission, queryTreeList, @@ -103,26 +110,27 @@ export { saveRolePermission, queryPermissionsByUser, loadAllRoleIds, + getPermissionRuleList, + queryPermissionRule, queryDepartTreeList, queryIdTree, queryParentName, searchByKeywords, - getLogList, + deleteByDepartId, deleteLog, deleteLogList, - getDictList, addDict, editDict, - delDict, treeList, - getDictItemList, addDictItem, editDictItem, - delDictItem, - delDictItemList, doReleaseData, doReovkeData, - getLoginfo + getLoginfo, + queryUserByDepId, + queryUserRoleMap, + duplicateCheck, + queryTreeListForRole } diff --git a/ant-design-jeecg-vue/src/api/index.js b/ant-design-jeecg-vue/src/api/index.js index 53d4985..35367e2 100644 --- a/ant-design-jeecg-vue/src/api/index.js +++ b/ant-design-jeecg-vue/src/api/index.js @@ -1,6 +1,6 @@ const api = { Login: '/sys/login', - Logout: '/auth/logout', + Logout: '/sys/logout', ForgePassword: '/auth/forge-password', Register: '/auth/register', SendSms: '/account/sms', diff --git a/ant-design-jeecg-vue/src/api/login.js b/ant-design-jeecg-vue/src/api/login.js index 9e72c42..f5b306b 100644 --- a/ant-design-jeecg-vue/src/api/login.js +++ b/ant-design-jeecg-vue/src/api/login.js @@ -38,12 +38,13 @@ export function getInfo() { }) } -export function logout() { +export function logout(logoutToken) { return axios({ - url: '/api/auth/logout', + url: '/sys/logout', method: 'post', headers: { - 'Content-Type': 'application/json;charset=UTF-8' + 'Content-Type': 'application/json;charset=UTF-8', + 'X-Access-Token': logoutToken } }) } \ 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 index cc50518..f0e1438 100644 --- a/ant-design-jeecg-vue/src/api/manage.js +++ b/ant-design-jeecg-vue/src/api/manage.js @@ -97,3 +97,18 @@ export function saveService(parameter) { }) } +/** + * 下载文件 用于excel导出 + * @param url + * @param parameter + * @returns {*} + */ +export function downFile(url,parameter){ + return axios({ + url: url, + params: parameter, + method:'get' , + responseType: 'blob' + }) +} + diff --git a/ant-design-jeecg-vue/src/assets/less/common.css b/ant-design-jeecg-vue/src/assets/less/common.css new file mode 100644 index 0000000..717295a --- /dev/null +++ b/ant-design-jeecg-vue/src/assets/less/common.css @@ -0,0 +1,29 @@ + +/*列表上方操作按钮*/ +.ant-card-body .table-operator { + margin-bottom: 18px; +} + +/*列表td的padding设置 可以控制列表大小*/ +.ant-table-tbody .ant-table-row td { + padding-top: 15px; + padding-bottom: 15px; +} + +/*列表页面弹出modal*/ +.ant-modal-cust-warp { + height: 100% +} + +/*弹出modal Y轴滚动条*/ +.ant-modal-cust-warp .ant-modal-body { + height: calc(100% - 110px) !important; + overflow-y: auto +} + +/*弹出modal 先有content后有body 故滚动条控制在body上*/ +.ant-modal-cust-warp .ant-modal-content { + height: 90% !important; + overflow-y: hidden +} + diff --git a/ant-design-jeecg-vue/src/assets/less/index.less b/ant-design-jeecg-vue/src/assets/less/index.less index ec5420d..f086f5f 100644 --- a/ant-design-jeecg-vue/src/assets/less/index.less +++ b/ant-design-jeecg-vue/src/assets/less/index.less @@ -1,3 +1,6 @@ +/** + * 列表查询通用样式,移动端自适应 + */ .search{ margin-bottom: 54px; } @@ -19,3 +22,7 @@ i { cursor: pointer; } +.trcolor{ + background-color: rgba(255, 192, 203, 0.31); + color:red; +} diff --git a/ant-design-jeecg-vue/src/assets/logo.png b/ant-design-jeecg-vue/src/assets/logo.png index e887375..1a55a53 100644 Binary files a/ant-design-jeecg-vue/src/assets/logo.png and b/ant-design-jeecg-vue/src/assets/logo.png differ diff --git a/ant-design-jeecg-vue/src/components/README.md b/ant-design-jeecg-vue/src/components/README.md new file mode 100644 index 0000000..4adb107 --- /dev/null +++ b/ant-design-jeecg-vue/src/components/README.md @@ -0,0 +1,41 @@ +####1._util包:存放自定义函数 详细见代码注释 +####2.AvatarList:显示头像群并支持tip,用法参考src\views\Home.vue(如下图) + +####3.chart包:存放各种图表相关的组件,条形图柱形图折线图等等 具体用法参考首页 +####4.countDown包:一个倒计时组件,用法参考home页,简单描述,该组件有3个属性, +target(时间/毫秒数)必填, +format(function,该方法接收一个毫秒数的参数,用于格式化显示当前倒计时时间)非必填, +onEnd倒计时结束触发函数 + +####5.dict包:数据字典专用,用法参考文件夹下readme文件 +####6.Ellipsis包:字符串截取组件,可以指定字符串的显示长度,并将全部内容显示到tip中,简单使用参考src\views\system\PermissionList.vue +####7.jeecg包:该包下自定义了很多列表/表单中用到的组件 参考包下readme文件 +####8.jeecgbiz包:该包下定义了一些业务相关的组件,比如选择用户弹框,根据部门选择用户等等 +####9.layouts+page包:系统页面布局相关组件,比如登陆进去之后页面顶部显示什么,底部显示什么,菜单点击触发多个tab的布局等等 一般情况不需要修改 +####10.menun包:菜单组件,俩个,一个折叠菜单一个正常显示的菜单 +####11.NumberInfo:数字信息显示组件 如下图 + +####12.online包:该包下封装了online表单的相关组件,用于展示表单各种控件,验证表单等等,相关用法参考readme +####13.setting包:该包下封装了首页风格切换等功能如下图 + +####14.table包:一个二次封装的table组件,用于展示列表,参考readme +####15.tools包: +Breadcrumb.vue:面包屑二次封装,支持路由跳转 +DetailList.vue:详情展示用法参考src\views\profile\advanced\Advanced.vue(效果如下图) + +```` +个人认为该页面代码有两点值得学习: +1.vue provide/inject的使用 +2.该页面css定义方式,只定义一个顶层class,其余样式都定义在其下,这样只要顶层class不和别的页面冲突,整个页面的样式都是唯一生效的 +```` +FooterToolBar.vue:fixed定位的底部,通过是否定义内部控件的属性slot="extra"决定是左浮动或是右浮动 +HeaderNotice.vue:首页通知(如下图) + +HeaderInfo.vue:上下文字布局(如下图) + +Logo.vue:首页左上侧的log图 + +UserMenu.vue:首页右上侧的内容 + +####16.trend包 趋势显示组件(如下图) + diff --git a/ant-design-jeecg-vue/src/components/_util/StringUtil.js b/ant-design-jeecg-vue/src/components/_util/StringUtil.js index 29aed19..3f52598 100644 --- a/ant-design-jeecg-vue/src/components/_util/StringUtil.js +++ b/ant-design-jeecg-vue/src/components/_util/StringUtil.js @@ -1,4 +1,8 @@ - +/** + * 获取字符串的长度ascii长度为1 中文长度为2 + * @param str + * @returns {number} + */ export const getStrFullLength = (str = '') => str.split('').reduce((pre, cur) => { const charCode = cur.charCodeAt(0) @@ -8,6 +12,12 @@ export const getStrFullLength = (str = '') => return pre + 2 }, 0) +/** + * 给定一个字符串和一个长度,将此字符串按指定长度截取 + * @param str + * @param maxLength + * @returns {string} + */ export const cutStrByFullLength = (str = '', maxLength) => { let showLength = 0 return str.split('').reduce((pre, cur) => { diff --git a/ant-design-jeecg-vue/src/components/chart/AreaChartTy.vue b/ant-design-jeecg-vue/src/components/chart/AreaChartTy.vue new file mode 100644 index 0000000..ea1b42f --- /dev/null +++ b/ant-design-jeecg-vue/src/components/chart/AreaChartTy.vue @@ -0,0 +1,68 @@ +<template> + <div :style="{ padding: '0 0 32px 32px' }"> + <h4 :style="{ marginBottom: '20px' }">{{ title }}</h4> + + <v-chart ref="chart" :forceFit="true" :height="height" :data="dataSource" :scale="scale"> + <v-tooltip/> + <v-axis/> + <v-line position="x*y" :size="lineSize"/> + <v-area position="x*y"/> + </v-chart> + + </div> +</template> + +<script> + import { triggerWindowResizeEvent } from '@/utils/util' + + export default { + name: 'AreaChartTy', + props: { + // 图表数据 + dataSource: { + type: Array, + required: true + }, + // 图表标题 + title: { + type: String, + default: '' + }, + // x 轴别名 + x: { + type: String, + default: 'x' + }, + // y 轴别名 + y: { + type: String, + default: 'y' + }, + // 图表高度 + height: { + type: Number, + default: 254 + }, + // 线的粗细 + lineSize: { + type: Number, + default: 2 + } + }, + computed: { + scale() { + return [ + { dataKey: 'x', title: this.x, alias: this.x }, + { dataKey: 'y', title: this.y, alias: this.y } + ] + } + }, + mounted() { + triggerWindowResizeEvent() + } + } +</script> + +<style lang="scss" scoped> + @import "chart"; +</style> \ 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 index 0a103c6..0b0f096 100644 --- a/ant-design-jeecg-vue/src/components/chart/Bar.vue +++ b/ant-design-jeecg-vue/src/components/chart/Bar.vue @@ -1,57 +1,38 @@ <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-chart :forceFit="true" :height="height" :data="dataSource" :padding="padding"> + <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 - }] + import { triggerWindowResizeEvent } from '@/utils/util' export default { - name: "Bar", + name: 'Bar', props: { + dataSource: { + type: Array, + required: true + }, title: { type: String, default: '' + }, + height: { + type: Number, + default: 254 } }, - data () { - return { - data, - scale, - tooltip - } + data() { + return { padding: ['auto', 'auto', '40', '50'] } + }, + mounted() { + triggerWindowResizeEvent() } } </script> \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/components/chart/BarMultid.vue b/ant-design-jeecg-vue/src/components/chart/BarMultid.vue new file mode 100644 index 0000000..1edfac3 --- /dev/null +++ b/ant-design-jeecg-vue/src/components/chart/BarMultid.vue @@ -0,0 +1,79 @@ +<template> + <div :style="{ padding: '0 0 32px 32px' }"> + <h4 :style="{ marginBottom: '20px' }">{{ title }}</h4> + <v-chart :forceFit="true" :height="height" :data="data" :padding="['auto', 'auto', '40', '50']"> + <v-tooltip /> + <v-axis /> + <v-legend /> + <v-bar position="x*y" color="type" :adjust="adjust" /> + </v-chart> + </div> +</template> + +<script> + import { DataSet } from '@antv/data-set' + + const sourceDataConst = [ + { type: 'Jeecg', 'Jan.': 18.9, 'Feb.': 28.8, 'Mar.': 39.3, 'Apr.': 81.4, 'May': 47, 'Jun.': 20.3, 'Jul.': 24, 'Aug.': 35.6 }, + { type: 'Jeebt', 'Jan.': 12.4, 'Feb.': 23.2, 'Mar.': 34.5, 'Apr.': 99.7, 'May': 52.6, 'Jun.': 35.5, 'Jul.': 37.4, 'Aug.': 42.4 } + ]; + const fieldsConst = ['Jan.', 'Feb.', 'Mar.', 'Apr.', 'May', 'Jun.', 'Jul.', 'Aug.']; + export default { + name: 'BarMultid', + props: { + title: { + type: String, + default: '' + }, + dataSource:{ + type:Array, + default:()=>[] + }, + fields:{ + type:Array, + default:()=>[] + }, + height: { + type: Number, + default: 254 + } + }, + data() { + return { + data:"", + adjust: [{ + type: 'dodge', + marginRatio: 1 / 32, + }], + }; + }, + watch: { + 'dataSource': function () { + this.drawChart(); + } + }, + mounted(){ + this.drawChart() + }, + methods:{ + drawChart(){ + let temp = sourceDataConst; + if(this.dataSource && this.dataSource.length>0){ + temp = this.dataSource + } + const dv = new DataSet.View().source(temp); + dv.transform({ + type: 'fold', + fields:(!this.fields||this.fields.length==0)?fieldsConst:this.fields, + key: 'x', + value: 'y', + }); + this.data=dv.rows; + } + } + } +</script> + +<style scoped> + +</style> \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/components/chart/DashChartDemo.vue b/ant-design-jeecg-vue/src/components/chart/DashChartDemo.vue new file mode 100644 index 0000000..101c9f7 --- /dev/null +++ b/ant-design-jeecg-vue/src/components/chart/DashChartDemo.vue @@ -0,0 +1,190 @@ +<template> + <div :style="{ padding: '0 0 32px 32px' }"> + <v-chart :forceFit="true" :height="height" :data="data" :scale="scale"> + <v-coord type="polar" :startAngle="-202.5" :endAngle="22.5" :radius="0.75"></v-coord> + <v-axis + dataKey="value" + :zIndex="2" + :line="null" + :label="axisLabel" + :subTickCount="4" + :subTickLine="axisSubTickLine" + :tickLine="axisTickLine" + :grid="null" + ></v-axis> + <v-axis dataKey="1" :show="false"></v-axis> + <v-series + gemo="point" + position="value*1" + shape="pointer" + color="#1890FF" + :active="false" + ></v-series> + <v-guide + type="arc" + :zIndex="0" + :top="false" + :start="arcGuide1Start" + :end="arcGuide1End" + :vStyle="arcGuide1Style" + ></v-guide> + <v-guide + type="arc" + :zIndex="1" + :start="arcGuide2Start" + :end="getArcGuide2End" + :vStyle="arcGuide2Style" + ></v-guide> + <v-guide + type="html" + :position="htmlGuidePosition" + :html="getHtmlGuideHtml()" + ></v-guide> + </v-chart> + </div> +</template> + +<script> + import {registerShape} from 'viser-vue'; + + registerShape('point', 'pointer', { + draw(cfg, container) { + let point = cfg.points[0]; + point = this.parsePoint(point); + const center = this.parsePoint({ + x: 0, + y: 0, + }); + container.addShape('line', { + attrs: { + x1: center.x, + y1: center.y, + x2: point.x, + y2: point.y + 15, + stroke: cfg.color, + lineWidth: 5, + lineCap: 'round', + } + }); + return container.addShape('circle', { + attrs: { + x: center.x, + y: center.y, + r: 9.75, + stroke: cfg.color, + lineWidth: 4.5, + fill: '#fff', + } + }); + } + }); + + const scale = [{ + dataKey: 'value', + min: 0, + max: 9, + tickInterval: 1, + nice: false, + }]; + + const sourceData = [ + {value: 6.7}, + ]; + + export default { + name: "DashChartDemo", + props: { + value: { + type: Number, + default: 6.7 + }, + title: { + type: String, + default: '' + }, + height: { + type: Number, + default: 254 + } + }, + created() { + if (!this.value) { + this.data = sourceData; + } else { + this.data = [ + {value: this.value}, + ]; + } + this.getData() + }, + watch: { + 'value': function (val) { + this.data = [ + {value: val}, + ]; + this.getData(); + } + }, + methods: { + getData() { + if (this.data && this.data.length > 0) { + this.abcd = this.data[0].value * 10 + } else { + this.abcd = 70 + } + }, + getHtmlGuideHtml() { + return '<div style="width: 300px;text-align: center;">\n' + + '<p style="font-size: 14px;color: #545454;margin: 0;">' + this.title + '</p>\n' + + '<p style="font-size: 36px;color: #545454;margin: 0;">' + this.abcd + '%</p>\n' + + '</div>' + }, + getArcGuide2End() { + return [this.data[0].value, 0.945] + } + }, + data() { + return { + data: [], + scale: scale, + abcd: 70, + axisLabel: { + offset: -16, + textStyle: { + fontSize: 18, + textAlign: 'center', + textBaseline: 'middle' + } + }, + axisSubTickLine: { + length: -8, + stroke: '#fff', + strokeOpacity: 1, + }, + axisTickLine: { + length: -17, + stroke: '#fff', + strokeOpacity: 1, + }, + arcGuide1Start: [0, 0.945], + arcGuide1End: [9, 0.945], + arcGuide1Style: { + stroke: '#CBCBCB', + lineWidth: 18, + }, + arcGuide2Start: [0, 0.945], + arcGuide2Style: { + stroke: '#1890FF', + lineWidth: 18, + }, + htmlGuidePosition: ['50%', '100%'], + htmlGuideHtml: ` + <div style="width: 300px;text-align: center;"> + <p style="font-size: 14px;color: #545454;margin: 0;">${this.title}</p> + <p style="font-size: 36px;color: #545454;margin: 0;">${this.abcd}%</p> + </div> + `, + }; + }, + }; +</script> diff --git a/ant-design-jeecg-vue/src/components/chart/LineChartMultid.vue b/ant-design-jeecg-vue/src/components/chart/LineChartMultid.vue new file mode 100644 index 0000000..66e6138 --- /dev/null +++ b/ant-design-jeecg-vue/src/components/chart/LineChartMultid.vue @@ -0,0 +1,100 @@ +<template> + <div :style="{ padding: '0 0 32px 32px' }"> + <h4 :style="{ marginBottom: '20px' }">{{ title }}</h4> + <v-chart :force-fit="true" :height="height" :data="data" :scale="scale" :padding="['auto', 'auto', '40', '50']"> + <v-tooltip /> + <v-axis /> + <v-legend /> + <v-line position="type*y" color="x" /> + <v-point position="type*y" color="x" :size="4" :v-style="style" :shape="'circle'" /> + </v-chart> + </div> +</template> + +<script> + import { DataSet } from '@antv/data-set' + + const sourceDataConst = [ + { type: 'Jan', jeecg: 7.0, jeebt: 3.9 }, + { type: 'Feb', jeecg: 6.9, jeebt: 4.2 }, + { type: 'Mar', jeecg: 9.5, jeebt: 5.7 }, + { type: 'Apr', jeecg: 14.5, jeebt: 8.5 }, + { type: 'May', jeecg: 18.4, jeebt: 11.9 }, + { type: 'Jun', jeecg: 21.5, jeebt: 15.2 }, + { type: 'Jul', jeecg: 25.2, jeebt: 17.0 }, + { type: 'Aug', jeecg: 26.5, jeebt: 16.6 }, + { type: 'Sep', jeecg: 23.3, jeebt: 14.2 }, + { type: 'Oct', jeecg: 18.3, jeebt: 10.3 }, + { type: 'Nov', jeecg: 13.9, jeebt: 6.6 }, + { type: 'Dec', jeecg: 9.6, jeebt: 4.8 } + ]; + + + + export default { + name: 'LineChartMultid', + props: { + title: { + type: String, + default: '' + }, + dataSource:{ + type:Array, + default:()=>[] + }, + fields:{ + type:Array, + default: () => ['jeecg', 'jeebt'] + }, + height:{ + type:Number, + default:254 + } + }, + data() { + return { + data:"", + scale: [{ + dataKey: 'x', + min: 0, + max: 1 + }], + style: { stroke: '#fff', lineWidth: 1 }, + }; + }, + watch: { + 'dataSource': function () { + this.drawChart(); + } + }, + mounted(){ + this.drawChart() + }, + methods:{ + drawChart(){ + let temp = sourceDataConst; + if (this.dataSource && this.dataSource.length > 0) { + temp = this.dataSource.map(item => { + // 为了防止直接修改源数据导致报错 + let obj = Object.assign({}, item) + obj.type = obj.x + return obj + }) + } + const dv = new DataSet.View().source(temp); + dv.transform({ + type: 'fold', + fields: this.fields, + key: 'x', + value: 'y', + }); + + this.data=dv.rows; + } + } + } +</script> + +<style scoped> + +</style> \ 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 index fdf58ee..85e5b61 100644 --- a/ant-design-jeecg-vue/src/components/chart/Liquid.vue +++ b/ant-design-jeecg-vue/src/components/chart/Liquid.vue @@ -1,19 +1,19 @@ <template> <div> - <v-chart - :forceFit="true" - :height="height" - :width="width" - :data="data" - :scale="scale" + <v-chart + :forceFit="true" + :height="height" + :width="width" + :data="data" + :scale="scale" :padding="0"> - <v-tooltip /> + <v-tooltip/> <v-interval :shape="['liquid-fill-gauge']" position="transfer*value" color="" :v-style="{ - lineWidth: 10, + lineWidth: 8, opacity: 0.75 }" :tooltip="[ @@ -47,8 +47,15 @@ </template> <script> + + const sourceDataConst = [ + { transfer: '一月', value: 813 }, + { transfer: '二月', value: 233 }, + { transfer: '三月', value: 561 } + ] + export default { - name: "Liquid", + name: 'Liquid', props: { height: { type: Number, @@ -58,6 +65,12 @@ type: Number, default: 0 } + }, + data() { + return { + data: sourceDataConst, + scale: [] + } } } </script> diff --git a/ant-design-jeecg-vue/src/components/chart/MiniArea.vue b/ant-design-jeecg-vue/src/components/chart/MiniArea.vue index 0f526ee..1c9b48c 100644 --- a/ant-design-jeecg-vue/src/components/chart/MiniArea.vue +++ b/ant-design-jeecg-vue/src/components/chart/MiniArea.vue @@ -1,9 +1,9 @@ <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 :force-fit="true" :height="height" :data="data" :scale="scale" :padding="[36, 0, 18, 0]"> + <v-tooltip/> + <v-smooth-area position="x*y"/> </v-chart> </div> </div> @@ -11,53 +11,55 @@ <script> import moment from 'dayjs' - const data = [] + + const sourceData = [] const beginDay = new Date().getTime() for (let i = 0; i < 10; i++) { - data.push({ + sourceData.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:{ + name: 'MiniArea', + props: { + dataSource: { type: Array, - default:()=>[] - } - }, - created(){ - if(this.datasource.length==0){ - this.datasource = data; + default: () => [] + }, + // x 轴别名 + x: { + type: String, + default: 'x' + }, + // y 轴别名 + y: { + type: String, + default: 'y' } }, - data () { + data() { return { - tooltip, - scale, + data: [], height: 100 } + }, + computed: { + scale() { + return [ + { dataKey: 'x', title: this.x, alias: this.x }, + { dataKey: 'y', title: this.y, alias: this.y } + ] + } + }, + created() { + if (this.dataSource.length === 0) { + this.data = sourceData + } else { + this.data = this.dataSource + } } } </script> diff --git a/ant-design-jeecg-vue/src/components/chart/MiniBar.vue b/ant-design-jeecg-vue/src/components/chart/MiniBar.vue index 6fe8582..ed62d30 100644 --- a/ant-design-jeecg-vue/src/components/chart/MiniBar.vue +++ b/ant-design-jeecg-vue/src/components/chart/MiniBar.vue @@ -1,21 +1,20 @@ <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 :style="{'width':width==null?'auto':width+'px'}"> + <v-chart :forceFit="width==null" :height="height" :data="data" padding="0"> + <v-tooltip/> + <v-bar position="x*y"/> + </v-chart> </div> </template> <script> import moment from 'dayjs' - const data = [] + + const sourceData = [] const beginDay = new Date().getTime() for (let i = 0; i < 10; i++) { - data.push({ + sourceData.push({ x: moment(new Date(beginDay + 1000 * 60 * 60 * 24 * i)).format('YYYY-MM-DD'), y: Math.round(Math.random() * 10) }) @@ -40,24 +39,33 @@ }] export default { - name: "MiniBar", - props:{ - datasource:{ + name: 'MiniBar', + props: { + dataSource: { type: Array, - default:()=>[] + default: () => [] + }, + width: { + type: Number, + default: null + }, + height: { + type: Number, + default: 200 } }, - created(){ - if(this.datasource.length==0){ - this.datasource = data; + created() { + if (this.dataSource.length === 0) { + this.data = sourceData + } else { + this.data = this.dataSource } }, - data () { + data() { return { - data, tooltip, - scale, - height: 100 + data: [], + scale } } } diff --git a/ant-design-jeecg-vue/src/components/chart/MiniProgress.vue b/ant-design-jeecg-vue/src/components/chart/MiniProgress.vue index c761982..444a9d8 100644 --- a/ant-design-jeecg-vue/src/components/chart/MiniProgress.vue +++ b/ant-design-jeecg-vue/src/components/chart/MiniProgress.vue @@ -1,26 +1,26 @@ <template> <div class="chart-mini-progress"> <div class="target" :style="{ left: target + '%'}"> - <span :style="{ backgroundColor: color }" /> + <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 class="progress" :style="{ backgroundColor: color, width: percentage + '%', height: height+'px' }"></div> </div> </div> </template> <script> export default { - name: "MiniProgress", + name: 'MiniProgress', props: { target: { type: Number, default: 0 }, height: { - type: String, - default: '10px' + type: Number, + default: 10 }, color: { type: String, @@ -64,7 +64,7 @@ position: relative; .progress { - transition: all .4s cubic-bezier(.08,.82,.17,1) 0s; + transition: all .4s cubic-bezier(.08, .82, .17, 1) 0s; border-radius: 1px 0 0 1px; background-color: #1890ff; width: 0; diff --git a/ant-design-jeecg-vue/src/components/chart/Pie.vue b/ant-design-jeecg-vue/src/components/chart/Pie.vue new file mode 100644 index 0000000..7cebf40 --- /dev/null +++ b/ant-design-jeecg-vue/src/components/chart/Pie.vue @@ -0,0 +1,83 @@ +<template> + <v-chart :forceFit="true" :height="height" :data="data" :scale="scale"> + <v-tooltip :showTitle="false" dataKey="item*percent"/> + <v-axis/> + <v-legend dataKey="item"/> + <v-pie position="percent" color="item" :v-style="pieStyle" :label="labelConfig"/> + <v-coord type="theta"/> + </v-chart> +</template> + +<script> + const DataSet = require('@antv/data-set') + + const sourceData = [ + { item: '事例一', percent: 40 }, + { item: '事例二', percent: 21 }, + { item: '事例三', percent: 17 }, + { item: '事例四', percent: 13 }, + { item: '事例五', percent: 9 } + ] + + const scale = [{ + dataKey: 'percent', + min: 0, + formatter: '.0%' + }] + + export default { + props: { + title: { + type: String, + default: '' + }, + height: { + type: Number, + default: 254 + }, + dataSource: { + type: Array, + default: () => [] + } + }, + created() { + this.change() + }, + watch: { + 'dataSource': function() { + this.change() + } + }, + methods: { + change() { + if (this.dataSource.length === 0) { + this.data = sourceData + } else { + const dv = new DataSet.View().source(this.dataSource) + dv.transform({ + type: 'percent', + field: 'count', + dimension: 'item', + as: 'percent' + }) + this.data = dv.rows + } + } + }, + data() { + return { + data: '', + scale, + pieStyle: { + stroke: '#fff', + lineWidth: 1 + }, + labelConfig: ['percent', { + formatter: (val, item) => { + return item.point.item + ': ' + val + } + }] + } + } + } +</script> \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/components/chart/README.md b/ant-design-jeecg-vue/src/components/chart/README.md new file mode 100644 index 0000000..20c74a8 --- /dev/null +++ b/ant-design-jeecg-vue/src/components/chart/README.md @@ -0,0 +1,328 @@ +# 报表组件文档 + +## 柱状图 + +##### 引用方式 + +```js +import Bar from '@/components/chart/Bar' +``` + +##### 参数列表 + +| 参数名 | 类型 | 必填 | 说明 | +|------------|--------|----|------------| +| title | string | | 报表标题 | +| dataSource | array | ✔️ | 报表数据源 | +| height | number | | 报表高度,默认254 | + +##### dataSource 示例 + +```json +[ + { + "x": "1月", + "y": 320 + }, + { + "x": "2月", + "y": 457 + }, + { + "x": "3月", + "y": 182 + } +] +``` + +## 多列柱状图 + +##### 引用方式 + +```js +import BarMultid from '@/components/chart/BarMultid' +``` + +##### 参数列表 + +| 参数名 | 类型 | 必填 | 说明 | +|------------|--------|----|------------| +| title | string | | 报表标题 | +| fields | array | | 主列字段列表 | +| dataSource | array | | 报表数据源 | +| height | number | | 报表高度,默认254 | + +##### fields 示例 + +```json +["Jan.", "Feb.", "Mar.", "Apr.", "May", "Jun.", "Jul.", "Aug."] +``` + +##### dataSource 示例 + +```json +[ + { + "type": "Jeecg", // 列名 + "Jan.": 18.9, + "Feb.": 28.8, + "Mar.": 39.3, + "Apr.": 81.4, + "May": 47, + "Jun.": 20.3, + "Jul.": 24, + "Aug.": 35.6 + }, + { + "type": "Jeebt", + "Jan.": 12.4, + "Feb.": 23.2, + "Mar.": 34.5, + "Apr.": 99.7, + "May": 52.6, + "Jun.": 35.5, + "Jul.": 37.4, + "Aug.": 42.4 + } +] +``` + +## 迷你柱状图 + +不带标题和数据轴的柱状图 + +##### 引用方式 + +```js +import MiniBar from '@/components/chart/MiniBar' +``` + +##### 参数列表 + +| 参数名 | 类型 | 必填 | 说明 | +|------------|--------|----|---------------| +| width | number | | 报表宽度度,默认自适应宽度 | +| height | number | | 报表高度,默认200 | +| dataSource | array | | 报表数据源 | + +##### dataSource 示例 + +```json +[ + { + "x": "1月", + "y": 320 + }, + { + "x": "2月", + "y": 457 + }, + { + "x": "3月", + "y": 182 + } +] +``` + +## 面积图 + +##### 引用方式 + +```js +import AreaChartTy from '@/components/chart/AreaChartTy' +``` + +##### 参数列表 + +| 参数名 | 类型 | 必填 | 说明 | +|------------|--------|----|------------| +| title | string | | 报表标题 | +| dataSource | array | ✔️ | 报表数据源 | +| height | number | | 报表高度,默认254 | +| lineSize | number | | 线的粗细,默认2 | + +##### dataSource 示例 + +```json +[ + { + "x": "1月", + "y": 320 + }, + { + "x": "2月", + "y": 457 + }, + { + "x": "3月", + "y": 182 + } +] +``` + +## 多行折线图 + +##### 引用方式 + +```js +import LineChartMultid from '@/components/chart/LineChartMultid' +``` + +##### 参数列表 + +| 参数名 | 类型 | 必填 | 说明 | +|------------|--------|----|------------| +| title | string | | 报表标题 | +| fields | array | | 主列字段列表 | +| dataSource | array | | 报表数据源 | +| height | number | | 报表高度,默认254 | + +##### fields 示例 + +```json +["jeecg", "jeebt"] +``` + +##### dataSource 示例 + +```json +[ + { + "type": "Jan", // 列名 + "jeecg": 7, + "jeebt": 3.9 + }, + { "type": "Feb", "jeecg": 6.9, "jeebt": 4.2 }, + { "type": "Mar", "jeecg": 9.5, "jeebt": 5.7 }, + { "type": "Apr", "jeecg": 14.5, "jeebt": 8.5 }, + { "type": "May", "jeecg": 18.4, "jeebt": 11.9 }, + { "type": "Jun", "jeecg": 21.5, "jeebt": 15.2 }, + { "type": "Jul", "jeecg": 25.2, "jeebt": 17 }, + { "type": "Aug", "jeecg": 26.5, "jeebt": 16.6 }, + { "type": "Sep", "jeecg": 23.3, "jeebt": 14.2 }, + { "type": "Oct", "jeecg": 18.3, "jeebt": 10.3 }, + { "type": "Nov", "jeecg": 13.9, "jeebt": 6.6 }, + { "type": "Dec", "jeecg": 9.6, "jeebt": 4.8 } +] +``` + +## 饼状图 + +##### 引用方式 + +```js +import Pie from '@/components/chart/Pie' +``` + +##### 参数列表 + +| 参数名 | 类型 | 必填 | 说明 | +|------------|--------|----|------------| +| dataSource | array | | 报表数据源 | +| height | number | | 报表高度,默认254 | + +##### dataSource 示例 + +```json +[ + // 所有的 percent 相加等于 100 + { "item": "一月", "percent": 40 }, + { "item": "二月", "percent": 21 }, + { "item": "三月", "percent": 17 }, + { "item": "四月", "percent": 13 }, + { "item": "五月", "percent": 9 } +] +``` + +## 雷达图 + +##### 引用方式 + +```js +import Radar from '@/components/chart/Radar' +``` + +##### 参数列表 + +| 参数名 | 类型 | 必填 | 说明 | +|------------|--------|----|------------| +| dataSource | array | | 报表数据源 | +| height | number | | 报表高度,默认254 | + +##### dataSource 示例 + +```json +[ + // score 最小值为 0,最大值为 100 + { "item": "一月", "score": 40 }, + { "item": "二月", "score": 20 }, + { "item": "三月", "score": 67 }, + { "item": "四月", "score": 43 }, + { "item": "五月", "score": 90 } +] +``` + +## 进度条 + +##### 引用方式 + +```js +import MiniProgress from '@/components/chart/MiniProgress' +``` + +##### 参数列表 + +| 参数名 | 类型 | 必填 | 说明 | +|------------|--------|----|-------------------| +| percentage | number | | 当前进度百分比,默认0,最高100 | +| target | number | | 目标值,默认10 | +| height | number | | 进度条高度,默认10 | +| color | string | | 进度条颜色,默认 #13C2C2 | + +## 仪表盘 + +##### 引用方式 + +```js +import DashChartDemo from '@/components/chart/DashChartDemo' +``` + +##### 参数列表 + +| 参数名 | 类型 | 必填 | 说明 | +|--------|--------|----|----------------| +| title | string | | 报表标题 | +| value | number | | 当前值,默认6.7,最大为9 | +| height | number | | 报表高度,默认254 | + +## 排名列表 + +##### 引用方式 + +```js +import RankList from '@/components/chart/RankList' +``` + +##### 参数列表 + +| 参数名 | 类型 | 必填 | 说明 | +|--------|--------|----|--------------| +| title | string | | 报表标题 | +| list | array | | 排名列表数据 | +| height | number | | 报表高度,默认自适应高度 | + +##### list 示例 + +```json +[ + { + "name": "北京朝阳 1 号店", + "total": 1981 + }, + { "name": "北京朝阳 2 号店", "total": 1359 }, + { "name": "北京朝阳 3 号店", "total": 1354 }, + { "name": "北京朝阳 4 号店", "total": 263 }, + { "name": "北京朝阳 5 号店", "total": 446 }, + { "name": "北京朝阳 6 号店", "total": 796 } +] +``` \ 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 index 0875262..b7b30b0 100644 --- a/ant-design-jeecg-vue/src/components/chart/Radar.vue +++ b/ant-design-jeecg-vue/src/components/chart/Radar.vue @@ -1,12 +1,12 @@ <template> - <v-chart :forceFit="true" height="400" :data="data" :padding="[20, 20, 95, 20]" :scale="scale"> + <v-chart :forceFit="true" :height="height" :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-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> @@ -38,26 +38,48 @@ { dataKey: 'score', min: 0, - max: 80 + max: 100 }, { dataKey: 'user', alias: '类型' } ] + const sourceData = [ + { item: '示例一', score: 40 }, + { item: '示例二', score: 20 }, + { item: '示例三', score: 67 }, + { item: '示例四', score: 43 }, + { item: '示例五', score: 90 } + ] + export default { name: 'Radar', props: { - data: { + height: { + type: Number, + default: 254 + }, + dataSource: { type: Array, - default: null, + default: () => [] } }, - data () { + data() { return { axis1Opts, axis2Opts, - scale + scale, + data: sourceData + } + }, + watch: { + dataSource(newVal) { + if (newVal.length === 0) { + this.data = sourceData + } else { + this.data = newVal + } } } } diff --git a/ant-design-jeecg-vue/src/components/chart/RankList.vue b/ant-design-jeecg-vue/src/components/chart/RankList.vue index d6744ae..a50b02a 100644 --- a/ant-design-jeecg-vue/src/components/chart/RankList.vue +++ b/ant-design-jeecg-vue/src/components/chart/RankList.vue @@ -1,7 +1,7 @@ <template> <div class="rank"> <h4 class="title">{{ title }}</h4> - <ul class="list"> + <ul class="list" :style="{height:height?`${height}px`:'auto',overflow:'auto'}"> <li :key="index" v-for="(item, index) in list"> <span :class="index < 3 ? 'active' : null">{{ index + 1 }}</span> <span>{{ item.name }}</span> @@ -23,6 +23,10 @@ list: { type: Array, default: null + }, + height: { + type: Number, + default: null } } } diff --git a/ant-design-jeecg-vue/src/components/chart/TransferBar.vue b/ant-design-jeecg-vue/src/components/chart/TransferBar.vue index 33e178a..bb953e9 100644 --- a/ant-design-jeecg-vue/src/components/chart/TransferBar.vue +++ b/ant-design-jeecg-vue/src/components/chart/TransferBar.vue @@ -2,63 +2,65 @@ <div :style="{ padding: '0 0 32px 32px' }"> <h4 :style="{ marginBottom: '20px' }">{{ title }}</h4> <v-chart - height="254" + :height="height" :data="data" :scale="scale" :forceFit="true" :padding="['auto', 'auto', '40', '50']"> - <v-tooltip /> - <v-axis /> + <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", + name: 'Bar', props: { title: { type: String, default: '' + }, + x: { + type: String, + default: 'x' + }, + y: { + type: String, + default: 'y' + }, + data: { + type: Array, + default: () => [] + }, + height: { + type: Number, + default: 254 } }, - data () { - return { - data: [], - scale, - tooltip + data() { + return {} + }, + computed: { + scale() { + return [ + { dataKey: 'x', title: this.x, alias: this.x }, + { dataKey: 'y', title: this.y, alias: this.y } + ] } }, - created () { - this.getMonthBar() + created() { + // this.getMonthBar() }, methods: { - getMonthBar() { - this.$http.get('/analysis/month-bar') - .then(res => { - this.data = res.result - }) - } + // 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 index ca8f591..95cae98 100644 --- a/ant-design-jeecg-vue/src/components/chart/Trend.vue +++ b/ant-design-jeecg-vue/src/components/chart/Trend.vue @@ -10,11 +10,13 @@ export default { name: "Trend", props: { + // 同title term: { type: String, default: '', required: true }, + // 百分比 percentage: { type: Number, default: null diff --git a/ant-design-jeecg-vue/src/components/dict/DictSelectTag.vue b/ant-design-jeecg-vue/src/components/dict/DictSelectTag.vue deleted file mode 100644 index e501254..0000000 --- a/ant-design-jeecg-vue/src/components/dict/DictSelectTag.vue +++ /dev/null @@ -1,47 +0,0 @@ -<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 deleted file mode 100644 index e7d0338..0000000 --- a/ant-design-jeecg-vue/src/components/dict/DictSelectUtil.js +++ /dev/null @@ -1,61 +0,0 @@ -/** - * 字典 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/JDictSelectTag.vue b/ant-design-jeecg-vue/src/components/dict/JDictSelectTag.vue new file mode 100644 index 0000000..fe93b01 --- /dev/null +++ b/ant-design-jeecg-vue/src/components/dict/JDictSelectTag.vue @@ -0,0 +1,52 @@ +<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: "JDictSelectTag", + props: { + dictCode: String, + placeholder: String, + triggerChange: Boolean, + 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); + if(this.triggerChange){ + this.$emit('change', val); + }else{ + this.$emit('input', val); + } + } + } + } +</script> + +<style scoped> +</style> \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/components/dict/JDictSelectUtil.js b/ant-design-jeecg-vue/src/components/dict/JDictSelectUtil.js new file mode 100644 index 0000000..df16af2 --- /dev/null +++ b/ant-design-jeecg-vue/src/components/dict/JDictSelectUtil.js @@ -0,0 +1,87 @@ +/** + * 字典 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 dictOptions 字典数组 + * @param text 字典值 + * @return String + */ +export function filterMultiDictText(dictOptions, text) { + if(!text){ + return "" + } + let re = ""; + let arr = text.split(",") + dictOptions.forEach(function (option) { + for(let i=0;i<arr.length;i++){ + if (arr[i] === option.value) { + re += option.text+","; + break; + } + } + }); + if(re==""){ + return ""; + } + return re.substring(0,re.length-1); +} + +/** + * 翻译字段值对应的文本 + * @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 index fca4d57..cffd2c7 100644 --- a/ant-design-jeecg-vue/src/components/dict/README.md +++ b/ant-design-jeecg-vue/src/components/dict/README.md @@ -1,26 +1,42 @@ -DictSelectTag 组件说明 -=== - -例子 +# JDictSelectTag 组件用法 ---- -<DictSelectTag v-model="queryParam.sex" placeholder="请输入用户性别" dictCode="sex"/> +- 从字典表获取数据,dictCode格式说明: 字典code +```html +<j-dict-select-tag v-model="queryParam.sex" placeholder="请输入用户性别" + dictCode="sex"/> +``` + +v-decorator用法: +```html +<j-dict-select-tag v-decorator="['sex', {}]" :triggerChange="true" placeholder="请输入用户性别" + dictCode="sex"/> +``` +- 从数据库表获取字典数据,dictCode格式说明: 表名,文本字段,取值字段 +```html +<j-dict-select-tag v-model="queryParam.username" placeholder="请选择用户名称" + dictCode="sys_user,realname,id"/> +``` -DictSelectUtil.js 列表字典函数用法说明 -=== -例子 +# JDictSelectUtil.js 列表字典函数用法 ---- -第一步: 引入依赖方法 - import {initDictOptions, filterDictText} from '@/components/dict/DictSelectUtil' +- 第一步: 引入依赖方法 +```html + import {initDictOptions, filterDictText} from '@/components/dict/JDictSelectUtil' +``` -第二步: 在created()初始化方法执行字典配置方法 +- 第二步: 在created()初始化方法执行字典配置方法 +```html //初始化字典配置 - this.initDictConfig(); -第三步: 实现initDictConfig方法,加载列表所需要的字典(列表上有多个字典项,就执行多次initDictOptions方法) - //sexDictOptions 自行定义 + this.initDictConfig(); +``` + +- 第三步: 实现initDictConfig方法,加载列表所需要的字典(列表上有多个字典项,就执行多次initDictOptions方法) + +```html initDictConfig() { //初始化字典 - 性别 initDictOptions('sex').then((res) => { @@ -29,8 +45,12 @@ DictSelectUtil.js 列表字典函数用法说明 } }); }, -第四步:实现字段的customRender方法 +``` + +- 第四步: 实现字段的customRender方法 +```html customRender: (text, record, index) => { //字典值替换通用方法 return filterDictText(this.sexDictOptions, text); - } \ No newline at end of file + } +``` \ 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 deleted file mode 100644 index 867e559..0000000 --- a/ant-design-jeecg-vue/src/components/dict/UserInfoTag.vue +++ /dev/null @@ -1,22 +0,0 @@ -<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 index 8bb2a95..22c3235 100644 --- a/ant-design-jeecg-vue/src/components/dict/index.js +++ b/ant-design-jeecg-vue/src/components/dict/index.js @@ -1,7 +1,7 @@ -import T from './DictSelectTag.vue' -const DictSelectTag = { +import T from './JDictSelectTag.vue' +const JDictSelectTag = { install: function (Vue) { - Vue.component('DictSelectTag',T); + Vue.component('JDictSelectTag',T); } } -export default DictSelectTag; \ No newline at end of file +export default JDictSelectTag; \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/components/jeecg/JCheckbox.vue b/ant-design-jeecg-vue/src/components/jeecg/JCheckbox.vue new file mode 100644 index 0000000..70f2d78 --- /dev/null +++ b/ant-design-jeecg-vue/src/components/jeecg/JCheckbox.vue @@ -0,0 +1,52 @@ +<template> + <a-checkbox-group :options="options" :value="checkboxArray" @change="onChange" /> +</template> + +<script> + export default { + name: 'JCheckbox', + props: { + value:{ + type: String, + required: false + }, + readOnly:{ + type: Boolean, + required: false, + default: false + }, + options:{ + type: Array, + required: true + }, + triggerChange:{ + type: Boolean, + required: false, + default: false + } + }, + data(){ + return { + checkboxArray:!this.value?[]:this.value.split(",") + } + }, + watch:{ + value (val) { + if(!val){ + this.checkboxArray = [] + }else{ + this.checkboxArray = this.value.split(",") + } + } + }, + methods:{ + onChange (checkedValues) { + if(this.triggerChange){ + this.$emit('change', checkedValues.join(",")); + }else{ + this.$emit('input', checkedValues.join(",")); + } + }, + } + } +</script> diff --git a/ant-design-jeecg-vue/src/components/jeecg/JDate.vue b/ant-design-jeecg-vue/src/components/jeecg/JDate.vue index ed64d16..7d6322c 100644 --- a/ant-design-jeecg-vue/src/components/jeecg/JDate.vue +++ b/ant-design-jeecg-vue/src/components/jeecg/JDate.vue @@ -20,7 +20,6 @@ }, value:{ type: String, - default: '', required: false }, dateFormat:{ @@ -71,4 +70,5 @@ } } } + //note: do not set the prop value one default property </script> diff --git a/ant-design-jeecg-vue/src/components/jeecg/JEditableTable.vue b/ant-design-jeecg-vue/src/components/jeecg/JEditableTable.vue new file mode 100644 index 0000000..7eefc45 --- /dev/null +++ b/ant-design-jeecg-vue/src/components/jeecg/JEditableTable.vue @@ -0,0 +1,1248 @@ +<!-- JEditableTable --> +<!-- @version 1.3 --> +<!-- @author sjlei --> +<template> + <a-spin :spinning="loading"> + + <!-- 操作按钮 --> + <div v-if="actionButton" class="action-button"> + <a-button type="primary" icon="plus" @click="handleClickAdd">新增</a-button> + <span class="gap"/> + <template v-if="selectedRowIds.length>0"> + <a-popconfirm + :title="`确定要删除这 ${selectedRowIds.length} 项吗?`" + @confirm="handleConfirmDelete"> + <a-button type="primary" icon="minus">删除</a-button> + </a-popconfirm> + <template v-if="showClearSelectButton"> + <span class="gap"/> + <a-button icon="delete" @click="handleClickClearSelect">清空选择</a-button> + </template> + </template> + </div> + + <div :id="`${caseId}inputTable`" class="input-table"> + <!-- 渲染表头 --> + <div class="thead"> + <div class="tr"> + <!-- 左侧固定td --> + <div v-if="rowSelection" class="td td-cb" :style="style.tdLeft"> + <!--:indeterminate="true"--> + <a-checkbox + :checked="getSelectAll" + :indeterminate="getSelectIndeterminate" + @change="handleChangeCheckedAll" + /> + </div> + <div v-if="rowNumber" class="td td-num" :style="style.tdLeft"> + <span>#</span> + </div> + <!-- 右侧动态生成td --> + <template v-for="col in columns"> + <div + class="td" + :key="col.key" + :style="buildTdStyle(col)"> + + <span>{{ col.title }}</span> + </div> + </template> + </div> + </div> + <!-- 渲染主体 body --> + <div :id="`${caseId}tbody`" class="tbody" :style="tbodyStyle"> + <!-- 扩展高度 --> + <div class="tr-expand" :style="`height:${getExpandHeight}px; z-index:${loading?'11':'9'};`"></div> + <!-- 无数据时显示 --> + <div v-if="rows.length===0" class="tr-nodata"> + <span>暂无数据</span> + </div> + <!-- 动态生成tr --> + <template v-for="(row,rowIndex) in rows"> + <!-- tr 只加载可见的和预加载的总共十条数据 --> + <div + v-if=" + rowIndex >= parseInt(`${(scrollTop-rowHeight) / rowHeight}`) && + (parseInt(`${scrollTop / rowHeight}`) + 9) > rowIndex + " + :id="`${caseId}tbody-tr-${rowIndex}`" + :data-idx="rowIndex" + class="tr" + :class="selectedRowIds.indexOf(row.id) !== -1 ? 'tr-checked' : ''" + :style="buildTrStyle(rowIndex)" + :key="row.id"> + <!-- 左侧固定td --> + <div v-if="rowSelection" class="td td-cb" :style="style.tdLeft"> + <!-- 此 v-for 只是为了拼接 id 字符串 --> + <template v-for="(id,i) in [`${row.id}`]"> + <a-checkbox + :id="id" + :key="i" + :checked="selectedRowIds.indexOf(id) !== -1" + @change="handleChangeLeftCheckbox"/> + </template> + </div> + <div v-if="rowNumber" class="td td-num" :style="style.tdLeft"> + <span>{{ rowIndex+1 }}</span> + </div> + <!-- 右侧动态生成td --> + <div + class="td" + v-for="col in columns" + :key="col.key" + :style="buildTdStyle(col)"> + + <!-- 此 v-for 只是为了拼接 id 字符串 --> + <template v-for="(id,i) in [`${col.key}${row.id}`]"> + + <!-- native input --> + <label :key="i" v-if="col.type === formTypes.input || col.type === formTypes.inputNumber"> + <a-tooltip + :id="id" + placement="top" + :title="(tooltips[id] || {}).title" + :visible="(tooltips[id] || {}).visible || false" + :autoAdjustOverflow="true"> + + <input + :id="id" + v-bind="buildProps(row,col)" + + :data-input-number="col.type === formTypes.inputNumber" + :placeholder="replaceProps(col, col.placeholder)" + @input="(e)=>{handleInputCommono(e.target,rowIndex,row,col)}" + @mouseover="()=>{handleMouseoverCommono(row,col)}" + @mouseout="()=>{handleMouseoutCommono(row,col)}"/> + + </a-tooltip> + + </label> + <!-- checkbox --> + <template v-else-if="col.type === formTypes.checkbox"> + <a-checkbox + :key="i" + :id="id" + v-bind="buildProps(row,col)" + :checked="checkboxValues[id]" + @change="handleChangeCheckboxCommon" + /> + </template> + <!-- select --> + <template v-else-if="col.type === formTypes.select"> + <!-- select 真身 --> + <a-tooltip + :key="i" + :id="id" + placement="top" + :title="(tooltips[id] || {}).title" + :visible="(tooltips[id] || {}).visible || false" + :autoAdjustOverflow="true"> + + <span + @mouseover="()=>{handleMouseoverCommono(row,col)}" + @mouseout="()=>{handleMouseoutCommono(row,col)}"> + + <a-select + :id="id" + :key="i" + v-bind="buildProps(row,col)" + style="width: 100%;" + :value="selectValues[id]" + :placeholder="replaceProps(col, col.placeholder)" + @change="(v)=>handleChangeSelectCommon(v,id,row,col)"> + + <template v-for="(opt,optKey) in col.options"> + <a-select-option :value="opt.value" :key="optKey">{{ opt.title }}</a-select-option> + </template> + </a-select> + </span> + </a-tooltip> + </template> + <!-- date --> + <template v-else-if="col.type === formTypes.date || col.type === formTypes.datetime"> + <a-tooltip + :key="i" + :id="id" + placement="top" + :title="(tooltips[id] || {}).title" + :visible="(tooltips[id] || {}).visible || false" + :autoAdjustOverflow="true"> + + <span + @mouseover="()=>{handleMouseoverCommono(row,col)}" + @mouseout="()=>{handleMouseoutCommono(row,col)}"> + + <j-date + :id="id" + :key="i" + v-bind="buildProps(row,col)" + style="width: 100%;" + :value="jdateValues[id]" + :placeholder="replaceProps(col, col.placeholder)" + :trigger-change="true" + :showTime="col.type === formTypes.datetime" + :dateFormat="col.type === formTypes.date? 'YYYY-MM-DD':'YYYY-MM-DD HH:mm:ss'" + @change="(v)=>handleChangeJDateCommon(v,id,row,col)"/> + + </span> + </a-tooltip> + </template> + + <!-- else (normal) --> + <span v-else :key="i">{{ col.defaultValue }}</span> + </template> + </div> + </div> + <!-- -- tr end -- --> + + </template> + + + </div> + </div> + </a-spin> +</template> + +<script> + + import { FormTypes, VALIDATE_NO_PASSED } from '@/utils/JEditableTableUtil' + import { cloneObject, randomString } from '@/utils/util' + import JDate from '@/components/jeecg/JDate' + + // 行高,需要在实例加载完成前用到 + let rowHeight = 61 + + export default { + name: 'JEditableTable', + components: { JDate }, + props: { + // 列信息 + columns: { + type: Array, + required: true + }, + // 数据源 + dataSource: { + type: Array, + required: true + }, + // 是否显示操作按钮 + actionButton: { + type: Boolean, + default: false + }, + // 是否显示行号 + rowNumber: { + type: Boolean, + default: false + }, + // 是否可选择行 + rowSelection: { + type: Boolean, + default: false + }, + // 页面是否在加载中 + loading: { + type: Boolean, + default: false + }, + // 页面是否在加载中 + maxHeight: { + type: Number, + default: 400 + }, + // 要禁用的行 + disabledRows: { + type: Object, + default() { + return {} + } + } + }, + data() { + return { + // caseId,用于防止有多个实例的时候会冲突 + caseId: `_jet-${randomString(6)}-`, + // 存储document element 对象 + el: { + inputTable: null, + tbody: null + }, + // 存储各个div的style + style: { + tbody: { left: '0px', 'max-height': '400px' }, + // 左侧固定td的style + tdLeft: { 'min-width': '4%', 'max-width': '45px' } + }, + // 表单的类型 + formTypes: FormTypes, + // 行数据 + rows: [], + // 行高,height + padding + border + rowHeight, + // 滚动条顶部距离 + scrollTop: 0, + // 绑定 select 的值 + selectValues: {}, + // 绑定 checkbox 的值 + checkboxValues: {}, + // 绑定 jdate 的值 + jdateValues: {}, + // 绑定左侧选择框已选择的id + selectedRowIds: [], + // 存储被删除行的id + deleteIds: [], + // 存储显示tooltip的信息 + tooltips: {}, + // 存储没有通过验证的inputId + notPassedIds: [] + } + }, + created() { + // 当前显示的tr + this.visibleTrEls = [] + // 用来存储input表单的值 + // 数组里的每项都是一个对象,对象里每个key都是input的rowKey,值就是input的值,其中有个id的字段来区分 + // 示例: + // [{ + // id: "_jet-4sp0iu-15541771111770" + // dbDefaultVal: "aaa", + // dbFieldName: "bbb", + // dbFieldTxt: "ccc", + // dbLength: 32 + // }] + this.inputValues = [] + this.disabledRowIds = (this.disabledRowIds || []) + }, + // 计算属性 + computed: { + // expandHeight = rows.length * rowHeight + getExpandHeight() { + return this.rows.length * this.rowHeight + }, + // 获取是否选择了部分 + getSelectIndeterminate() { + return (this.selectedRowIds.length > 0 && + this.selectedRowIds.length < this.rows.length) + }, + // 获取是否选择了全部 + getSelectAll() { + return (this.selectedRowIds.length === this.rows.length) && this.rows.length > 0 + }, + tbodyStyle() { + let style = Object.assign({}, this.style.tbody) + style['max-height'] = `${this.maxHeight}px` + return style + }, + showClearSelectButton() { + let count = 0 + for (let key in this.disabledRows) { + if (this.disabledRows.hasOwnProperty(key)) count++ + } + return count > 0 + } + }, + // 侦听器 + watch: { + dataSource: function(newValue) { + this.initialize() + + let rows = [] + let checkboxValues = {} + let selectValues = {} + let jdateValues = {} + // 禁用行的id + let disabledRowIds = (this.disabledRowIds || []) + newValue.forEach(data => { + let value = { id: this.caseId + data.id } + let row = { id: value.id } + let disabled = false + this.columns.forEach(column => { + let inputId = column.key + value.id + let sourceValue = (data[column.key] == null ? '' : data[column.key]).toString() + if (column.type === FormTypes.checkbox) { + + // 判断是否设定了customValue(自定义值) + if (column.customValue instanceof Array) { + let customValue = (column.customValue[0] || '').toString() + checkboxValues[inputId] = (sourceValue === customValue) + } else { + checkboxValues[inputId] = sourceValue + } + + } else if (column.type === FormTypes.select) { + selectValues[inputId] = sourceValue ? sourceValue : undefined + + } else if (column.type === FormTypes.date || column.type === FormTypes.datetime) { + jdateValues[inputId] = sourceValue + + } else { + value[column.key] = sourceValue + } + + // 解析disabledRows + for (let columnKey in this.disabledRows) { + // 判断是否有该属性 + if (this.disabledRows.hasOwnProperty(columnKey) && data.hasOwnProperty(columnKey)) { + // row[columnKey] = + + if (disabled !== true) { + disabled = this.disabledRows[columnKey] === data[columnKey] + if (disabled) { + disabledRowIds.push(row.id) + } + } + + } + } + }) + this.inputValues.push(value) + rows.push(row) + }) + this.disabledRowIds = disabledRowIds + this.checkboxValues = checkboxValues + this.selectValues = selectValues + this.jdateValues = jdateValues + this.rows = rows + + // 更新form表单的值 + this.$nextTick(() => { + this.updateFormValues() + }) + + }, + // 当selectRowIds改变时触发事件 + selectedRowIds(newValue) { + this.$emit('selectRowChange', cloneObject(newValue)) + } + }, + mounted() { + // 获取document element对象 + let elements = {}; + ['inputTable', 'tbody'].forEach(id => { + elements[id] = document.getElementById(this.caseId + id) + }) + this.el = elements + + let vm = this + /** 监听滚动条事件 */ + this.el.inputTable.onscroll = function(event) { + vm.syncScrollBar(event.target.scrollLeft) + } + this.el.tbody.onscroll = function(event) { + vm.recalcTrHiddenItem(event.target.scrollTop) + } + }, + methods: { + + /** 初始化列表 */ + initialize() { + this.visibleTrEls = [] + this.rows = [] + this.deleteIds = [] + this.inputValues = [] + this.selectValues = {} + this.checkboxValues = {} + this.jdateValues = {} + this.selectedRowIds = [] + this.tooltips = {} + this.notPassedIds = [] + this.scrollTop = 0 + this.$nextTick(() => { + this.el.tbody.scrollTop = 0 + }) + }, + + /** 同步滚动条状态 */ + syncScrollBar(scrollLeft) { + this.style.tbody.left = `${scrollLeft}px` + this.el.tbody.scrollLeft = scrollLeft + }, + /** 重置滚动条位置,参数留空则滚动到上次记录的位置 */ + resetScrollTop(top) { + if (top != null && typeof top === 'number') { + this.el.tbody.scrollTop = top + } else { + this.el.tbody.scrollTop = this.scrollTop + } + }, + /** 重新计算需要隐藏或显示的tr */ + recalcTrHiddenItem(top) { + let diff = top - this.scrollTop + if (diff < 0) { + diff = this.scrollTop - top + } + // 只有在滚动了百分之三十的行高的距离时才进行更新 + if (diff >= this.rowHeight * 0.3) { + this.scrollTop = top + // 更新form表单的值 + this.$nextTick(() => { + this.updateFormValues() + }) + } + }, + /** push 一条数据 */ + push(record, update = true, rows) { + if (!(rows instanceof Array)) { + rows = cloneObject(this.rows) || [] + } + + + if (record.id == null) { + let timestamp = new Date().getTime() + record.id = `${this.caseId}${timestamp}${rows.length}` + } + if (record.id.indexOf(this.caseId) === -1) { + record.id = this.caseId + record.id + } + let row = { id: record.id } + let value = { id: row.id } + let checkboxValues = Object.assign({}, this.checkboxValues) + let selectValues = Object.assign({}, this.selectValues) + let jdateValues = Object.assign({}, this.jdateValues) + this.columns.forEach(column => { + let key = column.key + let inputId = key + row.id + // record中是否有该列的值 + let recordHasValue = record[key] != null + if (column.type === FormTypes.input) { + value[key] = recordHasValue ? record[key] : column.defaultValue + + } else if (column.type === FormTypes.inputNumber) { + // 判断是否是排序字段,如果是就赋最大值 + if (column.isOrder === true) { + value[key] = this.getInputNumberMaxValue(column) + 1 + } else { + value[key] = recordHasValue ? record[key] : column.defaultValue + } + + } else if (column.type === FormTypes.checkbox) { + checkboxValues[inputId] = recordHasValue ? record[key] : column.defaultChecked + + } else if (column.type === FormTypes.select) { + let selected = column.defaultValue + if (selected !== 0 && !selected) { + selected = undefined + } + selectValues[inputId] = recordHasValue ? record[key] : selected + + } else if (column.type === FormTypes.date || column.type === FormTypes.datetime) { + jdateValues[inputId] = recordHasValue ? record[key] : column.defaultValue + + } else { + value[key] = recordHasValue ? record[key] : '' + } + }) + rows.push(row) + this.inputValues.push(value) + this.checkboxValues = checkboxValues + this.selectValues = selectValues + this.jdateValues = jdateValues + + if (update) { + this.rows = rows + this.$nextTick(() => { + this.updateFormValues() + }) + } + return rows + }, + /** 获取某一数字输入框列中的最大的值 */ + getInputNumberMaxValue(column) { + let maxNum = 0 + this.inputValues.forEach((item, index) => { + let val = item[column.key], num + try { + num = parseInt(val) + } catch { + num = 0 + } + // 把首次循环的结果当成最大值 + if (index === 0) { + maxNum = num + } else { + maxNum = (num > maxNum) ? num : maxNum + } + }) + return maxNum + }, + /** 添加一行 */ + add(num = 1, forceScrollToBottom = false) { + let timestamp = new Date().getTime() + let rows = this.rows + for (let i = 0; i < num; i++) { + let row = { id: `${this.caseId}${timestamp}${rows.length}` } + rows = this.push(row, false, rows) + } + this.rows = rows + + this.$nextTick(() => { + this.updateFormValues() + }) + // 设置滚动条位置 + let tbody = this.el.tbody + let offsetHeight = tbody.offsetHeight + let realScrollTop = tbody.scrollTop + offsetHeight + if (forceScrollToBottom === false) { + // 只有滚动条在底部的时候才自动滚动 + if (!((tbody.scrollHeight - realScrollTop) <= 10)) { + return + } + } + this.$nextTick(() => { + tbody.scrollTop = tbody.scrollHeight + }) + // 触发add事件 + this.$emit('added') + }, + /** 删除被选中的行 */ + removeSelectedRows() { + this.removeRows(this.selectedRowIds) + this.selectedRowIds = [] + }, + /** 删除一行或多行 */ + removeRows(id) { + let ids = id + if (!(id instanceof Array)) { + if (typeof id === 'string') { + ids = [id] + } else { + throw `InputTable.removeRows() 函数需要的参数可以是string或Array类型,但提供的却是${typeof id}` + } + } + + let rows = cloneObject(this.rows) + ids.forEach(removeId => { + // 找到每个id对应的真实index并删除 + const findAndDelete = (arr) => { + for (let i = 0; i < arr.length; i++) { + if (arr[i].id === removeId) { + arr.splice(i, 1) + return true + } + } + } + // 找到rows对应的index,并删除 + if (findAndDelete(rows)) { + // 将caseId去除 + this.deleteIds.push(removeId.split(this.caseId)[1]) + } + // 找到values对应的index,并删除 + findAndDelete(this.inputValues) + }) + this.rows = rows + this.$emit('deleted', this.getDeleteIds()) + return true + }, + + /** 获取表格表单里的值 */ + getValues(callback, validate = true) { + let error = 0 + let valueArray = cloneObject(this.inputValues) + let tooltips = Object.assign({}, this.tooltips) + let notPassedIds = cloneObject(this.notPassedIds) + valueArray.forEach(value => { + this.columns.forEach(column => { + let inputId = column.key + value.id + if (column.type === FormTypes.checkbox) { + let checked = this.checkboxValues[inputId] + if (column.customValue instanceof Array) { + value[column.key] = checked ? column.customValue[0] : column.customValue[1] + } else { + value[column.key] = checked + } + + } else if (column.type === FormTypes.select) { + value[column.key] = this.selectValues[inputId] + + } else if (column.type === FormTypes.date || column.type === FormTypes.datetime) { + value[column.key] = this.jdateValues[inputId] + + } + // 检查表单验证 + if (validate) { + let results = this.validateOneInput(value[column.key], value, column, notPassedIds, false) + tooltips[inputId] = results[0] + if (tooltips[inputId].visible) { + if (error++ === 0) { + // let element = document.getElementById(inputId) + // while (element.className !== 'tr') { + // element = element.parentElement + // } + // this.jumpToId(inputId, element) + } + } + tooltips[inputId].visible = false + notPassedIds = results[1] + } + }) + // 将caseId去除 + value.id = value.id.split(this.caseId)[1] + }) + this.tooltips = tooltips + this.notPassedIds = notPassedIds + if (typeof callback === 'function') callback(error, valueArray) + }, + /** getValues的Promise版 */ + getValuesPromise(validate = true) { + return new Promise((resolve, reject) => { + this.getValues((error, values) => { + if (error === 0) { + resolve(values) + } else { + reject(VALIDATE_NO_PASSED) + } + }, validate) + }) + }, + /** 获取被删除项的id */ + getDeleteIds() { + return cloneObject(this.deleteIds) + }, + /** 获取所有的数据,包括values、deleteIds */ + getAll(validate) { + return new Promise((resolve, reject) => { + let deleteIds = this.getDeleteIds() + this.getValuesPromise(validate).then((values) => { + resolve({ values, deleteIds }) + }).catch(error => { + reject(error) + }) + }) + }, + /** 设置某行某列的值 */ + setValues(values) { + + values.forEach(item => { + let { rowKey, values: newValues } = item + for (let newValueKey in newValues) { + if (newValues.hasOwnProperty(newValueKey)) { + let newValue = newValues[newValueKey] + let edited = false // 已被修改 + this.inputValues.forEach(value => { + // 在inputValues中找到了该字段 + if (`${this.caseId}${rowKey}` === value.id) { + edited = true + value[newValueKey] = newValue + } + }) + let modelKey = `${newValueKey}${this.caseId}${rowKey}` + // 在 selectValues 中寻找值 + if (!edited && this.selectValues.hasOwnProperty(modelKey)) { + if (newValue !== 0 && !newValue) { + this.selectValues[modelKey] = undefined + } else { + this.selectValues[modelKey] = newValue + } + edited = true + } + // 在 checkboxValues 中寻找值 + if (!edited && this.checkboxValues.hasOwnProperty(modelKey)) { + this.checkboxValues[modelKey] = newValue + edited = true + } + // 在 jdateValues 中寻找值 + if (!edited && this.jdateValues.hasOwnProperty(modelKey)) { + this.jdateValues[modelKey] = newValue + edited = true + } + } + } + }) + // 强制更新formValues + this.forceUpdateFormValues() + }, + + /** 跳转到指定位置 */ + // jumpToId(id, element) { + // if (element == null) { + // element = document.getElementById(id) + // } + // if (element != null) { + // console.log(this.el.tbody.scrollTop, element.offsetTop) + // this.el.tbody.scrollTop = element.offsetTop + // console.log(this.el.tbody.scrollTop, element.offsetTop) + // } + // }, + /** 验证单个表单 */ + validateOneInput(value, row, column, notPassedIds, update = false) { + let tooltips = Object.assign({}, this.tooltips) + // let notPassedIds = cloneObject(this.notPassedIds) + let inputId = column.key + row.id + let [passed, message] = this.validateValue(column.validateRules, value) + tooltips[inputId] = tooltips[inputId] ? tooltips[inputId] : {} + tooltips[inputId].visible = !passed + let index = notPassedIds.indexOf(inputId) + let borderColor = null, boxShadow = null + if (!passed) { + tooltips[inputId].title = this.replaceProps(column, message) + borderColor = 'red' + boxShadow = `0 0 0 2px rgba(255, 0, 0, 0.2)` + if (index === -1) notPassedIds.push(inputId) + } else { + if (index !== -1) notPassedIds.splice(index, 1) + } + + let element = document.getElementById(inputId) + if (element != null) { + // select 在 .ant-select-selection 上设置 border-color + if (column.type === FormTypes.select) { + element = element.getElementsByClassName('ant-select-selection')[0] + } + // jdate 在 input 上设置 border-color + if (column.type === FormTypes.date || column.type === FormTypes.datetime) { + element = element.getElementsByTagName('input')[0] + } + element.style.borderColor = borderColor + element.style.boxShadow = boxShadow + } + // 是否更新到data + if (update) { + this.tooltips = tooltips + this.notPassedIds = notPassedIds + } + return [tooltips[inputId], notPassedIds] + }, + /** 通过规则验证值是否正确 */ + validateValue(rules, value) { + if (!(rules instanceof Array)) { + return [true, ''] // 没有验证规则,或验证规则格式不正确,默认通过 + } + + let passed = true + let message = '' + for (let rule of rules) { + let isNull = (value == null || value === '') + // 非空验证 + if (rule.required === true) { + if (isNull) { + passed = false + message = rule.message + break + } + } else // 使用 else-if 是为了防止一个 rule 中出现两个规则 + // 正则表达式验证 + if (rule.pattern && !isNull) { + passed = new RegExp(rule.pattern).test(value) + message = rule.message + break + } + + } + return [passed, message] + }, + + /** 动态更新表单的值 */ + updateFormValues() { + let trs = this.el.tbody.getElementsByClassName('tr') + let trEls = [] + for (let tr of trs) { + trEls.push(tr) + } + // 获取新增的 tr + let newTrEls = trEls + if (this.visibleTrEls.length > 0) { + newTrEls = [] + for (let tr of trEls) { + let isNewest = true + for (let vtr of this.visibleTrEls) { + if (vtr.id === tr.id) { + isNewest = false + break + } + } + if (isNewest) { + newTrEls.push(tr) + } + } + } + this.visibleTrEls = trEls + // 向新增的tr中赋值 + newTrEls.forEach(tr => { + let { idx } = tr.dataset + let value = this.inputValues[idx] + for (let key in value) { + if (value.hasOwnProperty(key)) { + let elid = `${key}${value.id}` + let el = document.getElementById(elid) + if (el) { + el.value = value[key] + } + } + } + }) + }, + /** 强制更新FormValues */ + forceUpdateFormValues() { + this.visibleTrEls = [] + this.updateFormValues() + }, + + /** 全选或取消全选 */ + handleChangeCheckedAll() { + let selectedRowIds = [] + if (!this.getSelectAll) { + this.rows.forEach(row => { + if ((this.disabledRowIds || []).indexOf(row.id) === -1) { + selectedRowIds.push(row.id) + } + }) + } + this.selectedRowIds = selectedRowIds + }, + /** 左侧行选择框change事件 */ + handleChangeLeftCheckbox(event) { + let { id } = event.target + + if ((this.disabledRowIds || []).indexOf(id) !== -1) { + return + } + + let index = this.selectedRowIds.indexOf(id) + if (index !== -1) { + this.selectedRowIds.splice(index, 1) + } else { + this.selectedRowIds.push(id) + } + + }, + handleClickAdd() { + this.add() + }, + handleConfirmDelete() { + this.removeSelectedRows() + }, + handleClickClearSelect() { + this.selectedRowIds = [] + }, + + + /* --- common function begin --- */ + + /** 鼠标移入 */ + handleMouseoverCommono(row, column) { + let inputId = column.key + row.id + if (this.notPassedIds.indexOf(inputId) !== -1) { + this.showOrHideTooltip(inputId, true) + } + }, + /** 鼠标移出 */ + handleMouseoutCommono(row, column) { + let inputId = column.key + row.id + this.showOrHideTooltip(inputId, false) + }, + /** input事件 */ + handleInputCommono(target, index, row, column) { + let { value, dataset, selectionStart } = target + + if (`${dataset.inputNumber}` === 'true') { + let replace = value.replace(/[^0-9]/g, '') + if (value !== replace) { + value = replace + target.value = replace + if (typeof selectionStart === 'number') { + target.selectionStart = selectionStart - 1 + target.selectionEnd = selectionStart - 1 + } + } + } + // 存储输入的值 + this.inputValues[index][column.key] = value + // 做单个表单验证 + this.validateOneInput(value, row, column, this.notPassedIds, true) + }, + handleChangeCheckboxCommon(event) { + let { id, checked } = event.target + this.checkboxValues = this.bindValuesChange(checked, id, 'checkboxValues') + }, + handleChangeSelectCommon(value, id, row, column) { + this.selectValues = this.bindValuesChange(value, id, 'selectValues') + // 做单个表单验证 + this.validateOneInput(value, row, column, this.notPassedIds, true) + }, + handleChangeJDateCommon(value, id, row, column) { + this.jdateValues = this.bindValuesChange(value, id, 'jdateValues') + this.validateOneInput(value, row, column, this.notPassedIds, true) + }, + /** 记录用到数据绑定的组件的值 */ + bindValuesChange(value, id, key) { + let values = Object.assign({}, this[key]) + values[id] = value + return values + }, + + /** 显示或隐藏tooltip */ + showOrHideTooltip(inputId, show) { + let tooltips = Object.assign({}, this.tooltips) + tooltips[inputId] = tooltips[inputId] ? tooltips[inputId] : {} + tooltips[inputId].visible = show + this.tooltips = tooltips + }, + + /* --- common function end --- */ + + /* --- 以下是辅助方法,多用于动态构造页面中的数据 --- */ + + /** 辅助方法:打印日志 */ + log: console.log, + + /** 辅助方法:替换${...}变量 */ + replaceProps(col, value) { + if (value && typeof value === 'string') { + value = value.replace(/\${title}/g, col.title) + value = value.replace(/\${key}/g, col.key) + value = value.replace(/\${defaultValue}/g, col.defaultValue) + } + return value + }, + + /** view辅助方法:构建 tr style */ + buildTrStyle(index) { + return { + 'top': `${rowHeight * index}px` + } + }, + /** view辅助方法:构建 td style */ + buildTdStyle(col) { + let style = {} + // 计算宽度 + if (col.width) { + style['width'] = col.width + } else if (this.columns) { + style['width'] = `${(100 - 4 * 2) / this.columns.length}%` + } else { + style['width'] = '120px' + } + // checkbox 居中显示 + let isCheckbox = col.type === FormTypes.checkbox + if (isCheckbox) { + style['align-items'] = 'center' + style['text-align'] = 'center' + style['padding-left'] = '0' + style['padding-right'] = '0' + } + return style + }, + /** view辅助方法:构造props */ + buildProps(row, col) { + let props = {} + // 解析props + if (typeof col.props === 'object') { + for (let prop in col.props) { + if (col.props.hasOwnProperty(prop)) { + props[prop] = this.replaceProps(col, col.props[prop]) + } + } + } + // 判断是否为禁用的行 + if (props['disabled'] !== true) { + props['disabled'] = ((this.disabledRowIds || []).indexOf(row.id) !== -1) + } + return props + } + + } + } +</script> + +<style lang="less" scoped> + + .action-button { + margin-bottom: 8px; + + .gap { + padding-left: 8px; + } + + } + + @scrollBarSize: 12px; + + /* 定义滚动条高宽及背景 高宽分别对应横竖滚动条的尺寸*/ + ::-webkit-scrollbar { + width: @scrollBarSize; + height: @scrollBarSize; + background-color: transparent; + } + + /* 定义滚动条轨道 */ + ::-webkit-scrollbar-track { + background-color: #f0f0f0; + } + + /* 定义滑块 */ + ::-webkit-scrollbar-thumb { + border-radius: @scrollBarSize; + background-color: #eee; + box-shadow: inset 0 0 6px rgba(0, 0, 0, 0.3); + + &:hover { + background-color: #bbb; + } + + &:active { + background-color: #888; + } + + } + + /* 设定边框参数 */ + @borderColor: #e8e8e8; + @border: 1px solid @borderColor; + /* tr & td 之间的间距 */ + @spacing: 8px; + + .input-table { + max-width: 100%; + overflow-x: auto; + overflow-y: hidden; + position: relative; + border: @border; + + .thead, .tbody { + + .tr, .td { + display: flex; + } + + .td { + /*color: white;*/ + /*background-color: black;*/ + /*margin-right: @spacing !important;*/ + + padding-left: @spacing; + flex-direction: column; + + &.td-cb, &.td-num { + min-width: 4%; + max-width: 45px; + margin-right: 0; + padding-left: 0; + padding-right: 0; + justify-content: center; + align-items: center; + } + + } + + } + + .thead { + overflow-y: scroll; + border-bottom: @border; + + .td { + padding: 8px @spacing; + justify-content: center; + } + + } + + .tbody { + position: relative; + top: 0; + left: 0; + overflow-x: hidden; + overflow-y: scroll; + min-height: 61px; + max-height: 400px; + + .tr-nodata { + color: #999; + line-height: 61px; + text-align: center; + } + + .tr { + /*line-height: 50px;*/ + + border-bottom: @border; + transition: background-color 300ms; + width: 100%; + position: absolute; + left: 0; + z-index: 10; + + &.tr-checked { + background-color: #fafafa; + } + + &:hover { + background-color: #E6F7FF; + } + + } + + .tr-expand { + position: relative; + z-index: 9; + background-color: white; + } + + .td { + padding: 14px 0 14px @spacing; + + justify-content: center; + + &:last-child { + padding-right: @spacing; + } + + input { + font-variant: tabular-nums; + box-sizing: border-box; + margin: 0; + list-style: none; + position: relative; + display: inline-block; + padding: 4px 11px; + width: 100%; + height: 32px; + font-size: 14px; + line-height: 1.5; + color: rgba(0, 0, 0, 0.65); + background-color: #fff; + border: 1px solid #d9d9d9; + border-radius: 4px; + transition: all 0.3s; + outline: none; + + &:hover { + border-color: #4D90FE + } + + &:focus { + border-color: #40a9ff; + box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2); + border-right-width: 1px !important; + } + + &:disabled { + color: rgba(0, 0, 0, 0.25); + background: #f5f5f5; + cursor: not-allowed; + } + + /* 设置placeholder的颜色 */ + &::-webkit-input-placeholder { /* WebKit browsers */ + color: #ccc; + } + &:-moz-placeholder { /* Mozilla Firefox 4 to 18 */ + color: #ccc; + } + &::-moz-placeholder { /* Mozilla Firefox 19+ */ + color: #ccc; + } + &:-ms-input-placeholder { /* Internet Explorer 10+ */ + color: #ccc; + } + + } + + } + + } + + } + +</style> \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/components/jeecg/JEditor.vue b/ant-design-jeecg-vue/src/components/jeecg/JEditor.vue new file mode 100644 index 0000000..90d5cd5 --- /dev/null +++ b/ant-design-jeecg-vue/src/components/jeecg/JEditor.vue @@ -0,0 +1,92 @@ +<template> + <div class="tinymce-editor"> + <editor + v-model="myValue" + :init="init" + :disabled="disabled" + @onClick="onClick"> + </editor> + </div> +</template> + +<script> + import tinymce from 'tinymce/tinymce' + import Editor from '@tinymce/tinymce-vue' + import 'tinymce/themes/silver/theme' + import 'tinymce/plugins/image' + import 'tinymce/plugins/media' + import 'tinymce/plugins/table' + import 'tinymce/plugins/lists' + import 'tinymce/plugins/contextmenu' + import 'tinymce/plugins/wordcount' + import 'tinymce/plugins/colorpicker' + import 'tinymce/plugins/textcolor' + export default { + components: { + Editor + }, + props: { + value: { + type: String, + required:false + }, + disabled: { + type: Boolean, + default: false + }, + plugins: { + type: [String, Array], + default: 'lists image media table textcolor wordcount contextmenu' + }, + toolbar: { + type: [String, Array], + default: 'undo redo | formatselect | bold italic | alignleft aligncenter alignright alignjustify | bullist numlist outdent indent | lists image media table | removeformat' + } + }, + data() { + return { + //初始化配置 + init: { + language_url: '/tinymce/langs/zh_CN.js', + language: 'zh_CN', + skin_url: '/tinymce/skins/lightgray', + height: 300, + plugins: this.plugins, + toolbar: this.toolbar, + branding: false, + menubar: false, + images_upload_handler: (blobInfo, success) => { + const img = 'data:image/jpeg;base64,' + blobInfo.base64() + success(img) + } + }, + myValue: this.value + } + }, + mounted() { + tinymce.init({}) + }, + methods: { + + onClick(e) { + this.$emit('onClick', e, tinymce) + }, + //可以添加一些自己的自定义事件,如清空内容 + clear() { + this.myValue = '' + } + }, + watch: { + value(newValue) { + this.myValue = newValue + }, + myValue(newValue) { + console.log(newValue) + this.$emit('input', newValue) + } + } + } + +</script> +<style scoped> +</style> \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/components/jeecg/JEllipsis.vue b/ant-design-jeecg-vue/src/components/jeecg/JEllipsis.vue new file mode 100644 index 0000000..627113f --- /dev/null +++ b/ant-design-jeecg-vue/src/components/jeecg/JEllipsis.vue @@ -0,0 +1,29 @@ +<template> + <a-tooltip placement="topLeft"> + <template slot="title"> + <span>{{value}}</span> + </template> + {{ value | ellipsis(length) }} + </a-tooltip> +</template> + +<script> + export default { + name: 'JEllipsis', + props: { + value: { + type: String, + required: false, + }, + length: { + type: Number, + required: false, + default: 25, + } + } + } +</script> + +<style scoped> + +</style> diff --git a/ant-design-jeecg-vue/src/components/jeecg/JImportModal.vue b/ant-design-jeecg-vue/src/components/jeecg/JImportModal.vue new file mode 100644 index 0000000..50df1c4 --- /dev/null +++ b/ant-design-jeecg-vue/src/components/jeecg/JImportModal.vue @@ -0,0 +1,110 @@ +<template> + <a-modal + title="导入EXCEL" + :width="600" + :visible="visible" + :confirmLoading="uploading" + @cancel="handleClose"> + + <a-upload + name="file" + :multiple="true" + accept=".xls,.xlsx" + :fileList="fileList" + :remove="handleRemove" + :beforeUpload="beforeUpload"> + <a-button> + <a-icon type="upload" /> + 选择导入文件 + </a-button> + </a-upload> + + <template slot="footer"> + <a-button @click="handleClose">关闭</a-button> + <a-button + type="primary" + @click="handleImport" + :disabled="fileList.length === 0" + :loading="uploading"> + {{ uploading ? '上传中...' : '开始上传' }} + </a-button> + </template> + + </a-modal> +</template> + +<script> + import { postAction } from '@/api/manage' + export default { + name: 'JImportModal', + props:{ + url:{ + type: String, + default: '', + required: false + } + }, + data(){ + return { + visible:false, + uploading:false, + fileList:[], + uploadAction:'' + } + }, + watch: { + url (val) { + if(val){ + this.uploadAction = window._CONFIG['domianURL']+val + } + } + }, + created () { + this.uploadAction = window._CONFIG['domianURL']+this.url + }, + + methods:{ + handleClose(){ + this.visible=false + }, + show(){ + this.fileList = [] + this.uploading = false + this.visible = true + }, + handleRemove(file) { + const index = this.fileList.indexOf(file); + const newFileList = this.fileList.slice(); + newFileList.splice(index, 1); + this.fileList = newFileList + }, + beforeUpload(file) { + this.fileList = [...this.fileList, file] + return false; + }, + handleImport() { + const { fileList } = this; + const formData = new FormData(); + fileList.forEach((file) => { + formData.append('files[]', file); + }); + this.uploading = true + postAction(this.uploadAction, formData).then((res) => { + this.uploading = false + if(res.success){ + this.$message.success(res.message) + this.visible=false + this.$emit('ok') + }else{ + this.$message.warning(res.message) + } + }) + } + + } + } +</script> + +<style scoped> + +</style> \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/components/jeecg/JSelectMultiple.vue b/ant-design-jeecg-vue/src/components/jeecg/JSelectMultiple.vue new file mode 100644 index 0000000..323ad32 --- /dev/null +++ b/ant-design-jeecg-vue/src/components/jeecg/JSelectMultiple.vue @@ -0,0 +1,65 @@ +<template> + <a-select :value="arrayValue" @change="onChange" mode="multiple" :placeholder="placeholder"> + <a-select-option + v-for="(item,index) in options" + :key="index" + :value="item.value"> + {{ item.text }} + </a-select-option> + </a-select> +</template> + +<script> + //option {label:,value:} + export default { + name: 'JSelectMultiple', + props: { + placeholder:{ + type: String, + default:'', + required: false + }, + value:{ + type: String, + required: false + }, + readOnly:{ + type: Boolean, + required: false, + default: false + }, + options:{ + type: Array, + required: true + }, + triggerChange:{ + type: Boolean, + required: false, + default: false + } + }, + data(){ + return { + arrayValue:!this.value?[]:this.value.split(",") + } + }, + watch:{ + value (val) { + if(!val){ + this.arrayValue = [] + }else{ + this.arrayValue = this.value.split(",") + } + } + }, + methods:{ + onChange (selectedValue) { + if(this.triggerChange){ + this.$emit('change', selectedValue.join(",")); + }else{ + this.$emit('input', selectedValue.join(",")); + } + }, + } + } +</script> diff --git a/ant-design-jeecg-vue/src/components/jeecg/JSuperQuery.vue b/ant-design-jeecg-vue/src/components/jeecg/JSuperQuery.vue new file mode 100644 index 0000000..c5cd8ce --- /dev/null +++ b/ant-design-jeecg-vue/src/components/jeecg/JSuperQuery.vue @@ -0,0 +1,152 @@ +<template> + <a-modal + title="高级查询构造器" + :width="800" + :visible="visible" + :confirmLoading="confirmLoading" + @cancel="handleCancel" + :mask="false" + wrapClassName="ant-modal-cust-warp" + style="top:5%;max-height: 95%;"> + <template slot="footer"> + <a-button @click="handleCancel">关 闭</a-button> + <a-button @click="handleReset" style="float: left">重 置</a-button> + <a-button type="primary" @click="handleOk">查 询</a-button> + </template> + + <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" @select="(val,option)=>handleSelected(option,item)"> + <a-select-option v-for="(f,fIndex) in fieldList" :key=" 'field'+fIndex" :value="f.value" :data-type="f.type">{{ f.text }}</a-select-option> + </a-select> + </a-col> + + <a-col :span="6"> + <a-select placeholder="选择匹配规则" v-model="item.rule"> + <a-select-option value="eq">等于</a-select-option> + <a-select-option value="ne">不等于</a-select-option> + <a-select-option value="gt">大于</a-select-option> + <a-select-option value="ge">大于等于</a-select-option> + <a-select-option value="lt">小于</a-select-option> + <a-select-option value="le">小于等于</a-select-option> + <a-select-option value="right_like">以..开始</a-select-option> + <a-select-option value="left_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"> + <j-date v-if=" item.type=='date' " v-model="item.val" placeholder="请选择日期"></j-date> + <j-date v-else-if=" item.type=='datetime' " v-model="item.val" placeholder="请选择时间" :show-time="true" date-format="YYYY-MM-DD HH:mm:ss"></j-date> + <a-input-number v-else-if=" item.type=='int'||item.type=='number' " style="width: 100%" placeholder="请输入数值" v-model="item.val"/> + <a-input v-else v-model="item.val" placeholder="请输入值" /> + </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 ACol from 'ant-design-vue/es/grid/Col' + import JDate from '@/components/jeecg/JDate.vue'; + + export default { + name: 'JSuperQuery', + components: { + ACol, + JDate + }, + data(){ + return { + visible:false, + confirmLoading:false, + queryParamsModel:[{}] + } + }, + props:{ + /* fieldList:[{value:'',text:'',type:''}] + * type:date datetime int number string + * */ + fieldList:{ + type:Array, + required:true + }, + /* + * 这个回调函数接收一个数组参数 即查询条件 + * */ + callback:{ + type:String, + required:false, + default:'handleSuperQuery' + } + }, + methods:{ + show(){ + if(!this.queryParamsModel ||this.queryParamsModel.length==0){ + this.queryParamsModel = [{}] + } + this.visible = true; + }, + handleOk(){ + console.log("---高级查询参数--->",this.queryParamsModel) + if(!this.isNullArray()){ + this.$emit(this.callback, this.queryParamsModel) + }else{ + this.$emit(this.callback) + } + }, + handleCancel(){ + this.close() + }, + close () { + this.$emit('close'); + this.visible = false; + }, + handleAdd () { + this.queryParamsModel.push({}); + }, + handleDel (index) { + + this.queryParamsModel.splice(index,1); + this.$message.warning("请关闭后重新打开") + }, + handleSelected(option,item){ + item['type'] = option.data.attrs['data-type'] + }, + handleReset(){ + this.queryParamsModel=[{}] + this.$emit(this.callback) + }, + isNullArray(){ + //判断是不是空数组对象 + if(!this.queryParamsModel || this.queryParamsModel.length==0){ + return true + } + if(this.queryParamsModel.length==1){ + let obj = this.queryParamsModel[0] + if(!obj.field || !obj.val || !obj.rule){ + return true + } + } + return false; + } + } + } +</script> + +<style > + +</style> \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/components/jeecg/README.md b/ant-design-jeecg-vue/src/components/jeecg/README.md index 0c1e344..0947e1c 100644 --- a/ant-design-jeecg-vue/src/components/jeecg/README.md +++ b/ant-design-jeecg-vue/src/components/jeecg/README.md @@ -1,43 +1,198 @@ -日期组件 -说明: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 - +# JDate 日期组件 使用文档 + +###### 说明: antd-vue日期组件需要用moment中转一下,用起来不是很方便,特二次封装,使用时只需要传字符串即可 +## 参数配置 +| 参数 | 类型 | 必填 |说明| +|--------------|---------|----|---------| +| placeholder |string | | placeholder | +| readOnly | boolean | | true/false 默认false | +| value | string | | 绑定v-model或是v-decorator后不需要设置 | +| showTime | boolean | | 是否展示时间true/false 默认false | +| dateFormat | string | |日期格式 默认'YYYY-MM-DD' 若showTime设置为true则需要将其设置成对应的时间格式(如:YYYY-MM-DD HH:mm:ss) | +| triggerChange | string | |触发组件值改变的事件是否是change,当使用v-decorator时且没有设置decorator的option.trigger为input需要设置该值为true | 使用示例 ---- 1.组件带有v-model的使用方法 +```vue <j-date v-model="dateStr"></j-date> +``` -2.组件带有v-decorator的使用方法 +2.组件带有v-decorator的使用方法 a).设置trigger-change属性为true + ```vue <j-date :trigger-change="true" v-decorator="['dateStr',{}]"></j-date> + ``` + b).设置decorator的option.trigger为input + ```vue <j-date v-decorator="['dateStr',{trigger:'input'}]"></j-date> + ``` 3.其他使用 添加style - <j-date v-model="dateStr" style="width:100%"></j-date> +```vue +<j-date v-model="dateStr" style="width:100%"></j-date> +``` 添加placeholder - <j-date v-model="dateStr" placeholder="请输入dateStr"></j-date> +```vue +<j-date v-model="dateStr" placeholder="请输入dateStr"></j-date> +``` 添加readOnly - <j-date v-model="dateStr" :read-only="true"></j-date> +```vue +<j-date v-model="dateStr" :read-only="true"></j-date> +``` 备注: script内需引入jdate +```vue <script> import JDate from '@/components/jeecg/JDate' export default { name: "demo", components: { JDate + } + //... + } +</script> +``` + + + --- + + +# JSuperQuery 高级查询 使用文档 +## 参数配置 +| 参数 | 类型 | 必填 | 说明 | +|--------------|---------|----|----------------------| +| fieldList | array |✔| 需要查询的列集合示例如下,type类型有:date/datetime/string/int/number | +| callback | array | | 回调函数名称(非必须)默认handleSuperQuery | + +fieldList结构示例: +```vue + const superQueryFieldList=[{ + type:"date", + value:"birthday", + text:"生日" + },{ + type:"string", + value:"name", + text:"用户名" + },{ + type:"int", + value:"age", + text:"年龄" + }] +``` +页面代码概述: +---- +1.import之后再components之内声明 +```vue +import JSuperQuery from '@/components/jeecg/JSuperQuery.vue'; + export default { + name: "JeecgDemoList", + components: { + JSuperQuery }, -.... -</script> \ No newline at end of file + +``` +2.页面引用 +```vue + <!-- 高级查询区域 --> + <j-super-query :fieldList="fieldList" ref="superQueryModal" @handleSuperQuery="handleSuperQuery"></j-super-query> +``` +3.list页面data中需要定义三个属性: +```vue + fieldList:superQueryFieldList, + superQueryFlag:false, + superQueryParams:"" +``` +4.list页面声明回调事件handleSuperQuery(与组件的callback对应即可) +```vue +//高级查询方法 +handleSuperQuery(arg) { + if(!arg){ + this.superQueryParams='' + this.superQueryFlag = false + }else{ + this.superQueryFlag = true + this.superQueryParams=JSON.stringify(arg) + } + this.loadData() +}, +``` +5.改造list页面方法 +```vue + // 获取查询条件 + getQueryParams() { + let sqp = {} + if(this.superQueryParams){ + sqp['superQueryParams']=encodeURI(this.superQueryParams) + } + var param = Object.assign(sqp, this.queryParam, this.isorter); + param.field = this.getQueryField(); + param.pageNo = this.ipagination.current; + param.pageSize = this.ipagination.pageSize; + return filterObj(param); + }, +``` +6.打开弹框调用show方法: +```vue +this.$refs.superQueryModal.show(); +``` + +# JEllipsis 字符串超长截取省略号显示 + +###### 说明: 遇到超长文本展示,通过此标签可以截取省略号显示,鼠标放置会提示全文本 +## 参数配置 +| 参数 | 类型 | 必填 | 说明 | +|--------|---------|----|----------------| +| value |string | 必填 | 字符串文本| +| length | number | 非必填 | 默认25 | +使用示例 +---- +1.组件带有v-model的使用方法 +```vue +<j-ellipsis :value="text"/> + + +# Modal弹框实现最大化功能 + +1.定义modal的宽度: +```vue + <a-modal + :width="modalWidth" + + + /> +``` +2.自定义modal的title,居右显示切换图标 +```vue + <template slot="title"> + <div style="width: 100%;"> + <span>{{ title }}</span> + <span style="display:inline-block;width:calc(100% - 51px);padding-right:10px;text-align: right"> + <a-button @click="toggleScreen" icon="appstore" style="height:20px;width:20px;border:0px"></a-button> + </span> + </div> + </template> +``` +3.定义toggleScreen事件,用于切换modal宽度 +```vue + toggleScreen(){ + if(this.modaltoggleFlag){ + this.modalWidth = window.innerWidth; + }else{ + this.modalWidth = 800; + } + this.modaltoggleFlag = !this.modaltoggleFlag; + }, +``` +4.data中声明上述用到的属性 +```vue + data () { + return { + modalWidth:800, + modaltoggleFlag:true, +``` + diff --git a/ant-design-jeecg-vue/src/components/jeecg/README_JEditableTable.md b/ant-design-jeecg-vue/src/components/jeecg/README_JEditableTable.md new file mode 100644 index 0000000..2604410 --- /dev/null +++ b/ant-design-jeecg-vue/src/components/jeecg/README_JEditableTable.md @@ -0,0 +1,396 @@ +# JEditableTable 帮助文档 + +## 参数配置 + +| 参数 | 类型 | 必填 | 说明 | +|--------------|---------|----|---------------------------------| +| columns | array | ✔️ | 表格列的配置描述,具体项见下表 | +| dataSource | array | ✔️ | 表格数据 | +| loading | boolean | | 是否正在加载,加载中不会显示任何行,默认false | +| actionButton | boolean | | 是否显示操作按钮,包括"新增"、"删除",默认false | +| rowNumber | boolean | | 是否显示行号,默认false | +| rowSelection | boolean | | 是否可选择行,默认false | +| maxHeight | number | | 设定最大高度(px),默认400 | +| disabledRows | object | | 设定禁用的行,被禁用的行无法被选择和编辑,配置方法可以查看示例 | + +### columns 参数详解 + +| 参数 | 类型 | 必填 | 说明 | +|---------------|--------|----|----------------------------------------------------------------------| +| title | string | ✔️ | 表格列头显示的问题 | +| key | string | ✔️ | 列数据在数据项中对应的 key,必须是唯一的 | +| type | string | ✔️ | 表单的类型,可以通过`JEditableTableUtil.FormTypes`赋值 | +| width | string | | 列的宽度,可以是百分比,也可以是`px`或其他单位,建议设置为百分比,且每一列的宽度加起来不应超过100%,否则可能会不能达到预期的效果。留空会自动计算百分比 | +| placeholder | string | | 表单预期值的提示信息,可以使用`${...}`变量替换文本(详见`${...} 变量使用方式`) | +| defaultValue | string | | 默认值,在新增一行时生效 | +| validateRules | array | | 表单验证规则,配置方式见[validateRules 配置规则](#validaterules-配置规则) | +| props | object | | 设置添加给表单元素的自定义属性,例如:`props:{title: 'show title'}` | + +#### 当 type=checkbox 时所需的参数 + +| 参数 | 类型 | 必填 | 说明 | +|----------------|---------|----|------------------------------------------------------------------------------------------------------------------------------------------| +| defaultChecked | boolean | | 默认值是否选中 | +| customValue | array | | 自定义值,checkbox需要的是boolean值,如果数据是其他值(例如`'Y' or 'N'`)时,就会导致错误,所以提供了该属性进行转换,例:`customValue: ['Y','N']`,会将`true`转换为`'Y'`,`false`转换为`'N'`,反之亦然 | + +#### 当 type=select 时所需的参数 + +| 参数 | 类型 | 必填 | 说明 | +|---------|-------|----|-------------| +| options | array | ✔️ | 下拉选项列表,详见下表 | + +##### options 所需参数 + +| 参数 | 类型 | 必填 | 说明 | +|-------|--------|----|------| +| title | string | ✔️ | 显示标题 | +| value | string | ✔️ | 真实值 | + +### validateRules 配置规则 + +`validateRules` 需要的是一个数组,数组里每项都是一个规则,规则是object类型,规则的各个参数如下 + +- `required` 是否必填,可选值为`true`or`false` +- `pattern` 正则表达式验证,只有成功匹配该正则的值才能成功通过验证 +- `message` 当验证未通过时显示的提示文本,可以使用`${...}`变量替换文本(详见`${...} 变量使用方式`) +- 配置示例请看[示例二](#示例二) + +## 事件 + +| 事件名 | 触发时机 | 参数 | +|-----------------|---------------------------|--------------------------| +| added | 当添加行操作完成后触发 | | +| deleted | 当删除行操作完成后触发(批量删除操作只会触发一次) | `deleteIds` 被逻辑删除的id | +| selectRowChange | 当行被选中或取消选中时触发 | `selectedRowIds` 被选中行的id | + +## 方法 + +关于方法的如何调用的问题,请在**FAQ**中查看[方法如何调用](#方法如何调用) + +### initialize + +用于初始化表格(清空表格) + +- `参数:` 无 +- `返回值:` 无 + +### resetScrollTop + +重置滚动条Top位置 + +- `参数:` + +| 参数名 | 类型 | 必填 | 说明 | +|-----|--------|----|--------------------------------------------------------| +| top | number | | 新top位置,留空则滚动到上次记录的位置,用于解决切换tab选项卡时导致白屏以及自动将滚动条滚动到顶部的问题 | + +- `返回值:` 无 + +### add + +主动添加行,默认情况下,当用户的滚动条已经在底部的时候,会将滚动条固定在底部,即添加后无需用户手动滚动,而会自动滚动到底部 + +- `参数:` + +| 参数名 | 类型 | 必填 | 说明 | +|---------------------|---------|----|--------------------------------------| +| num | number | | 添加几行,默认为1 | +| forceScrollToBottom | boolean | | 是否在添加后无论用户的滚动条在什么位置都强制滚动到底部,默认为false | + +- `返回值:` 无 + +### removeRows + +主动删除一行或多行 + +- `参数:` + +| 参数名 | 类型 | 必填 | 说明 | +|-----|----------------|----|--------------------------------------------------| +| id | string 或 array | ✔️ | 被删除行的id。如果要删除一个,可以直接传id,如果要删除多个,需要将多个id封装成一个数组传入 | + +- `返回值:` 无 + +### removeSelectedRows + +主动删除被选中的行 + +- `参数:` 无 +- `返回值:` 无 + +### getValues + +用于获取表格里所有表单的值,可进行表单验证 + +- `参数:` + +| 参数名 | 类型 | 必填 | 说明 | +|----------|----------|----|-----------------------------------------------------------------------------------------------| +| callback | function | ✔️ | 获取值的回调方法,会传入`error`和`values`两个参数。`error`:未通过验证的数量,当等于`0`时代表验证通过;`values`:获取的值(即使未通过验证该字段也有数据) | +| validate | boolean | | 是否进行表单验证,默认为`true`,设为`false`则代表忽略表单验证 | + +- `返回值:` 无 + +### getValuesPromise + +`getValues`的promise版,会在`resolve`中传入获取到的值,会在`reject`中传入失败原因,例如`VALIDATE_NO_PASSED` + +- `参数:` + +| 参数名 | 类型 | 必填 | 说明 | +|----------|---------|----|---------------------------| +| validate | boolean | | 同`getValues`的`validate`参数 | + +- `返回值:` Promise + +### getDeleteIds + +用于获取被逻辑删除的行的id,返回一个数组,用户可将该数组传入后台,并进行批量删除 + +- `参数:` 无 +- `返回值:` array + +### getAll + +获取所有的数据,包括values、deleteIds +会在`resolve`中传入获取到的值:`{values, deleteIds}` +会在`reject`中传入失败原因,例如`VALIDATE_NO_PASSED` + +- `参数:` + +| 参数名 | 类型 | 必填 | 说明 | +|----------|---------|----|---------------------------| +| validate | boolean | | 同`getValues`的`validate`参数 | + +- `返回值:` Promise + +### setValues + +主动设置表格中某行某列的值 + +- `参数:` + +| 参数名 | 类型 | 必填 | 说明 | +|--------|-------|----|-------------------------------| +| values | array | | 传入一个数组,数组中的每项都是一行的新值,具体见下面的示例 | + +- `返回值:` 无 +- `示例:` + +```js +setValues([ + { + rowKey: id1, // 行的id + values: { // 在这里 values 中的 name 是你 columns 中配置的 key + 'name': 'zhangsan', + 'age': '20' + } + }, + { + rowKey: id2, + values: { + 'name': 'lisi', + 'age': '23' + } + } +]) +``` + +## ${...} 变量使用方式 + +在`placeholder`和`message`这两个属性中可以使用`${...}`变量来替换文本 +在[示例二](#示例二)中,配置了`title`为`名称`的一列,而`placeholder`配置成了`请输入${title}`,那么最终显示效果为`请输入名称` +这就是`${...}`变量的使用方式,在`${}`中可以使用的变量有`title`、`key`、`defaultValue`这三个属性的值 + +## JEditableTableUtil 使用说明 + +在之前配置`columns`时提到过`JEditableTableUtil`这个工具类,那么如果想要知道详细的使用说明就请看这里 + +### export 的常量 + +#### FormTypes + +这是配置`columns.type`时用到的常量值,其中包括 + +- `normal` 默认,直接显示值,不渲染表单 +- `input` 显示输入框 +- `inputNumber` 显示数字输入框 +- `checkbox` 显示多选框 +- `select` 显示选择器(下拉框) +- `date` 日期选择器 +- `datetime` 日期时间选择器 + +### VALIDATE_NO_PASSED + +在判断表单验证是否通过时使用,如果 reject 的值 === VALIDATE_NO_PASSED 则代表表单验证未通过,你可以做相应的其他处理,反之则可能是发生了报错,可以使用 `console.error` 输出 + +### 封装的方法 + +#### validateTables + +当你的页面中存在多个JEditableTable实例的时候,如果要获取每个实例的值、判断表单验证是否通过,就会让代码变得极其冗余、繁琐,于是我们就将该操作封装成了一个函数供你调用,它可以同时获取并验证多个JEditableTable实例的值,只有当所有实例的表单验证都通过后才会返回值,否则将会告诉你具体哪个实例没有通过验证。具体使用方法请看下面的示例 + +- `参数:` + +| 参数名 | 类型 | 必填 | 说明 | +|-------|-------|----|------------------------------------| +| cases | array | | 传入一个数组,数组中的每项都是一个JEditableTable的实例 | + +- `返回值:` Promise +- `示例:` + +```js +import { validateTables, VALIDATE_NO_PASSED } from '@/utils/JEditableTableUtil' +// 封装cases +let cases = [] +cases.push(this.$refs.editableTable1) +cases.push(this.$refs.editableTable2) +cases.push(this.$refs.editableTable3) +cases.push(this.$refs.editableTable4) +cases.push(this.$refs.editableTable5) +// 同时验证并获取多个实例的值 +validateTables(cases).then((all) => { + // all 是一个数组,每项都对应传入cases的下标,包含values和deleteIds + console.log('所有实例的值:', all) +}).catch((e = {}) => { + // 判断表单验证是否未通过 + if (e.error === VALIDATE_NO_PASSED) { + console.log('未通过验证的实例下标:', e.index) + } else { + console.error('发生异常:', e) + } +}) +``` + +## FAQ + +### 方法如何调用? + +在[示例一](#示例一)中,设定了一个 `ref="editableTable"` 的属性,那么在vue中就可以使用`this.$refs.editableTable`获取到该表格的实例,并调取其中的方法。 +假如我要调取`initialize`方法,就可以这么写:`this.$refs.editableTable.initialize()` + +### 如何获取表单的值? + +使用`getValue`方法进行获取,详见[示例三](#示例三) + +### 如何进行表单验证? + +在获取值的时候默认会进行表单验证操作,用户在输入的时候也会对正在输入的表单进行验证,只要配置好规则就可以了 + +### 如何添加或删除一行? + +该功能已封装到组件中,你只需要将 `actionButton` 设置为 `true` 即可,当然你也可以在代码中主动调用新增方法或修改,具体见上方的方法介绍。 + +### 为什么使用了ATab组件后,切换选项卡会导致白屏或滚动条位置会归零? + +在ATab组件中确实会导致滚动条位置归零,且不会触发`onscroll`方法,所以无法动态加载行,导致白屏的问题出现。 +解决方法是在ATab组件的`onChange`事件触发时执行`resetScrollTop()`即可,但是需要注意的是:代码主动改变ATab的`activeKey`不会触发`onChange`事件,还需要你手动调用下 + +- `示例` + +```html +<template> + <a-tabs @change="handleChangeTab"> + <a-tab-pane tab="表格1" :forceRender="true" key="1"> + <j-editable-table + ref="editableTable1" + :loading="tab1.loading" + :columns="tab1.columns" + :dataSource="tab1.dataSource"/> + </a-tab-pane> + <a-tab-pane tab="表格2" :forceRender="true" key="2"> + <j-editable-table + ref="editableTable2" + :loading="tab2.loading" + :columns="tab2.columns" + :dataSource="tab2.dataSource"/> + </a-tab-pane> + </a-tabs> +</template> +``` + +```js +/*--- 忽略部分代码片段 ---*/ +methods: { + + /** 切换tab选项卡的时候重置editableTable的滚动条状态 */ + handleChangeTab(key) { + this.$refs[`editableTable${key}`].resetScrollTop() + } + +} +/*--- 忽略部分代码片段 ---*/ +``` + +---- + +## 示例一 + +```html +<j-editable-table + ref="editableTable" + :loading="loading" + :columns="columns" + :dataSource="dataSource" + :rowNumber="true" + :rowSelection="true" + :actionButton="true" + style="margin-top: 8px;" + @selectRowChange="handleSelectRowChange"/> +``` + +## 示例二 + +```js + +import { FormTypes } from '@/utils/JEditableTableUtil' + +/*--- 忽略部分代码片断 ---*/ +columns: [ + { + title: '名称', + key: 'name', + type: FormTypes.input, + placeholder: '请输入${title}', + defaultValue: '称名', + // 表单验证规则 + validateRules: [ + { + required: true, // 必填 + message: '${title}不能为空' // 提示的文本 + }, + { + pattern: /^[a-z|A-Z][a-z|A-Z\d_-]{0,}$/, // 正则 + message: '${title}必须以字母开头,可包含数字、下划线、横杠' + } + ] + }, + { + title: '年龄', + key: 'age', + type: FormTypes.inputNumber, + placeholder: '请输入${title}', + defaultValue: 18, + validateRules: [{required: true, message: '${title}不能为空'}] + } +] +/*--- 忽略部分代码片断 ---*/ +``` + +## 示例三 + +```js +// 获取被逻辑删除的字段id +let deleteIds = this.$refs.editableTable.getDeleteIds(); +// 获取所有表单的值,并进行验证 +this.$refs.editableTable.getValues((error, values) => { + // 错误数 = 0 则代表验证通过 + if (error === 0) { + this.$message.success('验证通过') + // 将通过后的数组提交到后台或自行进行其他处理 + console.log(deleteIds, values) + } else { + this.$message.error('验证未通过') + } +}) +``` \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/components/jeecgbiz/JSearchUserByDep.vue b/ant-design-jeecg-vue/src/components/jeecgbiz/JSearchUserByDep.vue new file mode 100644 index 0000000..e3dc7e0 --- /dev/null +++ b/ant-design-jeecg-vue/src/components/jeecgbiz/JSearchUserByDep.vue @@ -0,0 +1,309 @@ +<template> + + <a-modal + :width="modalWidth" + :visible="visible" + :title="title" + @ok="handleSubmit" + @cancel="close" + cancelText="关闭" + style="margin-top: -70px" + wrapClassName="ant-modal-cust-warp" + > + <a-row :gutter="10" style="background-color: #ececec; padding: 10px; margin: -10px"> + <a-col :md="6" :sm="24"> + <a-card :bordered="false"> + <!--组织机构--> + <a-directory-tree + selectable + :selectedKeys="selectedKeys" + :checkStrictly="true" + @select="this.onSelect" + :dropdownStyle="{maxHeight:'200px',overflow:'auto'}" + :treeData="departTree" + /> + </a-card> + </a-col> + <a-col :md="18" :sm="24"> + <a-card :bordered="false"> + 用户账号: + <a-input-search + :style="{width:'150px',marginBottom:'15px'}" + placeholder="请输入用户名搜索" + v-model="queryParam.username" + @search="onSearch" + ></a-input-search> + <a-button @click="searchReset(1)" style="margin-left: 20px" icon="redo">重置</a-button> + <!--用户列表--> + <a-table + ref="table" + :scroll="scrollTrigger" + size="middle" + rowKey="id" + :columns="columns" + :dataSource="dataSource" + :pagination="ipagination" + :rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}" + @change="handleTableChange"> + </a-table> + </a-card> + </a-col> + </a-row> + </a-modal> + +</template> + +<script> + import { filterObj } from '@/utils/util' + import { queryDepartTreeList, getUserList, queryUserByDepId, queryUserRoleMap } from '@/api/api' + + export default { + name: 'JSearchUserByDep', + components: {}, + data() { + return { + queryParam: { + username:"", + }, + columns: [ + { + title: '用户账号', + align: 'center', + dataIndex: 'username' + }, + { + title: '真实姓名', + align: 'center', + dataIndex: 'realname' + }, + { + title: '角色名称', + align: 'center', + dataIndex: 'roleName' + }, + { + title: '性别', + align: 'center', + dataIndex: 'sex', + customRender: function(text) { + if (text === 1) { + return '男' + } else if (text === 2) { + return '女' + } else { + return text + } + } + }, + { + title: '手机号码', + align: 'center', + dataIndex: 'phone' + }, + { + title: '邮箱', + align: 'center', + dataIndex: 'email' + } + ], + scrollTrigger: {}, + dataSource: [], + selectedKeys: [], + userNameArr: [], + departName: '', + userRolesMap: {}, + title: '', + 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' + }, + selectedRowKeys: [], + selectedRows: [], + modalWidth: 1250, + departTree: [], + visible: false, + form: this.$form.createForm(this) + } + }, + created() { + // 该方法触发屏幕自适应 + this.resetScreenSize(); + this.queryUserRoleMap(); + }, + 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.assignRoleName(this.dataSource); + this.ipagination.total = res.result.total; + } + }) + }, + queryUserRoleMap(){ + queryUserRoleMap().then((res) => { + if (res.success) { + this.userRolesMap = res.result; + this.loadData(); + } + }) + }, + // 触发屏幕自适应 + resetScreenSize() { + let screenWidth = document.body.clientWidth; + if (screenWidth < 500) { + this.scrollTrigger = { x: 800 }; + } else { + this.scrollTrigger = {}; + } + }, + showModal() { + this.visible = true; + this.assignRoleName(this.dataSource); + this.queryDepartTree(); + this.form.resetFields(); + }, + getQueryParams() { + let 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() { + let str = 'id,'; + for (let a = 0; a < this.columns.length; a++) { + str += ',' + this.columns[a].dataIndex; + } + return str; + }, + searchReset(num) { + let that = this; + that.selectedRowKeys = []; + that.userNameArr = []; + that.queryParam = {}; + that.selectedKeys = []; + if(num !== 0){ + that.loadData(); + } + }, + close() { + this.searchReset(0); + this.visible = false; + }, + 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(); + }, + handleSubmit() { + let that = this; + for (let i = 0, len = this.selectedRowKeys.length; i < len; i++) { + this.getUserNames(this.selectedRowKeys[i]); + } + that.$emit('ok', that.userNameArr.join(',')); + that.close(); + }, + // 遍历匹配,获取用户真实姓名 + getUserNames(rowId) { + let dataSource = this.dataSource; + for (let i = 0, len = dataSource.length; i < len; i++) { + if (rowId === dataSource[i].id) { + this.userNameArr.push(dataSource[i].realname); + } + } + }, + // 点击树节点,筛选出对应的用户 + onSelect(selectedKeys) { + if (selectedKeys[0] != null) { + this.queryUserByDepId(selectedKeys); // 调用方法根据选选择的id查询用户信息 + if (this.selectedKeys[0] !== selectedKeys[0]) { + this.selectedKeys = [selectedKeys[0]]; + } + } + }, + onSelectChange(selectedRowKeys, selectionRows) { + this.selectedRowKeys = selectedRowKeys; + this.selectionRows = selectionRows; + }, + onSearch() { + this.loadData(1); + }, + // 根据选择的id来查询用户信息 + queryUserByDepId(selectedKeys) { + queryUserByDepId({ id: selectedKeys.toString() }).then((res) => { + if (res.success) { + this.dataSource = res.result; + this.ipagination.total = res.result.length; + this.assignRoleName(this.dataSource); + } + }) + }, + // 传入用户id,找到匹配的角色名称 + queryUserRole(userId) { + let map = this.userRolesMap; + let roleName = []; + for (var key in map) { + if (userId === key) { + roleName.push(map[key]); + } + } + return roleName.join(','); + }, + queryDepartTree() { + queryDepartTreeList().then((res) => { + if (res.success) { + this.departTree = res.result; + } + }) + }, + // 为角色名称赋值 + assignRoleName(data) { + let userId = ''; + let role = ''; + for (let i = 0, length = data.length; i < length; i++) { + userId = this.dataSource[i].id; + role = this.queryUserRole(userId); + this.dataSource[i].roleName = role; + } + }, + modalFormOk() { + this.loadData(); + } + } + } +</script> + +<style scoped> + .ant-table-tbody .ant-table-row td { + padding-top: 10px; + padding-bottom: 10px; + } + + #components-layout-demo-custom-trigger .trigger { + font-size: 18px; + line-height: 64px; + padding: 0 24px; + cursor: pointer; + transition: color .3s; + } +</style> \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/components/jeecgbiz/JSearchUserByDepModal.vue b/ant-design-jeecg-vue/src/components/jeecgbiz/JSearchUserByDepModal.vue new file mode 100644 index 0000000..f4982b7 --- /dev/null +++ b/ant-design-jeecg-vue/src/components/jeecgbiz/JSearchUserByDepModal.vue @@ -0,0 +1,309 @@ +<template> + + <a-modal + :width="modalWidth" + :visible="visible" + :title="title" + @ok="handleSubmit" + @cancel="close" + cancelText="关闭" + style="margin-top: -70px" + wrapClassName="ant-modal-cust-warp" + > + <a-row :gutter="10" style="background-color: #ececec; padding: 10px; margin: -10px"> + <a-col :md="6" :sm="24"> + <a-card :bordered="false"> + <!--组织机构--> + <a-directory-tree + selectable + :selectedKeys="selectedKeys" + :checkStrictly="true" + @select="this.onSelect" + :dropdownStyle="{maxHeight:'200px',overflow:'auto'}" + :treeData="departTree" + /> + </a-card> + </a-col> + <a-col :md="18" :sm="24"> + <a-card :bordered="false"> + 用户账号: + <a-input-search + :style="{width:'150px',marginBottom:'15px'}" + placeholder="请输入用户名搜索" + v-model="queryParam.username" + @search="onSearch" + /> + <a-button @click="searchReset" style="margin-left: 20px" icon="redo">重置</a-button> + <!--用户列表--> + <a-table + ref="table" + :scroll="scrollTrigger" + size="middle" + rowKey="id" + :columns="columns" + :dataSource="dataSource" + :pagination="ipagination" + :rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}" + @change="handleTableChange"> + </a-table> + </a-card> + </a-col> + </a-row> + </a-modal> + +</template> + +<script> + import { filterObj } from '@/utils/util' + import { queryDepartTreeList, getUserList, queryUserByDepId, queryUserRoleMap } from '@/api/api' + + export default { + name: 'JSearchUserByDepModal', + components: {}, + data() { + return { + queryParam: {}, + columns: [ + { + title: '用户账号', + align: 'center', + dataIndex: 'username' + }, + { + title: '真实姓名', + align: 'center', + dataIndex: 'realname' + }, + { + title: '角色名称', + align: 'center', + dataIndex: 'roleName' + }, + { + title: '性别', + align: 'center', + dataIndex: 'sex', + customRender: function(text) { + if (text === 1) { + return '男' + } else if (text === 2) { + return '女' + } else { + return text + } + } + }, + { + title: '手机号码', + align: 'center', + dataIndex: 'phone' + }, + { + title: '邮箱', + align: 'center', + dataIndex: 'email' + } + ], + scrollTrigger: {}, + dataSource: [], + userDataSource:[], + selectedKeys: [], + userNameArr: [], + departName: '', + userRolesMap: {}, + title: '', + 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' + }, + selectedRowKeys: [], + selectedRows: [], + modalWidth: 1250, + departTree: [], + visible: false, + form: this.$form.createForm(this) + } + }, + created() { + // 该方法触发屏幕自适应 + this.resetScreenSize(); + this.queryUserRoleMap(); + }, + 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.userDataSource = res.result.records; + this.assignRoleName(this.dataSource); + this.ipagination.total = res.result.total; + } + }) + }, + queryUserRoleMap(){ + queryUserRoleMap().then((res) => { + if (res.success) { + this.userRolesMap = res.result; + this.loadData(); + } + }) + }, + // 触发屏幕自适应 + resetScreenSize() { + let screenWidth = document.body.clientWidth; + if (screenWidth < 500) { + this.scrollTrigger = { x: 800 }; + } else { + this.scrollTrigger = {}; + } + }, + showModal() { + this.visible = true; + this.assignRoleName(this.dataSource); + this.queryDepartTree(); + this.form.resetFields(); + }, + getQueryParams() { + let 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() { + let str = 'id,'; + for (let a = 0; a < this.columns.length; a++) { + str += ',' + this.columns[a].dataIndex; + } + return str; + }, + searchReset(num) { + let that = this; + if (num !== 0) { + that.dataSource = that.userDataSource; + } + that.selectedRowKeys = []; + that.userNameArr = []; + that.queryParam = {}; + that.selectedKeys = []; + }, + close() { + this.searchReset(0); + this.visible = false; + }, + 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(); + }, + handleSubmit() { + let that = this; + for (let i = 0, len = this.selectedRowKeys.length; i < len; i++) { + this.getUserNames(this.selectedRowKeys[i]); + } + that.$emit('ok', that.userNameArr.join(',')); + that.close(); + }, + // 遍历匹配,获取用户真实姓名 + getUserNames(rowId) { + let dataSource = this.dataSource; + for (let i = 0, len = dataSource.length; i < len; i++) { + if (rowId === dataSource[i].id) { + this.userNameArr.push(dataSource[i].realname); + } + } + }, + // 点击树节点,筛选出对应的用户 + onSelect(selectedKeys) { + if (selectedKeys[0] != null) { + this.queryUserByDepId(selectedKeys); // 调用方法根据选选择的id查询用户信息 + if (this.selectedKeys[0] !== selectedKeys[0]) { + this.selectedKeys = [selectedKeys[0]]; + } + } + }, + onSelectChange(selectedRowKeys, selectionRows) { + this.selectedRowKeys = selectedRowKeys; + this.selectionRows = selectionRows; + }, + onSearch() { + this.loadData(1); + }, + // 根据选择的id来查询用户信息 + queryUserByDepId(selectedKeys) { + queryUserByDepId({ id: selectedKeys.toString() }).then((res) => { + if (res.success) { + this.dataSource = res.result; + this.ipagination.total = res.result.length; + this.assignRoleName(this.dataSource); + } + }) + }, + // 传入用户id,找到匹配的角色名称 + queryUserRole(userId) { + let map = this.userRolesMap; + let roleName = []; + for (var key in map) { + if (userId === key) { + roleName.push(map[key]); + } + } + return roleName.join(','); + }, + queryDepartTree() { + queryDepartTreeList().then((res) => { + if (res.success) { + this.departTree = res.result; + } + }) + }, + // 为角色名称赋值 + assignRoleName(data) { + let userId = ''; + let role = ''; + for (let i = 0, length = data.length; i < length; i++) { + userId = this.dataSource[i].id; + role = this.queryUserRole(userId); + this.dataSource[i].roleName = role; + } + }, + modalFormOk() { + this.loadData(); + } + } + } +</script> + +<style scoped> + .ant-table-tbody .ant-table-row td { + padding-top: 10px; + padding-bottom: 10px; + } + + #components-layout-demo-custom-trigger .trigger { + font-size: 18px; + line-height: 64px; + padding: 0 24px; + cursor: pointer; + transition: color .3s; + } +</style> \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/components/jeecgbiz/JSelectUser.vue b/ant-design-jeecg-vue/src/components/jeecgbiz/JSelectUser.vue new file mode 100644 index 0000000..e20485c --- /dev/null +++ b/ant-design-jeecg-vue/src/components/jeecgbiz/JSelectUser.vue @@ -0,0 +1,87 @@ +<template> + <div> + <a-modal + :title="title" + :width="800" + :visible="visible" + :confirmLoading="confirmLoading" + @ok="handleSubmit" + @cancel="handleCancel"> + <div> + <a-form-item label="用户名:" :label-col="{ span: 5 }" :wrapper-col="{ span: 12 }"> + <a-input-search placeholder="点击右侧按钮选择用户" disabled @search="onSearch" v-model="userNames"> + <a-button slot="enterButton" icon="search">选择</a-button> + </a-input-search> + </a-form-item> + </div> + </a-modal> + + <!-- 用户查询列表 --> + <select-user-list-modal ref="selectUserListModal" @ok="getUserCallBack"></select-user-list-modal> + </div> +</template> + +<script> + import {getUserList} from '@/api/api' + import SelectUserListModal from './modal/SelectUserListModal' + + export default { + name: "SelectUserModal", + components: { + SelectUserListModal, + }, + props: ['taskId'], + data() { + return { + title: "操作", + visible: false, + selectUserListVisible: false, + model: {}, + confirmLoading: false, + userNames: '', + userKeys: '', + } + }, + created() { + }, + methods: { + open() { + this.userNames = '' + this.userKeys = '' + this.visible = true; + }, + close() { + this.$emit('close'); + this.visible = false; + }, + handleCancel() { + this.close() + }, + onSearch() { + this.$refs.selectUserListModal.open(); + }, + getUserCallBack(selectionRows) { + console.log(selectionRows) + let names = '' + let keys = '' + for (let row of selectionRows) { + names = row.realname + "," + names + keys = row.username + "," + keys + } + this.userNames = names + this.userKeys = keys + + console.log('--userkeys--' + this.userKeys) + }, + handleSubmit() { + console.log("taskId: "+ this.taskId) + this.$emit('ok', this.userKeys,this.taskId); + this.close() + }, + } + } +</script> + +<style> + +</style> diff --git a/ant-design-jeecg-vue/src/components/jeecgbiz/SearchUserByDepModal.vue b/ant-design-jeecg-vue/src/components/jeecgbiz/SearchUserByDepModal.vue new file mode 100644 index 0000000..20c9768 --- /dev/null +++ b/ant-design-jeecg-vue/src/components/jeecgbiz/SearchUserByDepModal.vue @@ -0,0 +1,308 @@ +<template> + <a-modal + :width="modalWidth" + :visible="visible" + :title="title" + @ok="handleSubmit" + @cancel="close" + cancelText="关闭" + style="margin-top: -70px" + wrapClassName="ant-modal-cust-warp" + > + <a-row :gutter="10" style="background-color: #ececec; padding: 10px; margin: -10px"> + <a-col :md="6" :sm="24"> + <a-card :bordered="false"> + <!--组织机构--> + <a-directory-tree + selectable + :selectedKeys="selectedKeys" + :checkStrictly="true" + @select="this.onSelect" + :dropdownStyle="{maxHeight:'200px',overflow:'auto'}" + :treeData="departTree" + /> + </a-card> + </a-col> + <a-col :md="18" :sm="24"> + <a-card :bordered="false"> + 用户账号: + <a-input-search + :style="{width:'150px',marginBottom:'15px'}" + placeholder="" + v-model="queryParam.username" + @search="onSearch" + /> + <a-button @click="searchReset" style="margin-left: 10px" icon="redo">重置</a-button> + <!--用户列表--> + <a-table + ref="table" + :scroll="scrollTrigger" + size="middle" + rowKey="id" + :columns="columns" + :dataSource="dataSource" + :pagination="ipagination" + style="background-color: white" + :rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}" + @change="handleTableChange"> + </a-table> + </a-card> + </a-col> + </a-row> + </a-modal> +</template> + +<script> + import { filterObj } from '@/utils/util' + import { queryDepartTreeList, getUserList, queryUserByDepId, queryUserRoleMap } from '@/api/api' + + export default { + name: 'SearchUserByDepModal', + components: { + }, + data() { + return { + queryParam: {}, + columns: [ + { + title: '用户账号', + align: 'center', + dataIndex: 'username' + }, + { + title: '真实姓名', + align: 'center', + dataIndex: 'realname' + }, + { + title: '角色名称', + align: 'center', + dataIndex: 'roleName' + }, + { + title: '性别', + align: 'center', + dataIndex: 'sex', + customRender: function(text) { + if (text === 1) { + return '男' + } else if (text === 2) { + return '女' + } else { + return text + } + } + }, + { + title: '手机号码', + align: 'center', + dataIndex: 'phone' + }, + { + title: '邮箱', + align: 'center', + dataIndex: 'email' + } + ], + scrollTrigger:{}, + dataSource: [], + selectedKeys: [], + userNames: [], + departName: '', + userRolesMap: {}, + title: '', + 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' + }, + selectedRowKeys: [], + selectedRows: [], + userData: [], + modalWidth: 1250, + departTree: [], + visible: false, + form: this.$form.createForm(this), + } + }, + created() { + // 该方法触发屏幕自适应 + this.resetScreenSize(); + }, + 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.assignRoleName(this.dataSource); + this.userData = res.result.records; + this.ipagination.total = res.result.total; + } + }) + queryUserRoleMap().then((res) => { + if (res.success) { + this.userRolesMap = res.result; + } + }) + }, + // 触发屏幕自适应 + resetScreenSize(){ + let screenWidth = document.body.clientWidth; + if(screenWidth < 500){ + this.scrollTrigger = {x : 800}; + }else{ + this.scrollTrigger = {}; + } + }, + showModal() { + this.visible = true; + this.assignRoleName(this.dataSource); + this.queryDepartTree(); + this.form.resetFields(); + this.loadData(1); + }, + getQueryParams() { + let 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() { + let str = 'id,'; + for (let a = 0; a < this.columns.length; a++) { + str += ',' + this.columns[a].dataIndex; + } + return str; + }, + searchReset(num) { + let that = this; + if(num !== 0){ + that.loadData(1); + } + that.selectedRowKeys = []; + that.userNames = []; + that.queryParam = {}; + that.selectedKeys = []; + that.userNames = []; + }, + close() { + this.$emit('close'); + this.searchReset(0); + this.visible = false; + }, + 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(); + }, + handleSubmit() { + const that = this; + for (let i = 0, len = this.selectedRowKeys.length; i < len; i++) { + this.getUserNames(this.selectedRowKeys[i]); + } + that.$emit('ok', that.userNames.join(',')); + that.close(); + }, + // 遍历匹配,获取用户真实姓名 + getUserNames(rowId) { + let dataSource = this.dataSource; + for (let i = 0, len = dataSource.length; i < len; i++) { + if (rowId === dataSource[i].id) { + this.userNames.push(dataSource[i].realname); + } + } + }, + // 点击树节点,筛选出对应的用户 + onSelect(selectedKeys) { + if (selectedKeys[0] != null) { + this.queryUser(selectedKeys) // 调用方法根据选选择的id查询用户信息 + if (this.selectedKeys[0] !== selectedKeys[0]) { + this.selectedKeys = [selectedKeys[0]]; + } + } + }, + onSelectChange(selectedRowKeys, selectionRows) { + this.selectedRowKeys = selectedRowKeys; + this.selectionRows = selectionRows; + }, + onSearch() { + this.loadData(1); + }, + // 根据选择的id来查询用户信息 + queryUser(selectedKeys) { + queryUserByDepId({ id: selectedKeys.toString() }).then((res) => { + if (res.success) { + this.ipagination.total = res.result.length; + this.dataSource = res.result; + this.assignRoleName(this.dataSource); + } + }) + }, + // 传入用户id,找到匹配的角色名称 + queryUserRole(userId) { + let map = this.userRolesMap; + let roleName = []; + for (var key in map) { + if (userId === key) { + roleName.push(map[key]); + } + } + return roleName.join(','); + }, + queryDepartTree() { + queryDepartTreeList().then((res) => { + if (res.success) { + this.departTree = res.result; + } + }) + }, + // 为角色名称赋值 + assignRoleName(data) { + let userId = ''; + let role = ''; + for (let i = 0, length = data.length; i < length; i++) { + userId = this.dataSource[i].id; + role = this.queryUserRole(userId); + this.dataSource[i].roleName = role; + } + }, + modalFormOk() { + this.loadData(); + } + } + } +</script> + +<style scoped> + .ant-table-tbody .ant-table-row td { + padding-top: 10px; + padding-bottom: 10px; + } + + #components-layout-demo-custom-trigger .trigger { + font-size: 18px; + line-height: 64px; + padding: 0 24px; + cursor: pointer; + transition: color .3s; + } +</style> \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/components/jeecgbiz/SelectMultipleUserModal.vue b/ant-design-jeecg-vue/src/components/jeecgbiz/SelectMultipleUserModal.vue new file mode 100644 index 0000000..70d65b2 --- /dev/null +++ b/ant-design-jeecg-vue/src/components/jeecgbiz/SelectMultipleUserModal.vue @@ -0,0 +1,276 @@ +<template> + <div> + <a-modal + centered + :title="title" + :width="1000" + :visible="visible" + @ok="handleOk" + @cancel="handleCancel" + cancelText="关闭"> + <a-row :gutter="18"> + <a-col :span="16"> + <a-card title="选择人员" :bordered=true> + <!-- 查询区域 --> + <div class="table-page-search-wrapper"> + <a-form layout="inline"> + <a-row :gutter="24"> + + <a-col :span="10"> + <a-form-item label="姓名"> + <a-input placeholder="请输入姓名" v-model="queryParam.name"></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> + <!-- table区域-begin --> + <div> + <a-table + size="small" + bordered + rowKey="id" + :columns="columns1" + :dataSource="dataSource1" + :pagination="ipagination" + :loading="loading" + :scroll="{ y: 240 }" + :rowSelection="{selectedRowKeys: selectedRowKeys,onSelectAll:onSelectAll,onSelect:onSelect,onChange: onSelectChange}" + @change="handleTableChange"> + + </a-table> + </div> + <!-- table区域-end --> + </a-card> + </a-col> + <a-col :span="8"> + <a-card title="用户选择" :bordered=true> + <!-- table区域-begin --> + <div> + <a-table + size="small" + bordered + rowKey="id" + :columns="columns2" + :dataSource="dataSource2" + :loading="loading" + :scroll="{ y: 240 }" + > + <span slot="action" slot-scope="text, record"> + <a-button type="primary" size="small" @click="handleDelete(record)" icon="delete">删除</a-button> + </span> + </a-table> + </div> + <!-- table区域-end --> + </a-card> + </a-col> + </a-row> + </a-modal> + </div> +</template> + +<script> + import { filterObj } from '@/utils/util' + import { getAction } from '@/api/manage' + + export default { + name: "SelectDemoModal", + data () { + return { + title: "用户列表", + names: [], + visible: false, + placement: 'right', + description: '人员管理页面', + // 查询条件 + queryParam: {}, + // 表头 + columns1: [ + { + title: '#', + dataIndex: '', + key:'rowIndex', + width:50, + align:"center", + customRender:function (t,r,index) { + return parseInt(index)+1; + } + }, + { + title: '姓名', + align:"center", + width:113, + dataIndex: 'name' + }, + { + title: '年龄', + align:"center", + width:100, + dataIndex: 'age' + }, + { + title: '出生日期', + align:"center", + width:100, + dataIndex: 'birthday' + } + ], + columns2: [ + + { + title: '用户账号', + align:"center", + width:100, + dataIndex: 'name' + }, + { + title: '操作', + dataIndex: 'action', + align:"center", + width:100, + scopedSlots: { customRender: 'action' }, + } + ], + //数据集 + dataSource1:[], + dataSource2:[], + // 分页参数 + 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", + }, + + } + }, + created() { + this.loadData(); + }, + methods: { + searchQuery(){ + this.loadData(1); + }, + searchReset(){ + this.queryParam={}; + this.loadData(1); + }, + handleCancel() { + this.visible = false; + }, + handleOk() { + this.$emit("selectFinished",this.dataSource2); + this.visible = false; + }, + add() { + this.visible = true; + }, + 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.dataSource1 = 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 字段权限控制 + }, + onSelectAll (selected, selectedRows, changeRows) { + if(selected===true){ + for(var a = 0;a<changeRows.length;a++){ + this.dataSource2.push(changeRows[a]); + } + }else{ + for(var b = 0;b<changeRows.length;b++){ + this.dataSource2.splice(this.dataSource2.indexOf(changeRows[b]),1); + } + } + // console.log(selected, selectedRows, changeRows); + }, + onSelect (record,selected) { + if(selected===true){ + this.dataSource2.push(record); + }else{ + var index = this.dataSource2.indexOf(record); + //console.log(); + if(index >=0 ){ + this.dataSource2.splice(this.dataSource2.indexOf(record),1); + } + + } + }, + onSelectChange (selectedRowKeys,selectedRows) { + this.selectedRowKeys = selectedRowKeys; + this.selectionRows = selectedRows; + }, + onClearSelected(){ + this.selectedRowKeys = []; + this.selectionRows = []; + }, + handleDelete: function(record){ + this.dataSource2.splice(this.dataSource2.indexOf(record),1); + }, + 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 lang="less" scoped> + .ant-card-body .table-operator{ + margin-bottom: 18px; + } + .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/components/jeecgbiz/modal/SelectUserListModal.vue b/ant-design-jeecg-vue/src/components/jeecgbiz/modal/SelectUserListModal.vue new file mode 100644 index 0000000..60bca0e --- /dev/null +++ b/ant-design-jeecg-vue/src/components/jeecgbiz/modal/SelectUserListModal.vue @@ -0,0 +1,122 @@ +<template> + <a-modal + title="用户列表" + :width="1000" + :visible="visible" + :confirmLoading="confirmLoading" + @ok="handleSubmit" + @cancel="handleCancel"> + + <a-table + ref="table" + bordered + size="middle" + rowKey="id" + :columns="columns" + :dataSource="dataSource" + :pagination="ipagination" + :loading="loading" + :rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}"></a-table> + </a-modal> +</template> + +<script> + import {getUserList} from '@/api/api' + import {JeecgListMixin} from '@/mixins/JeecgListMixin' + + export default { + name: "SelectUserListModal", + mixins: [JeecgListMixin], + data() { + return { + title: "操作", + visible: false, + model: {}, + confirmLoading: false, + url: { + add: "/act/model/create", + list: "/sys/user/list" + }, + columns: [ + { + title: '用户账号', + align: "center", + dataIndex: 'username', + fixed: 'left', + width: 200 + }, + { + title: '用户真实姓名', + align: "center", + dataIndex: 'realname', + }, + { + title: '性别', + align: "center", + dataIndex: 'sex_dictText' + }, + { + title: '手机号码', + align: "center", + dataIndex: 'phone' + }, + { + title: '邮箱', + align: "center", + dataIndex: 'email' + }, + { + title: '状态', + align: "center", + dataIndex: 'status_dictText' + } + ] + } + }, + created() { + //Step.2 加载用户数据 + getUserList().then((res) => { + if (res.success) { + this.dataSource = res.result.records; + this.ipagination.total = res.result.total; + } + }) + }, + methods: { + open() { + this.visible = true; + + //Step.1 清空选中用户 + this.selectedRowKeys = [] + this.selectedRows = [] + }, + close() { + this.$emit('close'); + this.visible = false; + }, + handleChange(info) { + let file = info.file; + if (file.response.success) { + this.$message.success(file.response.message); + this.$emit('ok'); + this.close() + } else { + this.$message.warn(file.response.message); + this.close() + } + + }, + handleCancel() { + this.close() + }, + handleSubmit() { + this.$emit('ok', this.selectionRows); + this.close() + }, + } + } +</script> + +<style> + +</style> diff --git a/ant-design-jeecg-vue/src/components/layouts/TabLayout.vue b/ant-design-jeecg-vue/src/components/layouts/TabLayout.vue index 65c8e86..1ef77ab 100644 --- a/ant-design-jeecg-vue/src/components/layouts/TabLayout.vue +++ b/ant-design-jeecg-vue/src/components/layouts/TabLayout.vue @@ -1,11 +1,12 @@ <template> <global-layout> - <contextmenu :itemList="menuItemList" :visible.sync="menuVisible" @select="onMenuSelect" /> + <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" + class="tab-layout-tabs" + style="height:52px" :hide-add="true" type="editable-card" @change="changePage" @@ -14,26 +15,33 @@ <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> + <div style="margin: 24px 24px 0;"> + <transition name="page-toggle"> + <keep-alive v-if="multipage"> + <router-view/> + </keep-alive> + <router-view v-else/> + </transition> + </div> </global-layout> </template> <script> import GlobalLayout from '@/components/page/GlobalLayout' import Contextmenu from '@/components/menu/Contextmenu' - const indexKey="/dashboard/analysis" + import { mixin, mixinDevice } from '@/utils/mixin.js' + import { topNavScrollToSelectItem } from '@/utils/util' + + const indexKey = '/dashboard/analysis' + export default { - name: "TabLayout", + name: 'TabLayout', components: { GlobalLayout, Contextmenu }, - data () { + mixins: [mixin, mixinDevice], + data() { return { pageList: [], linkList: [], @@ -47,17 +55,34 @@ } }, computed: { - multipage () { - return this.$store.state.app.multipage + multipage() { + //判断如果是手机模式,自动切换为单页面模式 + if (this.isMobile()) { + return false + } else { + return this.$store.state.app.multipage + } } }, - created () { + created() { + if (this.$route.path != indexKey) { + this.pageList.push({ + name: 'dashboard-analysis', + path: indexKey, + fullPath: indexKey, + meta: { + icon: 'dashboard', + title: '首页' + } + }) + this.linkList.push(indexKey) + } this.pageList.push(this.$route) this.linkList.push(this.$route.fullPath) this.activePage = this.$route.fullPath }, watch: { - '$route': function (newRoute) { + '$route': function(newRoute) { this.activePage = newRoute.fullPath if (!this.multipage) { this.linkList = [newRoute.fullPath] @@ -65,21 +90,21 @@ } 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); + } 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]; + '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) { + 'multipage': function(newVal) { if (!newVal) { this.linkList = [this.$route.fullPath] this.pageList = [this.$route] @@ -87,14 +112,20 @@ } }, methods: { - changePage (key) { + changePage(key) { this.activePage = key + // 只有当前模式是顶部菜单时才执行定位 + if (this.layoutMode === 'topmenu') { + setTimeout(() => { + topNavScrollToSelectItem(document) + }, 100) + } }, - editPage (key, action) { + editPage(key, action) { this[action](key) }, - remove (key) { - if(key==indexKey){ + remove(key) { + if (key == indexKey) { this.$message.warning('首页不能关闭!') return } @@ -108,14 +139,14 @@ index = index >= this.linkList.length ? this.linkList.length - 1 : index this.activePage = this.linkList[index] }, - onContextmenu (e) { + onContextmenu(e) { const pagekey = this.getPageKey(e.target) if (pagekey !== null) { e.preventDefault() this.menuVisible = true } }, - getPageKey (target, depth) { + getPageKey(target, depth) { depth = depth || 0 if (depth > 2) { return null @@ -124,7 +155,7 @@ pageKey = pageKey || (target.previousElementSibling ? target.previousElementSibling.getAttribute('pagekey') : null) return pageKey || (target.firstElementChild ? this.getPageKey(target.firstElementChild, ++depth) : null) }, - onMenuSelect (key, target) { + onMenuSelect(key, target) { let pageKey = this.getPageKey(target) switch (key) { case '1': @@ -140,14 +171,14 @@ break } }, - closeOthers (pageKey) { + closeOthers(pageKey) { let index = this.linkList.indexOf(pageKey) - if(pageKey==indexKey){ + 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] + } 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) @@ -155,12 +186,12 @@ this.activePage = this.linkList[1] } }, - closeLeft (pageKey) { - if(pageKey==indexKey){ + closeLeft(pageKey) { + if (pageKey == indexKey) { return } - let tempList = [...this.pageList]; - let indexContent = tempList.slice(0,1)[0] + 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) @@ -170,7 +201,7 @@ this.activePage = this.linkList[0] } }, - closeRight (pageKey) { + closeRight(pageKey) { let index = this.linkList.indexOf(pageKey) this.linkList = this.linkList.slice(0, index + 1) this.pageList = this.pageList.slice(0, index + 1) @@ -178,7 +209,7 @@ this.activePage = this.linkList[this.linkList.length - 1] } } - }, + } } </script> @@ -206,8 +237,63 @@ -webkit-transform: scale(1.1); transform: scale(1.1); } + /*美化弹出Tab样式*/ .ant-tabs-nav-container { margin-top: 4px; } + + /* 修改 ant-tabs 样式 */ + .tab-layout-tabs.ant-tabs { + border-bottom: 1px solid #ccc; + border-left: 1px solid #ccc; + background-color: white; + padding: 0 20px; + + .ant-tabs-bar { + margin: 4px 0 0; + border: none; + } + + } + + .ant-tabs { + + &.ant-tabs-card .ant-tabs-tab { + + padding: 0 24px !important; + background-color: white !important; + margin-right: 10px !important; + + .ant-tabs-close-x { + width: 12px !important; + height: 12px !important; + opacity: 0 !important; + cursor: pointer !important; + font-size: 12px !important; + margin: 0 !important; + position: absolute; + top: 36%; + right: 6px; + } + + &:hover .ant-tabs-close-x { + opacity: 1 !important; + } + + } + + } + + .ant-tabs.ant-tabs-card > .ant-tabs-bar { + .ant-tabs-tab { + border: none !important; + border-bottom: 1px solid transparent !important; + } + .ant-tabs-tab-active { + border-color: #1890ff !important; + } + } + + </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 index 180d5b5..fa4aac6 100644 --- a/ant-design-jeecg-vue/src/components/layouts/UserLayout.vue +++ b/ant-design-jeecg-vue/src/components/layouts/UserLayout.vue @@ -17,9 +17,9 @@ <div class="footer"> <div class="links"> - <a href="_self">帮助</a> - <a href="_self">隐私</a> - <a href="_self">条款</a> + <a href="http://jeecg-boot.mydoc.io" target="_blank">帮助</a> + <a href="https://github.com/zhangdaiscott/jeecg-boot" target="_blank">隐私</a> + <a href="https://github.com/zhangdaiscott/jeecg-boot" target="_blank">条款</a> </div> <div class="copyright"> Copyright © 2019 <a href="http://www.jeecg.org" target="_blank">JEECG开源社区</a> 出品 diff --git a/ant-design-jeecg-vue/src/components/menu/SideMenu.vue b/ant-design-jeecg-vue/src/components/menu/SideMenu.vue index cd77a84..3fbcaf8 100644 --- a/ant-design-jeecg-vue/src/components/menu/SideMenu.vue +++ b/ant-design-jeecg-vue/src/components/menu/SideMenu.vue @@ -1,7 +1,7 @@ <template> <a-layout-sider :class="['sider', isDesktop() ? null : 'shadow', theme, fixSiderbar ? 'ant-fixed-sidemenu' : null ]" - width="248px" + width="200px" :collapsible="collapsible" v-model="collapsed" :trigger="null"> @@ -12,7 +12,7 @@ :theme="theme" @select="onSelect" :mode="mode" - style="padding: 16px 0px;"></s-menu> + style="padding: 0;"></s-menu> </a-layout-sider> </template> diff --git a/ant-design-jeecg-vue/src/components/menu/index.js b/ant-design-jeecg-vue/src/components/menu/index.js index 5e3c901..59b0cf6 100644 --- a/ant-design-jeecg-vue/src/components/menu/index.js +++ b/ant-design-jeecg-vue/src/components/menu/index.js @@ -62,18 +62,38 @@ export default { : 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 ]) - ] - ) - ] - ) + // 判断是否带参数路由URL,是的话,采用path跳转方式 + if(menu.route && menu.route === '0'){ + return h(Item, { key: menu.path ? menu.path : 'item_' + pIndex + '_' + index }, + [ + h( + 'router-link', + //--update-begin----author:scott---date:20190320------for:改造菜单路由跳转规则,原来是跳转到组件,现在改造成跳转URL(为了支持参数URL菜单)------ + { attrs: { to: { path: menu.path } } }, + //--update-end----author:scott---date:20190320------for:改造菜单路由跳转规则,原来是跳转到组件,现在改造成跳转URL(为了支持参数URL菜单)------ + [ + this.renderIcon(h, menu.meta.icon), + h('span', [ menu.meta.title ]) + ] + ) + ] + ) + }else{ + // 默认采用组件跳转方式 + 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; diff --git a/ant-design-jeecg-vue/src/components/page/GlobalHeader.vue b/ant-design-jeecg-vue/src/components/page/GlobalHeader.vue index 39c72e8..926db82 100644 --- a/ant-design-jeecg-vue/src/components/page/GlobalHeader.vue +++ b/ant-design-jeecg-vue/src/components/page/GlobalHeader.vue @@ -1,7 +1,11 @@ <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-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" :class="theme"> <a-icon v-if="device==='mobile'" class="trigger" @@ -12,26 +16,32 @@ class="trigger" :type="collapsed ? 'menu-unfold' : 'menu-fold'" @click.native="toggle"/> - <span>欢迎进入 Jeecg-Boot 企业级快速开发平台</span> - <user-menu></user-menu> + + <span v-if="device === 'desktop'">欢迎进入 Jeecg-Boot 企业级快速开发平台</span> + <span v-else>Jeecg-Boot</span> + + <user-menu :theme="theme"/> </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> + <div class="header-index-left" :style="topMenuStyle.headerIndexLeft"> + <logo class="top-nav-header" :show-title="device !== 'mobile'" :style="topMenuStyle.topNavHeader"/> + <div v-if="device !== 'mobile'" id="top-nav-scroll-view" :style="topMenuStyle.scrollView"> + <div id="top-nav-scroll-width" :style="topMenuStyle.scrollWidth"> + <s-menu + mode="horizontal" + :menu="menus" + :theme="theme"></s-menu> + </div> + </div> <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> + <user-menu class="header-index-right" :theme="theme" :style="topMenuStyle.headerIndexRight"/> </div> </div> @@ -44,9 +54,10 @@ import Logo from '../tools/Logo' import { mixin } from '@/utils/mixin.js' + import { topNavScrollToSelectItem } from '@/utils/util' export default { - name: "GlobalHeader", + name: 'GlobalHeader', components: { UserMenu, SMenu, @@ -82,13 +93,48 @@ data() { return { headerBarFixed: false, + //update-begin--author:sunjianlei---date:20190408------for: 顶部导航栏增加横向滚动条----- + topMenuStyle: { + headerIndexLeft: {}, + topNavHeader: {}, + headerIndexRight: {}, + scrollView: { + 'overflow-x': 'auto', + 'overflow-y': 'hidden' + }, + scrollWidth: { + // 设置这么宽是为了让顶部菜单首次加载时充分展开,方便计算真实宽度 + 'width': '10000px' + } + } } }, - mounted () { + watch: { + /** 监听设备变化 */ + device() { + if (this.mode === 'topmenu') { + this.buildTopMenuStyle() + } + }, + /** 监听导航栏模式变化 */ + mode(newVal) { + if (newVal === 'topmenu') { + this.calcTopMenuScrollWidth() + } + } + }, + //update-end--author:sunjianlei---date:20190408------for: 顶部导航栏增加横向滚动条----- + mounted() { window.addEventListener('scroll', this.handleScroll) + //update-begin--author:sunjianlei---date:20190408------for: 顶部导航栏增加横向滚动条----- + if (this.mode === 'topmenu') { + this.buildTopMenuStyle() + this.calcTopMenuScrollWidth() + } + //update-end--author:sunjianlei---date:20190408------for: 顶部导航栏增加横向滚动条----- }, methods: { - handleScroll () { + handleScroll() { if (this.autoHideHeader) { let scrollTop = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop if (scrollTop > 100) { @@ -102,26 +148,172 @@ }, toggle() { this.$emit('toggle') + }, + //update-begin--author:sunjianlei---date:20190408------for: 顶部导航栏增加横向滚动条----- + buildTopMenuStyle() { + if (this.mode === 'topmenu') { + if (this.device === 'mobile') { + // 手机端需要清空样式,否则显示会错乱 + this.topMenuStyle.topNavHeader = {} + this.topMenuStyle.headerIndexRight = {} + this.topMenuStyle.headerIndexLeft = {} + } else { + let rightWidth = '360px' + this.topMenuStyle.topNavHeader = { 'min-width': '165px' } + this.topMenuStyle.headerIndexRight = { 'min-width': rightWidth } + this.topMenuStyle.headerIndexLeft = { 'width': `calc(100% - ${rightWidth})` } + // 由于首次从mobile设备下切换到desktop设备没有初始化TopMenuScrollWidth,所以这里需要计算一下 + if (this.topMenuStyle.scrollWidth['width'] === '10000px') { + this.calcTopMenuScrollWidth() + } + } + } + }, + /** 计算滚动条的宽度 */ + calcTopMenuScrollWidth() { + // 非顶部菜单时不计算宽度 + if (this.mode !== 'topmenu') return + let count = 0 + let timer = setInterval(() => { + count++ + let scrollWidth = document.getElementById('top-nav-scroll-width') + if (scrollWidth == null) { + clearInterval(timer) + return + } + let menu = scrollWidth.getElementsByClassName('ant-menu')[0] + if (menu) { + let widthCount = 0 + let menuItems = menu.getElementsByTagName('li') + for (let item of menuItems) { + if (item.className.indexOf('ant-menu-overflowed-submenu') === -1) { + widthCount += item.offsetWidth + } + } + // 由于首次从侧边菜单模式下切换到顶部菜单模式下没有buildTopMenuStyle,所以这里需要build一下 + if (this.topMenuStyle.scrollWidth['width'] === '10000px') { + // 防止递归调用 + this.$nextTick(() => { + this.buildTopMenuStyle() + }) + } + this.topMenuStyle.scrollWidth['width'] = `${widthCount + 10}px` + // 将滚动条位置滚动到当前选中的菜单处 + if (count === 1) { + topNavScrollToSelectItem(document) + } + } + // 校准数据三次再关闭定时器 + if (count === 3) { + clearInterval(timer) + } + }, 100) } + //update-end--author:sunjianlei---date:20190408------for: 顶部导航栏增加横向滚动条----- } } </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; + + $height: 59px; + + .layout { + + .top-nav-header-index { + + .header-index-wide { + margin-left: 10px; + + .ant-menu.ant-menu-horizontal { + height: $height; + line-height: $height; + } + } + .trigger { + line-height: 64px; + &:hover { + background: rgba(0, 0, 0, 0.05); + } + } + } + + .header { + z-index: 2; + color: white; + height: $height; + background-color: #1890ff; + transition: background 300ms; + + /* dark 样式 */ + &.dark { + color: #000000; + box-shadow: 0 0 4px rgba(0, 0, 0, 0.2); + background-color: white !important; + } + } + + .header, .top-nav-header-index { + &.dark .trigger:hover { + background: rgba(0, 0, 0, 0.05); + } + } } + .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; + height: $height; + line-height: $height; } + /* update_end author:scott date:20190220 for: 缩小首页布局顶部的高度*/ + + /* update_begin author:sunjianlei date:20190408 for: 修改顶部导航栏滚动条的样式 */ + #top-nav-scroll-view { + $scrollBarSize: 8px; + + /* 定义滚动条高宽及背景 高宽分别对应横竖滚动条的尺寸*/ + &::-webkit-scrollbar { + width: $scrollBarSize; + height: $scrollBarSize; + background-color: transparent; + } + + /* 定义滚动条轨道 */ + &::-webkit-scrollbar-track { + background-color: transparent; + } + + /* 定义滑块 */ + &::-webkit-scrollbar-thumb { + border-radius: $scrollBarSize; + background-color: #eee; + box-shadow: inset 0 0 6px rgba(0, 0, 0, 0.1); + + &:hover { + background-color: #dddddd; + } + + &:active { + background-color: #bbbbbb; + } + } + } + + /** 暗色系滚动条样式 */ + .dark #top-nav-scroll-view { + &::-webkit-scrollbar-thumb { + background-color: #666666; + + &:hover { + background-color: #808080; + } + + &:active { + background-color: #999999; + } + } + } + + /* update_end author:sunjianlei date:20190408 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 index ddc2570..05d3367 100644 --- a/ant-design-jeecg-vue/src/components/page/GlobalLayout.vue +++ b/ant-design-jeecg-vue/src/components/page/GlobalLayout.vue @@ -9,6 +9,7 @@ @close="() => this.collapsed = false" :closable="false" :visible="collapsed" + width="200px" > <side-menu mode="inline" @@ -36,6 +37,7 @@ @close="() => this.collapsed = false" :closable="false" :visible="collapsed" + width="200px" > <side-menu mode="inline" @@ -47,25 +49,27 @@ </a-drawer> </template> - <a-layout :class="[layoutMode, `content-width-${contentWidth}`]" :style="{ paddingLeft: fixSiderbar && isDesktop() ? `${sidebarOpened ? 256 : 80}px` : '0' }"> + <a-layout + :class="[layoutMode, `content-width-${contentWidth}`]" + :style="{ paddingLeft: fixSiderbar && isDesktop() ? `${sidebarOpened ? 200 : 80}px` : '0' }"> <!-- layout header --> - <global-header - :mode="layoutMode" - :menus="menus" - :theme="navTheme" - :collapsed="collapsed" - :device="device" + <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' }"> + <a-layout-content :style="{ height: '100%', paddingTop: fixedHeader ? '59px' : '0' }"> <slot></slot> </a-layout-content> <!-- layout footer --> <a-layout-footer style="padding: 0px"> - <global-footer /> + <global-footer/> </a-layout-footer> </a-layout> @@ -83,7 +87,7 @@ import { mixin, mixinDevice } from '@/utils/mixin.js' export default { - name: "GlobalLayout", + name: 'GlobalLayout', components: { SideMenu, GlobalHeader, @@ -91,7 +95,7 @@ SettingDrawer }, mixins: [mixin, mixinDevice], - data () { + data() { return { collapsed: false, menus: [] @@ -100,16 +104,26 @@ computed: { ...mapState({ // 主路由 - mainMenu: state => state.permission.addRouters, + mainRouters: state => state.permission.addRouters, + // 后台菜单 + permissionMenuList: state => state.user.permissionList }) }, watch: { sidebarOpened(val) { this.collapsed = !val - }, + } }, created() { - this.menus = this.mainMenu.find((item) => item.path === '/').children + //--update-begin----author:scott---date:20190320------for:根据后台菜单配置,判断是否路由菜单字段,动态选择是否生成路由(为了支持参数URL菜单)------ + //this.menus = this.mainRouters.find((item) => item.path === '/').children; + this.menus = this.permissionMenuList + // 根据后台配置菜单,重新排序加载路由信息 + console.log('----加载菜单逻辑----') + console.log(this.mainRouters) + console.log(this.permissionMenuList) + console.log('----navTheme------'+this.navTheme) + //--update-end----author:scott---date:20190320------for:根据后台菜单配置,判断是否路由菜单字段,动态选择是否生成路由(为了支持参数URL菜单)------ }, methods: { ...mapActions(['setSidebar']), @@ -123,7 +137,7 @@ this.collapsed = false } } - }, + } } </script> @@ -138,7 +152,7 @@ } .layout { - min-height: 100vh; + min-height: 100vh !important; overflow-x: hidden; &.mobile { @@ -165,7 +179,7 @@ .sidemenu { .ant-header-fixedHeader { - &.ant-header-side-opened, &.ant-header-side-closed { + &.ant-header-side-opened, &.ant-header-side-closed { width: 100% } } @@ -179,6 +193,11 @@ } } } + .header, .top-nav-header-index { + .user-wrapper .action { + padding: 0 12px; + } + } } &.ant-layout-has-sider { @@ -186,13 +205,14 @@ } .trigger { - font-size: 20px; - line-height: 64px; - padding: 0 24px; + font-size: 22px; + line-height: 42px; + padding: 0 18px; cursor: pointer; - transition: color .3s; + transition: color 300ms, background 300ms; + &:hover { - background: rgba(0, 0, 0, 0.025); + background: rgba(255, 255, 255, 0.3); } } @@ -237,7 +257,7 @@ transition: width .2s; &.ant-header-side-opened { - width: calc(100% - 256px) + width: calc(100% - 200px) } &.ant-header-side-closed { @@ -246,8 +266,6 @@ } } - - .header { height: 64px; padding: 0 12px 0 0; @@ -264,23 +282,28 @@ .action { cursor: pointer; - padding: 0 12px; + padding: 0 14px; display: inline-block; transition: all .3s; - height: 100%; + + height: 70%; + line-height: 46px; + + &.action-full { + height: 100%; + } &:hover { - background: rgba(0, 0, 0, 0.025); + background: rgba(255, 255, 255, 0.3); } .avatar { - margin: 20px 8px 20px 0; + margin: 20px 10px 20px 0; color: #1890ff; background: hsla(0, 0%, 100%, .85); vertical-align: middle; } - .icon { font-size: 16px; padding: 4px; @@ -292,10 +315,10 @@ .user-wrapper { .action { - color: rgba(255, 255, 255, 0.85); + color: black; &:hover { - background: rgba(255, 255, 255, 0.16); + background: rgba(0, 0, 0, 0.05); } } } @@ -322,6 +345,10 @@ } } + .user-wrapper .action .avatar { + margin: 20px 0; + } + &.light { .header-index-wide { @@ -346,7 +373,7 @@ .header-index-left { .logo > a { overflow: hidden; - text-overflow:ellipsis; + text-overflow: ellipsis; white-space: nowrap; } } @@ -355,18 +382,17 @@ } - .top-nav-header-index { - box-shadow: 0 1px 4px rgba(0,21,41,.08); + box-shadow: 0 1px 4px rgba(0, 21, 41, .08); position: relative; - transition: background .3s,width .2s; + transition: background .3s, width .2s; .header-index-wide { - max-width: 1200px; + width: 100%; margin: auto; - padding-left: 0; + padding: 0 20px 0 0; display: flex; - height: 64px; + height: 59px; .ant-menu.ant-menu-horizontal { border: none; @@ -405,8 +431,11 @@ .header-index-right { float: right; - height: 64px; + height: 59px; overflow: hidden; + .action:hover { + background-color: rgba(0, 0, 0, 0.05); + } } } @@ -423,13 +452,29 @@ } } } - } + &.dark { + + .user-wrapper { + + .action { + color: white; + + &:hover { + background: rgba(255, 255, 255, 0.3); + } + } + } + .header-index-wide .header-index-left .trigger:hover { + background: rgba(255, 255, 255, 0.3); + } + } + + } // 内容区 .layout-content { margin: 24px 24px 0px; - height: 100%; height: 64px; padding: 0 12px 0 0; } @@ -438,8 +483,8 @@ .topmenu { .page-header-index-wide { - max-width: 1200px; margin: 0 auto; + width: 100%; } } @@ -468,7 +513,7 @@ // 菜单样式 .sider { - box-shadow: 2px 0 6px rgba(0, 21, 41, .35); + box-shadow: 2px 116px 6px 0 rgba(0, 21, 41, .35); position: relative; z-index: 10; @@ -498,8 +543,8 @@ h1 { color: #fff; - font-size: 20px; - margin: 0 0 0 12px; + font-size: 18px; + margin: 0 0 0 8px; 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; } @@ -507,11 +552,11 @@ &.light { background-color: #fff; - box-shadow: 2px 0px 8px 0px rgba(29, 35, 41, 0.05); + box-shadow: 2px 116px 8px 0 rgba(29, 35, 41, 0.05); .logo { background: #fff; - box-shadow: 1px 1px 0px 0px #e8e8e8; + box-shadow: 1px 1px 0 0 #e8e8e8; h1 { color: unset; @@ -563,7 +608,7 @@ vertical-align: middle; } - >.ant-form-item-label { + > .ant-form-item-label { line-height: 32px; padding-right: 8px; width: auto; diff --git a/ant-design-jeecg-vue/src/components/page/PageLayout.vue b/ant-design-jeecg-vue/src/components/page/PageLayout.vue index bff916e..a1b8c3c 100644 --- a/ant-design-jeecg-vue/src/components/page/PageLayout.vue +++ b/ant-design-jeecg-vue/src/components/page/PageLayout.vue @@ -1,5 +1,5 @@ <template> - <div :style="!$route.meta.pageHeader ? 'margin: -16px -24px 0px;' : null"> + <div :style="!$route.meta.pageHeader ? 'margin: -10px -24px 0;' : 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> diff --git a/ant-design-jeecg-vue/src/components/setting/SettingDrawer.vue b/ant-design-jeecg-vue/src/components/setting/SettingDrawer.vue index 4f10299..ba5f127 100644 --- a/ant-design-jeecg-vue/src/components/setting/SettingDrawer.vue +++ b/ant-design-jeecg-vue/src/components/setting/SettingDrawer.vue @@ -134,6 +134,12 @@ <div slot="title">色弱模式</div> </a-list-item-meta> </a-list-item> + <a-list-item> + <a-switch slot="actions" size="small" :defaultChecked="multipage" @change="onMultipageWeak" /> + <a-list-item-meta> + <div slot="title">多页签模式</div> + </a-list-item-meta> + </a-list-item> </a-list> </div> </div> @@ -161,6 +167,7 @@ import config from '@/defaultSettings' import { updateTheme, updateColorWeak, colorList } from '@/components/tools/setting' import { mixin, mixinDevice } from '@/utils/mixin.js' + import { triggerWindowResizeEvent } from '@/utils/util' export default { components: { @@ -189,6 +196,9 @@ if (this.colorWeak !== config.colorWeak) { updateColorWeak(this.colorWeak) } + if (this.multipage !== config.multipage) { + this.$store.dispatch('ToggleMultipage', this.multipage) + } }, methods: { showDrawer() { @@ -204,14 +214,18 @@ this.$store.dispatch('ToggleWeak', checked) updateColorWeak(checked) }, + onMultipageWeak (checked) { + this.$store.dispatch('ToggleMultipage', checked) + }, handleMenuTheme (theme) { this.$store.dispatch('ToggleTheme', theme) }, handleLayout (mode) { this.$store.dispatch('ToggleLayoutMode', mode) // 因为顶部菜单不能固定左侧菜单栏,所以强制关闭 - // - this.handleFixSiderbar(false); + this.handleFixSiderbar(false) + // 触发窗口resize事件 + triggerWindowResizeEvent() }, handleContentWidthChange (type) { this.$store.dispatch('ToggleContentWidth', type) diff --git a/ant-design-jeecg-vue/src/components/tools/Logo.vue b/ant-design-jeecg-vue/src/components/tools/Logo.vue index 68c71b8..986551e 100644 --- a/ant-design-jeecg-vue/src/components/tools/Logo.vue +++ b/ant-design-jeecg-vue/src/components/tools/Logo.vue @@ -9,7 +9,7 @@ <script> export default { - name: "Logo", + name: 'Logo', props: { title: { type: String, @@ -26,8 +26,26 @@ </script> <style lang="scss" scoped> /*缩小首页布 局顶部的高度*/ - .sider .logo { - height: 59px!important; - line-height: 59px!important; + $height: 59px; + + .sider { + box-shadow: none !important; + .logo { + height: $height !important; + line-height: $height !important; + box-shadow: none !important; + transition: background 300ms; + + a { + color: white; + &:hover { + color: rgba(255, 255, 255, 0.8); + } + } + } + + &.light .logo { + background-color: #1890ff; + } } </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 index 70d9c6f..92fb7f2 100644 --- a/ant-design-jeecg-vue/src/components/tools/UserMenu.vue +++ b/ant-design-jeecg-vue/src/components/tools/UserMenu.vue @@ -1,13 +1,13 @@ <template> - <div class="user-wrapper"> + <div class="user-wrapper" :class="theme"> <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"> + <span class="action action-full ant-dropdown-link user-dropdown-menu"> <a-avatar class="avatar" size="small" :src="getAvatar()"/> - <span>欢迎您,{{ nickname() }}</span> + <span v-if="isDesktop()">欢迎您,{{ nickname() }}</span> </span> <a-menu slot="overlay" class="user-dropdown-menu-wrapper"> <a-menu-item key="0"> @@ -38,7 +38,7 @@ <span class="action"> <a class="logout_title" href="javascript:;" @click="handleLogout"> <a-icon type="logout"/> - <span> 退出登录</span> + <span v-if="isDesktop()"> 退出登录</span> </a> </span> </div> @@ -47,19 +47,26 @@ <script> import HeaderNotice from './HeaderNotice' import { mapActions, mapGetters } from 'vuex' - import {imgView} from '@/api/api' - + import { mixinDevice } from '@/utils/mixin.js' export default { name: "UserMenu", + mixins: [mixinDevice], components: { HeaderNotice }, + props: { + theme: { + type: String, + required: false, + default: 'dark' + } + }, methods: { ...mapActions(["Logout"]), ...mapGetters(["nickname", "avatar"]), getAvatar(){ - console.log('url = '+ imgView+this.avatar()) - return imgView+this.avatar() + console.log('url = '+ window._CONFIG['imgDomainURL']+"/"+this.avatar()) + return window._CONFIG['imgDomainURL']+"/"+this.avatar() }, handleLogout() { const that = this @@ -69,7 +76,8 @@ content: '真的要注销登录吗 ?', onOk() { return that.Logout({}).then(() => { - window.location.reload() + window.location.href="/"; + //window.location.reload() }).catch(err => { that.$message.error({ title: '错误', @@ -86,8 +94,8 @@ </script> <style scoped> - .logout_title{ - color: rgba(0, 0, 0, 0.65); - text-decoration:none; + .logout_title { + color: inherit; + text-decoration: none; } </style> \ 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 index a7e2546..0e0c8ca 100644 --- a/ant-design-jeecg-vue/src/config/router.config.js +++ b/ant-design-jeecg-vue/src/config/router.config.js @@ -8,43 +8,258 @@ export const asyncRouterMap = [ { path: '/', - name: 'index', + name: 'dashboard', 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' ] } - }, - - - ] - }, + // //流程管理 + // { + // path: '/process', + // name: 'process', + // redirect: '/process', + // component: RouteView, + // meta: { title: '流程管理', icon: 'dashboard', permission: [ 'dashboard' ] }, + // children: [ + // { + // path: '/process/ExtActExpressionList', + // name: 'ExtActExpressionList', + // component: () => import('@/views/modules/extbpm/process/ExtActExpressionList'), + // meta: { title: '流程表达式', permission: [ 'dashboard' ] } + // }, + // { + // path: '/process/ExtActListenerList', + // name: 'ExtActListenerList', + // component: () => import('@/views/modules/extbpm/process/ExtActListenerList'), + // meta: { title: '流程监听', permission: [ 'dashboard' ] } + // }, + // { + // path: '/process/ExtActProcessList', + // name: 'ExtActProcessList', + // component: () => import('@/views/modules/extbpm/process/ExtActProcessList'), + // meta: { title: '流程设计', permission: [ 'dashboard' ] } + // }, + // ] + // }, + // + // + // //工作流程 + // { + // path: '/bpm', + // name: 'bpm', + // redirect: '/bpm', + // component: RouteView, + // meta: { title: '工作流程', icon: 'dashboard', permission: [ 'dashboard' ] }, + // children: [ + // { + // path: '/modules/bpm/ModelList', + // name: 'ModelList', + // component: () => import('@/views/modules/bpm/ModelList'), + // meta: { title: '在线流程设计', permission: [ 'dashboard' ] } + // }, + // { + // path: '/modules/bpm/ProcessList', + // name: 'ProcessList', + // component: () => import('@/views/modules/bpm/ProcessList'), + // meta: { title: '流程发布管理', permission: [ 'dashboard' ] } + // }, + // { + // path: '/modules/bpm/task/MyTaskList', + // name: 'MyTaskList', + // component: () => import('@/views/modules/bpm/task/MyTaskList'), + // meta: { title: '我的任务', permission: [ 'dashboard' ] } + // }, + // { + // path: '/modules/bpm/ProcessInstanceList', + // name: 'ProcessInstanceList', + // component: () => import('@/views/modules/bpm/ProcessInstanceList'), + // meta: { title: '流程实例管理', permission: [ 'dashboard' ] } + // }, + // ] + // }, + // + // //系统管理 + // { + // path: '/isystem', + // name: 'system', + // redirect: '/isystem/user', + // component: RouteView, + // meta: { title: '系统管理', icon: 'dashboard', permission: [ 'dashboard' ] }, + // children: [ + // { + // path: '/isystem/user', + // name: 'user', + // component: () => import('@/views/system/UserList'), + // meta: { title: '用户管理', permission: [ 'dashboard' ] } + // }, + // { + // path: '/isystem/permission', + // name: 'permission', + // component: () => import('@/views/system/PermissionList'), + // meta: { title: '菜单管理', permission: [ 'dashboard' ] } + // }, + // { + // path: '/isystem/dict', + // name: 'dict', + // component: () => import('@/views/system/DictList'), + // meta: { title: '字典管理', permission: [ 'dashboard' ] } + // }, + // { + // path: '/isystem/annountCement', + // name: 'annountCement', + // component: () => import('@/views/system/SysAnnouncementList'), + // meta: { title: '系统通知', permission: [ 'dashboard' ] } + // }, + // { + // path: '/isystem/depart', + // name: 'depart', + // component: () => import('@/views/system/DepartList'), + // meta: { title: '部门管理', permission: [ 'dashboard' ] } + // }, + // + // { + // path: '/isystem/role', + // name: 'role', + // component: () => import('@/views/system/RoleList'), + // meta: { title: '角色管理', permission: [ 'dashboard' ] } + // }, + // { + // path: '/isystem/log', + // name: 'log', + // component: () => import('@/views/system/LogList'), + // meta: { title: '日志管理', permission: [ 'dashboard' ] } + // }, + // ] + // }, + // + // + // //Online开发 + // { + // path: '/online', + // name: 'online', + // redirect: '/online', + // component: RouteView, + // meta: { title: '在线开发', icon: 'dashboard', permission: [ 'dashboard' ] }, + // children: [ + // { + // path: '/online/cgreport', + // name: 'OnlCgreportHeadList', + // component: () => import('@/views/modules/online/cgreport/OnlCgreportHeadList'), + // meta: { title: 'Online报表配置', permission: [ 'dashboard' ] } + // }, + // { + // path: '/online/cgform', + // name: 'OnlCgformHeadList', + // component: () => import('@/views/modules/online/cgform/OnlCgformHeadList'), + // meta: { title: 'Online表单开发', permission: [ 'dashboard' ] } + // }, + // { + // path: '/jeecg/jeecgOnlineTest', + // name: 'JeecgOnlineTest', + // component: () => import('@/views/jeecg/JeecgOnlineTest'), + // meta: { title: '动态表单页面', permission: [ 'dashboard' ] } + // }, + // { + // path: '/online/auto/:code', + // name: 'onlineAutoList', + // hidden : true, + // component: () => import('@/views/modules/online/cgreport/auto/OnlCgreportAutoList'), + // meta: { title: 'Auto报表', permission: [ 'cgreport' ] } + // } + // ] + // }, + // + // + // //系统监控 + // { + // path: '/sysmonitor', + // name: 'sysmonitor', + // redirect: '/sysmonitor', + // component: RouteView, + // meta: { title: '系统监控', icon: 'dashboard', permission: [ 'dashboard' ] }, + // children: [ + // { + // path: '/sys/dataLog-list', + // name: 'DataLogList', + // component: () => import('@/views/system/DataLogList'), + // meta: { title: '数据日志', permission: [ 'dashboard' ] } + // }, + // { + // path: 'http://localhost:8080/jeecg-boot/druid/', + // name: 'druid', + // component: () => import('@/views/jeecg/tablist/JeecgOrderDMainList'), + // meta: { title: 'SQL监控', permission: [ 'dashboard' ] } + // }, + // { + // path: '/isystem/QuartzJobList', + // name: 'QuartzJobList', + // component: () => import('@/views/system/QuartzJobList'), + // meta: { title: '定时任务', permission: [ 'dashboard' ] } + // }, + // ] + // }, + // + // + // //jeecg demo + // { + // 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/tablist/JeecgOrderDMainList', + // name: 'JeecgOrderDMainList', + // component: () => import('@/views/jeecg/tablist/JeecgOrderDMainList'), + // meta: { title: '一对多Tab示例', permission: [ 'dashboard' ] } + // }, + // { + // path: '/jeecg/FlowTest', + // name: 'FlowTest', + // component: () => import('@/views/jeecg/FlowTest'), + // meta: { title: '数据回执模拟', permission: [ 'dashboard' ] } + // }, + // { + // path: '/jeecg/PrintDemo', + // name: 'PrintDemo', + // component: () => import('@/views/jeecg/PrintDemo'), + // meta: { title: '打印测试', permission: [ 'dashboard' ] } + // }, + // { + // path: '/jeecg/JeecgOrderMainList', + // name: 'JeecgOrderMainList', + // component: () => import('@/views/jeecg/JeecgOrderMainList'), + // meta: { title: '一对多示例', permission: [ 'dashboard' ] } + // }, + // { + // path: 'http://www.baidu.com', + // name: 'baidu', + // component: () => import('@/components/layouts/IframePageView'), + // meta: { title: '百度', permission: [ 'dashboard' ] } + // }, + // { + // path: 'http://localhost:8080/jeecg-boot/auto/cgform/list', + // name: 'cgformtest', + // component: () => import('@/components/layouts/IframePageView'), + // meta: { title: 'online表单测试', permission: [ 'dashboard' ] } + // }, + // { + // path: '/jeecg/helloworld', + // name: 'helloworld', + // hidden : true, + // component: () => import('@/views/jeecg/helloworld'), + // meta: { title: 'helloworld', permission: [ 'dashboard' ] } + // }, + // ] + // }, // dashboard { @@ -76,29 +291,6 @@ export const asyncRouterMap = [ ] }, - //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', @@ -369,10 +561,34 @@ export const constantRouterMap = [ path: 'register-result', name: 'registerResult', component: () => import(/* webpackChunkName: "user" */ '@/views/user/RegisterResult') - } + }, ] }, + // { + // path: '/', + // name: 'index', + // component: TabLayout, + // meta: {title: '首页'}, + // redirect: '/dashboard/workplace', + // children: [ + // { + // path: '/online', + // name: 'online', + // redirect: '/online', + // component: RouteView, + // meta: {title: '在线开发', icon: 'dashboard', permission: ['dashboard']}, + // children: [ + // { + // path: '/online/auto/:code', + // name: 'report', + // component: () => import('@/views/modules/online/cgreport/OnlCgreportAutoList') + // }, + // ] + // }, + // ] + // }, + { path: '/test', component: BlankLayout, @@ -385,7 +601,6 @@ export const constantRouterMap = [ } ] }, - { 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 index 62adddd..8427058 100644 --- a/ant-design-jeecg-vue/src/defaultSettings.js +++ b/ant-design-jeecg-vue/src/defaultSettings.js @@ -22,6 +22,7 @@ export default { fixSiderbar: false, // sticky siderbar autoHideHeader: false, // auto hide header colorWeak: false, + multipage: false, //默认多页签模式 // vue-ls options storageOptions: { namespace: 'pro__', // key prefix diff --git a/ant-design-jeecg-vue/src/main.js b/ant-design-jeecg-vue/src/main.js index 31c7778..6a5e8d6 100644 --- a/ant-design-jeecg-vue/src/main.js +++ b/ant-design-jeecg-vue/src/main.js @@ -12,9 +12,9 @@ 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 Print from 'vue-print-nb-jeecg' /*import '@babel/polyfill'*/ +import VueApexCharts from 'vue-apexcharts' import { ACCESS_TOKEN, @@ -30,17 +30,19 @@ import { } from "@/store/mutation-types" import config from '@/defaultSettings' +import JDictSelectTag from './components/dict/index.js' 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(JDictSelectTag) Vue.use(Print) +Vue.use(VueApexCharts) +Vue.component('apexchart', VueApexCharts) new Vue({ router, diff --git a/ant-design-jeecg-vue/src/mixins/JEditableTableOneToManyMixin.js b/ant-design-jeecg-vue/src/mixins/JEditableTableOneToManyMixin.js new file mode 100644 index 0000000..f6c7ad8 --- /dev/null +++ b/ant-design-jeecg-vue/src/mixins/JEditableTableOneToManyMixin.js @@ -0,0 +1,160 @@ +import JEditableTable from '@/components/jeecg/JEditableTable' +import { VALIDATE_NO_PASSED, getRefPromise, validateFormAndTables } from '@/utils/JEditableTableUtil' +import { httpAction, getAction } from '@/api/manage' + +export const JEditableTableOneToManyMixin = { + components: { + JEditableTable + }, + data() { + return { + title: '操作', + visible: false, + form: this.$form.createForm(this), + confirmLoading: false, + model: {}, + labelCol: { + xs: { span: 24 }, + sm: { span: 6 } + }, + wrapperCol: { + xs: { span: 24 }, + sm: { span: 18 } + } + } + }, + methods: { + + /** 获取所有的editableTable实例 */ + getAllTable() { + if (!(this.refKeys instanceof Array)) { + throw this.throwNotArray('refKeys') + } + let values = this.refKeys.map(key => getRefPromise(this, key)) + return Promise.all(values) + }, + + /** 遍历所有的JEditableTable实例 */ + eachAllTable(callback) { + // 开始遍历 + this.getAllTable().then(tables => { + tables.forEach((item, index) => { + if (typeof callback === 'function') { + callback(item, index) + } + }) + }) + }, + + /** 当点击新增按钮时调用此方法 */ + add() { + // 默认新增空数据 + let rowNum = this.addDefaultRowNum + if (typeof rowNum !== 'number') { + rowNum = 1 + console.warn('由于你没有在 data 中定义 addDefaultRowNum 或 addDefaultRowNum 不是数字,所以默认添加一条空数据,如果不想默认添加空数据,请将定义 addDefaultRowNum 为 0') + } + this.eachAllTable((item) => { + item.add(rowNum) + }) + + this.edit({}) + }, + /** 当点击了编辑(修改)按钮时调用此方法 */ + edit(record) { + if (typeof this.editBefore === 'function') this.editBefore(record) + this.visible = true + this.activeKey = this.refKeys[0] + this.form.resetFields() + this.model = Object.assign({}, record) + if (typeof this.editAfter === 'function') this.editAfter(this.model) + }, + /** 关闭弹窗,并将所有JEditableTable实例回归到初始状态 */ + close() { + this.visible = false + this.eachAllTable((item) => { + item.initialize() + }) + this.$emit('close') + }, + + /** 查询某个tab的数据 */ + requestSubTableData(url, params, tab) { + tab.loading = true + getAction(url, params).then(res => { + tab.dataSource = res.result || [] + }).finally(() => { + tab.loading = false + }) + }, + /** 发起请求,自动判断是执行新增还是修改操作 */ + request(formData) { + let url = this.url.add, method = 'post' + if (this.model.id) { + url = this.url.edit + method = 'put' + } + this.confirmLoading = true + httpAction(url, formData, method).then((res) => { + if (res.success) { + this.$message.success(res.message) + this.$emit('ok') + this.close() + } else { + this.$message.warning(res.message) + } + }).finally(() => { + this.confirmLoading = false + }) + }, + + /* --- handle 事件 --- */ + + /** ATab 选项卡切换事件 */ + handleChangeTabs(key) { + // 自动重置scrollTop状态,防止出现白屏 + getRefPromise(this, key).then(editableTable => { + editableTable.resetScrollTop() + }) + }, + /** 关闭按钮点击事件 */ + handleCancel() { + this.close() + }, + /** 确定按钮点击事件 */ + handleOk() { + /** 触发表单验证 */ + this.getAllTable().then(tables => { + /** 一次性验证主表和所有的次表 */ + return validateFormAndTables(this.form, tables) + }).then(allValues => { + if (typeof this.classifyIntoFormData !== 'function') { + throw this.throwNotFunction('classifyIntoFormData') + } + let formData = this.classifyIntoFormData(allValues) + // 发起请求 + return this.request(formData) + }).catch(e => { + if (e.error === VALIDATE_NO_PASSED) { + // 如果有未通过表单验证的子表,就自动跳转到它所在的tab + this.activeKey = e.index == null ? this.activeKey : this.refKeys[e.index] + } else { + console.error(e) + } + }) + }, + + /* --- throw --- */ + + /** not a function */ + throwNotFunction(name) { + return `${name} 未定义或不是一个函数` + }, + + /** not a array */ + throwNotArray(name) { + return `${name} 未定义或不是一个数组` + } + + } +} \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/mixins/JeecgListMixin.js b/ant-design-jeecg-vue/src/mixins/JeecgListMixin.js new file mode 100644 index 0000000..3640b3f --- /dev/null +++ b/ant-design-jeecg-vue/src/mixins/JeecgListMixin.js @@ -0,0 +1,220 @@ +/** + * 新增修改完成调用 modalFormOk方法 编辑弹框组件ref定义为modalForm + * 高级查询按钮调用 superQuery方法 高级查询组件ref定义为superQueryModal + * data中url定义 list为查询列表 delete为删除单条记录 deleteBatch为批量删除 + */ +import { filterObj } from '@/utils/util'; +import { deleteAction, getAction } from '@/api/manage' +export const JeecgListMixin = { + data(){ + return { + /* 查询条件 */ + queryParam: {}, + /* 数据源 */ + 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', + }, + /* 筛选参数 */ + filters: {}, + /* table加载状态 */ + loading:false, + /* table选中keys*/ + selectedRowKeys: [], + /* table选中records*/ + selectionRows: [], + /* 查询折叠 */ + toggleSearchStatus:false, + /* 高级查询条件生效状态 */ + superQueryFlag:false, + /* 高级查询条件 */ + superQueryParams:"", + } + }, + created() { + this.loadData(); + //初始化字典配置 在自己页面定义 + this.initDictConfig(); + }, + methods:{ + loadData(arg) { + if(!this.url.list){ + this.$message.error("请设置url.list属性!") + return + } + //加载数据 若传入参数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; + } + }) + }, + initDictConfig(){ + console.log("--这是一个假的方法!") + }, + handleSuperQuery(arg) { + //高级查询方法 + if(!arg){ + this.superQueryParams='' + this.superQueryFlag = false + }else{ + this.superQueryFlag = true + this.superQueryParams=JSON.stringify(arg) + } + this.loadData() + }, + getQueryParams() { + //获取查询条件 + let sqp = {} + if(this.superQueryParams){ + sqp['superQueryParams']=encodeURI(this.superQueryParams) + } + var param = Object.assign(sqp, this.queryParam, this.isorter ,this.filters); + 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) { + 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() { + this.queryParam = {} + this.loadData(1); + }, + batchDel: function () { + if(!this.url.deleteBatch){ + this.$message.error("请设置url.deleteBatch属性!") + return + } + 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) { + if(!this.url.delete){ + this.$message.error("请设置url.delete属性!") + return + } + 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.modalForm.edit(record); + this.$refs.modalForm.title = "编辑"; + }, + handleAdd: function () { + this.$refs.modalForm.add(); + this.$refs.modalForm.title = "新增"; + }, + 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; + }, + modalFormOk() { + // 新增/修改 成功时,重载列表 + this.loadData(); + }, + handleDetail:function(record){ + this.$refs.modalForm.edit(record); + this.$refs.modalForm.title="详情"; + this.$refs.modalForm.disableSubmit = true; + }, + /* 导出 */ + handleExportXls(){ + let paramsStr = encodeURI(JSON.stringify(this.getQueryParams())); + let url = `${window._CONFIG['domianURL']}/${this.url.exportXlsUrl}?paramsStr=${paramsStr}`; + window.location.href = url; + }, + /* 导入 */ + handleImportExcel(info){ + if (info.file.status !== 'uploading') { + console.log(info.file, info.fileList); + } + if (info.file.status === 'done') { + this.$message.success(`${info.file.name} 文件上传成功`); + this.loadData(); + } else if (info.file.status === 'error') { + this.$message.error(`${info.file.name} 文件上传失败.`); + } + }, + } + +} \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/store/modules/app.js b/ant-design-jeecg-vue/src/store/modules/app.js index d8ce233..e2a0b74 100644 --- a/ant-design-jeecg-vue/src/store/modules/app.js +++ b/ant-design-jeecg-vue/src/store/modules/app.js @@ -26,7 +26,7 @@ const app = { autoHideHeader: false, color: null, weak: false, - multipage: true + multipage: true //默认多页签模式 }, mutations: { SET_SIDEBAR_TYPE: (state, type) => { @@ -74,8 +74,8 @@ const app = { Vue.ls.set(DEFAULT_COLOR_WEAK, flag) state.weak = flag }, - setMultipage (state, multipage) { - state.multipage = multipage + SET_MULTI_PAGE (state, multipageFlag) { + state.multipage = multipageFlag } }, actions: { @@ -114,6 +114,9 @@ const app = { }, ToggleWeak({ commit }, weakFlag) { commit('TOGGLE_WEAK', weakFlag) + }, + ToggleMultipage({ commit }, multipageFlag) { + commit('SET_MULTI_PAGE', multipageFlag) } } } diff --git a/ant-design-jeecg-vue/src/store/modules/user.js b/ant-design-jeecg-vue/src/store/modules/user.js index cf79988..05000ea 100644 --- a/ant-design-jeecg-vue/src/store/modules/user.js +++ b/ant-design-jeecg-vue/src/store/modules/user.js @@ -82,11 +82,12 @@ const user = { // 登出 Logout({ commit, state }) { return new Promise((resolve) => { + let logoutToken = state.token; commit('SET_TOKEN', '') commit('SET_PERMISSIONLIST', []) Vue.ls.remove(ACCESS_TOKEN) - - logout(state.token).then(() => { + //console.log('logoutToken: '+ logoutToken) + logout(logoutToken).then(() => { resolve() }).catch(() => { resolve() diff --git a/ant-design-jeecg-vue/src/utils/JEditableTableUtil.js b/ant-design-jeecg-vue/src/utils/JEditableTableUtil.js new file mode 100644 index 0000000..b443383 --- /dev/null +++ b/ant-design-jeecg-vue/src/utils/JEditableTableUtil.js @@ -0,0 +1,97 @@ +const FormTypes = { + normal: 'normal', + input: 'input', + inputNumber: 'inputNumber', + checkbox: 'checkbox', + select: 'select', + date: 'date', + datetime: 'datetime' +} +const VALIDATE_NO_PASSED = Symbol() +export { FormTypes, VALIDATE_NO_PASSED } + +/** + * 获取指定的 $refs 对象 + * 有时候可能会遇到组件未挂载到页面中的情况,导致无法获取 $refs 中的某个对象 + * 这个方法可以等待挂载完成之后再返回 $refs 的对象,避免报错 + * @author sunjianlei + **/ +export function getRefPromise(vm, name) { + return new Promise((resolve) => { + (function next() { + let ref = vm.$refs[name] + if (ref) { + resolve(ref) + } else { + setTimeout(() => { + next() + }, 10) + } + })() + }) +} + +/** + * 一次性验证主表单和所有的次表单 + * @param form 主表单 form 对象 + * @param cases 接收一个数组,每项都是一个JEditableTable实例 + * @returns {Promise<any>} + * @author sunjianlei + */ +export function validateFormAndTables(form, cases) { + + if (!(form && typeof form.validateFields === 'function')) { + throw `form 参数需要的是一个form对象,而传入的却是${typeof form}` + } + + let options = {} + return new Promise((resolve, reject) => { + // 验证主表表单 + form.validateFields((err, values) => { + err ? reject({ error: VALIDATE_NO_PASSED }) : resolve(values) + }) + }).then(values => { + Object.assign(options, { formValue: values }) + // 验证所有子表的表单 + return validateTables(cases) + }).then(all => { + Object.assign(options, { tablesValue: all }) + return Promise.resolve(options) + }).catch(error => { + return Promise.reject(error) + }) + +} + +/** + * 验证并获取一个或多个表格的所有值 + * @param cases 接收一个数组,每项都是一个JEditableTable实例 + * @author sunjianlei + */ +export function validateTables(cases) { + if (!(cases instanceof Array)) { + throw `'validateTables'函数的'cases'参数需要的是一个数组,而传入的却是${typeof cases}` + } + return new Promise((resolve, reject) => { + let tables = [] + let index = 0; + (function next() { + let vm = cases[index] + vm.getAll(true).then(all => { + tables[index] = all + // 判断校验是否全部完成,完成返回成功,否则继续进行下一步校验 + if (++index === cases.length) { + resolve(tables) + } else ( + next() + ) + }, error => { + // 出现未验证通过的表单,不再进行下一步校验,直接返回失败并跳转到该表格 + if (error === VALIDATE_NO_PASSED) { + reject({ error: VALIDATE_NO_PASSED, index }) + } + reject(error) + }) + })() + }) +} \ 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 index e02705d..de27d4c 100644 --- a/ant-design-jeecg-vue/src/utils/axios.js +++ b/ant-design-jeecg-vue/src/utils/axios.js @@ -33,5 +33,5 @@ const VueAxios = { export { VueAxios, // eslint-disable-next-line no-undef - // instance as axios + //instance as axios } \ 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 index f4aa4ce..43c77ef 100644 --- a/ant-design-jeecg-vue/src/utils/filter.js +++ b/ant-design-jeecg-vue/src/utils/filter.js @@ -15,4 +15,16 @@ Vue.filter('dayjs', function(dataStr, pattern = 'YYYY-MM-DD HH:mm:ss') { Vue.filter('moment', function(dataStr, pattern = 'YYYY-MM-DD HH:mm:ss') { return dayjs(dataStr).format(pattern) +}) + +/** 字符串超长截取省略号显示 */ +Vue.filter('ellipsis', function (value, vlength = 25) { + if(!value){ + return ""; + } + console.log('vlength: '+ vlength); + if (value.length > vlength) { + return value.slice(0, vlength) + '...' + } + return value }) \ 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 index 8e821eb..52aafbb 100644 --- a/ant-design-jeecg-vue/src/utils/hasPermission.js +++ b/ant-design-jeecg-vue/src/utils/hasPermission.js @@ -3,10 +3,11 @@ const hasPermission = { console.log(options); Vue.directive('has', { inserted: (el, binding, vnode)=>{ - //console.log("页面权限----",el); + console.log("页面权限----",el); let permissionList = vnode.context.$route.meta.permissionList; if (permissionList === null || permissionList === "" || permissionList === undefined) { el.parentNode.removeChild(el) + return } let permissions = []; for (var item of permissionList) { diff --git a/ant-design-jeecg-vue/src/utils/mixin.js b/ant-design-jeecg-vue/src/utils/mixin.js index 8417db6..8a6c89e 100644 --- a/ant-design-jeecg-vue/src/utils/mixin.js +++ b/ant-design-jeecg-vue/src/utils/mixin.js @@ -11,6 +11,7 @@ const mixin = { navTheme: state => state.app.theme, primaryColor: state => state.app.color, colorWeak: state => state.app.weak, + multipage: state => state.app.multipage,//多页签设置 fixedHeader: state => state.app.fixedHeader, fixSiderbar: state => state.app.fixSiderbar, contentWidth: state => state.app.contentWidth, diff --git a/ant-design-jeecg-vue/src/utils/request.js b/ant-design-jeecg-vue/src/utils/request.js index 4765bb3..b5e3ecc 100644 --- a/ant-design-jeecg-vue/src/utils/request.js +++ b/ant-design-jeecg-vue/src/utils/request.js @@ -23,7 +23,7 @@ const err = (error) => { break case 500: //notification.error({ message: '系统提示', description:'Token失效,请重新登录!',duration: 4}) - if(data.message=="Token失效,请重新登录"){ + if(token && data.message=="Token失效,请重新登录"){ // update-begin- --- author:scott ------ date:20190225 ---- for:Token失效采用弹框模式,不直接跳转---- // store.dispatch('Logout').then(() => { // window.location.reload() @@ -35,6 +35,7 @@ const err = (error) => { mask: false, onOk: () => { store.dispatch('Logout').then(() => { + Vue.ls.remove(ACCESS_TOKEN) window.location.reload() }) } @@ -76,6 +77,12 @@ service.interceptors.request.use(config => { if (token) { config.headers[ 'X-Access-Token' ] = token // 让每个请求携带自定义 token 请根据实际情况自行修改 } + if(config.method=='get'){ + config.params = { + _t: Date.parse(new Date())/1000, + ...config.params + } + } return config },(error) => { return Promise.reject(error) diff --git a/ant-design-jeecg-vue/src/utils/util.js b/ant-design-jeecg-vue/src/utils/util.js index c9287cd..5072374 100644 --- a/ant-design-jeecg-vue/src/utils/util.js +++ b/ant-design-jeecg-vue/src/utils/util.js @@ -1,3 +1,4 @@ +import { isURL } from '@/utils/validate' export function timeFix() { const time = new Date() @@ -33,7 +34,7 @@ export function filterObj(obj) { for ( var key in obj) { if (obj.hasOwnProperty(key) - && (obj[key] == null || obj[key] == undefined || obj[key] == '')) { + && (obj[key] == null || obj[key] == undefined || obj[key] === '')) { delete obj[key]; } } @@ -105,6 +106,13 @@ function generateChildRouters (data) { }else{ component = "views/"+item.component; } + + // eslint-disable-next-line + let URL = (item.meta.url|| '').replace(/{{([^}}]+)?}}/g, (s1, s2) => eval(s2)) // URL支持{{ window.xxx }}占位符变量 + if (isURL(URL)) { + item.meta.url = URL; + } + let menu = { path: item.path, name: item.name, @@ -125,7 +133,94 @@ function generateChildRouters (data) { if (item.children && item.children.length > 0) { menu.children = [...generateChildRouters( item.children)]; } - routers.push(menu); + //--update-begin----author:scott---date:20190320------for:根据后台菜单配置,判断是否路由菜单字段,动态选择是否生成路由(为了支持参数URL菜单)------ + //判断是否生成路由 + if(item.route && item.route === '0'){ + console.log(' 不生成路由 item.route: '+item.route); + console.log(' 不生成路由 item.path: '+item.path); + }else{ + routers.push(menu); + } + //--update-end----author:scott---date:20190320------for:根据后台菜单配置,判断是否路由菜单字段,动态选择是否生成路由(为了支持参数URL菜单)------ } return routers +} + +/** + * 深度克隆对象、数组 + * @param obj 被克隆的对象 + * @return 克隆后的对象 + */ +export function cloneObject(obj) { + return JSON.parse(JSON.stringify(obj)) +} + +/** + * 随机生成数字 + * @param min 最小值 + * @param max 最大值 + * @return int 生成后的数字 + */ +export function randomNumber(min, max) { + return Math.floor(Math.random() * (max - min + 1) + min) +} + +/** + * 随机生成字符串 + * @param length 字符串的长度 + * @param chats 可选字符串区间(只会生成传入的字符串中的字符) + * @return string 生成的字符串 + */ +export function randomString(length, chats) { + if (!length) length = 1 + if (!chats) chats = '0123456789qwertyuioplkjhgfdsazxcvbnm' + let str = '' + for (let i = 0; i < length; i++) { + let num = randomNumber(0, chats.length - 1) + str += chats[num] + } + return str +} + +/** + * 随机生成uuid + * @return string 生成的uuid + */ +export function randomUUID() { + let chats = '0123456789abcdef' + return randomString(32, chats) +} + +/** + * 【顶部导航栏模式】 + * @date 2019-04-08 + * 顶部导航栏滚动条位置滚动到选中的菜单处 + * @param doc document 对象 + */ +export function topNavScrollToSelectItem(doc) { + let scrollWidth = doc.getElementById('top-nav-scroll-width') + if (scrollWidth == null) return + let menu = scrollWidth.getElementsByClassName('ant-menu')[0] + if (menu) { + let menuItems = menu.getElementsByTagName('li') + for (let item of menuItems) { + let index1 = item.className.indexOf('ant-menu-item-selected') !== -1 + let index2 = item.className.indexOf('ant-menu-submenu-selected') !== -1 + if (index1 || index2) { + // scrollLeft = 选中项left - 选中项width - (第一个隐藏的div的宽度) + let scrollLeft = (item.offsetLeft - item.offsetWidth - (index1 ? 100 : 60)) + let scrollView = doc.getElementById('top-nav-scroll-view') + // scrollTo() 方法存在兼容性问题 + if (typeof scrollView.scrollTo === 'function') { + scrollView.scrollTo({ + left: scrollLeft, + behavior: 'smooth' + }) + } else { + scrollView.scrollLeft = scrollLeft + } + break + } + } + } } \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/utils/validate.js b/ant-design-jeecg-vue/src/utils/validate.js new file mode 100644 index 0000000..c8edcac --- /dev/null +++ b/ant-design-jeecg-vue/src/utils/validate.js @@ -0,0 +1,31 @@ +/** + * 邮箱 + * @param {*} s + */ +export function isEmail (s) { + return /^([a-zA-Z0-9._-])+@([a-zA-Z0-9_-])+((.[a-zA-Z0-9_-]{2,3}){1,2})$/.test(s) +} + +/** + * 手机号码 + * @param {*} s + */ +export function isMobile (s) { + return /^1[0-9]{10}$/.test(s) +} + +/** + * 电话号码 + * @param {*} s + */ +export function isPhone (s) { + return /^([0-9]{3,4}-)?[0-9]{7,8}$/.test(s) +} + +/** + * URL地址 + * @param {*} s + */ +export function isURL (s) { + return /^http[s]?:\/\/.*/.test(s) +} diff --git a/ant-design-jeecg-vue/src/views/account/center/Index.vue b/ant-design-jeecg-vue/src/views/account/center/Index.vue index 024b0b8..3658dc6 100644 --- a/ant-design-jeecg-vue/src/views/account/center/Index.vue +++ b/ant-design-jeecg-vue/src/views/account/center/Index.vue @@ -93,8 +93,6 @@ 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 { @@ -135,7 +133,7 @@ methods: { ...mapGetters(["nickname", "avatar"]), getAvatar(){ - return imgView+this.avatar(); + return window._CONFIG['imgDomainURL']+"/"+this.avatar(); }, getTeams() { this.$http.get('/api/workplace/teams') diff --git a/ant-design-jeecg-vue/src/views/dashboard/Analysis.vue b/ant-design-jeecg-vue/src/views/dashboard/Analysis.vue index 6313e6d..d68948a 100644 --- a/ant-design-jeecg-vue/src/views/dashboard/Analysis.vue +++ b/ant-design-jeecg-vue/src/views/dashboard/Analysis.vue @@ -36,7 +36,7 @@ <a-icon type="info-circle-o" /> </a-tooltip> <div> - <mini-bar /> + <mini-bar :height="40" /> </div> <template slot="footer">转化率 <span>60%</span></template> </chart-card> @@ -47,7 +47,7 @@ <a-icon type="info-circle-o" /> </a-tooltip> <div> - <mini-progress color="rgb(19, 194, 194)" :target="80" :percentage="78" height="8px" /> + <mini-progress color="rgb(19, 194, 194)" :target="80" :percentage="78" :height="8" /> </div> <template slot="footer"> <trend flag="down" style="margin-right: 16px;"> @@ -78,7 +78,7 @@ <a-tab-pane loading="true" tab="销售额" key="1"> <a-row> <a-col :xl="16" :lg="12" :md="12" :sm="24" :xs="24"> - <bar title="销售额排行" /> + <bar title="销售额排行" :dataSource="barData"/> </a-col> <a-col :xl="8" :lg="12" :md="12" :sm="24" :xs="24"> <rank-list title="门店销售排行榜" :list="rankList"/> @@ -88,7 +88,7 @@ <a-tab-pane tab="访问量" key="2"> <a-row> <a-col :xl="16" :lg="12" :md="12" :sm="24" :xs="24"> - <bar title="销售额趋势" /> + <bar title="销售额趋势" :dataSource="barData"/> </a-col> <a-col :xl="8" :lg="12" :md="12" :sm="24" :xs="24"> <rank-list title="门店销售排行榜" :list="rankList"/> @@ -173,7 +173,7 @@ import RankList from '@/components/chart/RankList' import Bar from '@/components/chart/Bar' import Trend from '@/components/Trend' - import {getLoginfo} from '@/api/api.js' + import {getLoginfo} from '@/api/api' const rankList = [] for (let i = 0; i < 7; i++) { @@ -182,7 +182,13 @@ total: 1234.56 - i * 100 }) } - + const barData = [] + for (let i = 0; i < 12; i += 1) { + barData.push({ + x: `${i + 1}月`, + y: Math.floor(Math.random() * 1000) + 200 + }) + } export default { name: "Analysis", components: { @@ -199,7 +205,9 @@ data() { return { loading: true, + center: null, rankList, + barData, loginfo:{}, } }, diff --git a/ant-design-jeecg-vue/src/views/dashboard/Workplace.vue b/ant-design-jeecg-vue/src/views/dashboard/Workplace.vue index 0042c0b..96c764b 100644 --- a/ant-design-jeecg-vue/src/views/dashboard/Workplace.vue +++ b/ant-design-jeecg-vue/src/views/dashboard/Workplace.vue @@ -21,11 +21,11 @@ <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" + <a-card + class="project-list" + :loading="loading" + style="margin-bottom: 24px;" + :bordered="false" title="进行中的项目" :body-style="{ padding: 0 }"> <a slot="extra">全部项目</a> @@ -67,12 +67,12 @@ </a-list> </a-card> </a-col> - <a-col - style="padding: 0 12px" - :xl="8" - :lg="24" - :md="24" - :sm="24" + <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"> @@ -116,9 +116,7 @@ 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') @@ -187,7 +185,8 @@ }, created() { this.user = this.userInfo - this.avatar = imgView + this.userInfo.avatar + this.avatar = window._CONFIG['imgDomainURL'] +"/"+ this.userInfo.avatar + console.log('this.avatar :'+ this.avatar) getRoleList().then(res => { console.log('workplace -> call getRoleList()', res) diff --git a/ant-design-jeecg-vue/src/views/jeecg/FlowTest.vue b/ant-design-jeecg-vue/src/views/jeecg/FlowTest.vue deleted file mode 100644 index 19f832d..0000000 --- a/ant-design-jeecg-vue/src/views/jeecg/FlowTest.vue +++ /dev/null @@ -1,93 +0,0 @@ -<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/InterfaceTest.vue b/ant-design-jeecg-vue/src/views/jeecg/InterfaceTest.vue new file mode 100644 index 0000000..78a9e46 --- /dev/null +++ b/ant-design-jeecg-vue/src/views/jeecg/InterfaceTest.vue @@ -0,0 +1,93 @@ +<template> + <a-card :bordered="false"> + <a-row> + <a-col :md="2" :sm="4"> + <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 :md="22" :sm="20"> + <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/JSearchUserByDepList.vue b/ant-design-jeecg-vue/src/views/jeecg/JSearchUserByDepList.vue new file mode 100644 index 0000000..250ab33 --- /dev/null +++ b/ant-design-jeecg-vue/src/views/jeecg/JSearchUserByDepList.vue @@ -0,0 +1,43 @@ +<template> + <div> + <a-input-search + v-model="this.selectedUserNames" + placeholder="请先选择用户" + disabled + @search="onSearch" + size="large"> + <a-button slot="enterButton">选择用户</a-button> + </a-input-search> + + <j-search-user-by-dep-modal ref="JSearchUserByDepModal" @ok="modalFormOk"></j-search-user-by-dep-modal> + </div> +</template> + +<script> + import JSearchUserByDepModal from '@/components/jeecgbiz/JSearchUserByDepModal' + + export default { + name: 'JSearchUserByDepList', + components: { + JSearchUserByDepModal, + }, + data() { + return { + selectedUserNames: '', + } + }, + methods: { + onSearch() { + this.$refs.JSearchUserByDepModal.showModal(); + this.selectedUserNames = ''; + this.$refs.JSearchUserByDepModal.title = '根据部门查询用户'; + }, + modalFormOk(selectedValue) { + this.selectedUserNames = selectedValue; + } + } + } +</script> +<style scoped> + +</style> \ 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 index 1a94ec5..02c2135 100644 --- a/ant-design-jeecg-vue/src/views/jeecg/JeecgDemoList.vue +++ b/ant-design-jeecg-vue/src/views/jeecg/JeecgDemoList.vue @@ -6,40 +6,65 @@ <a-form layout="inline"> <a-row :gutter="24"> - <a-col :span="6"> + <a-col :md="6" :sm="8"> <a-form-item label="名称"> <a-input placeholder="请输入名称查询" v-model="queryParam.name"></a-input> </a-form-item> </a-col> - <a-col :span="6"> + <a-col :md="6" :sm="8"> <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> + <template v-if="toggleSearchStatus"> + <a-col :md="6" :sm="8"> + <a-form-item label="字典下拉"> + <j-dict-select-tag 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-col :md="6" :sm="8"> + <a-form-item label="字典表下拉"> + <j-dict-select-tag v-model="queryParam.realname" placeholder="请选择用户" dictCode="sys_user,realname,id"/> + </a-form-item> + </a-col> + </template> + <span style="float: left;overflow: hidden;" class="table-page-search-submitButtons"> + <a-col :md="6" :sm="24"> <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-col> + </span> + <a-col :md="6" :sm="24"> + <template v-if="superQueryFlag"> + <a-tooltip title="已有高级查询条件生效!"> + <button :disabled="false" class="ant-btn ant-btn-primary" @click="superQuery"> + <a-icon type="appstore" theme="twoTone" spin="true"></a-icon> + <span>高级查询</span> + </button> + </a-tooltip> + </template> + <a-button v-else type="primary" @click="superQuery" icon="filter">高级查询</a-button> + + <a @click="handleToggleSearch" style="margin-left: 8px"> + {{ toggleSearchStatus ? '收起' : '展开' }} + <a-icon :type="toggleSearchStatus ? 'up' : 'down'"/> + </a> + </a-col> </a-row> </a-form> </div> <!-- 操作按钮区域 --> - <div class="table-operator"> + <div class="table-operator" style="margin-top: 5px"> <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-button type="primary" icon="download" @click="exportXls">导出</a-button> + <a-upload name="file" :showUploadList="false" :multiple="false" :action="importExcelUrl" @change="handleImportExcel"> + <a-button type="primary" icon="import">导入</a-button> + </a-upload> <a-dropdown v-if="selectedRowKeys.length > 0"> <a-menu slot="overlay"> <a-menu-item key="1" @click="batchDel"> @@ -94,38 +119,51 @@ <!-- table区域-end --> <!-- 表单区域 --> - <jeecgDemo-modal ref="jeecgDemoModal" @ok="modalFormOk"></jeecgDemo-modal> + <jeecgDemo-modal ref="modalForm" @ok="modalFormOk"></jeecgDemo-modal> <!-- 一对多表单区域 --> <JeecgDemoTabsModal ref="jeecgDemoTabsModal" @ok="modalFormOk"></JeecgDemoTabsModal> <!-- 高级查询区域 --> - <superQueryModal ref="superQueryModal" @ok="modalFormOk" @handleSuperQuery="handleSuperQuery"></superQueryModal> + <j-super-query :fieldList="fieldList" ref="superQueryModal" @handleSuperQuery="handleSuperQuery"></j-super-query> </a-card> </template> <script> import JeecgDemoModal from './modules/JeecgDemoModal' - import SuperQueryModal from './modules/SuperQueryModal' + import JSuperQuery from '@/components/jeecg/JSuperQuery.vue'; import JeecgDemoTabsModal from './modules/JeecgDemoTabsModal' - import {filterObj} from '@/utils/util' - import {deleteAction, getAction, postAction} from '@/api/manage' - import {initDictOptions, filterDictText} from '@/components/dict/DictSelectUtil' + import {initDictOptions, filterDictText} from '@/components/dict/JDictSelectUtil' + import { JeecgListMixin } from '@/mixins/JeecgListMixin' + //高级查询modal需要参数 + const superQueryFieldList=[{ + type:"date", + value:"birthday", + text:"生日" + },{ + type:"string", + value:"name", + text:"用户名" + },{ + type:"int", + value:"age", + text:"年龄" + }] export default { name: "JeecgDemoList", + mixins:[JeecgListMixin], components: { JeecgDemoModal, - SuperQueryModal, + JSuperQuery, JeecgDemoTabsModal, }, data() { return { description: '用户管理页面', - // 查询条件 - queryParam: {}, //字典数组缓存 sexDictOptions: [], + importExcelUrl:`${window._CONFIG['domianURL']}/test/jeecgDemo/importExcel`, // 表头 columns: [ { @@ -157,7 +195,7 @@ title: '性别', align: "center", dataIndex: 'sex', - customRender: (text, record, index) => { + customRender: (text) => { //字典值替换通用方法 return filterDictText(this.sexDictOptions, text); } @@ -189,66 +227,34 @@ 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", }, - + fieldList:superQueryFieldList } }, - 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; - } - }) + exportXls(){ + let paramsStr = encodeURI(JSON.stringify(this.getQueryParams())); + console.log('paramsStr: ' + paramsStr) + let url = `${window._CONFIG['domianURL']}/test/jeecgDemo/exportXls?paramsStr=${paramsStr}`; + window.location.href = url; }, - 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); - } - }) + handleImportExcel(info){ + if (info.file.status !== 'uploading') { + console.log(info.file, info.fileList); + } + if (info.file.status === 'done') { + this.$message.success(`${info.file.name} 文件上传成功`); + this.loadData(); + } else if (info.file.status === 'error') { + this.$message.error(`${info.file.name} 文件上传失败.`); + } }, initDictConfig() { + console.log("--我才是真的方法!--") //初始化字典 - 性别 initDictOptions('sex').then((res) => { if (res.success) { @@ -256,105 +262,10 @@ } }); }, - 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) { + onetomany: function () { 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'}) @@ -367,10 +278,6 @@ margin-bottom: 18px; } - .ant-layout-content { - margin: 12px 16px 0 !important; - } - .ant-table-tbody .ant-table-row td { padding-top: 15px; padding-bottom: 15px; diff --git a/ant-design-jeecg-vue/src/views/jeecg/JeecgEditableTableExample.vue b/ant-design-jeecg-vue/src/views/jeecg/JeecgEditableTableExample.vue new file mode 100644 index 0000000..8bb1a2e --- /dev/null +++ b/ant-design-jeecg-vue/src/views/jeecg/JeecgEditableTableExample.vue @@ -0,0 +1,191 @@ +<template> + + <a-card :borderd="false"> + + + <a-button @click="handleTableCheck" type="primary">表单验证</a-button> + <span style="padding-left:8px;"></span> + <a-tooltip placement="top" title="获取值,忽略表单验证" :autoAdjustOverflow="true"> + <a-button @click="handleTableGet" type="primary">获取值</a-button> + </a-tooltip> + <span style="padding-left:8px;"></span> + <a-tooltip placement="top" title="模拟加载1000条数据" :autoAdjustOverflow="true"> + <a-button @click="handleTableSet" type="primary">设置值</a-button> + </a-tooltip> + + + <j-editable-table + ref="editableTable" + :loading="loading" + :columns="columns" + :dataSource="dataSource" + :rowNumber="true" + :rowSelection="true" + :actionButton="true" + style="margin-top: 8px;" + @selectRowChange="handleSelectRowChange"/> + + </a-card> + +</template> + +<script> + + + import JEditableTable from '@/components/jeecg/JEditableTable' + import { FormTypes } from '@/utils/JEditableTableUtil' + import { randomUUID, randomString, randomNumber } from '@/utils/util' + + export default { + name: 'JeecgEditableTableExample', + components: { + JEditableTable + }, + data() { + return { + loading: false, + columns: [ + { + title: '字段名称', + key: 'dbFieldName', + width: '19%', + type: FormTypes.input, + defaultValue: '', + placeholder: '请输入${title}', + validateRules: [ + { + required: true, // 必填 + message: '请输入${title}' // 显示的文本 + }, + { + pattern: /^[a-z|A-Z][a-z|A-Z\d_-]{0,}$/, // 正则 + message: '${title}必须以字母开头,可包含数字、下划线、横杠' + } + ] + }, + { + title: '字段备注', + key: 'dbFieldTxt', + width: '19%', + type: FormTypes.input, + defaultValue: '', + placeholder: '请输入${title}', + validateRules: [{ required: true, message: '请输入${title}' }] + }, + { + title: '字段类型', + key: 'dbFieldType', + width: '18%', + type: FormTypes.select, + options: [ // 下拉选项 + { title: 'String', value: 'string' }, + { title: 'Integer', value: 'int' }, + { title: 'Double', value: 'double' }, + { title: 'Boolean', value: 'boolean' } + ], + defaultValue: '', + placeholder: '请选择${title}', + validateRules: [{ required: true, message: '请选择${title}' }] + }, + { + title: '字段长度', + key: 'dbLength', + width: '8%', + type: FormTypes.inputNumber, + defaultValue: 32, + placeholder: '${title}', + validateRules: [{ required: true, message: '请输入${title}' }] + }, + { + title: '默认值', + key: 'dbDefaultVal', + width: '22%', + type: FormTypes.input, + defaultValue: '', + placeholder: '请输入${title}', + validateRules: [{ required: true, message: '请输入${title}' }] + }, + { + title: '可以为空', + key: 'isNull', + width: '8%', + type: FormTypes.checkbox, + customValue: ['Y', 'N'], // true ,false + defaultChecked: false + } + + ], + dataSource: [], + selectedRowIds: [] + + } + }, + created() { + + }, + mounted() { + this.randomData(23, false) + }, + methods: { + + /** 表单验证 */ + handleTableCheck() { + this.$refs.editableTable.getValues((error) => { + if (error === 0) { + this.$message.success('验证通过') + } else { + this.$message.error('验证未通过') + } + }) + }, + /** 获取值,忽略表单验证 */ + handleTableGet() { + this.$refs.editableTable.getValues((error, values) => { + console.log('values:', values) + }, false) + console.log('deleteIds:', this.$refs.editableTable.getDeleteIds()) + + this.$message.info('获取值成功,请看控制台输出') + + }, + /** 模拟加载1000条数据 */ + handleTableSet() { + this.randomData(1000, true) + }, + + handleSelectRowChange(selectedRowIds) { + this.selectedRowIds = selectedRowIds + }, + + /* 随机生成数据 */ + randomData(size, loading = false) { + if (loading) { + this.loading = true + setTimeout(() => { + this.loading = false + }, 3000) + } + + let values = [] + for (let i = 0; i < size; i++) { + values.push({ + id: randomUUID(), + dbFieldName: `name_${i + 1}`, + dbFieldTxt: randomString(10), + dbFieldType: ['string', 'int', 'double', 'boolean'][randomNumber(0, 3)], + dbLength: randomNumber(0, 233), + dbDefaultVal: randomString(8), + isNull: ['Y', 'N'][randomNumber(0, 1)] + }) + } + this.dataSource = values + } + + + } + } +</script> + +<style scoped> + +</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 index 43d755e..1953458 100644 --- a/ant-design-jeecg-vue/src/views/jeecg/JeecgOrderMainList.vue +++ b/ant-design-jeecg-vue/src/views/jeecg/JeecgOrderMainList.vue @@ -6,12 +6,12 @@ <a-form layout="inline"> <a-row :gutter="24"> - <a-col :span="6"> + <a-col :md="6" :sm="24"> <a-form-item label="订单号"> <a-input placeholder="请输入订单号" v-model="queryParam.orderCode"></a-input> </a-form-item> </a-col> - <a-col :span="6"> + <a-col :md="6" :sm="24"> <a-form-item label="订单类型"> <a-select placeholder="请输入订单类型" v-model="queryParam.ctype"> <a-select-option value="1">国内订单</a-select-option> @@ -20,7 +20,7 @@ </a-form-item> </a-col> - <a-col :span="8" > + <a-col :md="6" :sm="24" > <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> @@ -34,6 +34,10 @@ <!-- 操作按钮区域 --> <div class="table-operator"> <a-button @click="handleAdd" type="primary" icon="plus">新增</a-button> + <a-button type="primary" icon="download" @click="exportXls">导出</a-button> + <a-upload name="file" :showUploadList="false" :multiple="false" :action="importExcelUrl" @change="handleImportExcel"> + <a-button type="primary" icon="import">导入</a-button> + </a-upload> <a-dropdown v-if="selectedRowKeys.length > 0"> <a-menu slot="overlay"> @@ -83,25 +87,24 @@ <!-- table区域-end --> <!-- 表单区域 --> - <jeecgOrderMain-modal ref="jeecgOrderMainModal" @ok="modalFormOk"></jeecgOrderMain-modal> + <jeecgOrderMain-modal ref="modalForm" @ok="modalFormOk"></jeecgOrderMain-modal> </a-card> </template> <script> import JeecgOrderMainModal from './modules/JeecgOrderMainModal' - import { filterObj } from '@/utils/util' - import { deleteAction,getAction } from '@/api/manage' + import { JeecgListMixin } from '@/mixins/JeecgListMixin' export default { name: "JeecgOrderMainList", + mixins: [JeecgListMixin], components: { JeecgOrderMainModal }, data () { return { description: '订单管理页面', - // 查询条件 - queryParam: {}, + importExcelUrl:`${window._CONFIG['domianURL']}/test/jeecgOrderMain/importExcel`, // 表头 columns: [ { @@ -114,12 +117,12 @@ return parseInt(index)+1; } }, - { + { title: '订单号', align:"center", dataIndex: 'orderCode' }, - { + { title: '订单类型', align:"center", dataIndex: 'ctype', @@ -133,17 +136,17 @@ return re; } }, - { + { title: '订单日期', align:"center", dataIndex: 'orderDate' }, - { + { title: '订单金额', align:"center", dataIndex: 'orderMoney' }, - { + { title: '订单备注', align:"center", dataIndex: 'content' @@ -155,154 +158,43 @@ 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; + exportXls(){ + let paramsStr = encodeURI(JSON.stringify(this.getQueryParams())); + console.log('paramsStr: ' + paramsStr) + let url = `${window._CONFIG['domianURL']}/test/jeecgOrderMain/exportXls?paramsStr=${paramsStr}`; + window.location.href = url; }, - 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); - } - }); - } - }); + handleImportExcel(info){ + if (info.file.status !== 'uploading') { + console.log(info.file, info.fileList); } - }, - 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" + if (info.file.status === 'done') { + this.$message.success(`${info.file.name} 文件上传成功`); + this.loadData(); + } else if (info.file.status === 'error') { + this.$message.error(`${info.file.name} 文件上传失败.`); } - this.ipagination = pagination; - this.loadData(); - }, - modalFormOk () { - // 新增/修改 成功时,重载列表 - this.loadData(); } } } </script> <style scoped> + /** Button按钮间距 */ + .ant-btn { + margin-left: 3px + } .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; diff --git a/ant-design-jeecg-vue/src/views/jeecg/JeecgOrderMainListForJEditableTable.vue b/ant-design-jeecg-vue/src/views/jeecg/JeecgOrderMainListForJEditableTable.vue new file mode 100644 index 0000000..e379af5 --- /dev/null +++ b/ant-design-jeecg-vue/src/views/jeecg/JeecgOrderMainListForJEditableTable.vue @@ -0,0 +1,217 @@ +<template> + <a-card :bordered="false"> + + <!-- 查询区域 --> + <div class="table-page-search-wrapper"> + <a-form layout="inline"> + <a-row :gutter="24"> + + <a-col :md="6" :sm="24"> + <a-form-item label="订单号"> + <a-input placeholder="请输入订单号" v-model="queryParam.orderCode"></a-input> + </a-form-item> + </a-col> + <a-col :md="6" :sm="24"> + <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 :md="6" :sm="24"> + <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> + <span>已选择</span> + <a style="font-weight: 600"> + {{ selectedRowKeys.length }} + </a> + <span>项</span> + <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 --> + + <!-- 表单区域 --> + <jeecg-order-modal-for-j-editable-table ref="modalForm" @ok="modalFormOk"/> + + </a-card> +</template> + +<script> + + import { JeecgListMixin } from '@/mixins/JeecgListMixin' + import JeecgOrderModalForJEditableTable from './modules/JeecgOrderModalForJEditableTable' + + export default { + name: 'JeecgOrderMainListForJEditableTable', + mixins: [JeecgListMixin], + components: { + JeecgOrderModalForJEditableTable + }, + data() { + return { + description: '订单管理页面', + // 请求参数 + url: { + list: '/test/jeecgOrderMain/list', + delete: '/test/jeecgOrderMain/delete', + deleteBatch: '/test/jeecgOrderMain/deleteBatch' + }, + // 表头 + 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' } + } + ] + } + }, + methods: { + + initDictConfig() { + } + + } + } +</script> +<style scoped> + + .ant-card-body .table-operator { + margin-bottom: 18px; + } + + .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/PrintDemo.vue b/ant-design-jeecg-vue/src/views/jeecg/PrintDemo.vue new file mode 100644 index 0000000..7b68b15 --- /dev/null +++ b/ant-design-jeecg-vue/src/views/jeecg/PrintDemo.vue @@ -0,0 +1,166 @@ +<template> + <a-card :bordered="false" :class="{'abcdefg':true}"> + <div class="no-print" style="text-align: right"> + <a-button v-print="'#printContent'" ghost type="primary">打印</a-button> + </div> + <section ref="print" id="printContent" class="abcdefg"> + <div style="text-align: center"> + <p style="font-size: 24px;font-weight: 800">打印测试表单</p> + </div> + <!--签字--> + <a-col :md="24" :sm="24"> + <div class="sign" style="text-align: left;height: inherit"> + <a-col :span="24"> + <span> + 打印人员: + </span> + <a-input style="width: 30%" v-model="printer"/> + <span style="margin-left: 12.5%">打印日期:</span> + <a-input style="width: 30%" v-model="printTime"/> + </a-col> + <a-col :span="24"> + </a-col> + <a-col :span="24" style="margin-top: 20px"> + <span>打印内容:</span> + <a-input style="width: 80%" v-model="printContent"/> + </a-col> + <a-col :span="24" style="margin-top: 20px"> + <span>打印目的:</span> + <a-input style="width: 80%" v-model="printReason"/> + </a-col> + <a-col style="margin-top: 20px" :span="24"> + <span>打印图片:</span> + <br/> + <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-col> + </div> + </a-col> + </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 ATextarea from 'ant-design-vue/es/input/TextArea' + + export default { + components: { + ATextarea, + ARow, + ACol, + }, + name: 'Printgzsld', + props:{ + reBizCode:{ + type: String, + default: '' + } + }, + data(){ + return { + columns: [{ + } + ], + labelCol: { + xs: { span: 24 }, + sm: { span: 2 }, + }, + wrapperCol: { + xs: { span: 24 }, + sm: { span: 8 }, + }, + printer:'张三', + printTime:'2019-02-01 12:00:00', + printContent:'打印内容就是,做一个打印测试', + printReason:'做一个打印测试', + 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(){ + + }, + 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/PrintDemoList.vue b/ant-design-jeecg-vue/src/views/jeecg/PrintDemoList.vue deleted file mode 100644 index e9d483d..0000000 --- a/ant-design-jeecg-vue/src/views/jeecg/PrintDemoList.vue +++ /dev/null @@ -1,208 +0,0 @@ -<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/SearchUserByDepList.vue b/ant-design-jeecg-vue/src/views/jeecg/SearchUserByDepList.vue new file mode 100644 index 0000000..4c4ab63 --- /dev/null +++ b/ant-design-jeecg-vue/src/views/jeecg/SearchUserByDepList.vue @@ -0,0 +1,43 @@ +<template> + <div> + <a-input-search + v-model="this.selectedUserNames" + placeholder="请先选择用户" + disabled + @search="onSearch" + size="large"> + <a-button slot="enterButton">选择用户</a-button> + </a-input-search> + + <j-search-user-by-dep ref="JSearchUserByDep" @ok="modalFormOk"></j-search-user-by-dep> + </div> +</template> + +<script> + import JSearchUserByDep from '@/components/jeecgbiz/JSearchUserByDep' + + export default { + name: 'SearchUserByDepList', + components: { + JSearchUserByDep, + }, + data() { + return { + selectedUserNames: '', + } + }, + methods: { + onSearch() { + this.$refs.JSearchUserByDep.showModal(); + this.selectedUserNames = ''; + this.$refs.JSearchUserByDep.title = '根据部门查询用户'; + }, + modalFormOk(selectedValue) { + this.selectedUserNames = selectedValue; + } + } + } +</script> +<style scoped> + +</style> \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/views/jeecg/SelectDemo.vue b/ant-design-jeecg-vue/src/views/jeecg/SelectDemo.vue new file mode 100644 index 0000000..c6aafec --- /dev/null +++ b/ant-design-jeecg-vue/src/views/jeecg/SelectDemo.vue @@ -0,0 +1,135 @@ +<template> + <a-card :bordered="false" style="height:100%"> + + <div class="table-page-search-wrapper"> + <a-form layout="inline"> + <!-- 选择多个用户,可排序 --> + <a-row :gutter="24"> + <a-col :span="12"> + <a-form-item label="人员列表"> + <a-select + mode="multiple" + placeholder="Please select" + :value=nameList + @change="handleChange" + > + </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="handleSelect" icon="search">选择</a-button> + <a-button type="primary" @click="selectReset" icon="reload" style="margin-left: 8px">清空</a-button> + </span> + </a-col> + </a-row> + + <!-- 通过部门筛选,选择人 --> + <a-row :gutter="24"> + <a-col :span="12"> + <a-form-item label="人员列表"> + <a-input-search + v-model="this.selectedDepUsers" + placeholder="请先选择用户" + disabled + @search="onSearchDepUser" + size="large"> + <a-button slot="enterButton">选择用户</a-button> + </a-input-search> + </a-form-item> + </a-col> + </a-row> + + </a-form> + </div> + + <!-- 选择多个用户支持排序 --> + <select-multiple-user-modal ref="selectDemoModal" @selectFinished="selectOK"></select-multiple-user-modal> + <!-- 通过部门筛选,选择人 --> + <search-user-by-dep-modal ref="SearchUserByDepModal" @ok="onSearchDepUserCallBack"></search-user-by-dep-modal> + </a-card> +</template> + +<script> + import SelectMultipleUserModal from '@/components/jeecgbiz/SelectMultipleUserModal' + import SearchUserByDepModal from '@/components/jeecgbiz/SearchUserByDepModal' + + export default { + name: "SelectDemo", + components: { + SelectMultipleUserModal, + SearchUserByDepModal + }, + data() { + return { + selectList: [], + selectedDepUsers: '' + } + }, + computed: { + nameList: function () { + var names = []; + for (var a = 0; a < this.selectList.length; a++) { + names.push(this.selectList[a].name); + } + return names; + } + }, + methods: { + handleChange() { + }, + selectOK: function (data) { + this.selectList = data; + }, + handleSelect: function () { + this.$refs.selectDemoModal.add(); + }, + selectReset() { + this.selectList = []; + }, + //通过组织机构筛选选择用户 + onSearchDepUser() { + this.$refs.SearchUserByDepModal.showModal() + this.selectedDepUsers = '' + this.$refs.SearchUserByDepModal.selectedKeys = [] + this.$refs.SearchUserByDepModal.title = '根据部门查询用户' + }, + onSearchDepUserCallBack(selectedDepUsers) { + this.selectedDepUsers = selectedDepUsers + } + } + } +</script> +<style lang="less" scoped> + .ant-card-body .table-operator { + margin-bottom: 18px; + } + + .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/TableExpandeSub.vue b/ant-design-jeecg-vue/src/views/jeecg/TableExpandeSub.vue new file mode 100644 index 0000000..249fa6d --- /dev/null +++ b/ant-design-jeecg-vue/src/views/jeecg/TableExpandeSub.vue @@ -0,0 +1,270 @@ +<template> + <a-card :bordered="false"> + + <!-- 查询区域 --> + <div class="table-page-search-wrapper"> + <a-form layout="inline"> + <a-row :gutter="24"> + + <a-col :md="6" :sm="24"> + <a-form-item label="订单号"> + <a-input placeholder="请输入订单号" v-model="queryParam.orderCode"></a-input> + </a-form-item> + </a-col> + <a-col :md="6" :sm="24"> + <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 :md="6" :sm="24"> + <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" + bordered + rowKey="id" + :columns="columns" + :dataSource="dataSource" + :pagination="false" + :expandedRowKeys= "expandedRowKeys" + :rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}" + @change="handleTableChange" + @expand="handleExpand" + > + + <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 + slot="expandedRowRender" + slot-scope="text" + :columns="innerColumns" + :dataSource="innerData" + size="middle" + bordered + rowKey="id" + :pagination="false" + :loading="loading" + > + </a-table> + </a-table> + </div> + <!-- table区域-end --> + + <!-- 表单区域 --> + <jeecgOrderDMain-modal ref="modalForm" @ok="modalFormOk"></jeecgOrderDMain-modal> + </a-card> +</template> + +<script> + import { getAction } from '@/api/manage' + import JeecgOrderDMainModal from '@/views/jeecg/tablist/form/JeecgOrderDMainModal' + import {JeecgListMixin} from '@/mixins/JeecgListMixin' + + export default { + name: "TableDemo", + mixins: [JeecgListMixin], + components: { + JeecgOrderDMainModal + }, + data() { + return { + // 子表表头 + innerColumns: [ + { + title: '客户名', + align: "center", + width: 100, + dataIndex: 'name', + key: 'name', + }, + { + 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", + }, + + ], + innerData: [], + expandedRowKeys: [], + id: ' ', + description: '列表展开子表Demo', + // 列表表头 + 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'}, + }], + // 分页参数 + type: "radio", + url: { + list: "/test/order/orderList", + delete: "/test/order/delete", + deleteBatch: "/test/order/deleteBatch", + customerListByMainId: "/test/order/listOrderCustomerByMainId", + }, + } + }, + computed: { + currentId(){ + return this.id; + } + }, + methods: { + handleExpand(expanded, record){ + this.expandedRowKeys=[]; + this.innerData=[]; + if(expanded===true){ + this.loading = true; + this.expandedRowKeys.push(record.id); + getAction(this.url.customerListByMainId, {mainId: record.id}).then((res) => { + if (res.success) { + this.loading = false; + this.innerData = res.result; + } + }); + } + }, + } + } +</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/helloworld.vue b/ant-design-jeecg-vue/src/views/jeecg/helloworld.vue index 9b73f06..c0a8b34 100644 --- a/ant-design-jeecg-vue/src/views/jeecg/helloworld.vue +++ b/ant-design-jeecg-vue/src/views/jeecg/helloworld.vue @@ -1,49 +1,41 @@ <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> + <a-card :bordered="false"> + <a-form @submit="handleSubmit" :form="form"> + <a-col :md="24" :sm="24"> + <a-form-item label="Note" :labelCol="{ span: 7 }" :wrapperCol="{ span: 15 }"> + <a-input v-decorator="['note',{rules: [{ required: true, message: 'Please input your note!' }]}]"/> + </a-form-item> + </a-col> + <a-col :md="24" :sm="24"> + <a-form-item label="Gender" :labelCol="{ span: 7 }" :wrapperCol="{ span: 15 }"> + <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-col> + <a-col :md="24" :sm="24"> + <a-form-item label="Gender" :labelCol="{ span: 7 }" :wrapperCol="{ span: 15 }"> + <a-cascader :options="areaOptions" @change="onChange" :showSearch="{filter}" placeholder="Please select" /> + </a-form-item> + </a-col> + <a-form-item :wrapperCol="{ span: 12, offset: 5 }"> + <a-col :md="24" :sm="24"> + <a-button type="primary" htmlType="submit">Submit</a-button> + </a-col> + </a-form-item> + </a-form> + </a-card> </template> <script> + import { getAction } from '@/api/manage' export default { data () { return { formLayout: 'horizontal', form: this.$form.createForm(this), + areaOptions:[] } }, methods: { @@ -61,6 +53,19 @@ note: `Hi, ${value === 'male' ? 'man' : 'lady'}!`, }) }, + onChange(value, selectedOptions) { + console.log(value, selectedOptions); + }, + filter(inputValue, path) { + return (path.some(option => (option.label).toLowerCase().indexOf(inputValue.toLowerCase()) > -1)); + }, }, + created (){ + getAction('/api/area').then((res) => { + console.log("------------") + console.log(res) + this.areaOptions = res; + }) + } } </script> \ 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 index 1bfec52..71d58e6 100644 --- a/ant-design-jeecg-vue/src/views/jeecg/modules/JeecgOrderMainModal.vue +++ b/ant-design-jeecg-vue/src/views/jeecg/modules/JeecgOrderMainModal.vue @@ -1,12 +1,12 @@ <template> <a-modal :title="title" - :width="1000" + :width="1200" :visible="visible" :confirmLoading="confirmLoading" @ok="handleOk" @cancel="handleCancel"> - + <a-spin :spinning="confirmLoading"> <a-form :form="form"> <!-- 主表单区域 --> @@ -35,7 +35,7 @@ :labelCol="labelCol" :wrapperCol="wrapperCol" label="订单日期"> - <a-date-picker showTime format='YYYY-MM-DD HH:mm:ss' v-decorator="[ 'orderDate',{}]"/> + <a-date-picker showTime format="YYYY-MM-DD HH:mm:ss" v-decorator="[ 'orderDate',{}]"/> </a-form-item> </a-col> </a-row> @@ -237,9 +237,11 @@ 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} + let formData = { + ...orderMainData, + jeecgOrderCustomerList: orderMainData.jeecgOrderCustomerList, + jeecgOrderTicketList: orderMainData.jeecgOrderTicketList + } console.log(formData) httpAction(httpurl,formData,method).then((res)=>{ diff --git a/ant-design-jeecg-vue/src/views/jeecg/modules/JeecgOrderModalForJEditableTable.vue b/ant-design-jeecg-vue/src/views/jeecg/modules/JeecgOrderModalForJEditableTable.vue new file mode 100644 index 0000000..579eccc --- /dev/null +++ b/ant-design-jeecg-vue/src/views/jeecg/modules/JeecgOrderModalForJEditableTable.vue @@ -0,0 +1,340 @@ +<template> + <a-modal + :title="title" + :width="1200" + :visible="visible" + :maskClosable="false" + :confirmLoading="confirmLoading" + @ok="handleOk" + @cancel="handleCancel"> + + <a-spin :spinning="confirmLoading"> + <a-form :form="form"> + <!-- 主表单区域 --> + <a-row class="form-row" :gutter="0"> + <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" style="width: 100%" v-decorator="[ 'orderDate',{}]"/> + </a-form-item> + </a-col> + </a-row> + <a-row class="form-row" :gutter="0"> + <a-col :lg="8"> + <a-form-item + :labelCol="labelCol" + :wrapperCol="wrapperCol" + label="订单金额"> + <a-input-number placeholder="请输入订单金额" style="width: 100%" 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-form> + + <!-- 子表单区域 --> + <a-tabs v-model="activeKey" @change="handleChangeTabs"> + <a-tab-pane tab="客户信息" key="1" :forceRender="true"> + + <j-editable-table + ref="editableTable1" + :loading="table1.loading" + :columns="table1.columns" + :dataSource="table1.dataSource" + :maxHeight="300" + :rowNumber="true" + :rowSelection="true" + :actionButton="true"/> + + </a-tab-pane> + + <a-tab-pane tab="机票信息" key="2" :forceRender="true"> + + <j-editable-table + ref="editableTable2" + :loading="table2.loading" + :columns="table2.columns" + :dataSource="table2.dataSource" + :maxHeight="300" + :rowNumber="true" + :rowSelection="true" + :actionButton="true"/> + + </a-tab-pane> + </a-tabs> + + </a-spin> + </a-modal> +</template> + +<script> + + import JEditableTable from '@/components/jeecg/JEditableTable' + import { FormTypes, VALIDATE_NO_PASSED, getRefPromise, validateFormAndTables } from '@/utils/JEditableTableUtil' + import { httpAction, getAction } from '@/api/manage' + import JDate from '@/components/jeecg/JDate' + import pick from 'lodash.pick' + import moment from 'moment' + + export default { + name: 'JeecgOrderModalForJEditableTable', + components: { + JDate, JEditableTable + }, + data() { + return { + title: '操作', + visible: false, + form: this.$form.createForm(this), + confirmLoading: false, + model: {}, + labelCol: { + xs: { span: 24 }, + sm: { span: 6 } + }, + wrapperCol: { + xs: { span: 24 }, + sm: { span: 24 - 6 } + }, + activeKey: '1', + // 客户信息 + table1: { + loading: false, + dataSource: [], + columns: [ + { + title: '客户名', + key: 'name', + width: '24%', + type: FormTypes.input, + defaultValue: '', + placeholder: '请输入${title}', + validateRules: [{ required: true, message: '${title}不能为空' }] + }, + { + title: '性别', + key: 'sex', + width: '18%', + type: FormTypes.select, + options: [ // 下拉选项 + { title: '男', value: '1' }, + { title: '女', value: '2' } + ], + defaultValue: '', + placeholder: '请选择${title}' + }, + { + title: '身份证号', + key: 'idcard', + width: '24%', + type: FormTypes.input, + defaultValue: '', + placeholder: '请输入${title}', + validateRules: [{ + 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: '${title}格式不正确' + }] + }, + { + title: '手机号', + key: 'telphone', + width: '24%', + type: FormTypes.input, + defaultValue: '', + placeholder: '请输入${title}', + validateRules: [{ + pattern: '^1(3|4|5|7|8)\\d{9}$', + message: '${title}格式不正确' + }] + } + ] + }, + // 机票信息 + table2: { + loading: false, + dataSource: [], + columns: [ + { + title: '航班号', + key: 'ticketCode', + width: '40%', + type: FormTypes.input, + defaultValue: '', + placeholder: '请输入${title}', + validateRules: [{ required: true, message: '${title}不能为空' }] + }, + { + title: '航班时间', + key: 'tickectDate', + width: '30%', + type: FormTypes.date, + placeholder: '请选择${title}', + defaultValue: '' + } + ] + }, + url: { + add: '/test/jeecgOrderMain/add', + edit: '/test/jeecgOrderMain/edit', + orderCustomerList: '/test/jeecgOrderMain/queryOrderCustomerListByMainId', + orderTicketList: '/test/jeecgOrderMain/queryOrderTicketListByMainId' + } + } + }, + created() { + }, + methods: { + + // 获取所有的editableTable实例 + getAllTable() { + return Promise.all([ + getRefPromise(this, 'editableTable1'), + getRefPromise(this, 'editableTable2') + ]) + }, + + add() { + // 默认新增一条数据 + this.getAllTable().then(editableTables => { + editableTables[0].add() + editableTables[1].add() + }) + + this.edit({}) + }, + edit(record) { + this.visible = true + this.activeKey = '1' + this.form.resetFields() + this.model = Object.assign({}, record) + + this.$nextTick(() => { + this.form.setFieldsValue(pick(this.model, 'orderCode', 'ctype', 'orderMoney', 'content')) + //时间格式化 + this.form.setFieldsValue({ orderDate: this.model.orderDate ? moment(this.model.orderDate) : null }) + }) + + // 加载子表数据 + if (this.model.id) { + let params = { id: this.model.id } + this.requestTableData(this.url.orderCustomerList, params, this.table1) + this.requestTableData(this.url.orderTicketList, params, this.table2) + } + + }, + close() { + this.visible = false + this.getAllTable().then(editableTables => { + editableTables[0].initialize() + editableTables[1].initialize() + }) + this.$emit('close') + }, + /** 查询某个tab的数据 */ + requestTableData(url, params, tab) { + tab.loading = true + getAction(url, params).then(res => { + tab.dataSource = res.result || [] + }).finally(() => { + tab.loading = false + }) + }, + handleOk() { + this.validateFields() + }, + handleCancel() { + this.close() + }, + /** ATab 选项卡切换事件 */ + handleChangeTabs(key) { + getRefPromise(this, `editableTable${key}`).then(editableTable => { + editableTable.resetScrollTop() + }) + }, + + /** 触发表单验证 */ + validateFields() { + this.getAllTable().then(tables => { + /** 一次性验证主表和所有的次表 */ + return validateFormAndTables(this.form, tables) + }).then(allValues => { + let formData = this.classifyIntoFormData(allValues) + // 发起请求 + return this.requestAddOrEdit(formData) + }).catch(e => { + if (e.error === VALIDATE_NO_PASSED) { + // 如果有未通过表单验证的子表,就自动跳转到它所在的tab + this.activeKey = e.index == null ? this.activeKey : (e.index + 1).toString() + } else { + console.error(e) + } + }) + }, + /** 整理成formData */ + classifyIntoFormData(allValues) { + let orderMain = Object.assign(this.model, allValues.formValue) + //时间格式化 + orderMain.orderDate = orderMain.orderDate ? orderMain.orderDate.format('YYYY-MM-DD HH:mm:ss') : null + return { + ...orderMain, // 展开 + jeecgOrderCustomerList: allValues.tablesValue[0].values, + jeecgOrderTicketList: allValues.tablesValue[1].values + } + }, + /** 发起新增或修改的请求 */ + requestAddOrEdit(formData) { + let url = this.url.add, method = 'post' + if (this.model.id) { + url = this.url.edit + method = 'put' + } + this.confirmLoading = true + httpAction(url, formData, method).then((res) => { + if (res.success) { + this.$message.success(res.message) + this.$emit('ok') + this.close() + } else { + this.$message.warning(res.message) + } + }).finally(() => { + this.confirmLoading = false + }) + } + + } + } +</script> + +<style scoped> +</style> \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/views/jeecg/report/Analysis.vue b/ant-design-jeecg-vue/src/views/jeecg/report/Analysis.vue new file mode 100644 index 0000000..15f88b7 --- /dev/null +++ b/ant-design-jeecg-vue/src/views/jeecg/report/Analysis.vue @@ -0,0 +1,698 @@ +<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="cardCount.sll | NumberFormat"> + <a-tooltip title="指标说明" slot="action"> + <a-icon type="info-circle-o" /> + </a-tooltip> + <div> + <mini-area :dataSource="chartData.sll" /> + </div> + <template slot="footer">今日受理量:<span>{{ todaySll }}</span></template> + </chart-card> + </a-col> + <a-col :sm="24" :md="12" :xl="6" :style="{ marginBottom: '24px' }"> + <chart-card :loading="loading" title="办结量" :total="cardCount.bjl | NumberFormat"> + <a-tooltip title="指标说明" slot="action"> + <a-icon type="info-circle-o" /> + </a-tooltip> + <div> + <mini-area :dataSource="chartData.bjl"/> + </div> + <template slot="footer">今日办结量:<span>{{ todayBjl }}</span></template> + </chart-card> + </a-col> + <a-col :sm="24" :md="12" :xl="6" :style="{ marginBottom: '24px' }"> + <chart-card :loading="loading" title="用户受理量" :total="cardCount.isll | NumberFormat"> + <a-tooltip title="指标说明" slot="action"> + <a-icon type="info-circle-o" /> + </a-tooltip> + <div> + <mini-bar :dataSource="chartData.isll"/> + </div> + <template slot="footer">用户今日受理量:<span>{{ todayISll }}</span></template> + </chart-card> + </a-col> + <a-col :sm="24" :md="12" :xl="6" :style="{ marginBottom: '24px' }"> + <chart-card :loading="loading" title="用户办结量" :total="cardCount.ibjl | NumberFormat"> + <a-tooltip title="指标说明" slot="action"> + <a-icon type="info-circle-o" /> + </a-tooltip> + <div> + <mini-bar :dataSource="chartData.ibjl"/> + </div> + <template slot="footer">用户今日办结量:<span>{{ todayIBjl }}</span></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"> + + <a-card title="快速开始 / 便捷导航" style="margin-bottom: 24px" :bordered="false" :body-style="{padding: 0}"> + <div class="item-group"> + <a-row> + <a-col :class="'more-btn'" :span="12" v-for="(item,index) in registerTypeList" :key=" 'registerType'+index "> + <a-button @click="goPage(index)" style="margin-bottom:10px" size="small" type="primary" ghost>{{ item.text }}</a-button> + </a-col> + </a-row> + </div> + </a-card> + + </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-multid :dataSource="jhjgData" :fields="jhjgFields" title="平台与部门交互量统计"></bar-multid> + </a-col> + <a-col :xl="8" :lg="12" :md="12" :sm="24" :xs="24"> + + <a-card title="快速开始 / 便捷导航" style="margin-bottom: 24px" :bordered="false" :body-style="{padding: 0}"> + <div class="item-group"> + <a-row> + <a-col :class="'more-btn'" :span="12" v-for="(item,index) in registerTypeList" :key=" 'registerType'+index "> + <a-button @click="goPage(index)" style="margin-bottom:10px" size="small" type="primary" ghost>{{ item.text }}</a-button> + </a-col> + </a-row> + </div> + </a-card> + + </a-col> + </a-row> + </a-tab-pane> + + <a-tab-pane tab="效率监管" key="3"> + <a-row> + <a-col :xl="16" :lg="12" :md="12" :sm="24" :xs="24"> + <line-chart-multid :dataSource="xljgData" :fields="xljgFields" title="平台与部门交互效率统计"></line-chart-multid> + </a-col> + <a-col :xl="8" :lg="12" :md="12" :sm="24" :xs="24"> + + <a-card title="快速开始 / 便捷导航" style="margin-bottom: 24px" :bordered="false" :body-style="{padding: 0}"> + <div class="item-group"> + <a-row> + <a-col :class="'more-btn'" :span="12" v-for="(item,index) in registerTypeList" :key=" 'registerType'+index "> + <a-button @click="goPage(index)" style="margin-bottom:10px" size="small" type="primary" ghost>{{ item.text }}</a-button> + </a-col> + </a-row> + </div> + </a-card> + + </a-col> + </a-row> + </a-tab-pane> + + <a-tab-pane tab="存储监管" key="4"> + <a-row> + <a-col :xl="16" :lg="12" :md="12" :sm="24" :xs="24"> + <a-row> + <template v-if="diskInfo && diskInfo.length>0"> + <a-col :span="12" v-for="(item,index) in diskInfo" :key=" 'diskInfo'+index "> + <dash-chart-demo :title="item.name" :dataSource="item.restPPT"></dash-chart-demo> + </a-col> + </template> + </a-row> + </a-col> + + <a-col :xl="8" :lg="12" :md="12" :sm="24" :xs="24"> + + <a-card title="快速开始 / 便捷导航" style="margin-bottom: 24px" :bordered="false" :body-style="{padding: 0}"> + <div class="item-group"> + <a-row> + <a-col :class="'more-btn'" :span="10" v-for="(item,index) in registerTypeList" :key=" 'registerType'+index "> + <a-button @click="goPage(index)" style="margin-bottom:10px" size="small" type="primary" ghost>{{ item.text }}</a-button> + </a-col> + </a-row> + </div> + </a-card> + + </a-col> + </a-row> + </a-tab-pane> + + </a-tabs> + + </div> + </a-card> + + <a-row :gutter="12"> + <a-card :loading="loading" :class="{ 'anty-list-cust':true }" :bordered="false" :style="{ marginTop: '24px' }"> + + <a-tabs default-active-key="1" size="large" :tab-bar-style="{marginBottom: '24px', paddingLeft: '16px'}"> + <div class="extra-wrapper" slot="tabBarExtraContent"> + <a-radio-group defaultValue="1"> + <a-radio-button value="1">转移登记</a-radio-button> + <a-radio-button value="2">抵押登记</a-radio-button> + </a-radio-group> + </div> + + <a-tab-pane loading="true" tab="业务流程限时监管" key="1"> + + <a-table :dataSource="dataSource1" size="default" rowKey="id" :columns="columns" :pagination="ipagination"> + <template slot="flowRate" slot-scope="text, record, index"> + <a-progress :percent="getFlowRateNumber(record.flowRate)" style="width:80px" /> + </template> + </a-table> + </a-tab-pane> + + <a-tab-pane loading="true" tab="业务节点限时监管" key="2"> + <a-table :dataSource="dataSource2" size="default" rowKey="id" :columns="columns2" :pagination="ipagination"> + <template slot="flowRate" slot-scope="text, record, index"> + <span style="color: red;">{{ record.flowRate }}分钟</span> + </template> + </a-table> + </a-tab-pane> + + </a-tabs> + + + </a-card> + </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 LineChartMultid from '@/components/chart/LineChartMultid' + import AreaChartTy from '@/components/chart/AreaChartTy' + import DashChartDemo from '@/components/chart/DashChartDemo' + import BarMultid from '@/components/chart/BarMultid' + import MiniProgress from '@/components/chart/MiniProgress' + import RankList from '@/components/chart/RankList' + import Bar from '@/components/chart/Bar' + import Trend from '@/components/Trend' + import { getAction } from '@/api/manage' + import { filterObj } from '@/utils/util' + import moment from 'dayjs' + + const rankList = [] + for (let i = 0; i < 7; i++) { + rankList.push({ + name: '白鹭岛 ' + (i+1) + ' 号店', + total: 1234.56 - i * 100 + }) + } + + const dataCol1 = [{ + title: '业务号', + align:"center", + dataIndex: 'reBizCode' + },{ + title: '权利类型', + align:"center", + dataIndex: 'droitType' + },{ + title: '登记类型', + align:"center", + dataIndex: 'registeType' + },{ + title: '座落', + align:"center", + dataIndex: 'beLocated' + },{ + title: '权利人', + align:"center", + dataIndex: 'qlr' + },{ + title: '义务人', + align:"center", + dataIndex: 'ywr' + },{ + title: '受理人', + align:"center", + dataIndex: 'acceptBy' + },{ + title: '受理时间', + align:"center", + dataIndex: 'acceptDate' + },{ + title: '当前节点', + align:"center", + dataIndex: 'curNode' + },{ + title: '办理进度', + align:"center", + dataIndex: 'flowRate', + scopedSlots: { customRender: 'flowRate' } + }]; + + const dataCol2 = [{ + title: '业务号', + align:"center", + dataIndex: 'reBizCode' + },{ + title: '权利类型', + align:"center", + dataIndex: 'droitType' + },{ + title: '登记类型', + align:"center", + dataIndex: 'registeType' + },{ + title: '座落', + align:"center", + dataIndex: 'beLocated' + },{ + title: '权利人', + align:"center", + dataIndex: 'qlr' + },{ + title: '义务人', + align:"center", + dataIndex: 'ywr' + },{ + title: '受理人', + align:"center", + dataIndex: 'acceptBy' + },{ + title: '发起时间', + align:"center", + dataIndex: 'acceptDate' + },{ + title: '当前节点', + align:"center", + dataIndex: 'curNode' + },{ + title: '超时时间', + align:"center", + dataIndex: 'flowRate', + scopedSlots: { customRender: 'flowRate' } + }]; + + const jhjgData = [ + { type: '房管', '一月': 900, '二月': 1120, '三月': 1380, '四月': 1480, '五月': 1450, '六月': 1100, '七月':1300, '八月':900,'九月':1000 ,'十月':1200 ,'十一月':600 ,'十二月':900 }, + { type: '税务', '一月':1200, '二月': 1500, '三月': 1980, '四月': 2000, '五月': 1000, '六月': 600, '七月':900, '八月':1100,'九月':1300 ,'十月':2000 ,'十一月':900 ,'十二月':1100 }, + { type: '不动产', '一月':2000, '二月': 1430, '三月': 1300, '四月': 1400, '五月': 900, '六月': 500, '七月':600, '八月':1000,'九月':600 ,'十月':1000 ,'十一月':1500 ,'十二月':1200 } + ] + const jhjgFields=[ + '一月','二月','三月','四月','五月','六月', + '七月','八月','九月','十月','十一月','十二月' + ] + + + const xljgData = [ + {type:'一月',"房管":1.12,"税务":1.55,"不动产":1.2}, + {type:'二月',"房管":1.65,"税务":1.32,"不动产":1.42}, + {type:'三月',"房管":1.85,"税务":1.1,"不动产":1.5}, + + {type:'四月',"房管":1.33,"税务":1.63,"不动产":1.4}, + {type:'五月',"房管":1.63,"税务":1.8,"不动产":1.7}, + {type:'六月',"房管":1.85,"税务":1.98,"不动产":1.8}, + + {type:'七月',"房管":1.98,"税务":1.5,"不动产":1.76}, + {type:'八月',"房管":1.48,"税务":1.2,"不动产":1.3}, + {type:'九月',"房管":1.41,"税务":1.9,"不动产":1.6}, + + {type:'十月',"房管":1.1,"税务":1.1,"不动产":1.4}, + {type:'十一月',"房管":1.85,"税务":1.6,"不动产":1.5}, + {type:'十二月',"房管":1.5,"税务":1.4,"不动产":1.3} + ] + const xljgFields=["房管","税务","不动产"] + export default { + name: "Analysis", + components: { + ATooltip, + ACol, + ChartCard, + MiniArea, + MiniBar, + MiniProgress, + RankList, + Bar, + Trend, + LineChartMultid, + AreaChartTy, + DashChartDemo, + BarMultid + }, + data() { + return { + xljgData, + xljgFields, + jhjgData, + jhjgFields, + loading: true, + rankList, + zsll:0, + zbjl:0, + todaySll:0, + todayBjl:0, + todayISll:0, + todayIBjl:0, + registerTypeList:[{ + text:"业务受理" + },{ + text:"业务管理" + },{ + text:"文件管理" + },{ + text:"信息查询" + }], + // 分页参数 + ipagination:{ + current: 1, + pageSize: 5, + pageSizeOptions: ['10', '20', '30'], + showTotal: (total, range) => { + return range[0] + "-" + range[1] + " 共" + total + "条" + }, + showQuickJumper: true, + showSizeChanger: true, + total: 0 + }, + //数据集 + dataSource:[], + dataSource1:[], + dataSource2:[], + url:{ + analysis:"/sps/register/analysis", + list:"sps/register/virtualList", + countSll:"sps/register/sllTenDaysCount", + countBjl:"sps/register/bjlTenDaysCount", + countISll:'sps/register/ISllTenDaysCount', + countIBjl:'sps/register/IBjlTenDaysCount', + queryDiskInfo:'api/queryDiskInfo' + }, + chartData:{ + sll:[], + bjl:[], + isll:[], + ibjl:[] + }, + cardCount:{ + sll:0, + bjl:0, + isll:0, + ibjl:0 + }, + columns:dataCol1, + columns2:dataCol2, + diskInfo:[] + } + }, + methods:{ + goPage(index){ + if(index==0){ + this.$router.push({ + path: '/isps/registerStepForm', + name: 'isps-registerStepForm', + }); + }else if(index==1){ + this.$router.push({ + path: '/isps/registerList', + name: 'isps-registerList', + }); + + }else if(index==2){ + this.$router.push({ + path: '/isps/fileManage', + name: 'isps-fileManage', + }); + }else if(index==3){ + this.$router.push({ + path: '/isps/infoSearch', + name: 'isps-infoSearch', + }); + } + }, + loadList (arg){ + if(arg===1){ + this.ipagination.current = 1; + } + var params = this.getQueryParams();//查询条件 + getAction(this.url.list,params).then((res)=>{ + console.log("dsdsd",res.result) + this.dataSource1 = res.result.data1; + this.dataSource2 = res.result.data2; + this.ipagination.total = 5; + }); + }, + getQueryParams(){ + var param = {flowStatus:"-3"}; + param.pageNo = this.ipagination.current; + param.pageSize = this.ipagination.pageSize; + return filterObj(param); + }, + formatRespectiveHoldCert(value){ + return (value=="1"||eval(value))?"是":"否" + }, + formatCertFormat(value){ + if(value=="1"){ + return "单一版" + }else if(value=="2"){ + return "集成版" + }else{ + return value; + } + }, + getFlowRateNumber(value){ + return Number(value) + }, + getFlowPercent(record){ + if(record.flowStatus=="3"){ + return 100 + }else if(record.flowStatus=="0"){ + return 0 + }else{ + return record.flowRate + } + }, + getFlowStatus(status){ + if(status=="4"){ + return "exception"; + }else if(status=="0"){ + return "normal"; + }else if(status=="3"){ + return "success"; + }else{ + return "active"; + } + + }, + queryCount(){ + getAction(this.url.analysis).then((res)=>{ + if(res.success){ + this.cardCount = res.result + } + console.log(res); + }); + }, + + loadDiskInfo(){ + getAction(this.url.queryDiskInfo).then((res)=>{ + if(res.success){ + console.log(res.result) + let one=0,two=""; + for(let a in res.result){ + let tempNum = Number(res.result[a].max) + if(tempNum>one){ + one = tempNum + two = res.result[a].name + } + } + let ontItem = res.result.filter((item)=>{return item.name == two})[0] + ontItem.restPPT = ontItem.restPPT/10 + this.diskInfo.push(ontItem); + + if(res.result.length>1){ + let one2=0,two2=""; + for(let a in res.result){ + if(res.result[a].name == two){ + continue; + } + let tempNum = Number(res.result[a].max) + if(tempNum>one2){ + one2 = tempNum + two2 = res.result[a].name + } + } + let one2Item = res.result.filter((item)=>{return item.name == two2})[0] + one2Item.restPPT = one2Item.restPPT/10 + this.diskInfo.push(one2Item); + } + + }else{ + console.log(res.message) + } + }) + }, + loadChartData(){ + getAction(this.url.countSll).then((res)=>{ + if(res.success){ + let map = res.result; + for(var key in map){ + let dataStr = key; + let value = map[key]; + let today = moment(new Date()).format('YYYY-MM-DD'); + if(dataStr == today){ + this.todaySll = map[today]; + } + this.chartData.sll.push({ + x: dataStr, + y: value + }); + } + } + + }), + getAction(this.url.countBjl).then((res)=>{ + if(res.success){ + let map = res.result; + for(var key in map){ + let dataStr = key; + let value = map[key]; + let today = moment(new Date()).format('YYYY-MM-DD'); + if(dataStr == today){ + this.todayBjl = map[today]; + } + this.chartData.bjl.push({ + x: dataStr, + y: value + }); + } + } + }), + getAction(this.url.countISll).then((res)=>{ + if(res.success){ + let map = res.result; + for(var key in map){ + let dataStr = key; + let value = map[key]; + let today = moment(new Date()).format('YYYY-MM-DD'); + if(dataStr == today){ + this.todayISll = map[today]; + } + this.chartData.isll.push({ + x: key, + y: value + }); + } + } + }), + getAction(this.url.countIBjl).then((res)=>{ + if(res.success){ + let map = res.result; + for(var key in map){ + let dataStr = key; + let value = map[key]; + let today = moment(new Date()).format('YYYY-MM-DD'); + if(dataStr == today){ + this.todayIBjl = map[today]; + } + this.chartData.ibjl.push({ + x: key, + y: value + }); + } + } + }) + } + }, + created() { + this.loadDiskInfo() + this.queryCount(); + this.loadChartData(); + this.loadList(1); + setTimeout(() => { + this.loading = !this.loading + }, 1000) + } + } +</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; + } + } + } + + .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%; + } + } + + .item-group { + .more-btn { + margin-bottom: 13px; + text-align: center; + } + } + + .list-content-item { + color: rgba(0, 0, 0, .45); + display: inline-block; + vertical-align: middle; + font-size: 14px; + margin-left: 40px; + } + + @media only screen and (min-width: 1600px) { + .list-content-item{ + margin-left:60px; + } + } + + @media only screen and (max-width: 1300px) { + .list-content-item{ + margin-left:20px; + } + .width-hidden4{ + display:none + } + } + .list-content-item{ + span{line-height: 20px;} + } + .list-content-item{ + p{margin-top: 4px;margin-bottom:0;line-height:22px;} + } + .anty-list-cust { + .ant-list-item-meta{flex: 0.3 !important;} + } + .anty-list-cust { + .ant-list-item-content{flex:1 !important; justify-content:flex-start !important;margin-left: 20px;} + } + + +</style> \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/views/jeecg/report/ArchivesStatisticst.vue b/ant-design-jeecg-vue/src/views/jeecg/report/ArchivesStatisticst.vue new file mode 100644 index 0000000..326fc28 --- /dev/null +++ b/ant-design-jeecg-vue/src/views/jeecg/report/ArchivesStatisticst.vue @@ -0,0 +1,315 @@ +<template> + <a-card :bordered="false"> + <a-tabs defaultActiveKey="1" @change="callback"> + <a-tab-pane tab="柱状图" key="1"> + <a-row :gutter="24"> + <a-col :span="10"> + <a-radio-group :value="barType" @change="statisticst"> + <a-radio-button value="year">按年统计</a-radio-button> + <a-radio-button value="month">按月统计</a-radio-button> + <a-radio-button value="category">按类别统计</a-radio-button> + <a-radio-button value="cabinet">按柜号统计</a-radio-button> + </a-radio-group> + </a-col> + <a-col :span="14"> + <a-form v-if="barType === 'month'" layout="inline" style="margin-top: -4px"> + <a-form-item label="月份区间"> + <a-range-picker + :placeholder="['开始月份', '结束月份']" + format="YYYY-MM" + :value="barValue" + :mode="barDate" + @panelChange="handleBarDate"/> + </a-form-item> + <a-button style="margin-top: 2px" type="primary" icon="search" @click="queryDatebar">查询</a-button> + <a-button style="margin-top: 2px;margin-left: 8px" type="primary" icon="reload" @click="searchReset">重置</a-button> + </a-form> + </a-col> + <bar class="statistic" title="档案统计" :dataSource="countSource"/> + </a-row> + </a-tab-pane> + + <a-tab-pane tab="饼状图" key="2"> + <a-row :gutter="24"> + <a-col :span="10"> + <a-radio-group :value="pieType" @change="statisticst"> + <a-radio-button value="year">按年统计</a-radio-button> + <a-radio-button value="month">按月统计</a-radio-button> + <a-radio-button value="category">按类别统计</a-radio-button> + <a-radio-button value="cabinet">按柜号统计</a-radio-button> + </a-radio-group> + </a-col> + <a-col :span="14"> + <a-form v-if="pieType === 'month'" layout="inline" style="margin-top: -4px"> + <a-row :gutter="24"> + <a-form-item label="月份区间"> + <a-range-picker + :placeholder="['开始月份', '结束月份']" + format="YYYY-MM" + :value="pieValue" + :mode="pieDate" + @panelChange="handlePieDate"/> + </a-form-item> + <a-button style="margin-top: 2px" type="primary" icon="search" @click="queryDatepie">查询</a-button> + <a-button style="margin-top: 2px;margin-left: 8px" type="primary" icon="reload" @click="searchReset">重置</a-button> + </a-row> + </a-form> + </a-col> + <pie class="statistic" title="档案统计" :dataSource="countSource"/> + </a-row> + </a-tab-pane> + </a-tabs> + </a-card> +</template> + +<script> + import Bar from '@/components/chart/Bar' + import Pie from '@/components/chart/Pie' + import ACol from 'ant-design-vue/es/grid/Col' + import { getAction } from '@/api/manage' + + export default { + name: 'ArchivesStatisticst', + components: { + ACol, + Bar, + Pie + }, + data() { + return { + description: '档案统计页面', + // 查询条件 + queryParam: {}, + // 数据集 + countSource: [], + // 柱状图 + barType: 'year', + barDate: ['month', 'month'], + barValue: [], + // 饼状图 + pieType: 'year', + pieDate: ['month', 'month'], + pieValue: [], + // 统计图类型 + tabStatus:"bar", + url: { + getYearCountInfo: "/api/report/getYearCountInfo", + getMonthCountInfo:"/api/report/getMonthCountInfo", + getCntrNoCountInfo:"/api/report/getCntrNoCountInfo", + getCabinetCountInfo:"/api/report/getCabinetCountInfo", + }, + } + }, + created() { + let url = this.url.getYearCountInfo; + this.loadDate(url,'year',{}); + }, + methods: { + loadDate(url,type,param) { + getAction(url,param,'get').then((res) => { + if (res.success) { + this.countSource = []; + if(type === 'year'){ + this.getYearCountSource(res.result); + } + if(type === 'month'){ + this.getMonthCountSource(res.result); + } + if(type === 'category'){ + this.getCategoryCountSource(res.result); + } + if(type === 'cabinet'){ + this.getCabinetCountSource(res.result); + } + }else{ + var that=this; + that.$message.warning(res.message); + } + }) + }, + getYearCountSource(data){ + for (let i = 0; i < data.length; i++) { + if(this.tabStatus === "bar"){ + this.countSource.push({ + x: `${data[i].year}年`, + y: data[i].yearcount + }) + }else{ + this.countSource.push({ + item: `${data[i].year}年`, + count:data[i].yearcount + }) + } + } + }, + getMonthCountSource(data){ + for (let i = 0; i < data.length; i++) { + if(this.tabStatus === "bar"){ + this.countSource.push({ + x: data[i].month, + y: data[i].monthcount + }) + }else{ + this.countSource.push({ + item: data[i].month, + count:data[i].monthcount + }) + } + } + }, + getCategoryCountSource(data){ + for (let i = 0; i < data.length; i++) { + if(this.tabStatus ==="bar"){ + this.countSource.push({ + x: data[i].classifyname, + y: data[i].cntrnocount + }) + }else{ + this.countSource.push({ + item: data[i].classifyname, + count:data[i].cntrnocount + }) + } + } + }, + getCabinetCountSource(data){ + for (let i = 0; i < data.length; i++) { + if(this.tabStatus === "bar"){ + this.countSource.push({ + x: data[i].cabinetname, + y: data[i].cabinetcocunt + }) + }else{ + this.countSource.push({ + item: data[i].cabinetname, + count:data[i].cabinetcocunt + }) + } + } + }, + // 选择统计图类别 + callback(key) { + if(key === "1"){ + this.tabStatus = "bar"; + this.queryDatebar(); + }else{ + this.tabStatus = "pie"; + this.queryDatepie(); + } + }, + // 选择统计类别 + statisticst(e) { + if(this.tabStatus === "pie"){ + this.pieType = e.target.value; + this.queryDatepie(); + }else{ + this.barType = e.target.value; + this.queryDatebar(); + } + }, + // 按月份查询 + queryDatebar(){ + if(this.barValue.length>0){ + this.getUrl(this.barType,{startTime:this.barValue[0]._d,endTime:this.barValue[1]._d}); + }else{ + this.getUrl(this.barType,{}); + } + }, + queryDatepie(){ + if(this.pieValue.length>0){ + this.getUrl(this.pieType,{startTime:this.pieValue[0]._d,endTime:this.pieValue[1]._d}); + }else{ + this.getUrl(this.pieType,{}); + } + }, + searchReset(){ + console.log(this.tabStatus); + if(this.tabStatus === "pie"){ + this.pieValue = []; + }else{ + this.barValue = []; + } + this.getUrl(this.barType,{}); + }, + // 选择请求url + getUrl(type,param){ + let url = ""; + if(type === 'year'){ + url = this.url.getYearCountInfo; + } + if(type === 'month'){ + url = this.url.getMonthCountInfo; + } + if(type === 'category'){ + url = this.url.getCntrNoCountInfo; + } + if(type === 'cabinet'){ + url = this.url.getCabinetCountInfo; + } + this.loadDate(url,type,param); + }, + // 选择月份日期 + handleBarDate(value, mode) { + this.barValue = value + this.barDate = [ + mode[0] === 'date' ? 'month' : mode[0], + mode[1] === 'date' ? 'month' : mode[1] + ] + }, + handlePieDate(value, mode) { + this.pieValue = value + this.pieDate = [ + mode[0] === 'date' ? 'month' : mode[0], + mode[1] === 'date' ? 'month' : mode[1] + ] + }, + } + } +</script> +<style scoped> + .ant-card-body .table-operator { + margin-bottom: 18px; + } + + .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 + } + + .statistic { + padding: 0px !important; + margin-top: 50px; + } + + .statistic h4 { + margin-bottom: 20px; + text-align: center !important; + font-size: 24px !important;; + } + + .statistic #canvas_1 { + width: 100% !important; + } +</style> \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/views/jeecg/report/ViserChartDemo.vue b/ant-design-jeecg-vue/src/views/jeecg/report/ViserChartDemo.vue new file mode 100644 index 0000000..dabc532 --- /dev/null +++ b/ant-design-jeecg-vue/src/views/jeecg/report/ViserChartDemo.vue @@ -0,0 +1,136 @@ +<template> + <a-card :bordered="false"> + <a-tabs defaultActiveKey="1"> + <!-- 柱状图 --> + <a-tab-pane tab="柱状图" key="1"> + <bar title="销售额排行" :dataSource="barData" :height="height"/> + </a-tab-pane> + <!-- 多列柱状图 --> + <a-tab-pane tab="多列柱状图" key="2"> + <bar-multid title="多列柱状图" :height="height"/> + </a-tab-pane> + <!-- 迷你柱状图 --> + <a-tab-pane tab="迷你柱状图" key="3"> + <mini-bar :dataSource="barData" :width="400" :height="200"/> + </a-tab-pane> + <!-- 面积图 --> + <a-tab-pane tab="面积图" key="4"> + <area-chart-ty title="销售额排行" :dataSource="areaData" x="月份" y="销售额" :height="height"/> + </a-tab-pane> + <!-- 迷你面积图 --> + <a-tab-pane tab="迷你面积图" key="5"> + <div style="padding-top: 100px;width:600px;height:200px"> + <mini-area :dataSource="areaData" x="月份" y="销售额" :height="height"/> + </div> + </a-tab-pane> + <!-- 多行折线图 --> + <a-tab-pane tab="多行折线图" key="6"> + <line-chart-multid title="多行折线图" :height="height"/> + </a-tab-pane> + <!-- 饼图 --> + <a-tab-pane tab="饼图" key="7"> + <pie title="饼图" :height="height"/> + </a-tab-pane> + <!-- 雷达图 --> + <a-tab-pane tab="雷达图" key="8"> + <radar title="雷达图" :height="height"/> + </a-tab-pane> + <!-- 仪表盘 --> + <a-tab-pane tab="仪表盘" key="9"> + <dash-chart-demo title="仪表盘" :value="9" :height="height"/> + </a-tab-pane> + <!-- 进度条 --> + <a-tab-pane tab="进度条" key="10"> + <mini-progress :percentage="30" :target="40" :height="30"/> + <mini-progress :percentage="51" :target="60" :height="30" color="#FFA500"/> + <mini-progress :percentage="66" :target="80" :height="30" color="#1E90FF"/> + <mini-progress :percentage="74" :target="70" :height="30" color="#FF4500"/> + <mini-progress :percentage="92" :target="100" :height="30" color="#49CC49"/> + </a-tab-pane> + <!-- 排名列表 --> + <a-tab-pane tab="排名列表" key="11"> + <rank-list title="门店销售排行榜" :list="rankList" style="width: 600px;margin: 0 auto;"/> + </a-tab-pane> + <!-- TransferBar --> + <a-tab-pane tab="TransferBar" key="12"> + <transfer-bar title="年度消耗流量一览表" :data="barData" x="月份" y="流量(Mb)" :height="height"/> + </a-tab-pane> + <!-- Trend --> + <a-tab-pane tab="Trend" key="13"> + <trend title="Trend" term="Trend:" :percentage="30"/> + </a-tab-pane> + <!-- Liquid --> + <a-tab-pane tab="Liquid" key="14"> + <liquid :height="height"/> + </a-tab-pane> + </a-tabs> + </a-card> +</template> + +<script> + import AreaChartTy from '@/components/chart/AreaChartTy' + import Bar from '@/components/chart/Bar' + import BarMultid from '@/components/chart/BarMultid' + import DashChartDemo from '@/components/chart/DashChartDemo' + import LineChartMultid from '@/components/chart/LineChartMultid' + import Liquid from '@/components/chart/Liquid' + import MiniBar from '@/components/chart/MiniBar' + import MiniArea from '@/components/chart/MiniArea' + import MiniProgress from '@/components/chart/MiniProgress' + import Pie from '@/components/chart/Pie' + import Radar from '@/components/chart/Radar' + import RankList from '@/components/chart/RankList' + import TransferBar from '@/components/chart/TransferBar' + import Trend from '@/components/chart/Trend' + + export default { + name: 'ViserChartDemo', + components: { + Bar, MiniBar, BarMultid, AreaChartTy, LineChartMultid, + Pie, Radar, DashChartDemo, MiniProgress, RankList, + TransferBar, Trend, Liquid, MiniArea + }, + data() { + return { + height: 420, + rankList: [], + barData: [], + areaData: [] + } + }, + created() { + setTimeout(() => { + this.loadBarData() + this.loadAreaData() + this.loadRankListData() + }, 100) + }, + methods: { + loadData(x, y, max, min, before = '', after = '月') { + let data = [] + for (let i = 0; i < 12; i += 1) { + data.push({ + [x]: `${before}${i + 1}${after}`, + [y]: Math.floor(Math.random() * max) + min + }) + } + return data + }, + // 加载柱状图数据 + loadBarData() { + this.barData = this.loadData('x', 'y', 1000, 200) + }, + // 加载AreaChartTy的数据 + loadAreaData() { + this.areaData = this.loadData('x', 'y', 500, 100) + }, + loadRankListData() { + this.rankList = this.loadData('name', 'total', 2000, 100, '北京朝阳 ', ' 号店') + } + } + } +</script> + +<style scoped> + +</style> diff --git a/ant-design-jeecg-vue/src/views/jeecg/tablist/JeecgOrderCustomerList.vue b/ant-design-jeecg-vue/src/views/jeecg/tablist/JeecgOrderCustomerList.vue index e0cdb5d..3a6ca21 100644 --- a/ant-design-jeecg-vue/src/views/jeecg/tablist/JeecgOrderCustomerList.vue +++ b/ant-design-jeecg-vue/src/views/jeecg/tablist/JeecgOrderCustomerList.vue @@ -2,14 +2,19 @@ <a-card :bordered="false"> <!-- 操作按钮区域 --> - <div class="table-operator"> + <div class="table-operator" :md="24" :sm="24" style="margin: -25px 0px 10px 0px"> <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-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-button style="margin-left: 8px"> 批量操作 + <a-icon type="down"/> + </a-button> </a-dropdown> </div> @@ -22,7 +27,7 @@ <a-table ref="table" - size="default" + size="middle" bordered rowKey="id" :columns="columns" @@ -34,13 +39,13 @@ <span slot="action" slot-scope="text, record"> <a @click="handleEdit(record)">编辑</a> - <a-divider type="vertical" /> + <a-divider type="vertical"/> <a-dropdown> <a class="ant-dropdown-link"> - 更多 <a-icon type="down" /> + 更多 <a-icon type="down"/> </a> <a-menu slot="overlay"> - <a-menu-item > + <a-menu-item> <a href="javascript:;" @click="handleDetail(record)">详情</a> </a-menu-item> <a-menu-item> @@ -55,238 +60,101 @@ </div> <!-- table区域-end --> <!-- 表单区域 --> - <jeecgOrderCustomer-modal ref="JeecgOrderCustomerModal" @ok="modalFormOk"></jeecgOrderCustomer-modal> + <jeecgOrderCustomer-modal ref="modalForm" @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' + import {JeecgListMixin} from '@/mixins/JeecgListMixin' + import {getAction} from '@/api/manage' export default { name: "JeecgOrderCustomerList", + mixins: [JeecgListMixin], components: { JeecgOrderDMainList, JeecgOrderCustomerModal }, - data () { + data() { return { description: '订单客户信息', - // 查询条件 - queryParam: { - orderId:null, - }, // 表头 columns: [ { title: '客户名', - align:"center", + align: "center", width: 100, dataIndex: 'name', key: 'name', - fixed: 'left' }, { title: '性别', - align:"center", + align: "center", dataIndex: 'sex', - customRender:function (text) { - if(text==1){ + customRender: function (text) { + if (text == 1) { return "男"; - }else if(text==2){ + } else if (text == 2) { return "女"; - }else{ + } else { return text; } } }, { title: '身份证号码', - align:"center", + align: "center", dataIndex: 'idcard', }, { title: '电话', dataIndex: 'telphone', - align:"center", + align: "center", }, { title: '操作', key: 'operation', align: 'center', - fixed: 'right', width: 130, - scopedSlots: { customRender: 'action' }, + 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", + list: "/test/order/listOrderCustomerByMainId", delete: "/test/order/deleteCustomer", deleteBatch: "/test/order/deleteBatchCustomer", - }, - + } } }, - created() { - this.loadData(); - }, methods: { - loadData (arg){ - //加载数据 若传入参数1则加载第一页的内容 - if(arg===1){ + loadData(arg) { + if (arg === 1) { this.ipagination.current = 1; } - var params = this.getQueryParams();//查询条件 - getAction(this.url.list,{id:params.orderId}).then((res)=>{ - if(res.success){ + var params = this.getQueryParams(); + getAction(this.url.list, {mainId: params.mainId}).then((res) => { + if (res.success) { this.dataSource = res.result; -/* - this.ipagination.total = res.result.total; -*/ - }else{ + } 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(){ + getOrderMain(orderId) { + this.queryParam.mainId = orderId; this.loadData(1); }, - searchReset(){ - var that = this; - for(var a in that.queryParam){ - that.queryParam[a] = ''; - } - that.loadData(1); + handleAdd: function () { + this.$refs.modalForm.add(this.queryParam.mainId); + this.$refs.modalForm.title = "添加客户信息"; }, - 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{ + .ant-card { margin-left: -30px; margin-right: -30px; } diff --git a/ant-design-jeecg-vue/src/views/jeecg/tablist/JeecgOrderDMainList.vue b/ant-design-jeecg-vue/src/views/jeecg/tablist/JeecgOrderDMainList.vue index d44475c..252f2ed 100644 --- a/ant-design-jeecg-vue/src/views/jeecg/tablist/JeecgOrderDMainList.vue +++ b/ant-design-jeecg-vue/src/views/jeecg/tablist/JeecgOrderDMainList.vue @@ -6,21 +6,21 @@ <a-form layout="inline"> <a-row :gutter="24"> - <a-col :span="6"> + <a-col :md="6" :sm="24"> <a-form-item label="订单号"> <a-input placeholder="请输入订单号" v-model="queryParam.orderCode"></a-input> </a-form-item> </a-col> - <a-col :span="6"> + <a-col :md="6" :sm="24"> <a-form-item label="订单类型"> - <a-select placeholder="请输入订单类型" v-model="queryParam.ctype"> + <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" > + <a-col :md="6" :sm="24"> <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> @@ -38,9 +38,14 @@ <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-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-button style="margin-left: 8px"> 批量操作 + <a-icon type="down"/> + </a-button> </a-dropdown> </div> @@ -53,7 +58,7 @@ <a-table ref="table" - size="default" + size="middle" bordered rowKey="id" filterMultiple="filterMultiple" @@ -68,7 +73,7 @@ <span slot="action" slot-scope="text, record"> <a @click="handleEdit(record)">编辑</a> - <a-divider type="vertical" /> + <a-divider type="vertical"/> <a-popconfirm title="确定删除吗?" @confirm="() => handleDelete(record.id)"> <a>删除</a> </a-popconfirm> @@ -88,7 +93,7 @@ </a-tabs> <!-- 表单区域 --> - <jeecgOrderDMain-modal ref="JeecgOrderDMainModal" @ok="modalFormOk"></jeecgOrderDMain-modal> + <jeecgOrderDMain-modal ref="modalForm" @ok="modalFormOk"></jeecgOrderDMain-modal> </a-card> </template> @@ -97,13 +102,14 @@ 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 {deleteAction} from '@/api/manage' import JeecgOrderCustomerModal from './form/JeecgOrderCustomerModal' import JeecgOrderTicketModal from './form/JeecgOrderTicketModal' + import {JeecgListMixin} from '@/mixins/JeecgListMixin' export default { name: "JeecgOrderDMainList", + mixins: [JeecgListMixin], components: { JeecgOrderTicketModal, JeecgOrderCustomerModal, @@ -111,30 +117,40 @@ JeecgOrderCustomerList, JeecgOrderTicketList, }, - data () { + data() { return { description: '订单管理页面', - // 查询条件 - queryParam: {}, + /* 分页参数 */ + ipagination:{ + current: 1, + pageSize: 5, + pageSizeOptions: ['5', '10', '20'], + showTotal: (total, range) => { + return range[0] + "-" + range[1] + " 共" + total + "条" + }, + showQuickJumper: true, + showSizeChanger: true, + total: 0 + }, // 表头 - columns: [ { + columns: [{ title: '#', dataIndex: '', - key:'rowIndex', - width:60, - align:"center", - customRender:function (t,r,index) { - return parseInt(index)+1; + key: 'rowIndex', + width: 60, + align: "center", + customRender: function (t, r, index) { + return parseInt(index) + 1; } }, { title: '订单号', - align:"center", + align: "center", dataIndex: 'orderCode' }, { title: '订单类型', - align:"center", + align: "center", dataIndex: 'ctype', customRender: (text) => { let re = ""; @@ -148,47 +164,27 @@ }, { title: '订单日期', - align:"center", + align: "center", dataIndex: 'orderDate' }, { title: '订单金额', - align:"center", + align: "center", dataIndex: 'orderMoney' }, { title: '订单备注', - align:"center", + align: "center", dataIndex: 'content' }, { title: '操作', dataIndex: 'action', - align:"center", - scopedSlots: { customRender: '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", @@ -196,152 +192,93 @@ }, } }, - 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){ + clickThenCheck(record) { return { on: { click: () => { - this.onSelectChange(record.id.split(","),[record]); + this.onSelectChange(record.id.split(","), [record]); } } }; }, - onSelectChange (selectedRowKeys,selectionRows) { + onSelectChange(selectedRowKeys, selectionRows) { this.selectedRowKeys = selectedRowKeys; this.selectionRows = selectionRows; this.$refs.JeecgOrderCustomerList.getOrderMain(this.selectedRowKeys[0]); this.$refs.JeecgOrderTicketList.getOrderMain(this.selectedRowKeys[0]); }, - onClearSelected(){ + onClearSelected() { this.selectedRowKeys = []; this.selectionRows = []; - this.$refs.JeecgOrderCustomerList.queryParam.orderId = null; - this.$refs.JeecgOrderTicketList.queryParam.orderId = null; + this.$refs.JeecgOrderCustomerList.queryParam.mainId = null; + this.$refs.JeecgOrderTicketList.queryParam.mainId = null; this.$refs.JeecgOrderCustomerList.loadData(); this.$refs.JeecgOrderTicketList.loadData(); + this.$refs.JeecgOrderCustomerList.selectedRowKeys = []; + this.$refs.JeecgOrderCustomerList.selectionRows = []; + this.$refs.JeecgOrderTicketList.selectedRowKeys = []; + this.$refs.JeecgOrderTicketList.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(); - this.$refs.JeecgOrderCustomerList.loadData(); - this.$refs.JeecgOrderTicketList.loadData(); - }else{ - that.$message.warning(res.message); - } - }); - } - }); - } - }, - handleDelete: function(id){ + + handleDelete: function (id) { var that = this; - deleteAction(that.url.delete,{id: id}).then((res)=>{ - if(res.success){ + 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{ + } 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 () { - // 新增/修改 成功时,重载列表 + searchQuery:function(){ + this.selectedRowKeys = []; + this.selectionRows = []; + this.$refs.JeecgOrderCustomerList.queryParam.mainId = null; + this.$refs.JeecgOrderTicketList.queryParam.mainId = null; + this.$refs.JeecgOrderCustomerList.loadData(); + this.$refs.JeecgOrderTicketList.loadData(); + this.$refs.JeecgOrderCustomerList.selectedRowKeys = []; + this.$refs.JeecgOrderCustomerList.selectionRows = []; + this.$refs.JeecgOrderTicketList.selectedRowKeys = []; + this.$refs.JeecgOrderTicketList.selectionRows = []; this.loadData(); } } } </script> <style scoped> - .ant-card-body .table-operator{ + .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-table-tbody .ant-table-row td{ - padding-top:15px; - padding-bottom:15px; + + .ant-modal-cust-warp .ant-modal-body { + height: calc(100% - 110px) !important; + overflow-y: auto } - .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} + .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 index 34a1284..9183250 100644 --- a/ant-design-jeecg-vue/src/views/jeecg/tablist/JeecgOrderTicketList.vue +++ b/ant-design-jeecg-vue/src/views/jeecg/tablist/JeecgOrderTicketList.vue @@ -2,14 +2,19 @@ <a-card :bordered="false"> <!-- 操作按钮区域 --> - <div class="table-operator"> + <div class="table-operator" :md="24" :sm="24" style="margin: -25px 0px 10px 2px"> <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-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-button style="margin-left: 8px"> 批量操作 + <a-icon type="down"/> + </a-button> </a-dropdown> </div> @@ -22,7 +27,7 @@ <a-table ref="table" - size="default" + size="middle" bordered rowKey="id" :columns="columns" @@ -34,13 +39,13 @@ <span slot="action" slot-scope="text, record"> <a @click="handleEdit(record)">编辑</a> - <a-divider type="vertical" /> + <a-divider type="vertical"/> <a-dropdown> <a class="ant-dropdown-link"> - 更多 <a-icon type="down" /> + 更多 <a-icon type="down"/> </a> <a-menu slot="overlay"> - <a-menu-item > + <a-menu-item> <a href="javascript:;" @click="handleDetail(record)">详情</a> </a-menu-item> @@ -58,216 +63,88 @@ <!-- table区域-end --> <!-- 表单区域 --> - <JeecgOrderTicket-modal ref="JeecgOrderTicketModal" @ok="modalFormOk"></JeecgOrderTicket-modal> + <JeecgOrderTicket-modal ref="modalForm" @ok="modalFormOk"></JeecgOrderTicket-modal> </a-card> </template> <script> - import { filterObj } from '@/utils/util' - import { deleteAction,getAction } from '@/api/manage' import JeecgOrderTicketModal from './form/JeecgOrderTicketModal' + import {JeecgListMixin} from '@/mixins/JeecgListMixin' + import {getAction} from '@/api/manage' export default { name: "JeecgOrderTicketList", + mixins: [JeecgListMixin], components: { JeecgOrderTicketModal, }, - data () { + 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: [], + 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', + align: "center", + width: 130, + scopedSlots: {customRender: 'action'}, + }], url: { - list: "/test/order/queryOrderTicketListByMainId", + list: "/test/order/listOrderTicketByMainId", delete: "/test/order/deleteTicket", deleteBatch: "/test/order/deleteBatchTicket", - }, - + } } }, - created() { - this.loadData(); - }, methods: { - loadData (arg){ - //加载数据 若传入参数1则加载第一页的内容 - if(arg===1){ + loadData(arg) { + if (arg === 1) { this.ipagination.current = 1; } - var params = this.getQueryParams();//查询条件 - getAction(this.url.list,{id:params.orderId}).then((res)=>{ - if(res.success){ + var params = this.getQueryParams(); + getAction(this.url.list, {mainId: params.mainId}).then((res) => { + if (res.success) { this.dataSource = res.result; -/* this.ipagination.total = res.result.total;*/ - }else{ + } 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(){ + getOrderMain(orderId) { + this.queryParam.mainId = orderId; 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="新增机票信息"; + handleAdd: function () { + this.$refs.modalForm.add(this.queryParam.mainId); + this.$refs.modalForm.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> + .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/form/JeecgOrderCustomerModal.vue b/ant-design-jeecg-vue/src/views/jeecg/tablist/form/JeecgOrderCustomerModal.vue index 2333700..ede36ee 100644 --- a/ant-design-jeecg-vue/src/views/jeecg/tablist/form/JeecgOrderCustomerModal.vue +++ b/ant-design-jeecg-vue/src/views/jeecg/tablist/form/JeecgOrderCustomerModal.vue @@ -10,21 +10,22 @@ cancelText="关闭"> <!-- 编辑 --> - <a-spin :spinning="confirmLoading" v-if="editStatus"> + <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" /> + 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 > + hasFeedback> <a-select v-decorator="['sex', {}]" placeholder="请选择性别"> <a-select-option value="1">男性</a-select-option> <a-select-option value="2">女性</a-select-option> @@ -34,14 +35,14 @@ :labelCol="labelCol" :wrapperCol="wrapperCol" label="身份证号码" - hasFeedback > - <a-input placeholder="请输入身份证号码" v-decorator="['idcard', validatorRules.idcard]" :readOnly="disableSubmit" /> + hasFeedback> + <a-input placeholder="请输入身份证号码" v-decorator="['idcard', validatorRules.idcard]" :readOnly="disableSubmit"/> </a-form-item> <a-form-item :labelCol="labelCol" :wrapperCol="wrapperCol" label="身份证扫描件" - hasFeedback > + hasFeedback> <a-upload :action="uploadAction" listType="picture-card" @@ -51,293 +52,244 @@ @preview="handlePreview" > <a-button> - <a-icon type="upload" /> upload + <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" /> + <img alt="example" style="width: 100%" :src="previewImage"/> </a-modal> - <br /> - </a-form-item> - <a-form-item + <br/> + </a-form-item> + <a-form-item :labelCol="labelCol" :wrapperCol="wrapperCol" label="联系方式" - hasFeedback > - <a-input v-decorator="[ 'telphone', validatorRules.telphone]" :readOnly="disableSubmit" /> + hasFeedback> + <a-input v-decorator="[ 'telphone', validatorRules.telphone]" :readOnly="disableSubmit"/> </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" /> + 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 {httpAction} from '@/api/manage' import pick from 'lodash.pick' import Vue from 'vue' - import { ACCESS_TOKEN } from "@/store/mutation-types" + import {ACCESS_TOKEN} from "@/store/mutation-types" export default { name: "JeecgOrderCustomerModal", - // 查询条件 - data () { + data() { return { - title:"操作", + title: "操作", visible: false, model: {}, labelCol: { - xs: { span: 24 }, - sm: { span: 5 }, + xs: {span: 24}, + sm: {span: 5}, }, wrapperCol: { - xs: { span: 24 }, - sm: { span: 16 }, + xs: {span: 24}, + sm: {span: 16}, }, // 表头 columns: [ { title: '客户名', - align:"center", + align: "center", dataIndex: 'name', }, { title: '性别', - align:"center", + align: "center", dataIndex: 'sex', }, { title: '身份证号码', - align:"center", + align: "center", dataIndex: 'idcard', }, { title: '身份证扫描件', - align:"center", + align: "center", dataIndex: 'idcardPic', }, { title: '电话', dataIndex: 'telphone', - align:"center", + align: "center", }, { title: '订单号码', dataIndex: 'orderId', - align:"center", + align: "center", }, { title: '创建人', dataIndex: 'createBy', - align:"center", + align: "center", }, { title: '创建时间', dataIndex: 'createTime', - align:"center", + align: "center", }, { title: '更新时间', dataIndex: 'updateBy', - align:"center", + align: "center", }, { title: '更新人', dataIndex: 'updateTime', - align:"center", + 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, + fileList: [], + disableSubmit: false, selectedRowKeys: [], - orderId:"", - hiding:false, - headers:{}, - picUrl:"", + orderId: "", + hiding: false, + headers: {}, + picUrl: "", previewVisible: false, previewImage: '', - addStatus:false, - editStatus:false, + 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", + fileUpload: window._CONFIG['domianURL'] + "/sys/common/upload", + imgerver: window._CONFIG['domianURL'] + "/sys/common/view", + getOrderCustomerList: "/test/order/listOrderCustomerByMainId", }, - validatorRules:{ - telphone:{rules: [{ validator:this.validateMobile}]}, - idcard:{rules:[{ validator:this.validateIdCard}]} + validatorRules: { + telphone: {rules: [{validator: this.validateMobile}]}, + idcard: {rules: [{validator: this.validateIdCard}]} }, } }, - computed:{ - uploadAction:function () { + computed: { + uploadAction: function () { return this.url.fileUpload; } }, - created () { + created() { const token = Vue.ls.get(ACCESS_TOKEN); - this.headers = {"X-Access-Token":token} + this.headers = {"X-Access-Token": token} }, methods: { - add (orderId) { + add(orderId) { this.hiding = true; - if(orderId){ + if (orderId) { this.orderId = orderId; - this.edit({},''); - }else{ + this.edit({orderId}, ''); + } else { this.$message.warning("请选择一个客户信息"); } }, - detail(record){ - this.edit(record,'d'); + detail(record) { + this.edit(record, 'd'); }, - edit (record,v) { + 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.orderId = record.orderId; + this.picUrl = record.idcardPic; this.model = Object.assign({}, record); - if(record.id){ + 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')) + this.form.setFieldsValue(pick(this.model, 'id', 'name', 'sex', 'idcard', 'idcardPic', 'telphone', 'orderId', 'createBy', 'createTime', 'updateBy', 'updateTime')) }); - }else{ + } 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 () { + close() { this.$emit('close'); this.visible = false; + this.picUrl = ""; + this.fileList=[]; }, - onSelectChange (selectedRowKeys,selectionRows) { - this.selectedRowKeys = selectedRowKeys; - console.log(selectionRows); - }, - handleOk () { + 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; - 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; + if (!this.model.id) { + httpurl += this.url.add; + method = 'post'; + } 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(); - }) } + let formData = Object.assign(this.model, values); + console.log(formData); + formData.orderId = this.orderId; + formData.idcardPic = this.picUrl; + 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(); }, - 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)){ + 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{ + } else { callback("您的手机号码格式不正确!"); } }, - validateIdCard(rule,value,callback){ - if (!value || new RegExp(/(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/).test(value)){ + validateIdCard(rule, value, callback) { + if (!value || new RegExp(/(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/).test(value)) { callback(); - }else{ + } else { callback("您的身份证号码格式不正确!"); } }, - handleChange (info) { + handleChange(info) { this.fileList = info.fileList; if (info.file.status === 'uploading') { return @@ -345,39 +297,43 @@ if (info.file.status === 'done') { var response = info.file.response; console.log(response); - if(response.success){ + if (response.success) { this.picUrl += response.message + ","; - }else{ + } else { this.$message.warning(response.message); } } }, - handlePicCancel () { + handlePicCancel() { this.previewVisible = false }, - handlePreview (file) { + handlePreview(file) { this.previewImage = file.url || file.thumbUrl this.previewVisible = true }, - getIdCardView(){ + getIdCardView() { let pics = this.model.idcardPic.split(","); - return this.url.imgerver +"/"+ pics[0]; + let pics_len = pics.length; + // 显示上传的最后一个图片 + return this.url.imgerver + "/" + pics[pics_len-2]; } - } + } } </script> <style scoped> /* tile uploaded pictures */ - .upload-list-inline >>> .ant-upload-list-item { + .upload-list-inline > > > .ant-upload-list-item { float: left; width: 200px; margin-right: 8px; } - .upload-list-inline >>> .ant-upload-animate-enter { + + .upload-list-inline > > > .ant-upload-animate-enter { animation-name: uploadAnimateInlineIn; } - .upload-list-inline >>> .ant-upload-animate-leave { + + .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 index 3e8bc08..a7dffd4 100644 --- a/ant-design-jeecg-vue/src/views/jeecg/tablist/form/JeecgOrderDMainModal.vue +++ b/ant-design-jeecg-vue/src/views/jeecg/tablist/form/JeecgOrderDMainModal.vue @@ -10,136 +10,50 @@ <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-item + :labelCol="labelCol" + :wrapperCol="wrapperCol" + label="订单号" + hasFeedback> + <a-input + placeholder="请输入订单号" + v-decorator="['orderCode', {rules: [{ required: true, message: '请输入订单号!' }]}]" + /> + </a-form-item> + <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-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-form-item + :labelCol="labelCol" + :wrapperCol="wrapperCol" + label="订单金额"> + <a-input-number style="width: 200px" v-decorator="[ 'orderMoney', {}]"/> + </a-form-item> + <a-form-item + :labelCol="labelCol" + :wrapperCol="wrapperCol" + label="订单备注"> + <a-input placeholder="请输入订单备注" v-decorator="['content', {}]"/> + </a-form-item> </a-form> </a-spin> </a-modal> </template> <script> - import { httpAction,getAction } from '@/api/manage' + import {httpAction} from '@/api/manage' import JDate from '@/components/jeecg/JDate' import pick from 'lodash.pick' import moment from "moment" @@ -149,77 +63,54 @@ components: { JDate }, - data () { + data() { return { - title:"操作", + title: "操作", visible: false, - orderMainModel: {jeecgOrderCustomerList: [{}], - jeecgOrderTicketList: [{}]}, + orderMainModel: { + jeecgOrderCustomerList: [{}], + jeecgOrderTicketList: [{}] + }, labelCol: { - xs: { span: 24 }, - sm: { span: 5 }, + xs: {span: 24}, + sm: {span: 5}, }, wrapperCol: { - xs: { span: 24 }, - sm: { span: 16 }, + xs: {span: 24}, + sm: {span: 16}, }, - confirmLoading: false, form: this.$form.createForm(this), - validatorRules:{ - }, + validatorRules: {}, url: { add: "/test/order/add", edit: "/test/order/edit", - orderCustomerList: "/test/order/queryOrderCustomerListByMainId", - orderTicketList: "/test/order/queryOrderTicketListByMainId", + orderCustomerList: "/test/order/listOrderCustomerByMainId", + orderTicketList: "/test/order/listOrderTicketByMainId", }, } }, - created () { - }, methods: { - add () { + add() { this.edit({}); }, - edit (record) { + 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}) //时间格式化 + 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 () { + close() { this.$emit('close'); this.visible = false; }, - handleOk () { + handleOk() { const that = this; // 触发表单验证 this.form.validateFields((err, values) => { @@ -227,60 +118,38 @@ that.confirmLoading = true; let httpurl = ''; let method = ''; - if(!this.orderMainModel.id){ - httpurl+=this.url.add; + if (!this.orderMainModel.id) { + httpurl += this.url.add; method = 'post'; - }else{ - httpurl+=this.url.edit; + } 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} + orderMainData.orderDate = orderMainData.orderDate ? orderMainData.orderDate.format('YYYY-MM-DD HH:mm:ss') : null; + let formData = { + ...orderMainData + } console.log(formData) - httpAction(httpurl,formData,method).then((res)=>{ - if(res.success){ + httpAction(httpurl, formData, method).then((res) => { + if (res.success) { that.$message.success(res.message); that.$emit('ok'); - }else{ + } else { that.$message.warning(res.message); } }).finally(() => { that.confirmLoading = false; that.close(); }) - } }) }, - handleCancel () { + 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> @@ -290,13 +159,16 @@ 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; 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 index 939df14..dfb0a80 100644 --- a/ant-design-jeecg-vue/src/views/jeecg/tablist/form/JeecgOrderTicketModal.vue +++ b/ant-design-jeecg-vue/src/views/jeecg/tablist/form/JeecgOrderTicketModal.vue @@ -16,14 +16,17 @@ :labelCol="labelCol" :wrapperCol="wrapperCol" label="航班号" - hasFeedback > - <a-input placeholder="请输入航班号" v-decorator="['ticketCode', {rules:[{ required: true,message: '请输入航班号!'}]}]" :readOnly="disableSubmit"/> + hasFeedback> + <a-input + placeholder="请输入航班号" + :readOnly="disableSubmit" + v-decorator="['ticketCode', {rules:[{ required: true,message: '请输入航班号!'}]}]"/> </a-form-item> <a-form-item :labelCol="labelCol" :wrapperCol="wrapperCol" label="航班时间" - hasFeedback > + hasFeedback> <j-date v-decorator="['tickectDate',{trigger:'input',rules:[{ required: true,message: '请输入航班号!'}]}]"></j-date> </a-form-item> <a-form-item @@ -32,7 +35,7 @@ label="订单号码" v-model="this.orderId" :hidden="hiding" - hasFeedback > + hasFeedback> <a-input v-decorator="[ 'orderId', {}]" disabled="disabled"/> </a-form-item> <a-form-item @@ -40,7 +43,7 @@ :wrapperCol="wrapperCol" label="创建人" :hidden="hiding" - hasFeedback > + hasFeedback> <a-input v-decorator="[ 'createBy', {}]" :readOnly="disableSubmit"/> </a-form-item> <a-form-item @@ -48,7 +51,7 @@ :wrapperCol="wrapperCol" label="创建时间" :hidden="hiding" - hasFeedback > + hasFeedback> <a-input v-decorator="[ 'createTime', {}]" :readOnly="disableSubmit"/> </a-form-item> </a-form> @@ -57,7 +60,7 @@ </template> <script> - import { httpAction } from '@/api/manage' + import {httpAction} from '@/api/manage' import pick from 'lodash.pick' import moment from 'moment' import JDate from '@/components/jeecg/JDate' @@ -66,80 +69,71 @@ components: { JDate }, - name: "JeecgOrderTicketModal", - data () { + name: 'JeecgOrderTicketModal', + data() { return { - title:"操作", + title: '操作', visible: false, model: {}, labelCol: { - xs: { span: 24 }, - sm: { span: 5 }, + xs: {span: 24}, + sm: {span: 5} }, wrapperCol: { - xs: { span: 24 }, - sm: { span: 16 }, + xs: {span: 24}, + sm: {span: 16} }, moment, - format:"YYYY-MM-DD HH:mm:ss", + format: 'YYYY-MM-DD HH:mm:ss', disableSubmit: false, - orderId:"", + orderId: '', hiding: false, confirmLoading: false, form: this.$form.createForm(this), - validatorRules:{ - }, + validatorRules: {}, url: { - add: "/test/order/addTicket", - edit: "/test/order/editTicket", - }, + add: '/test/order/addTicket', + edit: '/test/order/editTicket' + } } }, - created () { + created() { }, methods: { - add (orderId) { - if(orderId){ - this.orderId = orderId; - this.edit({},''); - }else{ - this.$message.warning("请选择一条航班数据"); + add(orderId) { + if (orderId) { + this.edit({orderId}, '') + } else { + this.$message.warning('请选择一条航班数据') } }, - detail(record){ - this.edit(record,'d'); + detail(record) { + this.edit(record, 'd') }, - edit (record,v) { - if(v == 'e'){ + edit(record, v) { + if (v == 'e') { this.hiding = false; this.disableSubmit = false; - }else if(v == 'd'){ + } else if (v == 'd') { this.hiding = false; this.disableSubmit = true; - }else{ + } else { this.hiding = true; this.disableSubmit = false; } this.form.resetFields(); + this.orderId = record.orderId; 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); + this.form.setFieldsValue(pick(this.model, 'ticketCode', 'tickectDate', 'orderId', 'createBy', 'createTime', 'updateBy', 'updateTime')) + }) }, - close () { + close() { this.$emit('close'); this.visible = false; }, - handleOk () { + handleOk() { const that = this; // 触发表单验证 this.form.validateFields((err, values) => { @@ -147,22 +141,20 @@ that.confirmLoading = true; let httpurl = ''; let method = ''; - if(!this.model.id){ - httpurl+=this.url.add; + if (!this.model.id) { + httpurl += this.url.add; method = 'post'; - }else{ - httpurl+=this.url.edit; + } 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){ + formData.mainId = this.orderId; + httpAction(httpurl, formData, method).then((res) => { + if (res.success) { that.$message.success(res.message); - that.$emit('ok'); - }else{ + that.$emit('ok') + } else { that.$message.warning(res.message); } }).finally(() => { @@ -172,9 +164,9 @@ } }) }, - handleCancel () { + handleCancel() { this.close() - }, + } } } </script> diff --git a/ant-design-jeecg-vue/src/views/modules/message/SysMessageList.vue b/ant-design-jeecg-vue/src/views/modules/message/SysMessageList.vue new file mode 100644 index 0000000..f181af2 --- /dev/null +++ b/ant-design-jeecg-vue/src/views/modules/message/SysMessageList.vue @@ -0,0 +1,261 @@ +<template> + <a-card :bordered="false"> + + <!-- 查询区域 --> + <div class="table-page-search-wrapper"> + <a-form layout="inline"> + <a-row :gutter="24"> + <a-col :md="6" :sm="8"> + <a-form-item label="推送标题"> + <a-input placeholder="请输入推送标题" v-model="queryParam.esTitle"></a-input> + </a-form-item> + </a-col> + <a-col :md="6" :sm="8"> + <a-form-item label="推送内容"> + <a-input placeholder="请输入推送内容" v-model="queryParam.esContent"></a-input> + </a-form-item> + </a-col> + <template v-if="toggleSearchStatus"> + <a-col :md="6" :sm="8"> + <a-form-item label="接收人"> + <a-input placeholder="请输入接收人" v-model="queryParam.esReceiver"></a-input> + </a-form-item> + </a-col> + </template> + <a-col :md="6" :sm="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> + <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" v-show="show" type="primary" icon="plus">新增</a-button> + <a-button type="primary" v-show="show" icon="download" @click="handleExportXls">导出</a-button> + <a-upload v-show="show" name="file" :showUploadList="false" :multiple="false" :action="importExcelUrl" + @change="handleImportExcel"> + <a-button type="primary" icon="import">导入</a-button> + </a-upload> + <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="esContent" slot-scope="text"> + <j-ellipsis :value="text" :length="10" /> + </span> + + <span slot="action" slot-scope="text, record"> + <a v-show="show" @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 --> + + <!-- 表单区域 --> + <sysMessage-modal ref="modalForm" @ok="modalFormOk"></sysMessage-modal> + </a-card> +</template> + +<script> + import SysMessageModal from './modules/SysMessageModal' + import {JeecgListMixin} from '@/mixins/JeecgListMixin' + import JEllipsis from "@/components/jeecg/JEllipsis"; + + export default { + name: "SysMessageList", + mixins: [JeecgListMixin], + components: { + JEllipsis, + SysMessageModal + }, + data() { + return { + description: '消息管理页面', + // 新增修改按钮是否显示 + show: false, + // 表头 + columns: [ + { + title: '#', + dataIndex: '', + key: 'rowIndex', + width: 60, + align: "center", + customRender: function (t, r, index) { + return parseInt(index) + 1; + } + }, + { + title: '消息标题', + align: "center", + dataIndex: 'esTitle' + }, + { + title: '发送内容', + align: "center", + dataIndex: 'esContent', + scopedSlots: {customRender: 'esContent'}, + }, + { + title: '接收人', + align: "center", + dataIndex: 'esReceiver' + }, + { + title: '发送次数', + align: "center", + dataIndex: 'esSendNum' + }, + { + title: '发送状态', + align: "center", + dataIndex: 'esSendStatus', + customRender: function (text) { + if(text=='0') { + return "未发送"; + } + if(text=='1') { + return "发送成功"; + } + if(text=='2') { + return "发送失败"; + } + } + }, + { + title: '发送时间', + align: "center", + dataIndex: 'esSendTime' + }, + { + title: '发送方式', + align: "center", + dataIndex: 'esType', + customRender: function (text) { + if(text=='1') { + return "短信"; + } + if(text=='2') { + return "邮件"; + } + if(text=='3') { + return "微信"; + } + } + }, + { + title: '操作', + dataIndex: 'action', + align: "center", + scopedSlots: {customRender: 'action'}, + } + ], + url: { + list: "/message/sysMessage/list", + delete: "/message/sysMessage/delete", + deleteBatch: "/message/sysMessage/deleteBatch", + exportXlsUrl: "message/sysMessage/exportXls", + importExcelUrl: "message/sysMessage/importExcel", + }, + } + }, + computed: { + importExcelUrl: function () { + return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`; + } + }, + methods: {} + } +</script> +<style lang="less" scoped> + /** Button按钮间距 */ + .ant-btn { + margin-left: 3px + } + + .ant-card-body .table-operator { + margin-bottom: 18px; + } + + .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/modules/message/SysMessageTemplateList.vue b/ant-design-jeecg-vue/src/views/modules/message/SysMessageTemplateList.vue new file mode 100644 index 0000000..7fd2612 --- /dev/null +++ b/ant-design-jeecg-vue/src/views/modules/message/SysMessageTemplateList.vue @@ -0,0 +1,250 @@ +<template> + <a-card :bordered="false"> + + <!-- 查询区域 --> + <div class="table-page-search-wrapper"> + <a-form layout="inline"> + <a-row :gutter="24"> + + <a-col :md="6" :sm="8"> + <a-form-item label="模板CODE"> + <a-input placeholder="请输入模板CODE" v-model="queryParam.templateCode"></a-input> + </a-form-item> + </a-col> + <a-col :md="6" :sm="8"> + <a-form-item label="模板内容"> + <a-input placeholder="请输入模板内容" v-model="queryParam.templateContent"></a-input> + </a-form-item> + </a-col> + <template v-if="toggleSearchStatus"> + <a-col :md="6" :sm="8"> + <a-form-item label="模板标题"> + <a-input placeholder="请输入模板标题" v-model="queryParam.templateName"></a-input> + </a-form-item> + </a-col> + <a-col :md="6" :sm="8"> + <a-form-item label="模板类型"> + <a-input placeholder="请输入模板类型" v-model="queryParam.templateType"></a-input> + </a-form-item> + </a-col> + </template> + <a-col :md="6" :sm="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> + <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 type="primary" icon="download" @click="handleExportXls">导出</a-button> + <a-upload name="file" :showUploadList="false" :multiple="false" :action="importExcelUrl" + @change="handleImportExcel"> + <a-button type="primary" icon="import">导入</a-button> + </a-upload> + <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="templateContent" slot-scope="text"> + <j-ellipsis :value="text" :length="25" /> + </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-popconfirm title="确定删除吗?" @confirm="() => handleDelete(record.id)"> + <a>删除</a> + </a-popconfirm> + </a-menu-item> + <a-menu-item> + <a @click="handleTest(record)">发送测试</a> + </a-menu-item> + </a-menu> + </a-dropdown> + </span> + + </a-table> + </div> + <!-- table区域-end --> + + <!-- 表单区域 --> + <sysMessageTemplate-modal ref="modalForm" @ok="modalFormOk"></sysMessageTemplate-modal> + + <sysMessageTest-modal ref="testModal"></sysMessageTest-modal> + </a-card> +</template> + +<script> + import SysMessageTemplateModal from './modules/SysMessageTemplateModal' + import SysMessageTestModal from './modules/SysMessageTestModal' + import {JeecgListMixin} from '@/mixins/JeecgListMixin' + import JEllipsis from "@/components/jeecg/JEllipsis"; + + export default { + name: "SysMessageTemplateList", + mixins: [JeecgListMixin], + components: { + JEllipsis, + SysMessageTemplateModal, + SysMessageTestModal + }, + data() { + return { + description: '消息模板管理页面', + // 表头 + columns: [ + { + title: '#', + dataIndex: '', + key: 'rowIndex', + width: 60, + align: "center", + customRender: function (t, r, index) { + return parseInt(index) + 1; + } + }, + { + title: '模板CODE', + align: "center", + dataIndex: 'templateCode' + }, + { + title: '模板标题', + align: "center", + dataIndex: 'templateName' + }, + { + title: '模板内容', + align: "center", + dataIndex: 'templateContent', + scopedSlots: {customRender: 'templateContent'}, + }, + { + title: '模板类型', + align: "center", + dataIndex: 'templateType', + customRender: function (text) { + if(text=='1') { + return "短信"; + } + if(text=='2') { + return "邮件"; + } + if(text=='3') { + return "微信"; + } + } + }, + { + title: '操作', + dataIndex: 'action', + align: "center", + scopedSlots: {customRender: 'action'}, + } + ], + url: { + list: "/message/sysMessageTemplate/list", + delete: "/message/sysMessageTemplate/delete", + deleteBatch: "/message/sysMessageTemplate/deleteBatch", + exportXlsUrl: "message/sysMessageTemplate/exportXls", + importExcelUrl: "message/sysMessageTemplate/importExcel", + }, + } + }, + computed: { + importExcelUrl: function () { + return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`; + } + }, + methods: { + handleTest(record){ + this.$refs.testModal.open(record); + this.$refs.testModal.title = "发送测试"; + } + + } + } +</script> +<style lang="less" scoped> + /** Button按钮间距 */ + .ant-btn { + margin-left: 3px + } + + .ant-card-body .table-operator { + margin-bottom: 18px; + } + + .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/modules/message/modules/SysMessageModal.vue b/ant-design-jeecg-vue/src/views/modules/message/modules/SysMessageModal.vue new file mode 100644 index 0000000..f2fb690 --- /dev/null +++ b/ant-design-jeecg-vue/src/views/modules/message/modules/SysMessageModal.vue @@ -0,0 +1,184 @@ +<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-spin :spinning="confirmLoading"> + <a-form :form="form"> + + <a-form-item + :labelCol="labelCol" + :wrapperCol="wrapperCol" + label="消息标题"> + <a-input placeholder="请输入消息标题" v-decorator="['esTitle', {}]"/> + </a-form-item> + <a-form-item + :labelCol="labelCol" + :wrapperCol="wrapperCol" + label="发送内容"> + <a-input placeholder="请输入发送内容" v-decorator="['esContent', {}]"/> + </a-form-item> + <a-form-item + :labelCol="labelCol" + :wrapperCol="wrapperCol" + label="发送所需参数"> + <a-input placeholder="请输入发送所需参数Json格式" v-decorator="['esParam', {}]"/> + </a-form-item> + <a-form-item + :labelCol="labelCol" + :wrapperCol="wrapperCol" + label="接收人"> + <a-input placeholder="请输入接收人" v-decorator="['esReceiver', {}]"/> + </a-form-item> + <a-form-item + :labelCol="labelCol" + :wrapperCol="wrapperCol" + label="发送方式"> + <j-dict-select-tag :triggerChange="true" dictCode="msgType" v-decorator="[ 'esType', {}]" placeholder="请选择发送方式"> + </j-dict-select-tag> + </a-form-item> + <a-form-item + :labelCol="labelCol" + :wrapperCol="wrapperCol" + label="发送时间"> + <a-date-picker showTime format='YYYY-MM-DD HH:mm:ss' v-decorator="[ 'esSendTime', {}]"/> + </a-form-item> + <a-form-item + :labelCol="labelCol" + :wrapperCol="wrapperCol" + label="发送状态"> + <j-dict-select-tag :triggerChange="true" dictCode="msgSendStatus" v-decorator="[ 'esSendStatus', {}]" placeholder="请选择发送状态"> + </j-dict-select-tag> + </a-form-item> + <a-form-item + :labelCol="labelCol" + :wrapperCol="wrapperCol" + label="发送次数"> + <a-input-number v-decorator="[ 'esSendNum', {}]"/> + </a-form-item> + <a-form-item + :labelCol="labelCol" + :wrapperCol="wrapperCol" + label="发送失败原因"> + <a-input v-decorator="['esResult', {}]"/> + </a-form-item> + <a-form-item + :labelCol="labelCol" + :wrapperCol="wrapperCol" + label="备注"> + <a-input v-decorator="['remark', {}]"/> + </a-form-item> + </a-form> + </a-spin> + <div v-show="!disableSubmit"> + <a-button style="margin-right: .8rem" @confirm="handleCancel">取消</a-button> + <a-button @click="handleOk" type="primary" :loading="confirmLoading">提交</a-button> + </div> + </a-drawer> +</template> + +<script> + import {httpAction} from '@/api/manage' + import pick from 'lodash.pick' + import moment from "moment" + + export default { + name: "SysMessageModal", + 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: "/message/sysMessage/add", + edit: "/message/sysMessage/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, 'esContent', 'esParam', 'esReceiver', 'esResult', 'esSendNum', 'esSendStatus', 'esTitle', 'esType', 'remark')) + //时间格式化 + this.form.setFieldsValue({esSendTime: this.model.esSendTime ? moment(this.model.esSendTime) : 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.esSendTime = formData.esSendTime ? formData.esSendTime.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() + }, + + + } + } +</script> + +<style scoped> + +</style> \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/views/modules/message/modules/SysMessageTemplateModal.vue b/ant-design-jeecg-vue/src/views/modules/message/modules/SysMessageTemplateModal.vue new file mode 100644 index 0000000..5f2fc2c --- /dev/null +++ b/ant-design-jeecg-vue/src/views/modules/message/modules/SysMessageTemplateModal.vue @@ -0,0 +1,156 @@ +<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="模板CODE"> + <a-input + :disabled="disable" + v-decorator="['templateCode', {} ]" + /> + </a-form-item> + <a-form-item + :labelCol="labelCol" + :wrapperCol="wrapperCol" + label="模板标题"> + <a-input + placeholder="请输入模板标题" + v-decorator="['templateName', validatorRules.templateName]" + /> + </a-form-item> + <a-form-item + :labelCol="labelCol" + :wrapperCol="wrapperCol" + label="模板内容"> + <a-textarea + placeholder="请输入模板内容" + v-decorator="['templateContent', validatorRules.templateContent ]" + :autosize="{ minRows: 8, maxRows: 8 }" + /> + </a-form-item> + <a-form-item + :labelCol="labelCol" + :wrapperCol="wrapperCol" + label="模板类型"> + <j-dict-select-tag :triggerChange="true" dictCode="msgType" v-decorator="['templateType', validatorRules.templateType ]" placeholder="请选择模板类型"> + </j-dict-select-tag> + </a-form-item> + </a-form> + </a-spin> + </a-modal> +</template> + +<script> + import {httpAction} from '@/api/manage' + import pick from 'lodash.pick' + + export default { + name: "SysMessageTemplateModal", + data() { + return { + title: "操作", + visible: false, + disable: true, + model: {}, + labelCol: { + xs: {span: 24}, + sm: {span: 5}, + }, + wrapperCol: { + xs: {span: 24}, + sm: {span: 16}, + }, + confirmLoading: false, + form: this.$form.createForm(this), + validatorRules: { + templateName: {rules: [{required: true, message: '请输入模板标题!'}]}, + templateContent: {rules: [{required: true, message: '请输入模板内容!'}]}, + templateType: {rules: [{required: true, message: '请输入模板类型!'}]}, + }, + url: { + add: "/message/sysMessageTemplate/add", + edit: "/message/sysMessageTemplate/edit", + }, + } + }, + created() { + }, + methods: { + add() { + this.disable = false; + this.edit({}); + }, + edit(record) { + this.form.resetFields(); + this.model = Object.assign({}, record); + this.visible = true; + this.$nextTick(() => { + this.form.setFieldsValue(pick(this.model, 'templateCode', 'templateContent', 'templateName', 'templateTestJson', 'templateType')) + //时间格式化 + }); + + }, + close() { + this.$emit('close'); + this.visible = false; + this.disable = true; + }, + handleOk() { + this.model.templateType = this.templateType; + 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/modules/message/modules/SysMessageTestModal.vue b/ant-design-jeecg-vue/src/views/modules/message/modules/SysMessageTestModal.vue new file mode 100644 index 0000000..77cc36f --- /dev/null +++ b/ant-design-jeecg-vue/src/views/modules/message/modules/SysMessageTestModal.vue @@ -0,0 +1,122 @@ +<template> + <a-modal + :title="title" + :width="800" + :visible="visible" + :confirmLoading="confirmLoading" + @ok="handleOk" + @cancel="handleCancel" + cancelText="关闭"> + + <a-spin :spinning="confirmLoading"> + <a-form> + <a-form-item + :labelCol="labelCol" + :wrapperCol="wrapperCol" + label="模板标题"> + <a-input disabled v-model="templateName"/> + </a-form-item> + <a-form-item + :labelCol="labelCol" + :wrapperCol="wrapperCol" + label="模板内容"> + <a-textarea disabled v-model="templateContent" :autosize="{ minRows: 5, maxRows: 8 }"/> + </a-form-item> + <a-form-item + :labelCol="labelCol" + :wrapperCol="wrapperCol" + label="测试数据"> + <a-textarea placeholder="请输入json格式测试数据" v-model="testData" :autosize="{ minRows: 5, maxRows: 8 }"/> + </a-form-item> + <a-form-item + :labelCol="labelCol" + :wrapperCol="wrapperCol" + label="消息类型"> + <j-dict-select-tag + v-model="msgType" + placeholder="请选择消息类型" + dictCode="msgType"/> + </a-form-item> + <a-form-item + :labelCol="labelCol" + :wrapperCol="wrapperCol" + label="消息接收方"> + <a-input placeholder="请输入消息接收方" v-model="receiver"/> + </a-form-item> + </a-form> + </a-spin> + </a-modal> +</template> + +<script> + import {httpAction} from '@/api/manage' + + export default { + name: "SysMessageTestModal", + data() { + return { + title: "操作", + visible: false, + model: {}, + labelCol: { + xs: {span: 24}, + sm: {span: 5}, + }, + wrapperCol: { + xs: {span: 24}, + sm: {span: 16}, + }, + + confirmLoading: false, + url: { + send: "/message/sysMessageTemplate/sendMsg", + }, + templateName: "", + templateContent: "", + receiver: "", + msgType: "", + testData: "", + sendParams: {} + } + }, + methods: { + open(record) { + this.sendParams.templateCode = record.templateCode; + this.templateName = record.templateName; + this.templateContent = record.templateContent; + this.testData = record.templateTestJson; + this.visible = true; + }, + close() { + this.receiver = ""; + this.msgType = ""; + this.sendParams = {}; + this.visible = false; + }, + handleOk() { + let httpurl = this.url.send; + let method = 'post'; + this.sendParams.testData = this.testData; + this.sendParams.receiver = this.receiver; + this.sendParams.msgType = this.msgType; + httpAction(httpurl, this.sendParams, method).then((res) => { + if (res.success) { + this.$message.success(res.message); + } else { + this.$message.warning(res.message); + } + }).finally(() => { + this.confirmLoading = false; + this.close(); + }) + }, + handleCancel() { + this.close() + }, + } + } +</script> + +<style scoped> + +</style> \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/views/modules/online/cgreport/OnlCgreportHeadList.vue b/ant-design-jeecg-vue/src/views/modules/online/cgreport/OnlCgreportHeadList.vue new file mode 100644 index 0000000..30cca51 --- /dev/null +++ b/ant-design-jeecg-vue/src/views/modules/online/cgreport/OnlCgreportHeadList.vue @@ -0,0 +1,218 @@ +<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.code"></a-input> + </a-form-item> + </a-col> + <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="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 @click="popReportURL(record.id)"> + 配置地址 + </a-menu-item> + <a-menu-item> + <a @click="goPageOnline(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 --> + + <!-- 表单区域 --> + <onlCgreportHead-modal ref="modalForm" @ok="modalFormOk"></onlCgreportHead-modal> + + <!-- 提示online报表链接 --> + <a-modal + title="报表访问链接" + :visible="visible" + @cancel="handleCancel"> + <p>{{ reportUrlText }}</p> + </a-modal> + </a-card> +</template> + +<script> + import OnlCgreportHeadModal from './modules/OnlCgreportHeadModal' + import {JeecgListMixin} from '@/mixins/JeecgListMixin' + + export default { + name: 'OnlCgreportHeadList', + mixins: [JeecgListMixin], + components: { + OnlCgreportHeadModal + }, + data() { + return { + description: '在线报表配置管理页面', + visible:false, + reportUrlText:'', + // 表头 + columns: [ + { + title: '报表名称', + align: 'center', + dataIndex: 'name' + }, + { + title: '编码', + align: 'center', + dataIndex: 'code' + }, + { + title: '查询SQL', + align: 'center', + dataIndex: 'cgrSql' + }, + { + title: '数据源', + align: 'center', + dataIndex: 'dbSource' + }, + { + title: '创建时间', + align: 'center', + dataIndex: 'createTime' + }, + { + title: '描述', + align: 'center', + dataIndex: 'content' + }, + { + title: '操作', + dataIndex: 'action', + align: 'center', + scopedSlots: { customRender: 'action' } + } + ], + url: { + list: '/online/cgreport/head/list', + delete: '/online/cgreport/head/delete', + deleteBatch: '/online/cgreport/head/deleteBatch' + } + } + }, + methods: { + goPageOnline(id){ + this.$router.push({path: '/online/cgreport/'+id}) + }, + popReportURL(id){ + this.visible = true; + this.reportUrlText = `/online/cgreport/${id}`; + }, + handleCancel(){ + this.visible = false + this.reportUrlText = null; + } + } + } +</script> +<style lang="less" scoped> + .ant-card-body .table-operator { + margin-bottom: 18px; + } + + .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/modules/online/cgreport/auto/OnlCgreportAutoList.vue b/ant-design-jeecg-vue/src/views/modules/online/cgreport/auto/OnlCgreportAutoList.vue new file mode 100644 index 0000000..95ddc2c --- /dev/null +++ b/ant-design-jeecg-vue/src/views/modules/online/cgreport/auto/OnlCgreportAutoList.vue @@ -0,0 +1,208 @@ +<template> + <a-card :bordered="false" style="height: 100%"> + + <div class="table-page-search-wrapper"> + <a-form layout="inline"> + <a-row :gutter="24" v-if="queryInfo && queryInfo.length>0"> + <template v-for="(item,index) in queryInfo"> + <template v-if=" item.hidden==='1' "> + <a-col :md="6" :sm="8" :key=" 'query'+index " v-show="toggleSearchStatus"> + <onl-cgreport-query-form-item :queryParam="queryParam" :item="item" :dictOptions="dictOptions"></onl-cgreport-query-form-item> + </a-col> + </template> + <template v-else> + <a-col :md="6" :sm="8" :key=" 'query'+index "> + <onl-cgreport-query-form-item :queryParam="queryParam" :item="item" :dictOptions="dictOptions"></onl-cgreport-query-form-item> + </a-col> + </template> + </template> + + <a-col :md="6" :sm="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> + <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" style="margin-bottom: 10px"> + <a-button type="primary" icon="plus" @click="exportExcel">导出</a-button> + </div> + + + <a-table + ref="table" + size="middle" + bordered + rowKey="id" + :columns="table.columns" + :dataSource="table.dataSource" + :pagination="table.pagination" + :loading="table.loading" + :rowSelection="{selectedRowKeys: table.selectedRowKeys, onChange: handleChangeInTableSelect}" + @change="handleChangeInTable" + style="min-height: 300px" + > + + </a-table> + + </a-card> +</template> + +<script> + import {getAction} from '@/api/manage' + import OnlCgreportQueryFormItem from './OnlCgreportQueryFormItem.vue'; + import {filterObj} from '@/utils/util'; + + export default { + name: 'OnlCgreportAutoList', + components: { + OnlCgreportQueryFormItem + }, + data() { + return { + // 查询参数 + queryInfo: [], + queryParam: {}, + sorter: { + column: 'createTime', + order: 'desc', + }, + dictOptions: {}, + toggleSearchStatus: false, // 高级搜索 展开/关闭 + reportCode: '', + description: '在线报表功能测试页面', + url: { + getColumns: '/online/cgreport/api/getColumns/', + getData: '/online/cgreport/api/getData/', + getQueryInfo: '/online/cgreport/api/getQueryInfo/' + }, + table: { + loading: true, + // 表头 + columns: [], + //数据集 + dataSource: [], + // 选择器 + selectedRowKeys: [], + selectionRows: [], + // 分页参数 + pagination: { + current: 1, + pageSize: 10, + pageSizeOptions: ['10', '20', '30'], + showTotal: (total, range) => { + return range[0] + '-' + range[1] + ' 共' + total + '条' + }, + showQuickJumper: true, + showSizeChanger: true, + total: 0 + } + } + } + }, + mounted() { + this.loadData() + this.initQueryInfo(); + }, + watch: { + '$route'(to, from) { + // 刷新参数放到这里去触发,就可以刷新相同界面了 + this.loadData() + this.initQueryInfo(); + } + }, + methods: { + initQueryInfo() { + getAction(`${this.url.getQueryInfo}${this.reportCode}`).then((res) => { + console.log("获取查询条件", res); + if (res.success) { + this.queryInfo = res.result + } else { + this.$message.warning(res.message) + } + }) + }, + loadData(arg) { + if (arg == 1) { + this.table.pagination.current = 1 + } + let params = this.getQueryParams();//查询条件 + console.log(params) + + //获取报表ID + this.reportCode = this.$route.params.code; + console.log(' 动态报表 reportCode : ' + this.reportCode); + this.table.loading = true + Promise.all([ + getAction(`${this.url.getColumns}${this.reportCode}`), + getAction(`${this.url.getData}${this.reportCode}`, params) + ]).then(results => { + let [{result: {columns}}, {result: data}] = results + this.table.columns = columns + if (data) { + this.table.pagination.total = Number(data.total) + this.table.dataSource = data.records + } else { + this.table.pagination.total = 0 + this.table.dataSource = [] + } + }).catch((e) => { + console.error(e) + this.$message.error('查询失败') + }).then(() => { + this.table.loading = false + }) + }, + getQueryParams() { + let param = Object.assign({}, this.queryParam, this.sorter); + param.pageNo = this.table.pagination.current; + param.pageSize = this.table.pagination.pageSize; + return filterObj(param); + }, + searchByQuery() { + this.loadData(1); + }, + searchReset() { + this.queryParam = {} + this.loadData(1); + }, + handleToggleSearch() { + this.toggleSearchStatus = !this.toggleSearchStatus; + }, + exportExcel() { + let url = `${window._CONFIG['domianURL']}/online/cgreport/api/exportXls/${this.reportCode}`; + window.location.href = url; + }, + handleChangeInTableSelect(selectedRowKeys, selectionRows) { + this.table.selectedRowKeys = selectedRowKeys + this.table.selectionRows = selectionRows + }, + handleChangeInTable(pagination, filters, sorter) { + //分页、排序、筛选变化时触发 + if (Object.keys(sorter).length > 0) { + this.sorter.column = sorter.field + this.sorter.order = 'ascend' == sorter.order ? 'asc' : 'desc' + } + this.table.pagination = pagination + this.loadData() + } + + } + } +</script> +<style scoped> + .div { + display: flex; + align-items: center; + height: 500px + } + +</style> \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/views/modules/online/cgreport/auto/OnlCgreportQueryFormItem.vue b/ant-design-jeecg-vue/src/views/modules/online/cgreport/auto/OnlCgreportQueryFormItem.vue new file mode 100644 index 0000000..c76fd93 --- /dev/null +++ b/ant-design-jeecg-vue/src/views/modules/online/cgreport/auto/OnlCgreportQueryFormItem.vue @@ -0,0 +1,91 @@ +<template> + <a-form-item v-if="item.view=='date'" :label="item.label"> + <template v-if="single_mode===item.mode"> + <j-date :placeholder=" '请选择'+item.label " v-model="queryParam[item.field]"></j-date> + </template> + <template v-else> + <j-date placeholder="请选择开始日期" v-model="queryParam[item.field+'_begin']" style="width:calc(50% - 15px);"></j-date> + <span class="group-query-strig">~</span> + <j-date placeholder="请选择结束日期" v-model="queryParam[item.field+'_end']" style="width:calc(50% - 15px);"></j-date> + </template> + </a-form-item> + + <a-form-item v-else-if="item.view=='datetime'" :label="item.label"> + <template v-if="single_mode===item.mode"> + <j-date :placeholder=" '请选择'+item.label " :show-time="true" date-format="YYYY-MM-DD HH:mm:ss" v-model="queryParam[item.field]"></j-date> + </template> + <template v-else> + <j-date placeholder="请选择开始时间" :show-time="true" date-format="YYYY-MM-DD HH:mm:ss" v-model="queryParam[item.field+'_begin']" style="width:calc(50% - 15px);"></j-date> + <span class="group-query-strig">~</span> + <j-date placeholder="请选择开始时间" :show-time="true" date-format="YYYY-MM-DD HH:mm:ss" v-model="queryParam[item.field+'_end']" style="width:calc(50% - 15px);"></j-date> + </template> + </a-form-item> + + <a-form-item v-else-if=" item.view=='list' || item.view=='radio' " :label="item.label"> + <a-select :placeholder=" '请选择'+item.label " v-model="queryParam[item.field]"> + <a-select-option + v-for="(op,opIndex) in dictOptions[item.field]" + :key="opIndex" + :value="op.value"> + {{ op.text }} + </a-select-option> + </a-select> + </a-form-item> + + <a-form-item v-else-if=" item.view=='checkbox'" :label="item.label"> + <j-select-multiple :placeholder=" '请选择'+item.label " :options="dictOptions[item.field]" v-model="queryParam[item.field]"></j-select-multiple> + </a-form-item> + + <a-form-item v-else :label="item.label"> + <template v-if="single_mode===item.mode"> + <a-input :placeholder=" '请输入'+item.label " v-model="queryParam[item.field]"></a-input> + </template> + <template v-else> + <a-input :placeholder=" '请输入开始'+item.label " v-model="queryParam[item.field+'_begin']" style="width:calc(50% - 15px);"></a-input> + <span class="group-query-strig">~</span> + <a-input :placeholder=" '请输入结束'+item.label " v-model="queryParam[item.field+'_end']" style="width:calc(50% - 15px);"></a-input> + </template> + </a-form-item> + +</template> + +<script> + import JDate from '@/components/jeecg/JDate.vue' + import JSelectMultiple from '@/components/jeecg/JSelectMultiple.vue'; + + export default { + name: 'OnlineQueryFormItem', + props:{ + item:{ + type:Object, + default:()=>{}, + required:true + }, + dictOptions:{ + type:Object, + default:()=>{}, + required:true + }, + queryParam:{ + type:Object, + default:()=>{}, + required:true + } + }, + components:{ + JDate, + JSelectMultiple + }, + data(){ + return { + single_mode:"single" + } + }, + } +</script> + +<style scoped> + .group-query-strig{ + width:30px;text-align: center;display: inline-block; + } +</style> \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/views/modules/online/cgreport/modules/OnlCgreportHeadModal.vue b/ant-design-jeecg-vue/src/views/modules/online/cgreport/modules/OnlCgreportHeadModal.vue new file mode 100644 index 0000000..508ec02 --- /dev/null +++ b/ant-design-jeecg-vue/src/views/modules/online/cgreport/modules/OnlCgreportHeadModal.vue @@ -0,0 +1,562 @@ +<template> + <a-modal + :title="title" + :width="1200" + :visible="visible" + :confirmLoading="confirmLoading" + :destroyOnClose="true" + :maskClosable="false" + cancelText="关闭" + style="top: 40px;" + @ok="handleOk" + @cancel="handleCancel" + + > + + <a-spin :spinning="confirmLoading"> + <a-form :form="form" layout="inline"> + <a-list> + <!-- 编码、名称、数据源 --> + <a-row :gutter="gutter" style="width: 100%;"> + <a-col :span="7"> + <a-form-item + style="width: 100%" + :labelCol="threeCol.label" + :wrapperCol="threeCol.wrapper" + label="编码" + > + <a-input placeholder="请输入编码" v-decorator="['code', validatorRules.code ]"/> + </a-form-item> + </a-col> + + + <a-col :span="8"> + <a-form-item + style="width: 100%" + :labelCol="threeCol.label" + :wrapperCol="threeCol.wrapper" + label="名称" + > + <a-input placeholder="请输入名称" v-decorator="['name', validatorRules.name ]"/> + </a-form-item> + + </a-col> + <a-col :span="8"> + <a-form-item + style="width: 100%" + :labelCol="threeCol.label" + :wrapperCol="threeCol.wrapper" + > + <!--label="数据源"--> + + <!--<a-select width="100%" style="width: 100%;" v-decorator="['dbSource', validatorRules.name ]">--> + <!--<a-select-option value="0">请选择</a-select-option>--> + <!--<a-select-option value="SAP_DB">SAP_DB</a-select-option>--> + <!--<a-select-option value="jeewx-yunying">jeewx-yunying</a-select-option>--> + <!--</a-select>--> + + </a-form-item> + </a-col> + </a-row> + <!-- 查询SQL --> + <a-row :gutter="gutter" style="width: 100%;"> + <a-col :span="20"> + <a-form-item + style="width: 100%" + :labelCol="oneCol.label" + :wrapperCol="oneCol.wrapper" + label="报表SQL"> + <a-textarea + rows="3" + placeholder="请输入查询SQL" + v-decorator="['cgrSql', validatorRules.cgrSql ]"> + + <!-- --- [ fix warning;by:sunjianlei;date:2019-03-24;for: Warning: `getFieldDecorator` will override `value`, so please don't set `value and v-model` directly and use `setFieldsValue` to set it. ]--- --> + <!-- v-model="reportSql" --> + <!-- --- [ fix warning;by:sunjianlei;date:2019-03-24;for: Warning: `getFieldDecorator` will override `value`, so please don't set `value and v-model` directly and use `setFieldsValue` to set it. ]--- --> + + </a-textarea> + </a-form-item> + </a-col> + <a-col :span="4"> + <a-popover title="使用指南" trigger="hover"> + <template slot="content"> + 您可以键入“”作为一个参数,这里abc是参数的名称。例如:<br> + select * from table where id = ${abc}。<br> + select * from table where id like concat('%',${abc},'%')。(mysql模糊查询)<br> + select * from table where id like '%'||${abc}||'%'。(oracle模糊查询)<br> + select * from table where id like '%'+${abc}+'%'。(sqlserver模糊查询)<br> + <span style="color: red;">注:参数只支持动态报表,popup暂不支持</span> + </template> + <a-icon type="question-circle"/> + </a-popover> + <a-button type="primary" @click="handleSQLAnalyze">SQL解析</a-button> + </a-col> + </a-row> + <a-divider style="margin-bottom: 1px"/> + <!-- 描述 --> + <a-list-item style="display: none"> + <a-row :gutter="gutter" style="width: 100%;;"> + <a-col :span="24"> + <a-form-item + style="width: 100%" + :labelCol="oneCol.label" + :wrapperCol="oneCol.wrapper" + label="描述"> + <a-textarea placeholder="请输入描述" v-decorator="['content']"/> + </a-form-item> + </a-col> + </a-row> + </a-list-item> + <!-- 返回值字段、返回文本字段、返回类型 --> + <a-list-item> + <a-row :gutter="gutter" style="width: 100%;"> + <a-col :span="24/3"> + <a-form-item + style="width: 100%" + :labelCol="threeCol.label" + :wrapperCol="threeCol.wrapper" + label="返回值字段" + > + <a-input placeholder="请输入返回值字段" v-decorator="['returnValField', {}]"/> + </a-form-item> + </a-col> + <a-col :span="24/3"> + <a-form-item + style="width: 100%" + :labelCol="threeCol.label" + :wrapperCol="threeCol.wrapper" + label="返回文本字段" + > + <a-input placeholder="请输入返回文本字段" v-decorator="['returnTxtField', {}]"/> + </a-form-item> + </a-col> + <a-col :span="24/3"> + <a-form-item + style="width: 100%" + :labelCol="threeCol.label" + :wrapperCol="threeCol.wrapper" + label="返回类型" + > + <a-select + v-decorator="[ 'returnType', {}]" + width="100%" + style="width:100%" + placeholder="请选择返回类型" + > + <a-select-option value="1">单选</a-select-option> + <a-select-option value="2">多选</a-select-option> + </a-select> + </a-form-item> + </a-col> + </a-row> + </a-list-item> + </a-list> + </a-form> + + <a-tabs v-model="activeKey" @change="handleChangeTab"> + <!-- 动态报表配置明细 --> + <a-tab-pane tab="动态报表配置明细" :forceRender="true" key="1"> + <j-editable-table + ref="editableTable1" + :loading="tab1.loading" + :columns="tab1.columns" + :dataSource="tab1.dataSource" + :rowNumber="true" + :rowSelection="true" + :actionButton="true" + :maxHeight="300"/> + </a-tab-pane> + <!-- 报表参数 --> + <a-tab-pane tab="报表参数" :forceRender="true" key="2"> + <j-editable-table + ref="editableTable2" + :loading="tab2.loading" + :columns="tab2.columns" + :dataSource="tab2.dataSource" + :rowNumber="true" + :rowSelection="true" + :actionButton="true" + :maxHeight="300"/> + </a-tab-pane> + + + </a-tabs> + + </a-spin> + </a-modal> +</template> + +<script> + + import JEditableTable from '@/components/jeecg/JEditableTable' + import { FormTypes, validateTables, VALIDATE_NO_PASSED } from '@/utils/JEditableTableUtil' + + import { getAction, httpAction } from '@/api/manage' + import pick from 'lodash.pick' + + export default { + name: 'OnlCgreportHeadModal', + components: { + JEditableTable + }, + data() { + return { + title: '操作', + visible: false, + model: {}, + reportSql: '', + gutter: 0, + oneCol: { + label: { span: 3 }, + wrapper: { span: 24 - 3 } + }, + threeCol: { + label: { span: 9 }, + wrapper: { span: 24 - 9 } + }, + confirmLoading: false, + form: this.$form.createForm(this), + validatorRules: { + code: { + rules: [ + { required: true, message: '请输入编码!' }, + { pattern: /^[a-z|A-Z][a-z|A-Z|\d|_|-]{0,}$/, message: '编码必须以字母开头,可包含数字、下划线、横杠' } + ] + }, + name: { rules: [{ required: true, message: '请输入报表名称!' }] }, + cgrSql: { rules: [{ required: true, message: '请输入查询SQL!' }] } + }, + url: { + add: '/online/cgreport/head/add', + edit: '/online/cgreport/head/editAll', + sql: '/online/cgreport/head/parseSql', + param: { + listByHeadId: '/online/cgreport/param/listByHeadId' + }, + item: { + listByHeadId: '/online/cgreport/item/listByHeadId' + } + + }, + activeKey: '1', + tab1: { + loading: false, + columns: [ + { + title: '字段名', + width: '13%', + key: 'fieldName', + type: FormTypes.input, + defaultValue: '', + placeholder: '请输入${title}', + validateRules: [{ required: true, message: '${title}不能为空' }] + }, + { + title: '排序', + width: '7%', + key: 'orderNum', + type: FormTypes.inputNumber, + defaultValue: 0, + placeholder: '${title}', + validateRules: [{ required: true, message: '${title}' }] + }, + { + title: '字段文本', + width: '13%', + key: 'fieldTxt', + type: FormTypes.input, + placeholder: '请输入${title}', + defaultValue: '', + validateRules: [{ required: true, message: '${title}不能为空' }] + }, + { + title: '类型', + width: '13%', + key: 'fieldType', + type: FormTypes.select, + options: [ // 下拉选项 + { title: '数值类型', value: 'Integer' }, + { title: '日期类型', value: 'Date' }, + { title: '字符类型', value: 'String' }, + { title: '长整型', value: 'Long' } + ], + defaultValue: 'String', + placeholder: '请选择${title}', + validateRules: [{ required: true, message: '${title}不能为空' }] + }, + { + title: '是否显示', + width: '3%', + key: 'isShow', + type: FormTypes.checkbox, + customValue: ['1', '0'], // true ,false + defaultChecked: true + }, + { + title: '字段href', + width: '12%', + key: 'fieldHref', + type: FormTypes.input, + defaultValue: '', + placeholder: '请输入${title}' + }, + { + title: '查询模式', + width: '12%', + key: 'searchMode', + type: FormTypes.select, + options: [ + { title: '单条件查询', value: 'single' }, + { title: '范围查询', value: 'group' } + ], + defaultValue: '', + placeholder: '请选择${title}' + }, + { + title: '取值表达式', + width: '12%', + key: 'replaceVal', + type: FormTypes.input, + defaultValue: '', + placeholder: '请输入${title}' + }, + { + title: '字典code', + width: '12%', + key: 'dictCode', + type: FormTypes.input, + defaultValue: '', + placeholder: '请输入${title}' + }, + { + title: '是否查询', + width: '3%', + key: 'isSearch', + type: FormTypes.checkbox, + customValue: ['1', '0'], + defaultChecked: false + } + ], + dataSource: [] + }, + tab2: { + loading: false, + columns: [ + { + width: '23%', + title: '参数', + key: 'paramName', + type: FormTypes.input, + defaultValue: '', + placeholder: '请输入${title}', + validateRules: [{ required: true, message: '${title}不能为空' }] + }, + { + width: '23%', + title: '参数文本', + key: 'paramTxt', + type: FormTypes.input, + defaultValue: '', + placeholder: '请输入${title}', + validateRules: [{ required: true, message: '${title}不能为空' }] + }, + { + width: '23%', + title: '默认值', + key: 'paramValue', + type: FormTypes.input, + defaultValue: '', + placeholder: '请输入${title}' + }, + { + width: '23%', + title: '排序', + key: 'orderNum', + type: FormTypes.inputNumber, + defaultValue: 0, + placeholder: '${title}', + validateRules: [{ required: true, message: '${title}不能为空' }] + } + ], + dataSource: [] + } + } + }, + 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, + 'code', + 'name', + 'cgrSql', + 'returnValField', + 'returnTxtField', + 'returnType', + // 'dbSource', + 'content' + )) + }) + this.reportSql = this.model.cgrSql + // 查询出param + if (record.id) { + this.requestData(record.id) + } + + }, + /** 关闭窗口,并初始化所有的表 */ + close() { + this.visible = false + // 初始化 + if (this.$refs.editableTable1) { + ['1', '2'].forEach(key => { + this.$refs['editableTable' + key].initialize() + this['tab' + key].dataSource = [] + }) + } + this.activeKey = '1' + this.$emit('close') + }, + + /** 点击确定按钮,提交数据 */ + handleOk() { + this.validateFields() + }, + /** 点击关闭按钮 */ + handleCancel() { + this.close() + }, + + /** 根据headId查询item和param */ + requestData(headId) { + this.requestTabData(this.url.item.listByHeadId, headId, this.tab1) + this.requestTabData(this.url.param.listByHeadId, headId, this.tab2) + }, + /** 查询某个tab的数据 */ + requestTabData(url, headId, tab) { + tab.loading = true + getAction(url, { headId }).then(res => { + tab.dataSource = res.result || [] + }).finally(() => { + tab.loading = false + }) + }, + + /** SQL解析 */ + handleSQLAnalyze() { + this.confirmLoading = true + + // --- [ fix warning;by:sunjianlei;date:2019-03-24;for: Warning: `getFieldDecorator` will override `value`, so please don't set `value and v-model` directly and use `setFieldsValue` to set it. ] + // var param = { 'sql': this.reportSql } + // let param = { 'sql': reportSql } + // --- [ fix warning;by:sunjianlei;date:2019-03-24;for: Warning: `getFieldDecorator` will override `value`, so please don't set `value and v-model` directly and use `setFieldsValue` to set it. ] + + let reportSql = this.form.getFieldValue('cgrSql') || '' + let param = { 'sql': reportSql } + getAction(this.url.sql, param).then(res => { + // console.log(res) + if (res.success) { + this.$message.success('解析成功') + this.tab1.dataSource = res.result.fields || [] + } + }).finally(() => { + this.confirmLoading = false + }) + }, + + /** 切换tab选项卡的时候重置editableTable的滚动条状态 */ + handleChangeTab(key) { + this.$refs[`editableTable${key}`].resetScrollTop() + }, + + /** 触发表单验证 */ + validateFields() { + let options = {} + new Promise((resolve, reject) => { + // 触发表单验证 + this.form.validateFields((err, values) => { + err ? reject(VALIDATE_NO_PASSED) : resolve(values) + }) + }).then(values => { + options.head = Object.assign(this.model, values) + return this.validateTableFields() + }).then(opt => { + Object.assign(options, opt) + let formData = this.classifyIntoFormData(options) + return this.requestAddOrEdit(formData) + }) + }, + + /** 发起请求新增或修改的请求 */ + requestAddOrEdit(formData) { + // 判断是add还是edit + let method = 'post', url = this.url.add + if (this.model.id) { + method = 'put' + url = this.url.edit + } + // 发起请求 + this.confirmLoading = true + httpAction(url, formData, method).then((res) => { + if (res.success) { + this.$message.success(res.message) + this.$emit('ok') + this.close() + } else { + this.$message.warning(res.message) + } + }).finally(() => { + this.confirmLoading = false + }) + }, + + /** 将数据整理成后台能识别的formData */ + classifyIntoFormData(options) { + let formData = pick(options, 'head') + + formData.items = options.table1.values + formData.deleteItemIds = options.table1.deleteIds.join(',') + + formData.params = options.table2.values + formData.deleteParamIds = options.table2.deleteIds.join(',') + + return formData + }, + + /** 验证并获取所有表的数据 */ + validateTableFields() { + let _this = this + return new Promise((resolve, reject) => { + let cases = [] + cases.push(_this.$refs.editableTable1) + cases.push(_this.$refs.editableTable2) + validateTables(cases).then((all) => { + let options = {} + all.forEach((item, index) => { + options[`table${index + 1}`] = item + }) + resolve(options) + }).catch((e = {}) => { + // 判断表单验证是否未通过 + if (e.error === VALIDATE_NO_PASSED) { + // 未通过就跳转到相应的tab选项卡 + _this.activeKey = (e.index + 1).toString() + } + reject(e) + }) + }) + } + + } + } +</script> + +<style scoped> + +</style> \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/views/monitor/HttpTrace.vue b/ant-design-jeecg-vue/src/views/monitor/HttpTrace.vue new file mode 100644 index 0000000..ad20518 --- /dev/null +++ b/ant-design-jeecg-vue/src/views/monitor/HttpTrace.vue @@ -0,0 +1,150 @@ +<template> + <a-card :bordered="false" class="card-area"> + <div> + <div class="alert"> + <a-alert type="success" :show-icon="true"> + <div slot="message"> + 共追踪到 {{dataSource.length}} 条近期HTTP请求记录 + <a style="margin-left: 24px" @click="search">点击刷新</a> + </div> + </a-alert> + </div> + <!-- 表格区域 --> + <a-table :columns="columns" + :dataSource="dataSource" + :pagination="pagination" + :loading="loading" + :scroll="{ x: 900 }" + @change="handleTableChange"> + </a-table> + </div> + </a-card> +</template> + +<script> +import moment from 'moment' +moment.locale('zh-cn') +import {getAction} from '@/api/manage' + +export default { + data () { + return { + advanced: false, + dataSource: [], + pagination: { + defaultPageSize: 10, + defaultCurrent: 1, + pageSizeOptions: ['10', '20', '30', '40', '100'], + showQuickJumper: true, + showSizeChanger: true, + showTotal: (total, range) => `显示 ${range[0]} ~ ${range[1]} 条记录,共 ${total} 条记录` + }, + loading: false + } + }, + computed: { + columns () { + return [{ + title: '请求时间', + dataIndex: 'timestamp', + customRender: (text, row, index) => { + return moment(text).format('YYYY-MM-DD HH:mm:ss') + } + }, { + title: '请求方法', + dataIndex: 'request.method', + customRender: (text, row, index) => { + switch (text) { + case 'GET': + return <a-tag color="#87d068">{text}</a-tag> + case 'POST': + return <a-tag color="#2db7f5">{text}</a-tag> + case 'PUT': + return <a-tag color="#ffba5a">{text}</a-tag> + case 'DELETE': + return <a-tag color="#f50">{text}</a-tag> + default: + return text + } + }, + filters: [ + { text: 'GET', value: 'GET' }, + { text: 'POST', value: 'POST' }, + { text: 'PUT', value: 'PUT' }, + { text: 'DELETE', value: 'DELETE' } + ], + filterMultiple: true, + onFilter: (value, record) => record.request.method.includes(value) + }, { + title: '请求URL', + dataIndex: 'request.uri', + customRender: (text, row, index) => { + return text.split('?')[0] + } + }, { + title: '响应状态', + dataIndex: 'response.status', + customRender: (text, row, index) => { + if (text < 200) { + return <a-tag color="pink">{text}</a-tag> + } else if (text < 201) { + return <a-tag color="green">{text}</a-tag> + } else if (text < 399) { + return <a-tag color="cyan">{text}</a-tag> + } else if (text < 403) { + return <a-tag color="orange">{text}</a-tag> + } else if (text < 501) { + return <a-tag color="red">{text}</a-tag> + } else { + return text + } + } + }, { + title: '请求耗时', + dataIndex: 'timeTaken', + customRender: (text, row, index) => { + if (text < 500) { + return <a-tag color="green">{text} ms</a-tag> + } else if (text < 1000) { + return <a-tag color="cyan">{text} ms</a-tag> + } else if (text < 1500) { + return <a-tag color="orange">{text} ms</a-tag> + } else { + return <a-tag color="red">{text} ms</a-tag> + } + } + }] + } + }, + mounted () { + this.fetch() + }, + methods: { + search () { + this.fetch() + }, + handleTableChange (pagination, filters, sorter) { + this.fetch() + }, + fetch () { + this.loading = true + getAction('actuator/httptrace').then((data) => { + this.loading = false + let filterData = [] + for (let d of data.traces) { + if (d.request.method !== 'OPTIONS' && d.request.uri.indexOf('httptrace') === -1) { + filterData.push(d) + } + } + this.dataSource = filterData + }) + } + } +} +</script> + +<style lang="less" scoped> + .alert { + margin-bottom: .5rem; + } +</style> diff --git a/ant-design-jeecg-vue/src/views/monitor/JvmInfo.vue b/ant-design-jeecg-vue/src/views/monitor/JvmInfo.vue new file mode 100644 index 0000000..4fa98cb --- /dev/null +++ b/ant-design-jeecg-vue/src/views/monitor/JvmInfo.vue @@ -0,0 +1,256 @@ +<template> + <a-skeleton active :loading="loading" :paragraph="{rows: 17}"> + <div class="jvm-info" style="background-color: #ffffff"> + <div class="alert"> + <a-alert type="success" :show-icon="true"> + <div slot="message"> + 数据获取时间 {{this.time}} + <a style="margin-left: 24px" @click="create">点击刷新</a> + </div> + </a-alert> + </div> + <table> + <tr> + <th>参数</th> + <th>描述</th> + <th>当前值</th> + </tr> + <tr> + <td> + <a-tag color="purple">jvm.memory.max</a-tag> + </td> + <td>JVM 最大内存</td> + <td>{{jvm.memory.max}} MB</td> + </tr> + <tr> + <td> + <a-tag color="purple">jvm.memory.committed</a-tag> + </td> + <td>JVM 可用内存</td> + <td>{{jvm.memory.committed}} MB</td> + </tr> + <tr> + <td> + <a-tag color="purple">jvm.memory.used</a-tag> + </td> + <td>JVM 已用内存</td> + <td>{{jvm.memory.used}} MB</td> + </tr> + <tr> + <td> + <a-tag color="cyan">jvm.buffer.memory.used</a-tag> + </td> + <td>JVM 缓冲区已用内存</td> + <td>{{jvm.buffer.memory.used}} MB</td> + </tr> + <tr> + <td> + <a-tag color="cyan">jvm.buffer.count</a-tag> + </td> + <td>当前缓冲区数量</td> + <td>{{jvm.buffer.count}} 个</td> + </tr> + <tr> + <td> + <a-tag color="green">jvm.threads.daemon</a-tag> + </td> + <td>JVM 守护线程数量</td> + <td>{{jvm.threads.daemon}} 个</td> + </tr> + <tr> + <td> + <a-tag color="green">jvm.threads.live</a-tag> + </td> + <td>JVM 当前活跃线程数量</td> + <td>{{jvm.threads.live}} 个</td> + </tr> + <tr> + <td> + <a-tag color="green">jvm.threads.peak</a-tag> + </td> + <td>JVM 峰值线程数量</td> + <td>{{jvm.threads.peak}} 个</td> + </tr> + <tr> + <td> + <a-tag color="orange">jvm.classes.loaded</a-tag> + </td> + <td>JVM 已加载 Class 数量</td> + <td>{{jvm.classes.loaded}} 个</td> + </tr> + <tr> + <td> + <a-tag color="orange">jvm.classes.unloaded</a-tag> + </td> + <td>JVM 未加载 Class 数量</td> + <td>{{jvm.classes.unloaded}} 个</td> + </tr> + <tr> + <td> + <a-tag color="pink">jvm.gc.memory.allocated</a-tag> + </td> + <td>GC 时, 年轻代分配的内存空间</td> + <td>{{jvm.gc.memory.allocated}} MB</td> + </tr> + <tr> + <td> + <a-tag color="pink">jvm.gc.memory.promoted</a-tag> + </td> + <td>GC 时, 老年代分配的内存空间</td> + <td>{{jvm.gc.memory.promoted}} MB</td> + </tr> + <tr> + <td> + <a-tag color="pink">jvm.gc.max.data.size</a-tag> + </td> + <td>GC 时, 老年代的最大内存空间</td> + <td>{{jvm.gc.maxDataSize}} MB</td> + </tr> + <tr> + <td> + <a-tag color="pink">jvm.gc.live.data.size</a-tag> + </td> + <td>FullGC 时, 老年代的内存空间</td> + <td>{{jvm.gc.liveDataSize}} MB</td> + </tr> + <tr> + <td> + <a-tag color="blue">jvm.gc.pause.count</a-tag> + </td> + <td>系统启动以来GC 次数</td> + <td>{{jvm.gc.pause.count}} 次</td> + </tr> + <tr> + <td> + <a-tag color="blue">jvm.gc.pause.totalTime</a-tag> + </td> + <td>系统启动以来GC 总耗时</td> + <td>{{jvm.gc.pause.totalTime}} 秒</td> + </tr> + </table> + </div> + </a-skeleton> +</template> +<script> + import axios from 'axios' + import moment from 'moment' + import {getAction} from '@/api/manage' + moment.locale('zh-cn') + + export default { + data() { + return { + time: '', + loading: true, + jvm: { + memory: { + max: 0, + committed: 0, + used: 0 + }, + buffer: { + memory: { + used: 0 + }, + count: 0 + }, + threads: { + daemon: 0, + live: 0, + peak: 0 + }, + classes: { + loaded: 0, + unloaded: 0 + }, + gc: { + memory: { + allocated: 0, + promoted: 0 + }, + maxDataSize: 0, + liveDataSize: 0, + pause: { + totalTime: 0, + count: 0 + } + } + } + } + }, + mounted() { + this.create() + }, + methods: { + create() { + this.time = moment().format('YYYY年MM月DD日 HH时mm分ss秒') + axios.all([ + getAction('actuator/metrics/jvm.memory.max'), + getAction('actuator/metrics/jvm.memory.committed'), + getAction('actuator/metrics/jvm.memory.used'), + getAction('actuator/metrics/jvm.buffer.memory.used'), + getAction('actuator/metrics/jvm.buffer.count'), + getAction('actuator/metrics/jvm.threads.daemon'), + getAction('actuator/metrics/jvm.threads.live'), + getAction('actuator/metrics/jvm.threads.peak'), + getAction('actuator/metrics/jvm.classes.loaded'), + getAction('actuator/metrics/jvm.classes.unloaded'), + getAction('actuator/metrics/jvm.gc.memory.allocated'), + getAction('actuator/metrics/jvm.gc.memory.promoted'), + getAction('actuator/metrics/jvm.gc.max.data.size'), + getAction('actuator/metrics/jvm.gc.live.data.size'), + getAction('actuator/metrics/jvm.gc.pause') + ]).then((r) => { + this.jvm.memory.max = this.convert(r[0].measurements[0].value) + this.jvm.memory.committed = this.convert(r[1].measurements[0].value) + this.jvm.memory.used = this.convert(r[2].measurements[0].value) + this.jvm.buffer.memory.used = this.convert(r[3].measurements[0].value) + this.jvm.buffer.count = r[4].measurements[0].value + this.jvm.threads.daemon = r[5].measurements[0].value + this.jvm.threads.live = r[6].measurements[0].value + this.jvm.threads.peak = r[7].measurements[0].value + this.jvm.classes.loaded = r[8].measurements[0].value + this.jvm.classes.unloaded = r[9].measurements[0].value + this.jvm.gc.memory.allocated = this.convert(r[10].measurements[0].value) + this.jvm.gc.memory.promoted = this.convert(r[11].measurements[0].value) + this.jvm.gc.maxDataSize = this.convert(r[12].measurements[0].value) + this.jvm.gc.liveDataSize = this.convert(r[13].measurements[0].value) + this.jvm.gc.pause.count = r[14].measurements[0].value + this.jvm.gc.pause.totalTime = r[14].measurements[1].value + this.loading = false + }).catch((r) => { + console.error(r) + this.$message.error('获取JVM信息失败') + }) + }, + convert(value) { + return Number(value / 1048576).toFixed(3) + } + } + } +</script> +<style lang="less"> + .jvm-info { + width: 100%; + table { + width: 100%; + tr { + line-height: 1.5rem; + border-bottom: 1px solid #f1f1f1; + th { + background: #fafafa; + padding: .5rem; + } + td { + padding: .5rem; + .ant-tag { + font-size: .8rem !important; + } + } + } + } + .alert { + margin-bottom: .5rem; + } + } +</style> diff --git a/ant-design-jeecg-vue/src/views/monitor/RedisInfo.vue b/ant-design-jeecg-vue/src/views/monitor/RedisInfo.vue new file mode 100644 index 0000000..05a7e8a --- /dev/null +++ b/ant-design-jeecg-vue/src/views/monitor/RedisInfo.vue @@ -0,0 +1,216 @@ +<template> + <div style="width: 100%;margin-top: 1rem;background-color: #ffffff"> + <a-row :gutter="8"> + <a-col :span="12"> + <apexchart ref="memoryInfo" type=area height=350 :options="memory.chartOptions" :series="memory.series" /> + </a-col> + <a-col :span="12"> + <apexchart ref="keySize" type=area height=350 :options="key.chartOptions" :series="key.series" /> + </a-col> + </a-row> + <a-row :gutter="8"> + <a-divider orientation="left">Redis详细信息</a-divider> + <table style="border-bottom: 1px solid #f1f1f1;"> + <tr v-for="(info, index) in redisInfo" :key="index" style="border-top: 1px solid #f1f1f1;"> + <td style="padding: .7rem 1rem">{{info.key}}</td> + <td style="padding: .7rem 1rem">{{info.description}}</td> + <td style="padding: .7rem 1rem">{{info.value}}</td> + </tr> + </table> + </a-row> + </div> +</template> +<script> +import axios from 'axios' +import moment from 'moment' +import {getAction} from '@/api/manage' + +export default { + name: 'RedisInfo', + data () { + return { + loading: true, + memory: { + series: [], + chartOptions: { + chart: { + animations: { + enabled: true, + easing: 'linear', + dynamicAnimation: { + speed: 3000 + } + }, + toolbar: { + show: false + }, + zoom: { + enabled: false + } + }, + dataLabels: { + enabled: false + }, + stroke: { + curve: 'smooth' + }, + title: { + text: 'Redis内存实时占用情况(kb)', + align: 'left' + }, + markers: { + size: 0 + }, + xaxis: { + }, + yaxis: {}, + legend: { + show: false + } + }, + data: [], + xdata: [] + }, + key: { + series: [], + chartOptions: { + chart: { + animations: { + enabled: true, + easing: 'linear', + dynamicAnimation: { + speed: 3000 + } + }, + toolbar: { + show: false + }, + zoom: { + enabled: false + } + }, + dataLabels: { + enabled: false + }, + colors: ['#f5564e'], + stroke: { + curve: 'smooth' + }, + title: { + text: 'Redis key实时数量(个)', + align: 'left' + }, + markers: { + size: 0 + }, + xaxis: { + }, + yaxis: {}, + legend: { + show: false + } + }, + data: [], + xdata: [] + }, + redisInfo: [], + timer: null + } + }, + beforeDestroy () { + if (this.timer) { + clearInterval(this.timer) + } + }, + mounted () { + let minMemory = 1e10 + let minSize = 1e10 + let maxMemory = -1e10 + let maxSize = -1e10 + this.timer = setInterval(() => { + if (this.$route.path.indexOf('redis') !== -1) { + axios.all([ + getAction('redis/keysSize'), + getAction('redis/memoryInfo') + ]).then((r) => { + console.log(r) + let currentMemory = r[1].used_memory / 1000 + let currentSize = r[0].dbSize + if (currentMemory < minMemory) { + minMemory = currentMemory + } + if (currentMemory > maxMemory) { + maxMemory = currentMemory + } + if (currentSize < minSize) { + minSize = currentSize + } + if (currentSize > maxSize) { + maxSize = currentSize + } + let time = moment().format('hh:mm:ss') + this.memory.data.push(currentMemory) + this.memory.xdata.push(time) + this.key.data.push(currentSize) + this.key.xdata.push(time) + if (this.memory.data.length >= 6) { + this.memory.data.shift() + this.memory.xdata.shift() + } + if (this.key.data.length >= 6) { + this.key.data.shift() + this.key.xdata.shift() + } + this.$refs.memoryInfo.updateSeries([ + { + name: '内存(kb)', + data: this.memory.data.slice() + } + ]) + this.$refs.memoryInfo.updateOptions({ + xaxis: { + categories: this.memory.xdata.slice() + }, + yaxis: { + min: minMemory, + max: maxMemory + } + }, true, true) + this.$refs.keySize.updateSeries([ + { + name: 'key数量', + data: this.key.data.slice() + } + ]) + this.$refs.keySize.updateOptions({ + xaxis: { + categories: this.key.xdata.slice() + }, + yaxis: { + min: minSize - 2, + max: maxSize + 2 + } + }, true, true) + if (this.loading) { + this.loading = false + } + }).catch((r) => { + console.error(r) + this.$message.error('获取Redis信息失败') + if (this.timer) { + clearInterval(this.timer) + } + }) + } + }, 3000) + getAction('redis/info').then((r) => { + console.log('redis/info') + console.log(r) + this.redisInfo = r.result + }) + } +} +</script> +<style> + +</style> diff --git a/ant-design-jeecg-vue/src/views/monitor/RedisTerminal.vue b/ant-design-jeecg-vue/src/views/monitor/RedisTerminal.vue new file mode 100644 index 0000000..e671afa --- /dev/null +++ b/ant-design-jeecg-vue/src/views/monitor/RedisTerminal.vue @@ -0,0 +1,13 @@ +<template> + <div> + <div>Redis终端</div> + </div> +</template> +<script> +export default { + name: 'RedisTerminal' +} +</script> +<style> + +</style> diff --git a/ant-design-jeecg-vue/src/views/monitor/SystemInfo.vue b/ant-design-jeecg-vue/src/views/monitor/SystemInfo.vue new file mode 100644 index 0000000..c3d8640 --- /dev/null +++ b/ant-design-jeecg-vue/src/views/monitor/SystemInfo.vue @@ -0,0 +1,125 @@ +<template> + <a-skeleton active :loading="loading" :paragraph="{rows: 17}"> + <div class="jvm-info" style="background-color: #ffffff"> + <div class="alert"> + <a-alert type="success" :show-icon="true"> + <div slot="message"> + 数据获取时间 {{this.time}} + <a style="margin-left: 24px" @click="create">点击刷新</a> + </div> + </a-alert> + </div> + <table> + <tr> + <th>参数</th> + <th>描述</th> + <th>当前值</th> + </tr> + <tr> + <td><a-tag color="green">system.cpu.count</a-tag></td> + <td>CPU 数量</td> + <td>{{system.cpu.count}} 核</td> + </tr> + <tr> + <td><a-tag color="green">system.cpu.usage</a-tag></td> + <td>系统 CPU 使用率</td> + <td>{{system.cpu.usage}} %</td> + </tr> + <tr> + <td><a-tag color="purple">process.start.time</a-tag></td> + <td>应用启动时间点</td> + <td>{{system.process.startTime}}</td> + </tr> + <tr> + <td><a-tag color="purple">process.uptime</a-tag></td> + <td>应用已运行时间</td> + <td>{{system.process.uptime}} 秒</td> + </tr> + <tr> + <td><a-tag color="purple">process.cpu.usage</a-tag></td> + <td>当前应用 CPU 使用率</td> + <td>{{system.process.cpuUsage}} %</td> + </tr> + </table> + </div> + </a-skeleton> +</template> +<script> +import axios from 'axios' +import moment from 'moment' +import {getAction} from '@/api/manage' +moment.locale('zh-cn') + +export default { + data () { + return { + time: '', + loading: true, + system: { + cpu: { + count: 0, + usage: 0 + }, + process: { + cpuUsage: 0, + uptime: 0, + startTime: 0 + } + } + } + }, + mounted () { + this.create() + }, + methods: { + create () { + this.time = moment().format('YYYY年MM月DD日 HH时mm分ss秒') + axios.all([ + getAction('actuator/metrics/system.cpu.count'), + getAction('actuator/metrics/system.cpu.usage'), + getAction('actuator/metrics/process.uptime'), + getAction('actuator/metrics/process.start.time'), + getAction('actuator/metrics/process.cpu.usage') + ]).then((r) => { + this.system.cpu.count = r[0].measurements[0].value + this.system.cpu.usage = this.convert(r[1].measurements[0].value) + this.system.process.uptime = r[2].measurements[0].value + this.system.process.startTime = moment(r[3].measurements[0].value * 1000).format('YYYY-MM-DD HH:mm:ss') + this.system.process.cpuUsage = this.convert(r[4].measurements[0].value) + this.loading = false + }).catch((r) => { + console.error(r) + this.$message.error('获取服务器信息失败') + }) + }, + convert (value) { + return Number(value * 100).toFixed(2) + } + } +} +</script> +<style lang="less"> + .jvm-info { + width: 100%; + table { + width: 100%; + tr { + line-height: 1.5rem; + border-bottom: 1px solid #f1f1f1; + th { + background: #fafafa; + padding: .5rem; + } + td { + padding: .5rem; + .ant-tag { + font-size: .8rem !important; + } + } + } + } + .alert { + margin-bottom: .5rem; + } + } +</style> diff --git a/ant-design-jeecg-vue/src/views/monitor/TomcatInfo.vue b/ant-design-jeecg-vue/src/views/monitor/TomcatInfo.vue new file mode 100644 index 0000000..84f539e --- /dev/null +++ b/ant-design-jeecg-vue/src/views/monitor/TomcatInfo.vue @@ -0,0 +1,202 @@ +<template> + <a-skeleton active :loading="loading" :paragraph="{rows: 17}"> + <div class="jvm-info" style="background-color: #ffffff"> + <div class="alert"> + <a-alert type="success" :show-icon="true"> + <div slot="message"> + 数据获取时间 {{this.time}} + <a style="margin-left: 24px" @click="create">点击刷新</a> + </div> + </a-alert> + </div> + <table> + <tr> + <th>参数</th> + <th>描述</th> + <th>当前值</th> + </tr> + <tr> + <td><a-tag color="green">tomcat.sessions.created</a-tag></td> + <td>tomcat 已创建 session 数</td> + <td>{{tomcat.sessions.created}} 个</td> + </tr> + <tr> + <td><a-tag color="green">tomcat.sessions.expired</a-tag></td> + <td>tomcat 已过期 session 数</td> + <td>{{tomcat.sessions.expired}} 个</td> + </tr> + <tr> + <td><a-tag color="green">tomcat.sessions.active.current</a-tag></td> + <td>tomcat 当前活跃 session 数</td> + <td>{{tomcat.sessions.active.current}} 个</td> + </tr> + <tr> + <td><a-tag color="green">tomcat.sessions.active.max</a-tag></td> + <td>tomcat 活跃 session 数峰值</td> + <td>{{tomcat.sessions.active.max}} 个</td> + </tr> + <tr> + <td><a-tag color="green">tomcat.sessions.rejected</a-tag></td> + <td>超过session 最大配置后,拒绝的 session 个数</td> + <td>{{tomcat.sessions.rejected}} 个</td> + </tr> + <tr> + <td><a-tag color="purple">tomcat.global.sent</a-tag></td> + <td>发送的字节数</td> + <td>{{tomcat.global.sent}} bytes</td> + </tr> + <tr> + <td><a-tag color="purple">tomcat.global.request.max</a-tag></td> + <td>request 请求最长耗时</td> + <td>{{tomcat.global.request.max}} 秒</td> + </tr> + <tr> + <td><a-tag color="purple">tomcat.global.request.count</a-tag></td> + <td>全局 request 请求次数</td> + <td>{{tomcat.global.request.count}} 次</td> + </tr> + <tr> + <td><a-tag color="purple">tomcat.global.request.totalTime</a-tag></td> + <td>全局 request 请求总耗时</td> + <td>{{tomcat.global.request.totalTime}} 秒</td> + </tr> + <tr> + <td><a-tag color="cyan">tomcat.servlet.request.max</a-tag></td> + <td>servlet 请求最长耗时</td> + <td>{{tomcat.servlet.request.max}} 秒</td> + </tr> + <tr> + <td><a-tag color="cyan">tomcat.servlet.request.count</a-tag></td> + <td>servlet 总请求次数</td> + <td>{{tomcat.servlet.request.count}} 次</td> + </tr> + <tr> + <td><a-tag color="cyan">tomcat.servlet.request.totalTime</a-tag></td> + <td>servlet 请求总耗时</td> + <td>{{tomcat.servlet.request.totalTime}} 秒</td> + </tr> + <tr> + <td><a-tag color="pink">tomcat.threads.current</a-tag></td> + <td>tomcat 当前线程数(包括守护线程)</td> + <td>{{tomcat.threads.current}} 个</td> + </tr> + <tr> + <td><a-tag color="pink">tomcat.threads.configMax</a-tag></td> + <td>tomcat 配置的线程最大数</td> + <td>{{tomcat.threads.configMax}} 个</td> + </tr> + </table> + </div> + </a-skeleton> +</template> +<script> +import axios from 'axios' +import moment from 'moment' +import {getAction} from '@/api/manage' +moment.locale('zh-cn') + +export default { + data () { + return { + time: '', + loading: true, + tomcat: { + sessions: { + created: 0, + expired: 0, + active: { + current: 0, + max: 0 + }, + rejected: 0 + }, + global: { + sent: 0, + request: { + count: 0, + max: 0, + totalTime: 0 + } + }, + servlet: { + request: { + count: 0, + totalTime: 0, + max: 0 + } + }, + threads: { + current: 0, + configMax: 0 + } + } + } + }, + mounted () { + this.create() + }, + methods: { + create () { + this.time = moment().format('YYYY年MM月DD日 HH时mm分ss秒') + axios.all([ + getAction('actuator/metrics/tomcat.sessions.created'), + getAction('actuator/metrics/tomcat.sessions.expired'), + getAction('actuator/metrics/tomcat.sessions.active.current'), + getAction('actuator/metrics/tomcat.sessions.active.max'), + getAction('actuator/metrics/tomcat.sessions.rejected'), + getAction('actuator/metrics/tomcat.global.sent'), + getAction('actuator/metrics/tomcat.global.request.max'), + getAction('actuator/metrics/tomcat.global.request'), + getAction('actuator/metrics/tomcat.servlet.request'), + getAction('actuator/metrics/tomcat.servlet.request.max'), + getAction('actuator/metrics/tomcat.threads.current'), + getAction('actuator/metrics/tomcat.threads.config.max') + ]).then((r) => { + this.tomcat.sessions.created = r[0].measurements[0].value + this.tomcat.sessions.expired = r[1].measurements[0].value + this.tomcat.sessions.active.current = r[2].measurements[0].value + this.tomcat.sessions.active.max = r[3].measurements[0].value + this.tomcat.sessions.rejected = r[4].measurements[0].value + this.tomcat.global.sent = r[5].measurements[0].value + this.tomcat.global.request.max = r[6].measurements[0].value + this.tomcat.global.request.count = r[7].measurements[0].value + this.tomcat.global.request.totalTime = r[7].measurements[1].value + this.tomcat.servlet.request.count = r[8].measurements[0].value + this.tomcat.servlet.request.totalTime = r[8].measurements[1].value + this.tomcat.servlet.request.max = r[9].measurements[0].value + this.tomcat.threads.current = r[10].measurements[0].value + this.tomcat.threads.configMax = r[11].measurements[0].value + this.loading = false + }).catch((r) => { + console.error(r) + this.$message.error('获取Tomcat信息失败') + }) + } + } +} +</script> +<style lang="less"> + .jvm-info { + width: 100%; + table { + width: 100%; + tr { + line-height: 1.5rem; + border-bottom: 1px solid #f1f1f1; + th { + background: #fafafa; + padding: .5rem; + } + td { + padding: .5rem; + .ant-tag { + font-size: .8rem !important; + } + } + } + } + .alert { + margin-bottom: .5rem; + } + } +</style> diff --git a/ant-design-jeecg-vue/src/views/system/DataLogList.vue b/ant-design-jeecg-vue/src/views/system/DataLogList.vue new file mode 100644 index 0000000..db518f9 --- /dev/null +++ b/ant-design-jeecg-vue/src/views/system/DataLogList.vue @@ -0,0 +1,173 @@ +<template> + <a-card :bordered="false"> + <!-- 查询区域 --> + <div class="table-page-search-wrapper"> + <a-form layout="inline"> + <a-row :gutter="24"> + <a-col :md="6" :sm="8"> + <a-form-item label="表名"> + <a-input placeholder="请输入表名" v-model="queryParam.dataTable"></a-input> + </a-form-item> + </a-col> + <a-col :md="6" :sm="8"> + <a-form-item label="数据ID"> + <a-input placeholder="请输入ID" v-model="queryParam.dataId"></a-input> + </a-form-item> + </a-col> + + <span style="float: left;overflow: hidden;" class="table-page-search-submitButtons"> + <a-col :md="6" :sm="24"> + <a-button type="primary" @click="searchQuery">查询</a-button> + <a-button style="margin-left: 8px" @click="searchReset">重置</a-button> + </a-col> + </span> + </a-row> + </a-form> + </div> + + <!-- 操作按钮区域 --> + <div class="table-operator"> + <a-button @click="handleCompare()" type="primary" icon="plus">数据比较</a-button> + </div> + + <!--table区 --> + <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="dataContent" slot-scope="text, record"> + <j-ellipsis :value="text" :length="80" /> + </span> + </a-table> + </div> + <data-log-modal ref="modalForm" @ok="modalFormOk"></data-log-modal> + </a-card> +</template> + +<script> + import DataLogModal from './modules/DataLogModal' + import {JeecgListMixin} from '@/mixins/JeecgListMixin' + import JEllipsis from "@/components/jeecg/JEllipsis"; + + export default { + name: 'DataLogList', + mixins: [JeecgListMixin], + components: { + JEllipsis, + DataLogModal + }, + data() { + return { + description: '数据日志管理页面', + //表头 + columns: [ + { + title: '表名', + align: 'center', + dataIndex: 'dataTable' + }, { + title: '数据ID', + align: 'center', + dataIndex: 'dataId' + }, { + title: '版本号', + align: 'center', + dataIndex: 'dataVersion' + }, { + title: '数据内容', + align: 'center', + dataIndex: 'dataContent', + width: "120px", + scopedSlots: {customRender: 'dataContent'}, + }, { + title: '创建人', + align: 'center', + dataIndex: 'createBy' + } + ], + url: { + list: "/sys/dataLog/list", + }, + } + }, + methods: { + handleCompare: function () { + if (!this.selectionRows || this.selectionRows.length != 2) { + this.openNotifIcon('请选择两条数据'); + return false; + } else if (this.selectionRows[0].dataId != this.selectionRows[1].dataId) { + this.openNotifIcon('请选择相同的数据库表和数据ID进行比较'); + return false; + } else { + this.$refs.modalForm.addModal(this.selectionRows); + this.$refs.modalForm.title = "数据比较"; + } + }, + openNotifIcon(msg) { + this.$notification['warning']({ + message: '提示信息', + description: msg, + }); + }, + } + + } + +</script> + +<style scoped> + .ant-card-body .table-operator { + margin-bottom: 18px; + } + + .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/DepartList.vue b/ant-design-jeecg-vue/src/views/system/DepartList.vue index 58a2b12..d69fbb3 100644 --- a/ant-design-jeecg-vue/src/views/system/DepartList.vue +++ b/ant-design-jeecg-vue/src/views/system/DepartList.vue @@ -1,110 +1,121 @@ -<template> - <a-layout style="height:100%" :class="{ 'anty-node-layout':true }"> - <a-layout-header class="header"> - <div class="anty-opt-btn"> +<template xmlns:background-color="http://www.w3.org/1999/xhtml"> + <a-row :gutter="10"> + <a-col :md="12" :sm="24"> + <a-card :bordered="false"> <!-- 按钮操作区域 --> - <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" :loading="loading">刷新</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" > + <a-row style="margin-left: 14px"> + <a-button @click="handleAdd(2)" type="primary">添加子部门</a-button> + <a-button @click="handleAdd(1)" type="default">添加一级部门</a-button> + <a-button title="删除多条数据" @click="batchDel" type="default">批量删除</a-button> + <a-button @click="refresh" type="default" icon="reload" :loading="loading">刷新</a-button> + </a-row> + <div style="background: #fff;padding-left:16px;height: 100%; margin-top: 5px"> + <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-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> + <a-col :md="10" :sm="24"> + <template> + <a-dropdown :trigger="[this.dropTrigger]" @visibleChange="dropStatus"> + <span style="user-select: none"> + <a-tree + checkable + multiple + @select="onSelect" + @check="onCheck" + @rightClick="rightHandle" + :selectedKeys="selectedKeys" + :checkedKeys="checkedKeys" + :treeData="departTree" + :checkStrictly="true" + :expandedKeys="iExpandedKeys" + :autoExpandParent="autoExpandParent" + @expand="onExpand"/> + </span> + <!--新增右键点击事件,和增加添加和删除功能--> + <a-menu slot="overlay"> + <a-menu-item @click="handleAdd(3)" key="1">添加</a-menu-item> + <a-menu-item @click="handleDelete" key="2">删除</a-menu-item> + <a-menu-item @click="closeDrop" key="3">取消</a-menu-item> + </a-menu> + </a-dropdown> + </template> + </a-col> + </div> + </a-card> + </a-col> + <a-col :md="12" :sm="24"> + <a-card :bordered="false"> + <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="['mobile', {'initialValue':''}]"/> + </a-form-item> + <a-form-item + :labelCol="labelCol" + :wrapperCol="wrapperCol" + label="地址"> + <a-input placeholder="请输入地址" v-decorator="['address', {'initialValue':''}]"/> + </a-form-item> + <a-form-item + :labelCol="labelCol" + :wrapperCol="wrapperCol" + label="备注"> + <a-textarea placeholder="请输入备注" v-decorator="['memo', {'initialValue':''}]"/> + </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-card> + </a-col> + <depart-modal ref="departModal" @ok="loadTree"></depart-modal> + </a-row> </template> <script> import DepartModal from './modules/DepartModal' import pick from 'lodash.pick' - import {queryDepartTreeList, searchByKeywords} from '@/api/api' - import { httpAction,deleteAction } from '@/api/manage' + import { queryDepartTreeList, searchByKeywords, deleteByDepartId } from '@/api/api' + import { httpAction, deleteAction } from '@/api/manage' // 表头 const columns = [ { title: '机构名称', - dataIndex: 'departName', + dataIndex: 'departName' }, { title: '机构类型', - align:"center", + align: 'center', dataIndex: 'orgType' }, { @@ -124,297 +135,360 @@ dataIndex: 'address' }, { - title:'排序', - align:'center', - dataIndex:'departOrder' + title: '排序', + align: 'center', + dataIndex: 'departOrder' }, { title: '操作', - align:"center", + align: 'center', dataIndex: 'action', - scopedSlots: { customRender: 'action' }, + scopedSlots: { customRender: 'action' } } - ]; + ] export default { - name: "DepartList", + name: 'DepartList', components: { DepartModal }, - data(){ + data() { return { - iExpandedKeys:[], - loading:false, - autoExpandParent:true, - currFlowId:"", - currFlowName:"", - disable:true, + iExpandedKeys: [], + loading: false, + autoExpandParent: true, + currFlowId: '', + currFlowName: '', + disable: true, treeData: [], - departTree:[], - hiding:true, - model:{}, - depart:{}, - columns:columns, - disableSubmit:false, - checkedKeys:[], - selectedKeys:[], - currSelected:{}, + visible: false, + departTree: [], + rightClickSelectedKey: '', + hiding: true, + model: {}, + dropTrigger: '', + depart: {}, + columns: columns, + disableSubmit: false, + checkedKeys: [], + selectedKeys: [], + autoIncr: 1, + currSelected: {}, form: this.$form.createForm(this), labelCol: { xs: { span: 24 }, - sm: { span: 5 }, + sm: { span: 5 } }, wrapperCol: { xs: { span: 24 }, - sm: { span: 16 }, + sm: { span: 16 } }, - graphDatasource:{ - nodes:[], - edges:[] + graphDatasource: { + nodes: [], + edges: [] }, - validatorRules:{ - departName:{rules: [{ required: true, message: '请输入机构/部门名称!' }]}, - orgCode:{rules: [{ required: true, message: '请输入机构编码!' }]}, - mobile:{rules: [{validator:this.validateMobile}]} + 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", - }, + 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){ + 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); + let temp = res.result[i] + that.treeData.push(temp) + that.departTree.push(temp) + that.setThisExpandedKeys(temp) console.log(temp.id) } - this.loading = false; + this.loading = false } - }); + }) }, - 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]); + 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.loading = true; - this.loadTree(); + refresh() { + this.loading = true + this.loadTree() + }, + // 右键操作方法 + rightHandle(node) { + this.dropTrigger = 'contextmenu' + console.log(node.node.eventKey) + this.rightClickSelectedKey = node.node.eventKey }, - onExpand (expandedKeys) { + 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); + backFlowList() { + this.$router.back(-1) + }, + // 右键点击下拉框改变事件 + dropStatus(visible) { + if (visible == false) { + this.dropTrigger = '' + } + }, + // 右键店家下拉关闭下拉框 + closeDrop() { + this.dropTrigger = '' }, - addRootNode(){ - this.$refs.nodeModal.add(this.currFlowId,''); + addRootNode() { + this.$refs.nodeModal.add(this.currFlowId, '') }, - batchDel: function(){ + 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]+","; + 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; + 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); + 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 = []; + 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); + let temp = res.result[i] + that.departTree.push(temp) } - }else{ - that.$message.warning(res.message); + } else { + that.$message.warning(res.message) } }) - }else{ - that.loadTree(); + } else { + that.loadTree() } }, - nodeModalOk(){ - this.loadTree(); + nodeModalOk() { + this.loadTree() + }, + nodeModalClose() { }, - nodeModalClose(){ + hide() { + console.log(111) + this.visible = false }, - onCheck (checkedKeys,info) { + onCheck(checkedKeys, info) { console.log('onCheck', checkedKeys, info) - this.hiding = false; - this.checkedKeys = checkedKeys.checked; + this.hiding = false + this.checkedKeys = checkedKeys.checked }, - onSelect (selectedKeys,e) { + 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')) - }); + 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.setValuesToForm(record) + }, - getCurrSelectedTitle(){ - return !this.currSelected.title?"":this.currSelected.title; + // 触发onSelect事件时,为部门树右侧的form表单赋值 + setValuesToForm(record) { + this.form.getFieldDecorator('fax', { initialValue: '' }) + this.form.setFieldsValue(pick(record, 'departName', 'departOrder', 'mobile', 'fax', 'address', 'memo')) }, - onClearSelected(){ - this.hiding = true; - this.model = {}; - this.checkedKeys={}; - this.currSelected={}; - this.selectedKeys = []; + getCurrSelectedTitle() { + return !this.currSelected.title ? '' : this.currSelected.title }, - handleNodeTypeChange(val){ - this.currSelected.nodeType = val; + onClearSelected() { + this.hiding = true + this.checkedKeys = {} + this.currSelected = {} + this.form.resetFields() + this.selectedKeys = [] }, - notifyTriggerTypeChange(value){ - this.currSelected.notifyTriggerType = value; + handleNodeTypeChange(val) { + this.currSelected.nodeType = val }, - receiptTriggerTypeChange(value){ - this.currSelected.receiptTriggerType = value; + notifyTriggerTypeChange(value) { + this.currSelected.notifyTriggerType = value }, - submitCurrForm(){ - this.form.validateFields((err, values) =>{ + receiptTriggerTypeChange(value) { + this.currSelected.receiptTriggerType = value + }, + submitCurrForm() { + this.form.validateFields((err, values) => { if (!err) { - if(!this.currSelected.id){ - this.$message.warning("请点击选择要修改部门!"); + if (!this.currSelected.id) { + this.$message.warning('请点击选择要修改部门!') return } - let formData = Object.assign(this.currSelected, values); + let formData = Object.assign(this.currSelected, values) console.log('Received values of form: ', formData) - httpAction(this.url.edit, formData, "put").then((res) => { + httpAction(this.url.edit, formData, 'put').then((res) => { if (res.success) { - this.$message.success("保存成功!"); - this.loadTree(); - this.selectedKeys = []; + this.$message.success('保存成功!') + this.loadTree() } }) } - }); + }) }, - emptyCurrForm(){ - this.form.setFieldsValue({ - parentId:"", - departName:"", - departNameEn:"", - departNameAbbr:"", - departOrder:"", - orgCode:"", - mobile:"", - fax:"", - address:"", - memo:"", - description:"", - }); + emptyCurrForm() { + this.form.resetFields() }, - nodeSettingFormSubmit(){ - this.form.validateFields((err, values) =>{ + nodeSettingFormSubmit() { + this.form.validateFields((err, values) => { if (!err) { console.log('Received values of form: ', values) } - }); + }) }, - openSelect(){ - this.$refs.sysDirectiveModal.show(); + 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; + handleAdd(num) { + if (num == 1) { + this.$refs.departModal.add() + this.$refs.departModal.title = '新增' + } else if (num == 2) { + let key = this.currSelected.key + if (!key) { + this.$message.warning('请先选中一条记录!') + return false } - this.$refs.DepartModal.add(this.selectedKeys); - this.$refs.DepartModal.title="新增"; + this.$refs.departModal.add(this.selectedKeys) + this.$refs.departModal.title = '新增' + } else { + this.$refs.departModal.add(this.rightClickSelectedKey) + this.$refs.departModal.title = '新增' } }, - selectDirectiveOk(record){ - console.log("选中指令数据",record); - this.nodeSettingForm.setFieldsValue({directiveCode:record.directiveCode}); - this.currSelected.sysCode = record.sysCode; + handleDelete() { + deleteByDepartId({ id: this.rightClickSelectedKey }).then((resp) => { + if (resp.success) { + this.$message.success('删除成功!') + this.loadTree() + } else { + this.$message.warning('删除失败!') + } + }) + }, + selectDirectiveOk(record) { + console.log('选中指令数据', record) + this.nodeSettingForm.setFieldsValue({ directiveCode: record.directiveCode }) + this.currSelected.sysCode = record.sysCode }, - getFlowGraphData(node){ + getFlowGraphData(node) { this.graphDatasource.nodes.push({ - id:node.id, - text:node.flowNodeName + id: node.id, + text: node.flowNodeName }) - if(node.children.length>0){ - for(let a=0;a<node.children.length;a++){ + 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); + source: node.id, + target: temp.id + }) + this.getFlowGraphData(temp) } } } }, - created(){ - this.currFlowId = this.$route.params.id; - this.currFlowName = this.$route.params.name; - this.loadTree(); - }, + 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} + .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; } + + /** Button按钮间距 */ + .ant-btn { + margin-left: 3px + } </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 index 2b0bca3..7ccebf7 100644 --- a/ant-design-jeecg-vue/src/views/system/DepartList2.vue +++ b/ant-design-jeecg-vue/src/views/system/DepartList2.vue @@ -254,9 +254,6 @@ .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; diff --git a/ant-design-jeecg-vue/src/views/system/DictItemList.vue b/ant-design-jeecg-vue/src/views/system/DictItemList.vue new file mode 100644 index 0000000..bf4b1ca --- /dev/null +++ b/ant-design-jeecg-vue/src/views/system/DictItemList.vue @@ -0,0 +1,203 @@ +<template> + <a-card :bordered="false"> + <!-- 抽屉 --> + <a-drawer + title="字典列表" + :width="screenWidth" + @close="onClose" + :visible="visible" + > + <!-- 抽屉内容的border --> + <div + :style="{ + padding:'10px', + border: '1px solid #e9e9e9', + background: '#fff', + }"> + + <div class="table-page-search-wrapper"> + <a-form layout="inline" :form="form"> + <a-row :gutter="10"> + <a-col :md="8" :sm="12"> + <a-form-item label="名称"> + <a-input style="width: 120px;" placeholder="请输入名称" v-model="queryParam.itemText"></a-input> + </a-form-item> + </a-col> + <a-col :md="9" :sm="24"> + <a-form-item label="状态" style="width: 170px" :labelCol="labelCol" :wrapperCol="wrapperCol"> + <a-select + placeholder="请选择" + v-model="queryParam.status" + > + <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 :md="7" :sm="24"> + <span style="float: left;" class="table-page-search-submitButtons"> + <a-button type="primary" @click="searchQuery">搜索</a-button> + <a-button type="primary" @click="searchReset" style="margin-left: 8px">重置</a-button> + </span> + </a-col> + </a-row> + <a-row> + <a-col :md="2" :sm="24"> + <a-button style="margin-bottom: 10px" type="primary" @click="handleAdd">新增</a-button> + </a-col> + </a-row> + </a-form> + </div> + <div> + <a-table + ref="table" + rowKey="id" + size="middle" + :columns="columns" + :dataSource="dataSource" + :pagination="ipagination" + :loading="loading" + @change="handleTableChange" + > + + <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> + </div> + </a-drawer> + <dict-item-modal ref="modalForm" @ok="modalFormOk"></dict-item-modal> <!-- 字典数据 --> + </a-card> +</template> + +<script> + import pick from 'lodash.pick' + import {filterObj} from '@/utils/util'; + import DictItemModal from './modules/DictItemModal' + import {JeecgListMixin} from '@/mixins/JeecgListMixin' + + export default { + name: "DictItemList", + mixins: [JeecgListMixin], + components: {DictItemModal}, + data() { + return { + columns: [ + { + title: '名称', + align: "center", + dataIndex: 'itemText', + }, + { + title: '数据值', + align: "center", + dataIndex: 'itemValue', + }, + { + title: '操作', + dataIndex: 'action', + align: "center", + scopedSlots: {customRender: 'action'}, + } + ], + queryParam: { + dictId: "", + dictName: "", + itemText: "", + delFlag: "1", + status: [], + }, + title: "操作", + visible: false, + screenWidth: 800, + model: {}, + dictId: "", + status: 1, + labelCol: { + xs: {span: 5}, + sm: {span: 5}, + }, + wrapperCol: { + xs: {span: 12}, + sm: {span: 12}, + }, + form: this.$form.createForm(this), + validatorRules: { + itemText: {rules: [{required: true, message: '请输入名称!'}]}, + itemValue: {rules: [{required: true, message: '请输入数据值!'}]}, + }, + url: { + list: "/sys/dictItem/list", + delete: "/sys/dictItem/delete", + deleteBatch: "/sys/dictItem/deleteBatch", + }, + } + }, + created() { + // 当页面初始化时,根据屏幕大小来给抽屉设置宽度 + this.resetScreenSize(); + }, + methods: { + add(dictId) { + this.dictId = dictId; + this.edit({}); + }, + edit(record) { + if (record.id) { + this.dictId = record.id; + } + this.queryParam = {} + 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')) + }); + // 当其它模块调用该模块时,调用此方法加载字典数据 + this.loadData(); + }, + + getQueryParams() { + var param = Object.assign({}, this.queryParam); + param.dictId = this.dictId; + param.field = this.getQueryField(); + param.pageNo = this.ipagination.current; + param.pageSize = this.ipagination.pageSize; + return filterObj(param); + }, + + // 添加字典数据 + handleAdd() { + this.$refs.modalForm.add(this.dictId); + this.$refs.modalForm.title = "新增"; + }, + showDrawer() { + this.visible = true + }, + onClose() { + this.visible = false + this.form.resetFields(); + this.dataSource = []; + }, + // 抽屉的宽度随着屏幕大小来改变 + resetScreenSize() { + let screenWidth = document.body.clientWidth; + if (screenWidth < 600) { + this.screenWidth = screenWidth; + } else { + this.screenWidth = 600; + } + }, + } + } +</script> +<style scoped> +</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 index 30c9346..66e7331 100644 --- a/ant-design-jeecg-vue/src/views/system/DictList.vue +++ b/ant-design-jeecg-vue/src/views/system/DictList.vue @@ -1,453 +1,189 @@ <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> + <!-- 左侧面板 --> + <div class="table-page-search-wrapper"> + <a-form layout="inline"> + <a-row :gutter="12"> + <a-col :md="7" :sm="8"> + <a-form-item label="字典名称" :labelCol="{span: 6}" :wrapperCol="{span: 14, offset: 1}"> + <a-input placeholder="请输入字典名称" v-model="queryParam.dictName"></a-input> + </a-form-item> </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 :md="7" :sm="8"> + <a-form-item label="字典编号" :labelCol="{span: 6}" :wrapperCol="{span: 14, offset: 1}"> + <a-input placeholder="请输入字典编号" v-model="queryParam.dictCode"></a-input> + </a-form-item> + </a-col> + <a-col :md="7" :sm="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> - </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" - > - + <a-row> + <a-col :md="24" :sm="24"> + <a-button style="margin-bottom: 20px" @click="handleAdd" type="primary" icon="plus">添加</a-button> + <a-button type="primary" icon="download" @click="handleExportXls">导出</a-button> + <a-upload name="file" :showUploadList="false" :multiple="false" :action="importExcelUrl" + @change="handleImportExcel"> + <a-button type="primary" icon="import">导入</a-button> + </a-upload> + </a-col> + </a-row> + </a-form> + + <a-table + ref="table" + rowKey="id" + size="middle" + :columns="columns" + :dataSource="dataSource" + :pagination="ipagination" + :loading="loading" + @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> + <a @click="handleEdit(record)"> + <a-icon type="edit"/> + 编辑 + </a> + <a-divider type="vertical"/> + <a @click="editDictItem(record)"><a-icon type="setting"/> 字典配置</a> + <a-divider type="vertical"/> + <a @click="handleDelete(record.id)">删除</a> </span> + </a-table> - </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> <!-- 字典数据 --> + </div> + <dict-modal ref="modalForm" @ok="modalFormOk"></dict-modal> <!-- 字典类型 --> + <dict-item-list ref="dictItemList"></dict-item-list> </a-card> </template> <script> import { filterObj } from '@/utils/util'; + import { JeecgListMixin } from '@/mixins/JeecgListMixin' import DictModal from './modules/DictModal' - import DictItemModal from './modules/DictItemModal' - import {delDict,getDictItemList,delDictItem,delDictItemList,treeList} from '@/api/api' + import DictItemList from './DictItemList' + import {delDict} from '@/api/api' export default { name: "DictList", - components: {DictModal,DictItemModal}, - data () { + mixins:[JeecgListMixin], + components: {DictModal, DictItemList}, + data() { return { description: '这是数据字典页面', - visible:false, + visible: false, // 查询条件 queryParam: { - dictId:"", - dictName:null, - delFlag:"1", - status:[], + dictCode: "", + dictName: "", }, // 表头 columns: [ { - title: '排序', + title: '#', + dataIndex: '', + key: 'rowIndex', + width: 120, align: "center", - dataIndex: 'sortOrder', - width: "100px", - sorter: true + customRender: function (t, r, index) { + return parseInt(index) + 1; + } }, { - title: '名称', - align: "center", - dataIndex: 'itemText', + title: '字典名称', + align: "left", + dataIndex: 'dictName', }, { - title: '数据值', - align: "center", - dataIndex: 'itemValue', + title: '字典编号', + align: "left", + dataIndex: 'dictCode', }, { title: '描述', - align: "center", + align: "left", 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 + dict: "", + labelCol: { + xs: {span: 8}, + sm: {span: 5}, + }, + wrapperCol: { + xs: {span: 16}, + sm: {span: 19}, }, - isorter: { - column: 'createTime', - order: 'asc', + url: { + list: "/sys/dict/list", + delete: "/sys/dict/delete", + exportXlsUrl: "sys/dict/exportXls", + importExcelUrl: "sys/dict/importExcel", }, - loading: false, - loadrefresh: false, - selectedRowKeys: [], - selectedRows: [], } }, - created() { - this.loadData(); + computed: { + importExcelUrl: function () { + return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`; + } }, 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; + 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(){ - 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(); + //删除字典类型 + handleDel(record) { + let that = this; + that.$confirm({ + title: "确认删除", + content: "您确定要删除 " + record.dictName + " 字典类型?", + onOk: function () { + delDict({id: record.id}).then((res) => { + if (res.success) { + that.$message.success(res.message); + that.loadData(); + that.cancelDict(); + } else { + that.$message.warning(res.message); + } + }); + }, + }); }, //取消选择 - cancelDict(){ - this.dict=""; - this.dictId = ""; + cancelDict() { + this.dict = ""; 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); + editDictItem(record) { + this.$refs.dictItemList.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(){ + // 重置字典类型搜索框的内容 + searchReset() { var that = this; - that.queryParam.status=[]; - that.queryParam.itemText=""; + that.queryParam.dictName = ""; + that.queryParam.dictCode = ""; 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) { + openKeys(val) { console.log('openKeys', val) }, }, @@ -455,6 +191,16 @@ </script> <style scoped> - .table-operator{margin-bottom: 10px} - .ant-tree li span.ant-tree-switcher, .ant-tree li span.ant-tree-iconEle{width:0px} + /** Button按钮间距 */ + .ant-btn { + margin-left: 3px + } + + .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 index e803668..ca4423d 100644 --- a/ant-design-jeecg-vue/src/views/system/LogList.vue +++ b/ant-design-jeecg-vue/src/views/system/LogList.vue @@ -3,7 +3,7 @@ <!--导航区域--> <div> <a-tabs defaultActiveKey="1" @change="callback"> - <a-tab-pane tab="登陆日志" key="1"></a-tab-pane> + <a-tab-pane tab="登录日志" key="1"></a-tab-pane> <a-tab-pane tab="操作日志" key="2"></a-tab-pane> </a-tabs> </div> @@ -13,18 +13,18 @@ <a-form layout="inline"> <a-row :gutter="24"> - <a-col :span="6"> + <a-col :md="6" :sm="8"> <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-col :md="8" :sm="10"> + <a-form-item label="创建时间" :labelCol="labelCol" :wrapperCol="wrapperCol"> <a-range-picker - :showTime="{ format: 'HH:mm' }" + style="width: 210px" v-model="queryParam.createTimeRange" - format="YYYY-MM-DD HH:mm" + format="YYYY-MM-DD" :placeholder="['开始时间', '结束时间']" @change="onDateChange" @ok="onDateOk" @@ -32,10 +32,10 @@ </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> + <a-col :md="8" :sm="10" > + <span style="float: right;" class="table-page-search-submitButtons"> + <a-button type="primary" style="left: -35px" @click="searchQuery" icon="search">查询</a-button> + <a-button type="primary" @click="searchReset" icon="reload" style="margin-left: 8px;left: -35px">重置</a-button> </span> </a-col> @@ -61,17 +61,17 @@ </p> </a-table> - </div> <!-- table区域-end --> </a-card> </template> <script> import { filterObj } from '@/utils/util'; - import {getLogList,deleteLog,deleteLogList} from '@/api/api' + import { JeecgListMixin } from '@/mixins/JeecgListMixin' export default { name: "LogList", + mixins:[JeecgListMixin], data () { return { description: '这是日志管理页面', @@ -88,7 +88,6 @@ title: '#', dataIndex: '', key:'rowIndex', - fixed:'center', align:"center", customRender:function (t,r,index) { return parseInt(index)+1; @@ -98,7 +97,6 @@ title: '日志内容', align:"left", dataIndex: 'logContent', - fixed:'center', sorter: true }, { @@ -127,8 +125,8 @@ }, { title: '日志类型', - dataIndex: 'logType', - customRender:function (text) { + dataIndex: 'logType_dictText', + /*customRender:function (text) { if(text==1){ return "登录日志"; }else if(text==2){ @@ -136,7 +134,7 @@ }else{ return text; } - }, + },*/ align:"center", }, { @@ -146,47 +144,20 @@ 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 + labelCol: { + xs: { span: 1 }, + sm: { span: 2 }, + }, + wrapperCol: { + xs: { span: 10 }, + sm: { span: 16 }, }, - isorter:{ - column: 'createTime', - order: 'desc', + url: { + list: "/sys/log/list", }, - 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); @@ -196,17 +167,7 @@ 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; @@ -229,17 +190,6 @@ 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> @@ -247,9 +197,6 @@ .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; diff --git a/ant-design-jeecg-vue/src/views/system/PermissionDataRuleList.vue b/ant-design-jeecg-vue/src/views/system/PermissionDataRuleList.vue new file mode 100644 index 0000000..dd715d7 --- /dev/null +++ b/ant-design-jeecg-vue/src/views/system/PermissionDataRuleList.vue @@ -0,0 +1,176 @@ +<template> + <a-drawer + title="数据权限规则" + :width="drawerWidth" + @close="onClose" + :visible="visible" + :wrapStyle="{height: 'calc(100% - 108px)',overflow: 'auto',paddingBottom: '108px'}" + > + <!-- 抽屉内容的border --> + <div + :style="{ + padding:'10px', + border: '1px solid #e9e9e9', + background: '#fff', + }"> + <div class="table-page-search-wrapper"> + <a-form> + <a-row :gutter="12"> + <a-col :md="8" :sm="8"> + <a-form-item label="规则名称" :labelCol="{span: 8}" :wrapperCol="{span: 14, offset: 1}"> + <a-input placeholder="请输入规则名称" v-model="queryParam.ruleName"></a-input> + </a-form-item> + </a-col> + <a-col :md="8" :sm="8"> + <a-form-item label="规则值" :labelCol="{span: 8}" :wrapperCol="{span: 14, offset: 1}"> + <a-input placeholder="请输入规则值" v-model="queryParam.ruleValue"></a-input> + </a-form-item> + </a-col> + <a-col :md="7" :sm="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-row> + <a-col :md="24" :sm="24"> + <a-button style="margin-bottom: 10px" @click="addPermissionRule" type="primary" icon="plus">添加</a-button> + </a-col> + </a-row> + </a-form> + + <a-table + ref="table" + rowKey="id" + size="middle" + :columns="columns" + :dataSource="dataSource" + :loading="loading"> + <span slot="action" slot-scope="text, record"> + <a @click="handleEdit(record)"> + <a-icon type="edit"/>编辑 + </a> + <a-divider type="vertical"/> + <a-popconfirm title="确定删除吗?" @confirm="() => handleDelete(record.id)"> + <a>删除</a> + </a-popconfirm> + </span> + </a-table> + + </div> + </div> + <permission-data-rule-modal @ok="modalFormOk" ref="modalForm"></permission-data-rule-modal> + </a-drawer> +</template> +<script> + import {getPermissionRuleList, queryPermissionRule} from '@/api/api' + import {JeecgListMixin} from '@/mixins/JeecgListMixin' + import PermissionDataRuleModal from './modules/PermissionDataRuleModal' + + const columns = [ + { + title: '规则名称', + dataIndex: 'ruleName', + key: 'ruleName' + }, + { + title: '规则字段', + dataIndex: 'ruleColumn', + key: 'ruleColumn' + }, + { + title: '规则值', + dataIndex: 'ruleValue', + key: 'ruleValue' + }, + { + title: '操作', + dataIndex: 'action', + scopedSlots: {customRender: 'action'}, + align: 'center' + } + ] + export default { + name: 'PermissionDataRuleList', + mixins: [JeecgListMixin], + components: { + PermissionDataRuleModal + }, + data() { + return { + queryParam: {}, + drawerWidth: 650, + columns: columns, + permId: '', + visible: false, + form: this.$form.createForm(this), + loading: false, + url: { + list: "/sys/permission/getPermRuleListByPermId", + delete: "/sys/permission/deletePermissionRule", + }, + } + }, + created() { + this.resetScreenSize() + }, + methods: { + loadData() { + let that = this + this.dataSource = [] + var params = this.getQueryParams()//查询条件 + getPermissionRuleList(params).then((res) => { + if (res.success) { + that.dataSource = res.result + } + }) + }, + edit(record) { + if (record.id) { + this.visible = true + this.permId = record.id + } + this.queryParam = {} + this.queryParam.permissionId = record.id + this.visible = true + this.loadData() + this.resetScreenSize() + }, + addPermissionRule() { + this.$refs.modalForm.add(this.permId) + this.$refs.modalForm.title = '新增' + }, + searchQuery() { + var params = this.getQueryParams(); + params.permissionId = this.permId; + queryPermissionRule(params).then((res) => { + if (res.success) { + this.dataSource = res.result + } + }) + }, + searchReset() { + this.queryParam = {} + this.queryParam.permissionId = this.permId + this.loadData(1); + }, + onClose() { + this.visible = false + }, + // 根据屏幕变化,设置抽屉尺寸 + resetScreenSize() { + let screenWidth = document.body.clientWidth + if (screenWidth < 500) { + this.drawerWidth = screenWidth + } else { + this.drawerWidth = 650 + } + }, + } + } +</script> + +<style scoped> + +</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 index c93fd70..1c0eb07 100644 --- a/ant-design-jeecg-vue/src/views/system/PermissionList.vue +++ b/ant-design-jeecg-vue/src/views/system/PermissionList.vue @@ -5,37 +5,39 @@ <div class="table-operator"> <a-button @click="handleAdd" type="primary" icon="plus">新增</a-button> <a-button - @click="batchdel" + @click="batchDel" style="margin-left:8px" v-if="selectedRowKeys.length > 0" ghost type="primary" - icon="delete">批量删除</a-button> + 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>项 + <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" + :pagination="false" :dataSource="dataSource" - :rowSelection="rowSelection" - > + :loading="loading" + :rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}"> <span slot="action" slot-scope="text, record"> <a @click="handleEdit(record)">编辑</a> - <a-divider type="vertical" /> + <a-divider type="vertical"/> <a-dropdown> <a class="ant-dropdown-link"> - 更多 <a-icon type="down" /> + 更多 <a-icon type="down"/> </a> <a-menu slot="overlay"> <a-menu-item> @@ -43,59 +45,61 @@ </a-menu-item> <a-menu-item> - <a-popconfirm title="确定删除吗?" @confirm="() => handleDelete(record.id)"> - <a>删除</a> - </a-popconfirm> + <a href="javascript:;" @click="handleDataRule(record)">数据规则</a> </a-menu-item> - <!--<a-menu-item v-if="record.status==1"> - <a-popconfirm title="确定冻结吗?" @confirm="() => handleFrozen(record.id,2)"> - <a>冻结</a> + <a-menu-item> + <a-popconfirm title="确定删除吗?" @confirm="() => handleDelete(record.id)"> + <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> - + <!-- 字符串超长截取省略号显示 --> + <span slot="url" slot-scope="text, record"> + <j-ellipsis :value="text" :length="25"/> + </span> + <!-- 字符串超长截取省略号显示--> + <span slot="component" slot-scope="text, record"> + <j-ellipsis :value="text"/> + </span> </a-table> </div> <!-- table区域-end --> - <permission-modal ref="permissionmodal" @ok="modalFormOk"></permission-modal> + <permission-modal ref="modalForm" @ok="modalFormOk"></permission-modal> + <permission-data-rule-list ref="PermissionDataRuleList" @ok="modalFormOk"></permission-data-rule-list> </a-card> </template> <script> import PermissionModal from './modules/PermissionModal' - import {getPermissionList,deletePermission,deletePermissionList} from '@/api/api' + import { getPermissionList } from '@/api/api' + import { JeecgListMixin } from '@/mixins/JeecgListMixin' + import PermissionDataRuleList from './PermissionDataRuleList' + import JEllipsis from '@/components/jeecg/JEllipsis' 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; + customRender: function(text) { + if (text == 0) { + return '菜单' + } else if (text == 1) { + return '菜单' + } else if (text == 2) { + return '按钮' + } else { + return text } } },/*{ @@ -105,152 +109,72 @@ },*/{ title: 'icon', dataIndex: 'icon', - key: 'icon', + key: 'icon' }, { title: '组件', dataIndex: 'component', key: 'component', + scopedSlots: { customRender: 'component' } }, { title: '路径', dataIndex: 'url', key: 'url', + scopedSlots: { customRender: 'url' } }, { title: '排序', dataIndex: 'sortNo', - key: 'sortNo', + key: 'sortNo' }, { title: '操作', dataIndex: 'action', scopedSlots: { customRender: 'action' }, - fixed:"right", - align:"center", - width:150 + align: 'center', + width: 150 } - ]; + ] export default { - name: "PermissionList", + name: 'PermissionList', + mixins: [JeecgListMixin], components: { - PermissionModal + PermissionDataRuleList, + PermissionModal, + JEllipsis }, - data () { + data() { return { description: '这是菜单管理页面', - //数据集 - dataSource:[], // 表头 - columns:columns, - rowSelection:{ - onChange: (selectedRowKeys) => { - //console.log(`selectedRowKeys: ${selectedRowKeys}`, 'selectedRows: ', selectedRows); - this.selectedRowKeys = selectedRowKeys; - }, - - }, - loading:false, - selectedRowKeys: [], - selectedRows: [], + columns: columns, + loading: false, + url: { + list: '/sys/permission/list', + delete: '/sys/permission/delete', + deleteBatch: '/sys/permission/deleteBatch' + } } }, - 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); - }*/ + loadData() { + this.dataSource = [] + getPermissionList().then((res) => { + if (res.success) { + console.log(res.result) + this.dataSource = res.result } }) }, - 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(); - }, + // 打开数据规则编辑 + handleDataRule(record) { + this.$refs.PermissionDataRuleList.edit(record) + } } } </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/common.css'; </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 index 5aa6526..fcc5c3c 100644 --- a/ant-design-jeecg-vue/src/views/system/QuartzJobList.vue +++ b/ant-design-jeecg-vue/src/views/system/QuartzJobList.vue @@ -6,14 +6,14 @@ <a-form layout="inline"> <a-row :gutter="24"> - <a-col :span="6"> + <a-col :md="6" :sm="10"> <a-form-item label="任务类名"> <a-input placeholder="请输入任务类名" v-model="queryParam.jobClassName"></a-input> </a-form-item> </a-col> - <a-col :span="6"> + <a-col :md="6" :sm="10"> <a-form-item label="任务状态"> - <a-select style="width: 150px" v-model="queryParam.status" placeholder="请选择状态"> + <a-select style="width: 220px" 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> @@ -21,7 +21,7 @@ </a-form-item> </a-col> - <a-col :span="8" > + <a-col :md="6" :sm="10" > <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> @@ -35,7 +35,11 @@ <!-- 操作按钮区域 --> <div class="table-operator"> <a-button @click="handleAdd" type="primary" icon="plus">新增</a-button> - + <a-button type="primary" icon="download" @click="handleExportXls">导出</a-button> + <a-upload name="file" :showUploadList="false" :multiple="false" :action="importExcelUrl" + @change="handleImportExcel"> + <a-button type="primary" icon="import">导入</a-button> + </a-upload> <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> @@ -63,6 +67,12 @@ :rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}" @change="handleTableChange"> + <!-- 字符串超长截取省略号显示--> + <span slot="description" slot-scope="text"> + <j-ellipsis :value="text" :length="25" /> + </span> + + <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> @@ -91,19 +101,22 @@ <!-- table区域-end --> <!-- 表单区域 --> - <quartzJob-modal ref="quartzJobModal" @ok="modalFormOk"></quartzJob-modal> + <quartzJob-modal ref="modalForm" @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' + import { postAction } from '@/api/manage' + import { JeecgListMixin } from '@/mixins/JeecgListMixin' + import JEllipsis from "@/components/jeecg/JEllipsis"; export default { name: "QuartzJobList", + mixins:[JeecgListMixin], components: { - QuartzJobModal + QuartzJobModal, + JEllipsis }, data () { return { @@ -122,33 +135,38 @@ return parseInt(index)+1; } }, - - { + { title: '任务类名', align:"center", dataIndex: 'jobClassName', - sorter: true + sorter: true, +/* customRender:function (text) { + return "*"+text.substring(9,text.length); + }*/ }, - { + { title: 'cron表达式', align:"center", dataIndex: 'cronExpression' }, - { + { title: '参数', align:"center", dataIndex: 'parameter' }, - { + { title: '描述', align:"center", - dataIndex: 'description' + width: 300, + dataIndex: 'description', + scopedSlots: {customRender: 'description'}, }, - { + { title: '状态', align:"center", dataIndex: 'status', scopedSlots: { customRender: 'customRenderStatus' }, + filterMultiple: false, filters: [ { text: '已启动', value: '0' }, { text: '已暂停', value: '-1' }, @@ -158,131 +176,41 @@ title: '操作', dataIndex: 'action', align:"center", + width:180, 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", + exportXlsUrl: "sys/quartzJob/exportXls", + importExcelUrl: "sys/quartzJob/importExcel", }, - } }, - created() { - this.loadData(); + computed: { + importExcelUrl: function () { + return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`; + } }, + 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); - } - }); - } - }); + + //筛选需要重写handleTableChange + handleTableChange(pagination, filters, sorter) { + //分页、排序、筛选变化时触发 + //TODO 筛选 + if (Object.keys(sorter).length > 0) { + this.isorter.column = sorter.field; + this.isorter.order = "ascend" == sorter.order ? "asc" : "desc" } - }, - 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="编辑"; + //这种筛选方式只支持单选 + this.filters.status = filters.status[0]; + this.ipagination = pagination; + this.loadData(); }, pauseJob: function(record){ var that = this; @@ -308,8 +236,8 @@ var that = this; //恢复定时任务 this.$confirm({ - title:"确认暂停", - content:"是否暂停选中任务?", + title:"确认启动", + content:"是否启动选中任务?", onOk: function(){ postAction(that.url.resume,record).then((res)=>{ if(res.success){ @@ -323,34 +251,17 @@ } }); }, - 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; + /** Button按钮间距 */ + .ant-btn { + margin-left: 3px } - .ant-layout-content{ - margin:12px 16px 0 !important; + + .ant-card-body .table-operator { + margin-bottom: 18px; } .ant-table-tbody .ant-table-row td{ padding-top:10px; diff --git a/ant-design-jeecg-vue/src/views/system/RoleList.vue b/ant-design-jeecg-vue/src/views/system/RoleList.vue index 68ecfbb..e9fe668 100644 --- a/ant-design-jeecg-vue/src/views/system/RoleList.vue +++ b/ant-design-jeecg-vue/src/views/system/RoleList.vue @@ -2,39 +2,37 @@ <a-card :bordered="false" class="card-area"> <!-- 查询区域 --> - <div> + <div class="table-page-search-wrapper"> <!-- 搜索区域 --> - <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-form layout="inline"> + <a-row :gutter="24"> + <a-col :md="6" :sm="8"> + <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="6" :sm="8"> + <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> + <span style="float: left;overflow: hidden;" class="table-page-search-submitButtons"> + <a-col :md="6" :sm="24"> + <a-button type="primary" @click="searchQuery">查询</a-button> + <a-button style="margin-left: 8px" @click="searchReset">重置</a-button> </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> + </span> + </a-row> </a-form> </div> <!-- 操作按钮区域 --> - <div class="table-operator"> + <div class="table-operator" style="margin-top: 5px"> <a-button @click="handleAdd" type="primary" icon="plus">新增</a-button> + <a-button type="primary" icon="download" @click="handleExportXls">导出</a-button> + <a-upload name="file" :showUploadList="false" :multiple="false" :action="importExcelUrl" @change="handleImportExcel"> + <a-button type="primary" icon="import">导入</a-button> + </a-upload> <a-dropdown v-if="selectedRowKeys.length > 0"> <a-menu slot="overlay"> @@ -92,25 +90,26 @@ <!-- table区域-end --> <!-- 表单区域 --> - <role-modal ref="roleModal" @ok="modalFormOk"></role-modal> + <role-modal ref="modalForm" @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' + import { JeecgListMixin } from '@/mixins/JeecgListMixin' export default { name: "RoleList", + mixins:[JeecgListMixin], components: { RoleModal, UserRoleModal }, data () { return { + description: '角色管理页面', // 查询条件 queryParam: {roleName:'',createTimeIsRange:[]}, @@ -160,145 +159,25 @@ 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', + url: { + list: "/sys/role/list", + delete: "/sys/role/delete", + deleteBatch: "/sys/role/deleteBatch", + exportXlsUrl: "sys/role/exportXls", + importExcelUrl: "sys/role/importExcel", }, - loading:false, - selectedRowKeys: [], - selectedRows: [], - } }, - created() { - this.loadData(); + computed: { + importExcelUrl: function(){ + return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`; + } }, 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); }, @@ -306,12 +185,13 @@ } </script> <style scoped> + /** Button按钮间距 */ + .ant-btn { + margin-left: 3px + } .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; @@ -322,6 +202,4 @@ .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 index 3eb99cf..681f6bf 100644 --- a/ant-design-jeecg-vue/src/views/system/SysAnnouncementList.vue +++ b/ant-design-jeecg-vue/src/views/system/SysAnnouncementList.vue @@ -17,7 +17,7 @@ </a-form-item> </a-col> - <a-col :span="8" > + <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> @@ -31,12 +31,20 @@ <!-- 操作按钮区域 --> <div class="table-operator"> <a-button @click="handleAdd" type="primary" icon="plus">新增</a-button> - + <a-button type="primary" icon="download" @click="handleExportXls">导出</a-button> + <a-upload name="file" :showUploadList="false" :multiple="false" :action="importExcelUrl" @change="handleImportExcel"> + <a-button type="primary" icon="import">导入</a-button> + </a-upload> <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-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-button style="margin-left: 8px"> 批量操作 + <a-icon type="down"/> + </a-button> </a-dropdown> </div> @@ -62,9 +70,9 @@ <span slot="action" slot-scope="text, record"> <a @click="handleEdit(record)">编辑</a> - <a-divider type="vertical" /> + <a-divider type="vertical"/> <a-dropdown> - <a class="ant-dropdown-link">更多 <a-icon type="down" /></a> + <a class="ant-dropdown-link">更多 <a-icon type="down"/></a> <a-menu slot="overlay"> <a-menu-item> <a-popconfirm title="确定删除吗?" @confirm="() => handleDelete(record.id)"> @@ -90,22 +98,22 @@ <!-- table区域-end --> <!-- 表单区域 --> - <sysAnnouncement-modal ref="sysAnnouncementModal" @ok="modalFormOk"></sysAnnouncement-modal> + <sysAnnouncement-modal ref="modalForm" @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' + import {doReleaseData, doReovkeData} from '@/api/api' + import {JeecgListMixin} from '@/mixins/JeecgListMixin' export default { name: "SysAnnouncementList", + mixins: [JeecgListMixin], components: { SysAnnouncementModal }, - data () { + data() { return { description: '系统通告表管理页面', // 查询条件 @@ -115,270 +123,145 @@ { title: '#', dataIndex: '', - key:'rowIndex', - width:60, - align:"center", - customRender:function (t,r,index) { - return parseInt(index)+1; + key: 'rowIndex', + width: 60, + align: "center", + customRender: function (t, r, index) { + return parseInt(index) + 1; } }, - - { + + { title: '标题', - align:"center", + align: "center", dataIndex: 'titile' }, - /*{ - title: '内容', - align:"center", - dataIndex: 'msgContent' - },*/ - { + /*{ + title: '内容', + align:"center", + dataIndex: 'msgContent' + },*/ + { title: '开始时间', - align:"center", + align: "center", dataIndex: 'startTime' }, - { + { title: '结束时间', - align:"center", + align: "center", dataIndex: 'endTime' }, - { + { title: '发布人', - align:"center", + align: "center", dataIndex: 'sender' }, - { + { title: '优先级', - align:"center", + align: "center", dataIndex: 'priority', - customRender:function (text) { - if(text=='L'){ + customRender: function (text) { + if (text == 'L') { return "低"; - }else if(text=="M"){ + } else if (text == "M") { return "中"; - }else if(text=="H"){ + } else if (text == "H") { return "高"; } else { return text; } } }, - { + { title: '通告对象类型', - align:"center", + align: "center", dataIndex: 'msgType', - customRender:function (text) { - if(text=='USER'){ + customRender: function (text) { + if (text == 'USER') { return "指定用户"; - }else if(text=="ALL"){ + } else if (text == "ALL") { return "全体用户"; } else { return text; } } }, - { + { title: '发布状态', - align:"center", + align: "center", dataIndex: 'sendStatus', - customRender:function (text) { - if(text==0){ + customRender: function (text) { + if (text == 0) { return "未发布"; - }else if(text==1){ + } else if (text == 1) { return "已发布"; - }else if(text==2){ + } else if (text == 2) { return "已撤销"; } else { return text; } } }, - { + { title: '发布时间', - align:"center", + align: "center", dataIndex: 'sendTime' }, - { + { title: '撤销时间', - align:"center", + align: "center", dataIndex: 'cancelTime' }, - /*{ - title: '删除状态(0,正常,1已删除)', - align:"center", - dataIndex: 'delFlag' - },*/ + /*{ + title: '删除状态(0,正常,1已删除)', + align:"center", + dataIndex: 'delFlag' + },*/ { title: '操作', dataIndex: 'action', - align:"center", - scopedSlots: { customRender: '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: { + url: { list: "/sys/annountCement/list", delete: "/sys/annountCement/delete", deleteBatch: "/sys/annountCement/deleteBatch", - releaseDataUrl:"/sys/annountCement/doReleaseData", - reovkeDataUrl:"sys/annountCement/doReovkeData", + releaseDataUrl: "/sys/annountCement/doReleaseData", + reovkeDataUrl: "sys/annountCement/doReovkeData", + exportXlsUrl: "sys/annountCement/exportXls", + importExcelUrl: "sys/annountCement/importExcel", }, - } }, - created() { - this.loadData(); + computed: { + importExcelUrl: function(){ + return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`; + } }, 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){ + releaseData: function (id) { console.log(id); var that = this; - doReleaseData({id:id}).then((res)=>{ - if(res.success){ + doReleaseData({id: id}).then((res) => { + if (res.success) { that.$message.success(res.message); that.loadData(1); - }else{ + } else { that.$message.warning(res.message); } }); }, //执行撤销操作 - reovkeData: function(id){ + reovkeData: function (id) { var that = this; - doReovkeData({id:id}).then((res)=>{ - if(res.success){ + doReovkeData({id: id}).then((res) => { + if (res.success) { that.$message.success(res.message); that.loadData(1); - }else{ + } else { that.$message.warning(res.message); } }); @@ -387,20 +270,38 @@ } </script> <style scoped> - .ant-card-body .table-operator{ + /** Button按钮间距 */ + .ant-btn { + margin-left: 3px + } + .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-table-tbody .ant-table-row td{ - padding-top:15px; - padding-bottom:15px; + + .ant-btn-danger { + background-color: #ffffff } - .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} + .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 index 9a0454a..d26aef8 100644 --- a/ant-design-jeecg-vue/src/views/system/UserList.vue +++ b/ant-design-jeecg-vue/src/views/system/UserList.vue @@ -6,13 +6,13 @@ <a-form layout="inline"> <a-row :gutter="24"> - <a-col :span="6"> + <a-col :md="6" :sm="12"> <a-form-item label="账号"> <a-input placeholder="请输入账号查询" v-model="queryParam.username"></a-input> </a-form-item> </a-col> - <a-col :span="6"> + <a-col :md="6" :sm="8"> <a-form-item label="性别"> <a-select v-model="queryParam.sex" placeholder="请选择性别查询"> <a-select-option value="">请选择性别查询</a-select-option> @@ -24,19 +24,19 @@ <template v-if="toggleSearchStatus"> - <a-col :span="6"> + <a-col :md="6" :sm="8"> <a-form-item label="邮箱"> <a-input placeholder="请输入邮箱查询" v-model="queryParam.email"></a-input> </a-form-item> </a-col> - <a-col :span="6"> + <a-col :md="6" :sm="8"> <a-form-item label="手机号码"> <a-input placeholder="请输入手机号码查询" v-model="queryParam.phone"></a-input> </a-form-item> </a-col> - <a-col :span="6"> + <a-col :md="6" :sm="8"> <a-form-item label="状态"> <a-select v-model="queryParam.status" placeholder="请选择用户状态查询"> <a-select-option value="">请选择用户状态</a-select-option> @@ -47,9 +47,9 @@ </a-col> </template> - <a-col :span="6" > + <a-col :md="6" :sm="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="searchQuery" 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 ? '收起' : '展开' }} @@ -63,25 +63,31 @@ </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>--> - - + <div class="table-operator" style="border-top: 5px"> + <a-button @click="handleAdd" v-has="'user:add'" type="primary" icon="plus">添加用户</a-button> + <a-button @click="handleSyncUser" type="primary" icon="plus">重新同步流程用户</a-button> + <a-button type="primary" icon="download" @click="handleExportXls">导出</a-button> + <a-upload name="file" :showUploadList="false" :multiple="false" :action="importExcelUrl" @change="handleImportExcel"> + <a-button type="primary" icon="import">导入</a-button> + </a-upload> <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-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-icon type="down"/> </a-button> </a-dropdown> </div> @@ -89,8 +95,7 @@ <!-- 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>项 + <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> @@ -110,32 +115,24 @@ <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-divider type="vertical"/> + <a-dropdown> <a class="ant-dropdown-link"> - 更多 <a-icon type="down" /> + 更多 <a-icon type="down"/> </a> <a-menu slot="overlay"> - <a-menu-item > + <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 href="javascript:;" @click="handleChangePassword(record.username)">密码</a> </a-menu-item> <a-menu-item> @@ -165,7 +162,7 @@ </div> <!-- table区域-end --> - <user-modal ref="modal" @ok="modalFormOk"></user-modal> + <user-modal ref="modalForm" @ok="modalFormOk"></user-modal> <password-modal ref="passwordmodal" @ok="passwordModalOk"></password-modal> @@ -173,19 +170,20 @@ </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' + import {putAction} from '@/api/manage'; + import {frozenBatch} from '@/api/api' + import {JeecgListMixin} from '@/mixins/JeecgListMixin' export default { name: "UserList", + mixins: [JeecgListMixin], components: { UserModal, PasswordModal }, - data () { + data() { return { description: '这是用户管理页面', queryParam: {}, @@ -202,207 +200,110 @@ },*/ { title: '用户账号', - align:"center", + align: "center", dataIndex: 'username', - fixed:'left', - width:200 + width: 120 }, { title: '真实姓名', - align:"center", + align: "center", + width: 100, dataIndex: 'realname', }, { title: '头像', - align:"center", + align: "center", + width: 120, dataIndex: 'avatar', - scopedSlots:{customRender:"avatarslot"} + scopedSlots: {customRender: "avatarslot"} }, { title: '性别', - align:"center", - dataIndex: 'sex', - customRender:function (text) { - if(text==1){ - return "男"; - }else if(text==2){ - return "女"; - }else{ - return text; - } - } + align: "center", + width: 80, + dataIndex: 'sex_dictText' }, { title: '生日', - align:"center", + align: "center", + width: 180, dataIndex: 'birthday' }, { title: '手机号码', - align:"center", + align: "center", + width: 100, dataIndex: 'phone' }, { title: '邮箱', - align:"center", + align: "center", dataIndex: 'email' }, { title: '状态', - align:"center", - dataIndex: 'status', - customRender:function (text) { - if(text==1){ - return "正常"; - }else if(text==2){ - return "冻结"; - }else{ - return text; - } - } + align: "center", + width: 80, + dataIndex: 'status_dictText' }, - { + /* { title: '创建时间', - align:"center", + align: "center", + width: 150, dataIndex: 'createTime', - sorter:true - }, + sorter: true + },*/ { title: '操作', dataIndex: 'action', - scopedSlots: { customRender: 'action' }, - fixed:"right", - align:"center", - width:150 + scopedSlots: {customRender: 'action'}, + align: "center", + width: 170 } ], - 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" + imgerver: window._CONFIG['domianURL'] + "/sys/common/view", + syncUser: "/process/extActProcess/doSyncUser", + list: "/sys/user/list", + delete: "/sys/user/delete", + deleteBatch: "/sys/user/deleteBatch", + exportXlsUrl: "sys/user/exportXls", + importExcelUrl: "sys/user/importExcel", }, - } }, - created() { - this.loadData(); + computed: { + importExcelUrl: function(){ + return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`; + } }, - 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); + getAvatarView: function (avatar) { + return this.url.imgerver + "/" + avatar; }, - 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){ + + batchFrozen: function (status) { + if (this.selectedRowKeys.length <= 0) { this.$message.warning('请选择一条记录!'); return false; - }else{ + } else { let ids = ""; let that = this; - that.selectedRowKeys.forEach(function(val) { - ids+=val+","; + that.selectedRowKeys.forEach(function (val) { + ids += val + ","; }); that.$confirm({ - title:"确认删除", - content:"是否删除选中数据?", - onOk: function(){ - deleteUserList({ids: ids}).then((res)=>{ - if(res.success){ + 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{ + } else { that.$message.warning(res.message); } }); @@ -410,69 +311,40 @@ }); } }, - handleMenuClick(e){ - if(e.key==1){ - this.batchdel(); - }else if(e.key==2){ + handleMenuClick(e) { + if (e.key == 1) { + this.batchDel(); + } else if (e.key == 2) { this.batchFrozen(2); - }else if(e.key==3){ + } else if (e.key == 3) { this.batchFrozen(1); } }, - handleDelete: function(id){ + handleFrozen: function (id, status) { let that = this; - deleteUser({id: id}).then((res)=>{ - if(res.success){ + frozenBatch({ids: id, status: status}).then((res) => { + if (res.success) { that.$message.success(res.message); that.loadData(); - }else{ + } else { that.$message.warning(res.message); } }); }, - handleFrozen: function(id,status){ - let that = this; - frozenBatch({ids: id,status:status}).then((res)=>{ - if(res.success){ + handleChangePassword(username) { + this.$refs.passwordmodal.show(username); + }, + handleSyncUser() { + var that = this; + putAction(that.url.syncUser, {}).then((res) => { + if (res.success) { that.$message.success(res.message); - that.loadData(); - }else{ + } 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(){ + passwordModalOk() { //TODO 密码修改完成 不需要刷新页面,可以把datasource中的数据更新一下 } } @@ -480,23 +352,52 @@ } </script> <style scoped> - .ant-card-body .table-operator{ + /** Button按钮间距 */ + .ant-btn { + margin-left: 3px + } + .ant-card-body { margin-bottom: 18px; } - .ant-layout-content{ - margin:12px 16px 0 !important; + + .table-operator button { + margin-bottom: 18px; + margin-right: 5px; + } + + .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-table-tbody .ant-table-row td{ - padding-top:15px; - padding-bottom:15px; + + .ant-modal-cust-warp { + height: 100% } - .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} + .ant-modal-cust-warp .ant-modal-body { + height: calc(100% - 110px) !important; + overflow-y: auto + } - .anty-img-wrap{height:25px;position: relative;} - .anty-img-wrap > img{max-height:100%;} + .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/DataLogCompareModal.vue b/ant-design-jeecg-vue/src/views/system/modules/DataLogCompareModal.vue new file mode 100644 index 0000000..e02bb02 --- /dev/null +++ b/ant-design-jeecg-vue/src/views/system/modules/DataLogCompareModal.vue @@ -0,0 +1,163 @@ +<template> + <a-modal + :width="modalWidth" + :visible="visible" + :footer="null" + @cancel="handleCancel" + cancelText="关闭"> + <!--table区 --> + <div class="marginCss"> + <a-table + ref="table" + size="small" + bordered + rowKey="id" + :columns="columns" + :dataSource="dataSource" + :rowClassName="setdataCss" + :loading="loading" + :scroll="{ y: 700 }" + :pagination="false"> + <span slot="dataVersionTitle1"><a-icon type="smile-o" /> 版本:{{dataVersion1Num}}</span> + <span slot="dataVersionTitle2"><a-icon type="smile-o" /> 版本:{{dataVersion2Num}}</span> + <template slot="avatarslot" slot-scope="text, record"> + <div class="anty-img-wrap"> + <img :src="getAvatarView(record)"/> + </div> + + </template> + </a-table> + </div> + </a-modal> +</template> + +<script> + import {getAction} from '@/api/manage' + + export default { + name: 'DataLogCompareModal', + data() { + return { + modalWidth: 1000, + modaltoggleFlag: true, + confirmDirty: false, + title: '操作', + visible: false, + model: {}, + confirmLoading: false, + headers: {}, + //版本号 + dataVersion1Num:'', + dataVersion2Num:'', + //表头 + columns: [ + { + title: '字段名', + align: 'left', + dataIndex: 'code', + width: '30%', + }, { + align: 'left', + dataIndex: 'dataVersion1', + width: '30%', + slots: { title: 'dataVersionTitle1' }, + }, { + title: '', + dataIndex: 'imgshow', + align: 'center', + scopedSlots: {customRender: "avatarslot"}, + width: '10%', + }, { + align: 'left', + dataIndex: 'dataVersion2', + width: '30%', + slots: { title: 'dataVersionTitle2' }, + } + ], + //数据集 + dataSource: [], + loading: false, + url: { + queryCompareUrl: "/sys/dataLog/queryCompareList", + }, + } + }, + created() { + + }, + methods: { + loadData(dataId1, dataId2) { + this.dataSource = []; + let that = this; + getAction(that.url.queryCompareUrl, {dataId1: dataId1, dataId2: dataId2}).then((res) => { + if (res.success) { + that.dataVersion1Num = res.result[0].dataVersion; + that.dataVersion2Num = res.result[1].dataVersion; + let json1 = JSON.parse(res.result[0].dataContent); + let json2 = JSON.parse(res.result[1].dataContent); + for (var item1 in json1) { + for (var item2 in json2) { + if (item1 == item2) { + this.dataSource.push({ + code: item1, + imgshow: '', + dataVersion1: json1[item1], + dataVersion2: json2[item2], + }) + } + } + } + } else { + console.log(res.message); + } + }) + }, + compareModal(dataId1, dataId2) { + this.visible = true + this.loadData(dataId1, dataId2); + }, + handleCancel() { + this.close() + }, + modalFormOk() { + }, + close() { + this.$emit('close'); + this.visible = false; + this.disableSubmit = false; + }, + setdataCss(record) { + let className = 'trcolor'; + const dataVersion1 = record.dataVersion1; + const dataVersion2 = record.dataVersion2; + if (dataVersion1 != dataVersion2) { + return className; + } + }, + getAvatarView: function (avatar) { + if (avatar.dataVersion1 != avatar.dataVersion2) { + return "/goright.png"; + } else { + return ""; + } + }, + } + } +</script> + +<style scoped> + .anty-img-wrap { + height: 25px; + position: relative; + } + + .anty-img-wrap > img { + max-height: 100%; + } + + .marginCss { + margin-top: 20px; + } + + @import '../../../assets/less/index.less'; +</style> \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/views/system/modules/DataLogModal.vue b/ant-design-jeecg-vue/src/views/system/modules/DataLogModal.vue new file mode 100644 index 0000000..c9f1e9c --- /dev/null +++ b/ant-design-jeecg-vue/src/views/system/modules/DataLogModal.vue @@ -0,0 +1,153 @@ +<template> + <div> + <a-modal + :width="modalWidth" + :visible="visible" + title="数据对比窗口" + :confirmLoading="confirmLoading" + @ok="handleOk" + @cancel="handleCancel" + cancelText="取消"> + + <a-spin :spinning="confirmLoading"> + <a-form @submit="handleSubmit" :form="form" class="form"> + <a-row class="form-row" :gutter="24"> + <a-col :md="12" :sm="8"> + <a-form-item label="数据库表名" :label-col="{ span: 6 }" :wrapper-col="{ span: 15 }"> + <a-input placeholder="请输入数据库表名" v-decorator="[ 'dataTale', {}]" @blur="handleTableBlur" disabled/> + </a-form-item> + </a-col> + + <a-col :md="12" :sm="8"> + <a-form-item label="数据ID" :label-col="{ span: 5 }" :wrapper-col="{ span: 15 }"> + <a-input placeholder="请输入数据ID" v-decorator="[ 'dataId', {}]" @blur="handleIdBlur" disabled/> + </a-form-item> + </a-col> + </a-row> + + <a-row class="form-row" :gutter="24"> + <a-col :md="12" :sm="8"> + <a-form-item label="版本号1" :label-col="{ span: 6 }" :wrapper-col="{ span: 15 }"> + <a-select placeholder="请选择版本号" v-decorator="[ 'dataVersion1', {}]" @change="handleChange1"> + <a-select-option v-for="(log,logindex) in DataVersionList" :key="logindex.toString()" :value="log.id"> + {{ log.dataVersion }} + </a-select-option> + </a-select> + </a-form-item> + </a-col> + <a-col :md="12" :sm="8"> + <a-form-item label="版本号2" :label-col="{ span: 5 }" :wrapper-col="{ span: 15 }"> + <a-select placeholder="请选择版本号" v-decorator="[ 'dataVersion2', {}]" @change="handleChange2"> + <a-select-option v-for="(log,logindex) in DataVersionList" :key="logindex.toString()" :value="log.id"> + {{ log.dataVersion }} + </a-select-option> + </a-select> + </a-form-item> + </a-col> + </a-row> + </a-form> + </a-spin> + <data-log-compare-modal ref="modal" @ok="modalFormOk" ></data-log-compare-modal> + </a-modal> + </div> +</template> + +<script> + import { getAction } from '@/api/manage' + import DataLogCompareModal from './DataLogCompareModal' + export default { + name: 'DataLogModal', + components: { DataLogCompareModal }, + dataId1:'', + dataId2: '', + dataTable1:'', + dataID3:'', + + data () { + return { + modalWidth:700, + modaltoggleFlag:true, + confirmDirty: false, + title:"操作", + visible: false, + model: {}, + confirmLoading: false, + headers:{}, + form:this.$form.createForm(this), + url: { + queryDataVerListUrl:"/sys/dataLog/queryDataVerList", + }, + DataVersionList:[], + } + }, + created () { + }, + methods: { + addModal(records){ + const dataTable = records[0].dataTable + const dataId = records[0].dataId; + const dataVersion1 = records[0].dataVersion; + const dataVersion2 = records[1].dataVersion; + this.dataId1 = records[0].id; + this.dataId2 = records[1].id; + this.dataTable1 = records[0].dataTable + this.dataID3 = records[0].dataId + this.initDataVersionList(); + this.form.resetFields(); + this.visible = true; + this.$nextTick(() => { + this.form.setFieldsValue({dataTale:dataTable,dataId:dataId,dataVersion1:dataVersion1,dataVersion2:dataVersion2}); + }); + }, + handleOk () { + this.close(); + this.$refs.modal.compareModal(this.dataId1 ,this.dataId2); + this.$refs.modal.title="数据比较"; + }, + handleCancel(){ + this.close() + }, + handleSubmit(){ + }, + close () { + this.$emit('close'); + this.visible = false; + this.disableSubmit = false; + }, + modalFormOk () { + }, + initDataVersionList(){ + let that = this; + getAction(that.url.queryDataVerListUrl,{dataTable:this.dataTable1,dataId:this.dataID3}).then((res)=>{ + if(res.success){ + this.DataVersionList = res.result; + }else{ + this.DataVersionList=[]; + this.dataId1 = '', + this.dataId2='', + console.log(res.message); + + } + }); + }, + handleChange1(value) { + this.dataId1 = value; + }, + handleChange2(value) { + this.dataId2 = value; + }, + handleTableBlur(e){ + this.dataTable1 = e.target.value; + this.initDataVersionList(); + }, + handleIdBlur(e){ + this.dataID3 = e.target.value; + this.initDataVersionList(); + } + } + } +</script> + +<style scoped> + +</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 index e55e87b..c4b76d0 100644 --- a/ant-design-jeecg-vue/src/views/system/modules/DepartModal.vue +++ b/ant-design-jeecg-vue/src/views/system/modules/DepartModal.vue @@ -120,7 +120,6 @@ for (let i = 0; i < res.result.length; i++) { let temp = res.result[i]; that.departTree.push(temp); - console.log(temp.id) } } diff --git a/ant-design-jeecg-vue/src/views/system/modules/DepartWindow.vue b/ant-design-jeecg-vue/src/views/system/modules/DepartWindow.vue index da93383..a4de2f8 100644 --- a/ant-design-jeecg-vue/src/views/system/modules/DepartWindow.vue +++ b/ant-design-jeecg-vue/src/views/system/modules/DepartWindow.vue @@ -101,13 +101,10 @@ 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} + departIdList:this.departList} console.log(formData) that.$emit('ok', formData); - }else{ - that.$message.warning("添加失败!"); } }).finally(() => { that.departList = []; diff --git a/ant-design-jeecg-vue/src/views/system/modules/DictItemModal.vue b/ant-design-jeecg-vue/src/views/system/modules/DictItemModal.vue index cda81a3..6d40f64 100644 --- a/ant-design-jeecg-vue/src/views/system/modules/DictItemModal.vue +++ b/ant-design-jeecg-vue/src/views/system/modules/DictItemModal.vue @@ -1,7 +1,7 @@ <template> <a-modal :title="title" - :width="600" + :width="800" :visible="visible" :confirmLoading="confirmLoading" @ok="handleOk" @@ -15,7 +15,7 @@ :labelCol="labelCol" :wrapperCol="wrapperCol" label="名称"> - <a-input placeholder="请输入名称" v-decorator="['itemText', validatorRules.itemText]" /> + <a-input placeholder="请输入名称" v-decorator="['itemText', validatorRules.itemText]"/> </a-form-item> <a-form-item @@ -36,14 +36,15 @@ :labelCol="labelCol" :wrapperCol="wrapperCol" label="排序值"> - <a-input-number :min="1" v-decorator="['sortOrder',{'initialValue':1}]"/> 值越小越靠前,支持小数 + <a-input-number :min="1" v-decorator="['sortOrder',{'initialValue':1}]"/> + 值越小越靠前,支持小数 </a-form-item> <a-form-item :labelCol="labelCol" :wrapperCol="wrapperCol" label="是否启用" - hasFeedback > + hasFeedback> <a-switch checkedChildren="启用" unCheckedChildren="禁用" @change="onChose" v-model="visibleCheck"/> </a-form-item> @@ -54,45 +55,45 @@ <script> import pick from 'lodash.pick' - import {addDictItem,editDictItem} from '@/api/api' + import {addDictItem, editDictItem, getDictItemList} from '@/api/api' export default { name: "DictItemModal", - data () { + data() { return { - title:"操作", + title: "操作", visible: false, visibleCheck: true, model: {}, - dictId:"", - status:1, + dictId: "", + status: 1, labelCol: { - xs: { span: 24 }, - sm: { span: 5 }, + xs: {span: 24}, + sm: {span: 5}, }, wrapperCol: { - xs: { span: 24 }, - sm: { span: 16 }, + xs: {span: 24}, + sm: {span: 16}, }, confirmLoading: false, form: this.$form.createForm(this), - validatorRules:{ - itemText:{rules: [{ required: true, message: '请输入名称!' }]}, - itemValue:{rules: [{ required: true, message: '请输入数据值!' }]}, + validatorRules: { + itemText: {rules: [{required: true, message: '请输入名称!'}]}, + itemValue: {rules: [{required: true, message: '请输入数据值!'}]}, }, } }, - created () { + created() { }, methods: { - add (dictId) { + add(dictId) { this.dictId = dictId; this.edit({}); }, - edit (record) { - if(record.id){ + edit(record) { + if (record.id) { this.dictId = record.dictId; - this.visibleCheck = (record.status == 1)?true:false; + this.visibleCheck = (record.status == 1) ? true : false; } this.form.resetFields(); this.model = Object.assign({}, record); @@ -100,20 +101,34 @@ this.model.status = this.status; this.visible = true; this.$nextTick(() => { - this.form.setFieldsValue(pick(this.model,'itemText','itemValue','description','sortOrder')) + this.form.setFieldsValue(pick(this.model, 'itemText', 'itemValue', 'description', 'sortOrder')) }); }, + // 将查询字典对象数据的方法拆分出来,需要的时候再加载 + getDictItemList() { + // 查询字典数据 + var params = this.getQueryParams();//查询条件 + getDictItemList(params).then((res) => { + if (res.success) { + this.dataSource = res.result.records; + console.log(this.dataSource) + this.ipagination.total = res.result.total; + this.loadrefresh = false; + this.loading = false; + } + }) + }, onChose(checked) { - if(checked){ - this.status=1; - this.visibleCheck=true; - }else{ - this.status=0; - this.visibleCheck=false; + if (checked) { + this.status = 1; + this.visibleCheck = true; + } else { + this.status = 0; + this.visibleCheck = false; } }, // 确定 - handleOk () { + handleOk() { const that = this; // 触发表单验证 this.form.validateFields((err, values) => { @@ -122,16 +137,16 @@ let formData = Object.assign(this.model, values); formData.status = this.status; let obj; - if(!this.model.id){ - obj=addDictItem(formData); - }else{ - obj=editDictItem(formData); + if (!this.model.id) { + obj = addDictItem(formData); + } else { + obj = editDictItem(formData); } - obj.then((res)=>{ - if(res.success){ + obj.then((res) => { + if (res.success) { that.$message.success(res.message); that.$emit('ok'); - }else{ + } else { that.$message.warning(res.message); } }).finally(() => { @@ -142,10 +157,10 @@ }) }, // 关闭 - handleCancel () { + handleCancel() { this.close(); }, - close () { + close() { this.$emit('close'); this.visible = false; }, diff --git a/ant-design-jeecg-vue/src/views/system/modules/DictModal.vue b/ant-design-jeecg-vue/src/views/system/modules/DictModal.vue index 20ca328..95e9e26 100644 --- a/ant-design-jeecg-vue/src/views/system/modules/DictModal.vue +++ b/ant-design-jeecg-vue/src/views/system/modules/DictModal.vue @@ -15,7 +15,7 @@ :labelCol="labelCol" :wrapperCol="wrapperCol" label="字典名称"> - <a-input placeholder="请输入字典名称" v-decorator="[ 'dictName', validatorRules.dictName]" /> + <a-input placeholder="请输入字典名称" v-decorator="[ 'dictName', validatorRules.dictName]"/> </a-form-item> <a-form-item @@ -39,56 +39,75 @@ <script> import pick from 'lodash.pick' - import {addDict,editDict} from '@/api/api' + import {addDict, editDict, duplicateCheck} from '@/api/api' export default { name: "DictModal", - data () { + data() { return { - value:1, - title:"操作", + value: 1, + title: "操作", visible: false, model: {}, labelCol: { - xs: { span: 24 }, - sm: { span: 5 }, + xs: {span: 24}, + sm: {span: 5}, }, wrapperCol: { - xs: { span: 24 }, - sm: { span: 16 }, + xs: {span: 24}, + sm: {span: 16}, }, confirmLoading: false, form: this.$form.createForm(this), - validatorRules:{ - dictName:{rules: [{ required: true, message: '请输入字典名称!' }]}, - dictCode:{rules: [{ required: true, message: '请输入字典编码!' }]}, + validatorRules: { + dictName: {rules: [{required: true, message: '请输入字典名称!'}]}, + dictCode: { + rules: [{required: true, message: '请输入字典编码!'}, + {validator: this.validateDictCode,}] + }, }, } }, - created () { + created() { }, methods: { + validateDictCode(rule, value, callback) { + // 重复校验 + var params = { + tableName: "sys_dict", + fieldName: "dict_code", + fieldVal: value, + dataId: this.model.id, + }; + duplicateCheck(params).then((res) => { + if (res.success) { + callback(); + } else { + callback(res.message); + } + }); + }, handleChange(value) { this.model.status = value; }, - add () { + add() { this.edit({}); }, - edit (record) { - if(record.id){ + edit(record) { + if (record.id) { this.visiblekey = true; - }else{ + } 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')) + this.form.setFieldsValue(pick(this.model, 'dictName', 'dictCode', 'description')) }); }, // 确定 - handleOk () { + handleOk() { const that = this; // 触发表单验证 this.form.validateFields((err, values) => { @@ -97,17 +116,17 @@ let formData = Object.assign(this.model, values); let obj; console.log(formData) - if(!this.model.id){ + if (!this.model.id) { formData.delFlag = "1"; - obj=addDict(formData); - }else{ - obj=editDict(formData); + obj = addDict(formData); + } else { + obj = editDict(formData); } - obj.then((res)=>{ - if(res.success){ + obj.then((res) => { + if (res.success) { that.$message.success(res.message); that.$emit('ok'); - }else{ + } else { that.$message.warning(res.message); } }).finally(() => { @@ -118,10 +137,10 @@ }) }, // 关闭 - handleCancel () { + handleCancel() { this.close(); }, - close () { + close() { this.$emit('close'); this.visible = false; }, diff --git a/ant-design-jeecg-vue/src/views/system/modules/PermissionDataRuleModal.vue b/ant-design-jeecg-vue/src/views/system/modules/PermissionDataRuleModal.vue new file mode 100644 index 0000000..6e79c4b --- /dev/null +++ b/ant-design-jeecg-vue/src/views/system/modules/PermissionDataRuleModal.vue @@ -0,0 +1,162 @@ +<template> + <a-modal + :title="title" + :width="1000" + :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="['ruleName', validatorRules.ruleName]"/> + </a-form-item> + <a-form-item + v-show="showRuleColumn" + :labelCol="labelCol" + :wrapperCol="wrapperCol" + label="规则字段"> + <a-input placeholder="请输入规则字段" v-decorator="['ruleColumn', validatorRules.ruleColumn]"/> + </a-form-item> + <a-form-item + :labelCol="labelCol" + :wrapperCol="wrapperCol" + label="条件规则"> + <j-dict-select-tag @change="handleChangeRuleCondition" v-decorator="['ruleConditions', validatorRules.ruleConditions]" placeholder="请输入条件规则" :triggerChange="true" dictCode="rule_conditions"/> + </a-form-item> + <a-form-item + :labelCol="labelCol" + :wrapperCol="wrapperCol" + label="规则值"> + <a-input placeholder="请输入规则值" v-decorator="['ruleValue', validatorRules.ruleValue]"/> + </a-form-item> + </a-form> + </a-spin> + </a-modal> +</template> +<script> + import {httpAction, getAction} from '@/api/manage' + import pick from 'lodash.pick' + + export default { + name: 'PermissionDataRuleModal', + data() { + return { + queryParam: {}, + title: '操作', + visible: false, + model: {}, + ruleConditionList: [], + labelCol: { + xs: {span: 24}, + sm: {span: 5} + }, + wrapperCol: { + xs: {span: 24}, + sm: {span: 16} + }, + confirmLoading: false, + form: this.$form.createForm(this), + permissionId: '', + validatorRules: { + ruleConditions: {rules: [{required: true, message: '请选择条件!'}]}, + ruleName: {rules: [{required: true, message: '请输入规则名称!'}]}, + ruleValue: {rules: [{required: true, message: '请输入规则值!'}]}, + ruleColumn: {rules: []} + }, + url: { + list: '/sys/dictItem/list', + add: '/sys/permission/addPermissionRule', + edit: '/sys/permission/editPermissionRule' + }, + showRuleColumn:true + } + }, + created() { + }, + methods: { + add(permId) { + this.permissionId = permId + this.edit({}) + }, + edit(record) { + this.form.resetFields() + this.model = Object.assign({}, record) + if (record.permissionId) { + this.model.permissionId = record.permissionId + } else { + this.model.permissionId = this.permissionId + } + this.visible = true + this.initRuleCondition() + this.$nextTick(() => { + this.form.setFieldsValue(pick(this.model, 'ruleName', 'ruleColumn', 'ruleConditions', 'ruleValue')) + }) + }, + 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) + 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() + }, + initRuleCondition(){ + if(this.model.ruleConditions && this.model.ruleConditions=='USE_SQL_RULES'){ + this.showRuleColumn = false + }else{ + this.showRuleColumn = true + } + }, + handleChangeRuleCondition(val){ + if(val=='USE_SQL_RULES'){ + this.form.setFieldsValue({ + ruleColumn:'' + }) + this.showRuleColumn = false + }else{ + this.showRuleColumn = true + } + } + } + } +</script> + +<style scoped> + +</style> \ 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 index 231d8ac..cac0d2f 100644 --- a/ant-design-jeecg-vue/src/views/system/modules/PermissionModal.vue +++ b/ant-design-jeecg-vue/src/views/system/modules/PermissionModal.vue @@ -1,23 +1,21 @@ <template> - <a-modal + <a-drawer :title="title" - :width="900" + :width="drawerWidth" + @close="handleCancel" :visible="visible" :confirmLoading="confirmLoading" - @ok="handleOk" - @cancel="handleCancel" - :okButtonProps="{ props: {disabled: disableSubmit} }" - cancelText="关闭" - wrapClassName="ant-modal-cust-warp" - style="top:5%;height: 95%;"> + :wrapStyle="{height: 'calc(100% - 108px)',overflow: 'auto',paddingBottom: '108px'}" + > + <div :style="{width: '100%',border: '1px solid #e9e9e9',padding: '10px 16px',background: '#fff',}"> <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-group @change="onChangeMenuType" v-decorator="['menuType',{'initialValue':0}]"> <a-radio :value="0">一级菜单</a-radio> <a-radio :value="1">子菜单</a-radio> - <a-radio :value="2">按钮</a-radio> + <a-radio :value="2">按钮/数据权限</a-radio> </a-radio-group> </a-form-item> @@ -98,6 +96,14 @@ v-show="show" :labelCol="labelCol" :wrapperCol="wrapperCol" + label="是否路由菜单"> + <a-switch checkedChildren="是" unCheckedChildren="否" v-model="routeSwitch"/> + </a-form-item> + + <a-form-item + v-show="show" + :labelCol="labelCol" + :wrapperCol="wrapperCol" label="隐藏路由"> <a-switch checkedChildren="是" unCheckedChildren="否" v-model="menuHidden"/> </a-form-item> @@ -116,7 +122,14 @@ <!-- 选择图标 --> <icons @choose="handleIconChoose" @close="handleIconCancel" :iconChooseVisible="iconChooseVisible"></icons> </a-spin> - </a-modal> + <a-row :style="{textAlign:'right'}"> + <a-button :style="{marginRight: '8px'}" @click="handleCancel"> + 关闭 + </a-button> + <a-button :disabled="disableSubmit" @click="handleOk" type="primary">确定</a-button> + </a-row> + </div> + </a-drawer> </template> <script> @@ -129,6 +142,7 @@ components: {Icons}, data () { return { + drawerWidth:700, treeData:[], treeValue: '0-0-4', title:"操作", @@ -138,6 +152,7 @@ localMenuType:'1', alwaysShow:false,//表单元素-聚合路由 menuHidden:false,//表单元素-隐藏路由 + routeSwitch:true, //是否路由菜单 show:true,//根据菜单类型,动态显示隐藏表单元素 menuLabel:'菜单名称', labelCol: { @@ -181,17 +196,20 @@ this.edit(); }, edit (record) { + this.resetScreenSize(); // 调用此方法,根据屏幕宽度自适应调整抽屉的宽度 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; + this.routeSwitch = record.route; //console.log('record.menuType', record.menuType); this.show = record.menuType==2?false:true; - this.menuLabel = record.menuType==2?'按钮名称':'菜单名称'; + this.menuLabel = record.menuType==2?'按钮/权限名称':'菜单名称'; if(this.model.parentId){ this.localMenuType = 1; @@ -199,9 +217,15 @@ this.localMenuType = 0; } }else{ + if(this.model.parentId){ + this.localMenuType = 1; + }else{ + this.localMenuType = 0; + } this.show = true; this.menuLabel = '菜单名称'; } + //---------------------------------------------------------------------------------------------- this.visible = true; this.loadTree(); @@ -223,6 +247,7 @@ that.confirmLoading = true; this.model.alwaysShow = this.alwaysShow; this.model.hidden = this.menuHidden; + this.model.route = this.routeSwitch; let formData = Object.assign(this.model, values); console.log(formData); let obj; @@ -260,7 +285,7 @@ this.localMenuType=e.target.value if(e.target.value == 2){ this.show = false; - this.menuLabel = '按钮名称'; + this.menuLabel = '按钮/权限名称'; }else{ this.show = true; this.menuLabel = '菜单名称'; @@ -278,6 +303,15 @@ this.form.icon = value this.iconChooseVisible = false }, + // 根据屏幕变化,设置抽屉尺寸 + resetScreenSize(){ + let screenWidth = document.body.clientWidth; + if(screenWidth < 500){ + this.drawerWidth = screenWidth; + }else{ + this.drawerWidth = 700; + } + }, } } </script> diff --git a/ant-design-jeecg-vue/src/views/system/modules/RoleDataruleModal.vue b/ant-design-jeecg-vue/src/views/system/modules/RoleDataruleModal.vue new file mode 100644 index 0000000..8897548 --- /dev/null +++ b/ant-design-jeecg-vue/src/views/system/modules/RoleDataruleModal.vue @@ -0,0 +1,121 @@ +<template> + <a-drawer + title="数据规则/按钮权限配置" + width=365 + :closable="false" + @close="onClose" + :visible="visible" + > + + <a-tabs defaultActiveKey="1"> + <a-tab-pane tab="数据规则" key="1"> + + <a-checkbox-group v-model="dataruleChecked" v-if="dataruleList.length>0"> + <a-row> + <a-col :span="24" v-for="(item,index) in dataruleList" :key=" 'dr'+index "> + <a-checkbox :value="item.id">{{ item.ruleName }}</a-checkbox> + </a-col> + + <a-col :span="24"> + <div style="width: 100%;margin-top: 15px"> + <a-button @click="saveDataruleForRole" type="primary" size="small" icon="save">点击保存</a-button> + </div> + </a-col> + </a-row> + </a-checkbox-group> + <div v-else><h3>无配置信息!</h3></div> + + </a-tab-pane> + <!--<a-tab-pane tab="按钮权限" key="2">敬请期待!!!</a-tab-pane>--> + </a-tabs> + + </a-drawer> +</template> + +<script> + import ARow from 'ant-design-vue/es/grid/Row' + import ACol from 'ant-design-vue/es/grid/Col' + import { getAction,postAction } from '@/api/manage' + + export default { + name: 'RoleDataruleModal', + components: { ACol, ARow }, + data(){ + return { + functionId:'', + roleId:'', + visible:false, + tabList: [{ + key: '1', + tab: '数据规则', + }, { + key: '2', + tab: '按钮权限', + }], + activeTabKey: '1', + url:{ + datarule:"/sys/role/datarule", + }, + dataruleList:[], + dataruleChecked:[] + } + }, + methods:{ + loadData(){ + getAction(`${this.url.datarule}/${this.functionId}/${this.roleId}`).then(res=>{ + console.log(res) + if(res.success){ + this.dataruleList = res.result.datarule + let drChecked = res.result.drChecked + if(drChecked){ + this.dataruleChecked = drChecked.split(",") + } + } + }) + }, + saveDataruleForRole(){ + if(!this.dataruleChecked || this.dataruleChecked.length==0){ + this.$message.warning("请现勾选数据权限然后保存!") + return false; + } + let params = { + permissionId:this.functionId, + roleId:this.roleId, + dataRuleIds:this.dataruleChecked.join(",") + } + console.log("保存数据权限",params) + postAction(this.url.datarule,params).then(res=>{ + if(res.success){ + this.$message.success(res.message) + }else{ + this.$message.error(res.message) + } + }) + }, + show(functionId,roleId){ + this.onReset() + this.functionId = functionId + this.roleId = roleId + this.visible=true + this.loadData() + }, + onClose(){ + this.visible=false + this.onReset() + }, + onTabChange (key) { + this.activeTabKey = key + }, + onReset(){ + this.functionId='' + this.roleId='' + this.dataruleList=[] + this.dataruleChecked=[] + } + } + } +</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 index 9479e7d..4c9fe08 100644 --- a/ant-design-jeecg-vue/src/views/system/modules/UserModal.vue +++ b/ant-design-jeecg-vue/src/views/system/modules/UserModal.vue @@ -1,20 +1,19 @@ <template> - <a-modal - :width="modalWidth" + <a-drawer + :title="title" + :maskClosable="true" + :width="drawerWidth" + placement="right" + :closable="true" + @close="handleCancel" :visible="visible" - :confirmLoading="confirmLoading" - :okButtonProps="{ props: {disabled: disableSubmit} }" - @ok="handleSubmit" - @cancel="handleCancel" - cancelText="关闭" - wrapClassName="ant-modal-cust-warp" - style="top:5%;height: auto;overflow-y: hidden"> + style="height: calc(100% - 55px);overflow: auto;padding-bottom: 53px;"> <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 style="display:inline-block;width:calc(100% - 51px);padding-right:10px;text-align: right"> + <a-button @click="toggleScreen" icon="appstore" style="height:20px;width:20px;border:0px"></a-button> </span> </div> @@ -23,25 +22,25 @@ <a-spin :spinning="confirmLoading"> <a-form :form="form"> - <a-form-item label="用户账号" :labelCol="labelCol" :wrapperCol="wrapperCol" hasFeedback> + <a-form-item label="用户账号" :labelCol="labelCol" :wrapperCol="wrapperCol"> <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-form-item label="登陆密码" :labelCol="labelCol" :wrapperCol="wrapperCol" > <a-input type="password" placeholder="请输入登陆密码" v-decorator="[ 'password', validatorRules.password]" /> </a-form-item> - <a-form-item label="确认密码" :labelCol="labelCol" :wrapperCol="wrapperCol" hasFeedback > + <a-form-item label="确认密码" :labelCol="labelCol" :wrapperCol="wrapperCol" > <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-form-item label="用户名字" :labelCol="labelCol" :wrapperCol="wrapperCol" > <a-input placeholder="请输入用户名称" v-decorator="[ 'realname', validatorRules.realname]" /> </a-form-item> - <a-form-item label="角色分配" :labelCol="labelCol" :wrapperCol="wrapperCol" hasFeedback > + <a-form-item label="角色分配" :labelCol="labelCol" :wrapperCol="wrapperCol" > <a-select mode="multiple" style="width: 100%" @@ -50,14 +49,18 @@ <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-input-search + placeholder="点击右侧按钮选择部门" + v-model="checkedDepartNameString" + disabled + @search="onSearch"> + <a-button slot="enterButton" icon="search">选择</a-button> + </a-input-search> + </a-form-item> <a-form-item label="头像" :labelCol="labelCol" :wrapperCol="wrapperCol"> <a-upload @@ -78,50 +81,68 @@ </a-upload> </a-form-item> - <a-form-item label="生日" :labelCol="labelCol" :wrapperCol="wrapperCol" hasFeedback > + <a-form-item label="生日" :labelCol="labelCol" :wrapperCol="wrapperCol"> <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-form-item label="性别" :labelCol="labelCol" :wrapperCol="wrapperCol"> + <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 label="邮箱" :labelCol="labelCol" :wrapperCol="wrapperCol" hasFeedback > + <a-form-item label="邮箱" :labelCol="labelCol" :wrapperCol="wrapperCol"> <a-input placeholder="请输入邮箱" v-decorator="[ 'email', validatorRules.email]" /> </a-form-item> - <a-form-item label="手机号码" :labelCol="labelCol" :wrapperCol="wrapperCol" hasFeedback > + <a-form-item label="手机号码" :labelCol="labelCol" :wrapperCol="wrapperCol"> <a-input placeholder="请输入手机号码" v-decorator="[ 'phone', validatorRules.phone]" /> </a-form-item> </a-form> </a-spin> - </a-modal> + <depart-window ref="departWindow" @ok="modalFormOk"></depart-window> + + <div class="drawer-bootom-button" v-show="!disableSubmit"> + <a-popconfirm title="确定放弃编辑?" @confirm="handleCancel" okText="确定" cancelText="取消"> + <a-button style="margin-right: .8rem">取消</a-button> + </a-popconfirm> + <a-button @click="handleSubmit" type="primary" :loading="confirmLoading">提交</a-button> + </div> + </a-drawer> </template> <script> import pick from 'lodash.pick' import moment from 'moment' import Vue from 'vue' + // 引入搜索部门弹出框的组件 + import departWindow from './DepartWindow' import { ACCESS_TOKEN } from "@/store/mutation-types" - import {doMian,addUser,editUser,queryUserRole,queryall,checkUsername} from '@/api/api' - + import { getAction, httpAction } from '@/api/manage' + import {addUser,editUser,queryUserRole,queryall,checkUsername } from '@/api/api' export default { name: "RoleModal", + components: { + departWindow, + }, data () { return { modalWidth:800, + drawerWidth:700, modaltoggleFlag:true, confirmDirty: false, + selectedDepartKeys:[], //保存用户选择部门id + checkedDepartKeys:[], + checkedDepartNames:[], // 保存部门的名称 =>title + checkedDepartNameString:"", // 保存部门的名称 =>title + userId:"", //保存用户id disableSubmit:false, + userDepartModel:{userId:'',departIdList:[]}, // 保存SysUserDepart的用户部门中间表数据需要的对象 dateFormat:"YYYY-MM-DD", validatorRules:{ username:{ @@ -169,8 +190,11 @@ headers:{}, form:this.$form.createForm(this), url: { - fileUpload:doMian+"sys/common/upload", - imgerver:doMian+"sys/common/view", + addUDepartIds:"/sys/user/addUDepartIds", // 引入为用户添加部门信息需要的url + editUDepartIds:"/sys/user/editUDepartIds", // 引入为用户更新部门信息需要的url + fileUpload: window._CONFIG['domianURL']+"/sys/common/upload", + imgerver: window._CONFIG['domianURL']+"/sys/common/view", + userWithDepart: "/sys/user/userDepartList", // 引入为指定用户查看部门信息需要的url }, } }, @@ -185,8 +209,8 @@ } }, methods: { - - togglescreen(){ + //窗口最大化切换 + toggleScreen(){ if(this.modaltoggleFlag){ this.modalWidth = window.innerWidth; }else{ @@ -212,29 +236,59 @@ } }); }, + refresh () { + this.selectedDepartKeys=[] + this.checkedDepartKeys=[] + this.checkedDepartNames=[] + this.checkedDepartNameString = "" + this.userId="" + }, add () { + this.refresh() this.edit({}); }, edit (record) { - this.initialRoleList(); - this.form.resetFields(); + this.resetScreenSize(); // 调用此方法,根据屏幕宽度自适应调整抽屉的宽度 + let that = this; + that.initialRoleList(); + that.checkedDepartNameString = ""; + that.form.resetFields(); if(record.hasOwnProperty("id")){ - this.loadUserRoles(record.id); + that.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); + that.userId = record.id; + that.visible = true; + that.model = Object.assign({}, record); + that.$nextTick(() => { + that.form.setFieldsValue(pick(this.model,'username','sex','realname','email','phone')) }); - + // 调用查询用户对应的部门信息的方法 + that.checkedDepartKeys = []; + that.loadCheckedDeparts(); + }, + // + loadCheckedDeparts(){ + let that = this; + getAction(that.url.userWithDepart,{userId:that.userId}).then((res)=>{ + that.checkedDepartNames = []; + if(res.success){ + for (let i = 0; i < res.result.length; i++) { + that.checkedDepartNames.push(res.result[i].title); + this.checkedDepartNameString = this.checkedDepartNames.join(","); + that.checkedDepartKeys.push(res.result[i].key); + } + }else{ + console.log(res.message); + } + }) }, close () { this.$emit('close'); this.visible = false; this.disableSubmit = false; this.selectedRole = []; + this.userDepartModel = {}; + this.checkedDepartNames = []; }, moment, handleSubmit () { @@ -252,8 +306,11 @@ let formData = Object.assign(this.model, values); formData.avatar = avatar; formData.selectedroles = this.selectedRole.length>0?this.selectedRole.join(","):''; + + that.addDepartsToUser(that,formData); // 调用根据当前用户添加部门信息的方法 let obj; if(!this.model.id){ + formData.id = this.userId; obj=addUser(formData); }else{ obj=editUser(formData); @@ -267,6 +324,7 @@ } }).finally(() => { that.confirmLoading = false; + that.checkedDepartNames = []; that.close(); }) @@ -276,6 +334,26 @@ handleCancel () { this.close() }, + + // 根据当前用户添加部门信息的方法 + addDepartsToUser(that,formData){ + let httpurl = ''; + let method = ''; + if(this.userDepartModel.userId != formData.id){ + httpurl+=this.url.addUDepartIds; + method = 'post'; + }else{ + httpurl+=this.url.editUDepartIds; + method = 'put'; + } + httpAction(httpurl,this.userDepartModel,method).then((res)=>{ + if(res.success){ + this.userDepartModel = {}; + }else{ + that.$message.warning(res.message); + } + }) + }, validateToNextPassword (rule, value, callback) { const form = this.form; if (value && this.confirmDirty) { @@ -350,7 +428,33 @@ getAvatarView(){ return this.url.imgerver +"/"+ this.model.avatar; }, + // 搜索用户对应的部门API + onSearch(){ + this.$refs.departWindow.add(this.checkedDepartKeys,this.userId); + }, + // 获取用户对应部门弹出框提交给返回的数据 + modalFormOk (formData) { + this.checkedDepartNames = []; + this.selectedDepartKeys = []; + this.userId = formData.userId; + this.userDepartModel.userId = formData.userId; + for (let i = 0; i < formData.departIdList.length; i++) { + this.selectedDepartKeys.push(formData.departIdList[i].key); + this.checkedDepartNames.push(formData.departIdList[i].title); + this.checkedDepartNameString = this.checkedDepartNames.join(","); + } + this.userDepartModel.departIdList = this.selectedDepartKeys; + }, + // 根据屏幕变化,设置抽屉尺寸 + resetScreenSize(){ + let screenWidth = document.body.clientWidth; + if(screenWidth < 500){ + this.drawerWidth = screenWidth; + }else{ + this.drawerWidth = 700; + } + }, } } </script> @@ -375,4 +479,15 @@ padding-bottom:10px; } + .drawer-bootom-button { + position: absolute; + bottom: -8px; + 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/UserRoleModal.vue b/ant-design-jeecg-vue/src/views/system/modules/UserRoleModal.vue index e935f29..8dadf4e 100644 --- a/ant-design-jeecg-vue/src/views/system/modules/UserRoleModal.vue +++ b/ant-design-jeecg-vue/src/views/system/modules/UserRoleModal.vue @@ -9,18 +9,23 @@ :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> + <a-form> + <a-form-item label='所拥有的权限'> + <a-tree + checkable + @check="onCheck" + :checkedKeys="checkedKeys" + :treeData="treeData" + @expand="onExpand" + @select="onTreeNodeSelect" + :expandedKeys="expandedKeysss" + :checkStrictly="checkStrictly"> + <span slot="hasDatarule" slot-scope="{slotTitle,icon}"> + {{ slotTitle }}<a-icon v-if="icon" type="align-left" style="margin-left:5px;color: red;"></a-icon> + </span> + </a-tree> + </a-form-item> + </a-form> <div class="drawer-bootom-button"> <a-dropdown style="float: left" :trigger="['click']" placement="topCenter"> @@ -41,13 +46,21 @@ </a-popconfirm> <a-button @click="handleSubmit" type="primary" :loading="loading">提交</a-button> </div> + + <role-datarule-modal ref="datarule"></role-datarule-modal> + </a-drawer> </template> <script> - import {queryTreeList,queryRolePermission,saveRolePermission} from '@/api/api' + import {queryTreeListForRole,queryRolePermission,saveRolePermission} from '@/api/api' + import RoleDataruleModal from './RoleDataruleModal.vue' + export default { name: "RoleModal", + components:{ + RoleDataruleModal + }, data(){ return { roleId:"", @@ -64,6 +77,9 @@ } }, methods: { + onTreeNodeSelect(id){ + this.$refs.datarule.show(id[0],this.roleId) + }, onCheck (o) { if(this.checkStrictly){ this.checkedKeys = o.checked; @@ -137,7 +153,7 @@ watch: { visible () { if (this.visible) { - queryTreeList().then((res) => { + queryTreeListForRole().then((res) => { this.treeData = res.result.treeList this.allTreeKeys = res.result.ids queryRolePermission({roleId:this.roleId}).then((res)=>{ @@ -165,4 +181,5 @@ background: #fff; border-radius: 0 0 2px 2px; } + </style> \ No newline at end of file diff --git a/ant-design-jeecg-vue/src/views/user/Login.vue b/ant-design-jeecg-vue/src/views/user/Login.vue index f836857..3a36a5d 100644 --- a/ant-design-jeecg-vue/src/views/user/Login.vue +++ b/ant-design-jeecg-vue/src/views/user/Login.vue @@ -73,7 +73,7 @@ </a-button> </a-form-item> - <div class="user-login-other"> + <!-- <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> @@ -81,7 +81,7 @@ <router-link class="register" :to="{ name: 'register' }"> 注册账户 </router-link> - </div> + </div>--> </a-form> <two-step-captcha diff --git a/ant-design-jeecg-vue/vue.config.js b/ant-design-jeecg-vue/vue.config.js index f3cf6da..d0b7cdc 100644 --- a/ant-design-jeecg-vue/vue.config.js +++ b/ant-design-jeecg-vue/vue.config.js @@ -10,8 +10,9 @@ module.exports = { Vue-cli3: Crashed when using Webpack `import()` #2463 https://github.com/vuejs/vue-cli/issues/2463 - */ + // 如果你不需要生产环境的 source map,可以将其设置为 false 以加速生产环境构建。 + productionSourceMap: false, /* pages: { index: { diff --git a/ant-design-jeecg-vue/yarn.lock b/ant-design-jeecg-vue/yarn.lock index 3dcb250..ba92e6f 100644 --- a/ant-design-jeecg-vue/yarn.lock +++ b/ant-design-jeecg-vue/yarn.lock @@ -4,16 +4,16 @@ "@ant-design/icons-vue@^1.0.1": version "1.0.1" - resolved "http://registry.npm.taobao.org/@ant-design/icons-vue/download/@ant-design/icons-vue-1.0.1.tgz#343579219c04190831c9ca3826aec7361bb8b4d4" - integrity sha1-NDV5IZwEGQgxyco4Jq7HNhu4tNQ= + resolved "https://registry.npmjs.org/@ant-design/icons-vue/-/icons-vue-1.0.1.tgz#343579219c04190831c9ca3826aec7361bb8b4d4" + integrity sha512-WRlfa3t9/e2wwVw9FPRgJ/pan4Ttzd+JvgounFsXdpuyDm0q6djAwhjj7W/ZxWWU3XkArbcaXTMSslnn25804w== dependencies: ant-design-palettes "^1.1.3" babel-runtime "^6.26.0" "@ant-design/icons@^1.1.15": version "1.2.1" - resolved "http://registry.npm.taobao.org/@ant-design/icons/download/@ant-design/icons-1.2.1.tgz#8e19301b1433ec67d6bbd0e892782e2ade561ff9" - integrity sha1-jhkwGxQz7GfWu9DoknguKt5WH/k= + resolved "https://registry.npmjs.org/@ant-design/icons/-/icons-1.2.1.tgz#8e19301b1433ec67d6bbd0e892782e2ade561ff9" + integrity sha512-gQx3nH6m1xvebOWh5xibhzVK02aoqHY7JUXUS4doAidSDRWsj5iwKC8Gq9DemDZ4T+bW6xO7jJZN1UsbvcW7Uw== "@antv/adjust@~0.1.0": version "0.1.0" @@ -507,8 +507,8 @@ "@babel/plugin-syntax-jsx@^7.2.0": version "7.2.0" - resolved "http://registry.npm.taobao.org/@babel/plugin-syntax-jsx/download/@babel/plugin-syntax-jsx-7.2.0.tgz#0b85a3b4bc7cdf4cc4b8bf236335b907ca22e7c7" - integrity sha1-C4WjtLx830zEuL8jYzW5B8oi58c= + resolved "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.2.0.tgz#0b85a3b4bc7cdf4cc4b8bf236335b907ca22e7c7" + integrity sha512-VyN4QANJkRW6lDBmENzRszvZf3/4AXaj9YR7GwrWeeN9tEBPuXbmDYVU9bYBN0D70zCWVwUy0HWq2553VCb6Hw== dependencies: "@babel/helper-plugin-utils" "^7.0.0" @@ -753,8 +753,8 @@ "@babel/polyfill@^7.2.5": version "7.2.5" - resolved "http://registry.npm.taobao.org/@babel/polyfill/download/@babel/polyfill-7.2.5.tgz#6c54b964f71ad27edddc567d065e57e87ed7fa7d" - integrity sha1-bFS5ZPca0n7d3FZ9Bl5X6H7X+n0= + resolved "https://registry.npmjs.org/@babel/polyfill/-/polyfill-7.2.5.tgz#6c54b964f71ad27edddc567d065e57e87ed7fa7d" + integrity sha512-8Y/t3MWThtMLYr0YNC/Q76tqN1w30+b0uQMeFUYauG2UGTR19zyUtFrAzT23zNtBxPp+LbE5E/nwV/q/r3y6ug== dependencies: core-js "^2.5.7" regenerator-runtime "^0.12.0" @@ -808,8 +808,8 @@ "@babel/runtime-corejs2@^7.2.0": version "7.3.4" - resolved "http://registry.npm.taobao.org/@babel/runtime-corejs2/download/@babel/runtime-corejs2-7.3.4.tgz#63f8bbc77622da202e9ea6f8f6e3bf28991832d9" - integrity sha1-Y/i7x3Yi2iAunqb49uO/KJkYMtk= + resolved "https://registry.npmjs.org/@babel/runtime-corejs2/-/runtime-corejs2-7.3.4.tgz#63f8bbc77622da202e9ea6f8f6e3bf28991832d9" + integrity sha512-QwPuQE65kNxjsNKk34Rfgen2R5fk0J2So99SD45uXBp34QOfyz11SqVgJ4xvyCpnCIieSQ0X0hSSc9z/ymlJJw== dependencies: core-js "^2.5.7" regenerator-runtime "^0.12.0" @@ -908,18 +908,25 @@ "@nodelib/fs.stat@^1.1.2": version "1.1.3" - resolved "http://registry.npm.taobao.org/@nodelib/fs.stat/download/@nodelib/fs.stat-1.1.3.tgz#2b5a3ab3f918cca48a8c754c08168e3f03eba61b" - integrity sha1-K1o6s/kYzKSKjHVMCBaOPwPrphs= + resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz#2b5a3ab3f918cca48a8c754c08168e3f03eba61b" + integrity sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw== "@soda/friendly-errors-webpack-plugin@^1.7.1": version "1.7.1" - resolved "http://registry.npm.taobao.org/@soda/friendly-errors-webpack-plugin/download/@soda/friendly-errors-webpack-plugin-1.7.1.tgz#706f64bcb4a8b9642b48ae3ace444c70334d615d" - integrity sha1-cG9kvLSouWQrSK46zkRMcDNNYV0= + resolved "https://registry.npmjs.org/@soda/friendly-errors-webpack-plugin/-/friendly-errors-webpack-plugin-1.7.1.tgz#706f64bcb4a8b9642b48ae3ace444c70334d615d" + integrity sha512-cWKrGaFX+rfbMrAxVv56DzhPNqOJPZuNIS2HGMELtgGzb+vsMzyig9mml5gZ/hr2BGtSLV+dP2LUEuAL8aG2mQ== dependencies: chalk "^1.1.3" error-stack-parser "^2.0.0" string-width "^2.0.0" +"@tinymce/tinymce-vue@^2.0.0": + version "2.0.0" + resolved "https://registry.npmjs.org/@tinymce/tinymce-vue/-/tinymce-vue-2.0.0.tgz#41cea256f67f195ac52f71b1cc0bcbda850c86f0" + integrity sha512-oUl8r1WvoLsy1NxpFMPNa8hZohkha6biNGLBAhtWUEIsqnmAhvosTPdVj2uroAlK7rjOcDTOy2jIkuNOsLuvtA== + dependencies: + vue "^2.5.17" + "@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" @@ -927,13 +934,13 @@ "@types/events@*": version "3.0.0" - resolved "http://registry.npm.taobao.org/@types/events/download/@types/events-3.0.0.tgz#2862f3f58a9a7f7c3e78d79f130dd4d71c25c2a7" - integrity sha1-KGLz9Yqaf3w+eNefEw3U1xwlwqc= + resolved "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz#2862f3f58a9a7f7c3e78d79f130dd4d71c25c2a7" + integrity sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g== "@types/glob@^7.1.1": version "7.1.1" - resolved "http://registry.npm.taobao.org/@types/glob/download/@types/glob-7.1.1.tgz#aa59a1c6e3fbc421e07ccd31a944c30eba521575" - integrity sha1-qlmhxuP7xCHgfM0xqUTDDrpSFXU= + resolved "https://registry.npmjs.org/@types/glob/-/glob-7.1.1.tgz#aa59a1c6e3fbc421e07ccd31a944c30eba521575" + integrity sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w== dependencies: "@types/events" "*" "@types/minimatch" "*" @@ -946,8 +953,8 @@ "@types/minimatch@*": version "3.0.3" - resolved "http://registry.npm.taobao.org/@types/minimatch/download/@types/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" - integrity sha1-PcoOPzOyAPx9ETnAzZbBJoyt/Z0= + resolved "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" + integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA== "@types/node@*": version "10.12.11" @@ -961,13 +968,13 @@ "@vue/babel-helper-vue-jsx-merge-props@^1.0.0-beta.2": version "1.0.0-beta.2" - resolved "http://registry.npm.taobao.org/@vue/babel-helper-vue-jsx-merge-props/download/@vue/babel-helper-vue-jsx-merge-props-1.0.0-beta.2.tgz#f3e20d77b89ddb7a4b9b7a75372f05cd3ac22d92" - integrity sha1-8+INd7id23pLm3p1Ny8FzTrCLZI= + resolved "https://registry.npmjs.org/@vue/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-1.0.0-beta.2.tgz#f3e20d77b89ddb7a4b9b7a75372f05cd3ac22d92" + integrity sha512-Yj92Q1GcGjjctecBfnBmVqKSlMdyZaVq10hlZB4HSd1DJgu4cWgpEImJSzcJRUCZmas6UigwE7f4IjJuQs+JvQ== "@vue/babel-plugin-transform-vue-jsx@^1.0.0-beta.2": version "1.0.0-beta.2" - resolved "http://registry.npm.taobao.org/@vue/babel-plugin-transform-vue-jsx/download/@vue/babel-plugin-transform-vue-jsx-1.0.0-beta.2.tgz#6f7903fe66a34a02163f418c426cf419e862d97e" - integrity sha1-b3kD/majSgIWP0GMQmz0Gehi2X4= + resolved "https://registry.npmjs.org/@vue/babel-plugin-transform-vue-jsx/-/babel-plugin-transform-vue-jsx-1.0.0-beta.2.tgz#6f7903fe66a34a02163f418c426cf419e862d97e" + integrity sha512-fvAymRZAPHitomRE+jIipWRj0STXNSMqeOSdOFu9Ffjqg9WGOxSdCjORxexManfZ2y5QDv7gzI1xfgprsK3nlw== dependencies: "@babel/helper-module-imports" "^7.0.0" "@babel/plugin-syntax-jsx" "^7.2.0" @@ -976,10 +983,10 @@ lodash.kebabcase "^4.1.1" svg-tags "^1.0.0" -"@vue/babel-preset-app@^3.4.1": - version "3.4.1" - resolved "http://registry.npm.taobao.org/@vue/babel-preset-app/download/@vue/babel-preset-app-3.4.1.tgz#98a0bf3f207b989e00a9ec27dd0d2d1b4f27402b" - integrity sha1-mKC/PyB7mJ4Aqewn3Q0tG08nQCs= +"@vue/babel-preset-app@^3.5.0": + version "3.5.0" + resolved "https://registry.npmjs.org/@vue/babel-preset-app/-/babel-preset-app-3.5.0.tgz#7d1584baba0d633b72cb950308bb35a6b07389d4" + integrity sha512-0zSE+5GcQ6pje39T5k4j7rw7rERGfFXvjHrcqcOS1WhO3UKDzA4dsivSRn0ESKueHej51m5Bg9O1D1OulQwykQ== dependencies: "@babel/plugin-proposal-class-properties" "^7.0.0" "@babel/plugin-proposal-decorators" "^7.1.0" @@ -995,8 +1002,8 @@ "@vue/babel-preset-jsx@^1.0.0-beta.2": version "1.0.0-beta.2" - resolved "http://registry.npm.taobao.org/@vue/babel-preset-jsx/download/@vue/babel-preset-jsx-1.0.0-beta.2.tgz#3e5dc2b73da58391c1c7327c2bd2ef154fe4e46e" - integrity sha1-Pl3Ctz2lg5HBxzJ8K9LvFU/k5G4= + resolved "https://registry.npmjs.org/@vue/babel-preset-jsx/-/babel-preset-jsx-1.0.0-beta.2.tgz#3e5dc2b73da58391c1c7327c2bd2ef154fe4e46e" + integrity sha512-nZoAKBR/h6iPMQ66ieQcIdlpPBmqhtUUcgjBS541jIVxSog1rwzrc00jlsuecLonzUMWPU0PabyitsG74vhN1w== dependencies: "@vue/babel-helper-vue-jsx-merge-props" "^1.0.0-beta.2" "@vue/babel-plugin-transform-vue-jsx" "^1.0.0-beta.2" @@ -1007,22 +1014,22 @@ "@vue/babel-sugar-functional-vue@^1.0.0-beta.2": version "1.0.0-beta.2" - resolved "http://registry.npm.taobao.org/@vue/babel-sugar-functional-vue/download/@vue/babel-sugar-functional-vue-1.0.0-beta.2.tgz#8831f686e7614f282d5170b902483ef538deef38" - integrity sha1-iDH2hudhTygtUXC5Akg+9Tje7zg= + resolved "https://registry.npmjs.org/@vue/babel-sugar-functional-vue/-/babel-sugar-functional-vue-1.0.0-beta.2.tgz#8831f686e7614f282d5170b902483ef538deef38" + integrity sha512-5qvi4hmExgjtrESDk0vflL69dIxkDAukJcYH9o4663E8Nh12Jpbmr+Ja8WmgkAPtTVhk90UVcVUFCCZLHBmhkQ== dependencies: "@babel/plugin-syntax-jsx" "^7.2.0" "@vue/babel-sugar-inject-h@^1.0.0-beta.2": version "1.0.0-beta.2" - resolved "http://registry.npm.taobao.org/@vue/babel-sugar-inject-h/download/@vue/babel-sugar-inject-h-1.0.0-beta.2.tgz#5f92f994bf4b4126fad8633f554e8a426b51b413" - integrity sha1-X5L5lL9LQSb62GM/VU6KQmtRtBM= + resolved "https://registry.npmjs.org/@vue/babel-sugar-inject-h/-/babel-sugar-inject-h-1.0.0-beta.2.tgz#5f92f994bf4b4126fad8633f554e8a426b51b413" + integrity sha512-qGXZ6yE+1trk82xCVJ9j3shsgI+R2ePj3+o8b2Ee7JNaRqQvMfTwpgx5BRlk4q1+CTjvYexdqBS+q4Kg7sSxcg== dependencies: "@babel/plugin-syntax-jsx" "^7.2.0" "@vue/babel-sugar-v-model@^1.0.0-beta.2": version "1.0.0-beta.2" - resolved "http://registry.npm.taobao.org/@vue/babel-sugar-v-model/download/@vue/babel-sugar-v-model-1.0.0-beta.2.tgz#051d3ae3ef5e70d514e09058ec5790f6a42e8c28" - integrity sha1-BR064+9ecNUU4JBY7FeQ9qQujCg= + resolved "https://registry.npmjs.org/@vue/babel-sugar-v-model/-/babel-sugar-v-model-1.0.0-beta.2.tgz#051d3ae3ef5e70d514e09058ec5790f6a42e8c28" + integrity sha512-63US3IMEtATJzzK2le/Na53Sk2bp3LHfwZ8eMFwbTaz6e2qeV9frBl3ZYaha64ghT4IDSbrDXUmm0J09EAzFfA== dependencies: "@babel/plugin-syntax-jsx" "^7.2.0" "@vue/babel-helper-vue-jsx-merge-props" "^1.0.0-beta.2" @@ -1033,35 +1040,35 @@ "@vue/babel-sugar-v-on@^1.0.0-beta.2": version "1.0.0-beta.2" - resolved "http://registry.npm.taobao.org/@vue/babel-sugar-v-on/download/@vue/babel-sugar-v-on-1.0.0-beta.2.tgz#3e2d122e229b10017f091d178346b601d9245260" - integrity sha1-Pi0SLiKbEAF/CR0Xg0a2AdkkUmA= + resolved "https://registry.npmjs.org/@vue/babel-sugar-v-on/-/babel-sugar-v-on-1.0.0-beta.2.tgz#3e2d122e229b10017f091d178346b601d9245260" + integrity sha512-XH/m3k11EKdMY0MrTg4+hQv8BFM8juzHT95chYkgxDmvDdVJnSCuf9+mcysEJttWD4PVuUGN7EHoIWsIhC0dRw== dependencies: "@babel/plugin-syntax-jsx" "^7.2.0" "@vue/babel-plugin-transform-vue-jsx" "^1.0.0-beta.2" camelcase "^5.0.0" -"@vue/cli-overlay@^3.4.1": - version "3.4.1" - resolved "http://registry.npm.taobao.org/@vue/cli-overlay/download/@vue/cli-overlay-3.4.1.tgz#f850c2f8d7cd42b475d03ec6658ccf2ec9830511" - integrity sha1-+FDC+NfNQrR10D7GZYzPLsmDBRE= +"@vue/cli-overlay@^3.5.0": + version "3.5.0" + resolved "https://registry.npmjs.org/@vue/cli-overlay/-/cli-overlay-3.5.0.tgz#25a61ec5bf56bef6dca12eb0382a57af7b647d5e" + integrity sha512-jjvJkhBE0mVAZjRyW/PXuy+ywTTRbVCZKN8WYcBN44BuKUYgBfLIUc29hUDmm/CesIZW5xMtPlFSWzRkz5uKcQ== "@vue/cli-plugin-babel@^3.3.0": - version "3.4.1" - resolved "http://registry.npm.taobao.org/@vue/cli-plugin-babel/download/@vue/cli-plugin-babel-3.4.1.tgz#f84fe329966ab5c82c80da1bd62da4db4089090b" - integrity sha1-+E/jKZZqtcgsgNob1i2k20CJCQs= + version "3.5.0" + resolved "https://registry.npmjs.org/@vue/cli-plugin-babel/-/cli-plugin-babel-3.5.0.tgz#0a572c4e73cad97f86684860e917cb3e3c883b79" + integrity sha512-oCsuCzAIedjwTL8hvSmX9l4roHW198soaRkynho5r/yx2fkIeImN5dG+/YdnMbXAyui73zHA8vAoUfSBMNiQvQ== dependencies: "@babel/core" "^7.0.0" - "@vue/babel-preset-app" "^3.4.1" - "@vue/cli-shared-utils" "^3.4.1" + "@vue/babel-preset-app" "^3.5.0" + "@vue/cli-shared-utils" "^3.5.0" babel-loader "^8.0.5" webpack ">=4 < 4.29" "@vue/cli-plugin-eslint@^3.3.0": - version "3.4.1" - resolved "http://registry.npm.taobao.org/@vue/cli-plugin-eslint/download/@vue/cli-plugin-eslint-3.4.1.tgz#59896379e12d68aefcdccac28c691cb6e23e5720" - integrity sha1-WYljeeEtaK783MrCjGkctuI+VyA= + version "3.5.0" + resolved "https://registry.npmjs.org/@vue/cli-plugin-eslint/-/cli-plugin-eslint-3.5.0.tgz#c5529ace3925766ffb45d99f0fddcc019b0181b5" + integrity sha512-tt5vjx3gT4KjIcwwsNK1FrvJHw6DkK8PA81oGBH7ARgf6HHXB80ruufwmddEhpn5MNKCsbvLkkUnVPs6t9WRUw== dependencies: - "@vue/cli-shared-utils" "^3.4.1" + "@vue/cli-shared-utils" "^3.5.0" babel-eslint "^10.0.1" eslint-loader "^2.1.2" globby "^9.0.0" @@ -1071,21 +1078,21 @@ eslint-plugin-vue "^4.7.1" "@vue/cli-service@^3.3.0": - version "3.4.1" - resolved "http://registry.npm.taobao.org/@vue/cli-service/download/@vue/cli-service-3.4.1.tgz#65ef3ed00b8e6eeeca736308a703c264cfa280cc" - integrity sha1-Ze8+0AuObu7Kc2MIpwPCZM+igMw= + version "3.5.0" + resolved "https://registry.npmjs.org/@vue/cli-service/-/cli-service-3.5.0.tgz#ccc21c4764dfe3d374818073d0a023da939178be" + integrity sha512-jSvO4woQbQZ59MNq1bSHz4yhzQBCN2EN0NsZLxcJ/nm1TT3UzKQG7WVfH37koXE90SA8AK412gx4eDWDFAyruQ== dependencies: "@intervolga/optimize-cssnano-plugin" "^1.0.5" "@soda/friendly-errors-webpack-plugin" "^1.7.1" - "@vue/cli-overlay" "^3.4.1" - "@vue/cli-shared-utils" "^3.4.1" - "@vue/component-compiler-utils" "^2.5.2" + "@vue/cli-overlay" "^3.5.0" + "@vue/cli-shared-utils" "^3.5.0" + "@vue/component-compiler-utils" "^2.6.0" "@vue/preload-webpack-plugin" "^1.1.0" "@vue/web-component-wrapper" "^1.2.0" acorn "^6.1.0" acorn-walk "^6.1.1" address "^1.0.3" - autoprefixer "^9.4.7" + autoprefixer "^9.4.8" cache-loader "^2.0.1" case-sensitive-paths-webpack-plugin "^2.2.0" chalk "^2.4.2" @@ -1096,6 +1103,7 @@ cssnano "^4.1.10" debug "^4.1.1" dotenv "^6.2.0" + dotenv-expand "^4.2.0" escape-string-regexp "^1.0.5" file-loader "^3.0.1" fs-extra "^7.0.1" @@ -1120,18 +1128,18 @@ terser-webpack-plugin "^1.2.2" thread-loader "^2.1.2" url-loader "^1.1.2" - vue-loader "^15.6.2" + vue-loader "^15.6.4" webpack ">=4 < 4.29" webpack-bundle-analyzer "^3.0.4" webpack-chain "^4.11.0" - webpack-dev-server "^3.1.14" + webpack-dev-server "^3.2.0" webpack-merge "^4.2.1" yorkie "^2.0.0" -"@vue/cli-shared-utils@^3.4.1": - version "3.4.1" - resolved "http://registry.npm.taobao.org/@vue/cli-shared-utils/download/@vue/cli-shared-utils-3.4.1.tgz#963454d2d2bc549d027c8988666c939903be6d7e" - integrity sha1-ljRU0tK8VJ0CfImIZmyTmQO+bX4= +"@vue/cli-shared-utils@^3.5.0": + version "3.5.0" + resolved "https://registry.npmjs.org/@vue/cli-shared-utils/-/cli-shared-utils-3.5.0.tgz#95b97e13e32c14d5a0ab62322796a615752e843a" + integrity sha512-+EIwVMTjdfRQVEtcIhpRjNsPB2ZlopiUktlPpx6oLQdlJXwBWkFQVwuXdXHtPYxB5Kzs3VPyUfhHxnPIbNw1+Q== dependencies: chalk "^2.4.1" execa "^1.0.0" @@ -1140,16 +1148,16 @@ lru-cache "^5.1.1" node-ipc "^9.1.1" opn "^5.3.0" - ora "^3.0.0" + ora "^3.1.0" request "^2.87.0" - request-promise-native "^1.0.5" + request-promise-native "^1.0.7" semver "^5.5.0" string.prototype.padstart "^3.0.0" -"@vue/component-compiler-utils@^2.5.1", "@vue/component-compiler-utils@^2.5.2": +"@vue/component-compiler-utils@^2.5.1", "@vue/component-compiler-utils@^2.6.0": version "2.6.0" - resolved "http://registry.npm.taobao.org/@vue/component-compiler-utils/download/@vue/component-compiler-utils-2.6.0.tgz#aa46d2a6f7647440b0b8932434d22f12371e543b" - integrity sha1-qkbSpvdkdECwuJMkNNIvEjceVDs= + resolved "https://registry.npmjs.org/@vue/component-compiler-utils/-/component-compiler-utils-2.6.0.tgz#aa46d2a6f7647440b0b8932434d22f12371e543b" + integrity sha512-IHjxt7LsOFYc0DkTncB7OXJL7UzwOLPPQCfEUNyxL2qt+tF12THV+EO33O1G2Uk4feMSWua3iD39Itszx0f0bw== dependencies: consolidate "^0.15.1" hash-sum "^1.0.2" @@ -1394,8 +1402,8 @@ acorn@^6.0.2: acorn@^6.0.7, acorn@^6.1.0: version "6.1.1" - resolved "http://registry.npm.taobao.org/acorn/download/acorn-6.1.1.tgz#7d25ae05bb8ad1f9b699108e1094ecd7884adc1f" - integrity sha1-fSWuBbuK0fm2mRCOEJTs14hK3B8= + resolved "https://registry.npmjs.org/acorn/-/acorn-6.1.1.tgz#7d25ae05bb8ad1f9b699108e1094ecd7884adc1f" + integrity sha512-jPTiwtOxaHNaAPg/dmrJ/beuzLRnXtB0kQPQ8JpotKJgTB6rX6c8mlf315941pyjBSaPg8NHXS9fhP4u17DpGA== add-dom-event-listener@^1.0.2: version "1.1.0" @@ -1446,8 +1454,8 @@ ajv@^6.1.0, ajv@^6.5.5: ajv@^6.9.1: version "6.10.0" - resolved "http://registry.npm.taobao.org/ajv/download/ajv-6.10.0.tgz#90d0d54439da587cd7e843bfb7045f50bd22bdf1" - integrity sha1-kNDVRDnaWHzX6EO/twRfUL0ivfE= + resolved "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz#90d0d54439da587cd7e843bfb7045f50bd22bdf1" + integrity sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg== dependencies: fast-deep-equal "^2.0.1" fast-json-stable-stringify "^2.0.0" @@ -1485,8 +1493,8 @@ ansi-escapes@^3.0.0: ansi-escapes@^3.2.0: version "3.2.0" - resolved "http://registry.npm.taobao.org/ansi-escapes/download/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" - integrity sha1-h4C5j/nb9WOBUtHx/lwde0RCl2s= + resolved "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" + integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== ansi-html@0.0.7: version "0.0.7" @@ -1508,6 +1516,11 @@ ansi-regex@^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-regex@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" + integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== + 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" @@ -1522,15 +1535,15 @@ ansi-styles@^3.2.0, ansi-styles@^3.2.1: ant-design-palettes@^1.1.3: version "1.1.3" - resolved "http://registry.npm.taobao.org/ant-design-palettes/download/ant-design-palettes-1.1.3.tgz#84119b1a4d86363adc52a38d587e65336a0a27dd" - integrity sha1-hBGbGk2GNjrcUqONWH5lM2oKJ90= + resolved "https://registry.npmjs.org/ant-design-palettes/-/ant-design-palettes-1.1.3.tgz#84119b1a4d86363adc52a38d587e65336a0a27dd" + integrity sha512-UpkkTp8egEN21KZNvY7sTcabLlkHvLvS71EVPk4CYi77Z9AaGGCaVn7i72tbOgWDrQp2wjIg8WgMbKBdK7GtWA== dependencies: tinycolor2 "^1.4.1" ant-design-vue@^1.3.1: version "1.3.5" - resolved "http://registry.npm.taobao.org/ant-design-vue/download/ant-design-vue-1.3.5.tgz#3b191e3eeef676a26b2816eb2933e95e8936d1ff" - integrity sha1-OxkePu72dqJrKBbrKTPpXok20f8= + resolved "https://registry.npmjs.org/ant-design-vue/-/ant-design-vue-1.3.5.tgz#3b191e3eeef676a26b2816eb2933e95e8936d1ff" + integrity sha512-EPRdBv5UJAZfkpR+KPYB8dpwpDsfV94PiuFytTvaq8Vw8TolB61/a1xQYko+o8qv3DOohyjPGmUpINR8zyjueA== dependencies: "@ant-design/icons" "^1.1.15" "@ant-design/icons-vue" "^1.0.1" @@ -1568,6 +1581,20 @@ anymatch@^2.0.0: micromatch "^3.1.4" normalize-path "^2.1.1" +apexcharts@^3.6.5: + version "3.6.5" + resolved "https://registry.npmjs.org/apexcharts/-/apexcharts-3.6.5.tgz#6ca9e2e501451d3fff436f8e8ae05fd12b5476b5" + integrity sha512-HSDNjTPMEpQaM0MadPj9f6gNvBKSmQXuC100h4Ev2mQFjC1rJId6b1KgF2yKh0In+iXuTXxszI58ozWhKNkbYQ== + dependencies: + promise-polyfill "8.1.0" + svg.draggable.js "^2.2.1" + svg.easing.js "^2.0.0" + svg.filter.js "^2.0.2" + svg.js "^2.6.6" + svg.pathmorphing.js "^0.1.3" + svg.resize.js "^1.4.1" + svg.select.js "^2.1.2" + 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" @@ -1745,10 +1772,10 @@ atob@^2.1.1: resolved "http://registry.npm.taobao.org/atob/download/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" integrity sha1-bZUX654DDSQ2ZmZR6GvZ9vE1M8k= -autoprefixer@^9.4.7: +autoprefixer@^9.4.8: version "9.4.10" - resolved "http://registry.npm.taobao.org/autoprefixer/download/autoprefixer-9.4.10.tgz#e1be61fc728bacac8f4252ed242711ec0dcc6a7b" - integrity sha1-4b5h/HKLrKyPQlLtJCcR7A3Mans= + resolved "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.4.10.tgz#e1be61fc728bacac8f4252ed242711ec0dcc6a7b" + integrity sha512-XR8XZ09tUrrSzgSlys4+hy5r2/z4Jp7Ag3pHm31U4g/CTccYPOVe19AkaJ4ey/vRd1sfj+5TtuD6I0PXtutjvQ== dependencies: browserslist "^4.4.2" caniuse-lite "^1.0.30000940" @@ -1825,8 +1852,8 @@ babel-loader@^8.0.0-beta.0: babel-loader@^8.0.5: version "8.0.5" - resolved "http://registry.npm.taobao.org/babel-loader/download/babel-loader-8.0.5.tgz#225322d7509c2157655840bba52e46b6c2f2fe33" - integrity sha1-IlMi11CcIVdlWEC7pS5GtsLy/jM= + resolved "https://registry.npmjs.org/babel-loader/-/babel-loader-8.0.5.tgz#225322d7509c2157655840bba52e46b6c2f2fe33" + integrity sha512-NTnHnVRd2JnRqPC0vW+iOQWU5pchDbYXsG2E6DMXEpMfUcQKclF9gmf3G3ZMhzG7IG9ji4coL0cm+FxeWxDpnw== dependencies: find-cache-dir "^2.0.0" loader-utils "^1.0.2" @@ -2078,8 +2105,8 @@ browserslist@^4.1.0: browserslist@^4.4.2: version "4.4.2" - resolved "http://registry.npm.taobao.org/browserslist/download/browserslist-4.4.2.tgz#6ea8a74d6464bb0bd549105f659b41197d8f0ba2" - integrity sha1-bqinTWRkuwvVSRBfZZtBGX2PC6I= + resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.4.2.tgz#6ea8a74d6464bb0bd549105f659b41197d8f0ba2" + integrity sha512-ISS/AIAiHERJ3d45Fz0AVYKkgcy+F/eJHzKEvv1j0wwKGKD9T3BrwKr/5g45L+Y4XIK5PlTqefHciRFcfE1Jxg== dependencies: caniuse-lite "^1.0.30000939" electron-to-chromium "^1.3.113" @@ -2180,8 +2207,8 @@ cache-base@^1.0.1: cache-loader@^2.0.1: version "2.0.1" - resolved "http://registry.npm.taobao.org/cache-loader/download/cache-loader-2.0.1.tgz#5758f41a62d7c23941e3c3c7016e6faeb03acb07" - integrity sha1-V1j0GmLXwjlB48PHAW5vrrA6ywc= + resolved "https://registry.npmjs.org/cache-loader/-/cache-loader-2.0.1.tgz#5758f41a62d7c23941e3c3c7016e6faeb03acb07" + integrity sha512-V99T3FOynmGx26Zom+JrVBytLBsmUCzVG2/4NnUKgvXN4bEV42R1ERl1IyiH/cvFIDA1Ytq2lPZ9tXDSahcQpQ== dependencies: loader-utils "^1.1.0" mkdirp "^0.5.1" @@ -2208,8 +2235,8 @@ callsites@^0.2.0: callsites@^3.0.0: version "3.0.0" - resolved "http://registry.npm.taobao.org/callsites/download/callsites-3.0.0.tgz#fb7eb569b72ad7a45812f93fd9430a3e410b3dd3" - integrity sha1-+361abcq16RYEvk/2UMKPkELPdM= + resolved "https://registry.npmjs.org/callsites/-/callsites-3.0.0.tgz#fb7eb569b72ad7a45812f93fd9430a3e410b3dd3" + integrity sha512-tWnkwu9YEq2uzlBDI4RcLn8jrFvF9AOi8PxDNU3hZZjJcjkcRAq3vCI+vZcg1SuxISDYe86k9VZFwAxDiJGoAw== camel-case@3.0.x: version "3.0.0" @@ -2248,9 +2275,9 @@ camelcase@^4.1.0: integrity sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0= camelcase@^5.0.0: - version "5.1.0" - resolved "http://registry.npm.taobao.org/camelcase/download/camelcase-5.1.0.tgz#29e83b9cfaf7ad478f401a187ae089cf83c257ea" - integrity sha1-Keg7nPr3rUePQBoYeuCJz4PCV+o= + version "5.2.0" + resolved "https://registry.npmjs.org/camelcase/-/camelcase-5.2.0.tgz#e7522abda5ed94cc0489e1b8466610e88404cf45" + integrity sha512-IXFsBS2pC+X0j0N/GE7Dm7j3bsEBp+oTpb7F50dwEVX7rf3IgwO9XatnegTsDtniKCUtEJH4fSU6Asw7uoVLfQ== caniuse-api@^3.0.0: version "3.0.0" @@ -2273,14 +2300,14 @@ caniuse-lite@^1.0.30000893, caniuse-lite@^1.0.30000912: integrity sha1-VgMR7PJC6vEhWbcg5ksR69dZteQ= caniuse-lite@^1.0.30000939, caniuse-lite@^1.0.30000940: - version "1.0.30000940" - resolved "http://registry.npm.taobao.org/caniuse-lite/download/caniuse-lite-1.0.30000940.tgz#19f2b1497fbfa5b96b615963097c3757f27989ce" - integrity sha1-GfKxSX+/pblrYVljCXw3V/J5ic4= + version "1.0.30000943" + resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000943.tgz#00b25bd5808edc2ed1cfb53533a6a6ff6ca014ee" + integrity sha512-nJMjU4UaesbOHTcmz6VS+qaog++Fdepg4KAya5DL/AZrL/aaAZDGOOQ0AECtsJa09r4cJBdHZMive5mw8lnQ5A== case-sensitive-paths-webpack-plugin@^2.2.0: version "2.2.0" - resolved "http://registry.npm.taobao.org/case-sensitive-paths-webpack-plugin/download/case-sensitive-paths-webpack-plugin-2.2.0.tgz#3371ef6365ef9c25fa4b81c16ace0e9c7dc58c3e" - integrity sha1-M3HvY2XvnCX6S4HBas4OnH3FjD4= + resolved "https://registry.npmjs.org/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.2.0.tgz#3371ef6365ef9c25fa4b81c16ace0e9c7dc58c3e" + integrity sha512-u5ElzokS8A1pm9vM3/iDgTcI3xqHxuCao94Oz8etI3cf0Tio0p8izkDYbTIn09uP3yUUr6+veaE6IkjnTYS46g== caseless@~0.12.0: version "0.12.0" @@ -2306,7 +2333,7 @@ chalk@^1.1.1, chalk@^1.1.3: 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: +chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.0, 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= @@ -2317,8 +2344,8 @@ chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.0, chalk@^2.3.1, chalk@^2.4 chalk@^2.4.2: version "2.4.2" - resolved "http://registry.npm.taobao.org/chalk/download/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" - integrity sha1-zUJUFnelQzPPVBpJEIwUMrRMlCQ= + resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== dependencies: ansi-styles "^3.2.1" escape-string-regexp "^1.0.5" @@ -2423,15 +2450,10 @@ cli-cursor@^2.1.0: 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-spinners@^2.0.0: version "2.0.0" - resolved "http://registry.npm.taobao.org/cli-spinners/download/cli-spinners-2.0.0.tgz#4b078756fc17a8f72043fdc9f1f14bf4fa87e2df" - integrity sha1-SweHVvwXqPcgQ/3J8fFL9PqH4t8= + resolved "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.0.0.tgz#4b078756fc17a8f72043fdc9f1f14bf4fa87e2df" + integrity sha512-yiEBmhaKPPeBj7wWm4GEdtPZK940p9pl3EANIrnJ3JnvWyrPjcFcsEq6qRUuQ7fzB0+Y82ld3p6B34xo95foWw== cli-width@^2.0.0: version "2.2.0" @@ -2734,8 +2756,8 @@ core-js@^2.4.0, core-js@^2.5.7: core-js@^2.6.5: version "2.6.5" - resolved "http://registry.npm.taobao.org/core-js/download/core-js-2.6.5.tgz#44bc8d249e7fb2ff5d00e0341a7ffb94fbf67895" - integrity sha1-RLyNJJ5/sv9dAOA0Gn/7lPv2eJU= + resolved "https://registry.npmjs.org/core-js/-/core-js-2.6.5.tgz#44bc8d249e7fb2ff5d00e0341a7ffb94fbf67895" + integrity sha512-klh/kDpwX8hryYL14M9w/xei6vrv6sE8gTHDG7/T/+SEovB/G4ejwcfE/CBzO6Edsu+OETZMZ3wcX/EjUkrl5A== core-util-is@1.0.2, core-util-is@~1.0.0: version "1.0.2" @@ -2950,8 +2972,8 @@ cssesc@^1.0.1: cssesc@^2.0.0: version "2.0.0" - resolved "http://registry.npm.taobao.org/cssesc/download/cssesc-2.0.0.tgz#3b13bd1bb1cb36e1bcb5a4dcd27f54c5dcb35703" - integrity sha1-OxO9G7HLNuG8taTc0n9UxdyzVwM= + resolved "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz#3b13bd1bb1cb36e1bcb5a4dcd27f54c5dcb35703" + integrity sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg== cssnano-preset-default@^4.0.0, cssnano-preset-default@^4.0.2: version "4.0.3" @@ -2991,8 +3013,8 @@ cssnano-preset-default@^4.0.0, cssnano-preset-default@^4.0.2: cssnano-preset-default@^4.0.7: version "4.0.7" - resolved "http://registry.npm.taobao.org/cssnano-preset-default/download/cssnano-preset-default-4.0.7.tgz#51ec662ccfca0f88b396dcd9679cdb931be17f76" - integrity sha1-UexmLM/KD4izltzZZ5zbkxvhf3Y= + resolved "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-4.0.7.tgz#51ec662ccfca0f88b396dcd9679cdb931be17f76" + integrity sha512-x0YHHx2h6p0fCl1zY9L9roD7rnlltugGu7zXSKQx6k2rYw0Hi3IqxcoAGF7u9Q5w1nt7vK0ulxV8Lo+EvllGsA== dependencies: css-declaration-sorter "^4.0.1" cssnano-util-raw-cache "^4.0.1" @@ -3059,8 +3081,8 @@ cssnano@^4.0.0: cssnano@^4.1.10: version "4.1.10" - resolved "http://registry.npm.taobao.org/cssnano/download/cssnano-4.1.10.tgz#0ac41f0b13d13d465487e111b778d42da631b8b2" - integrity sha1-CsQfCxPRPUZUh+ERt3jULaYxuLI= + resolved "https://registry.npmjs.org/cssnano/-/cssnano-4.1.10.tgz#0ac41f0b13d13d465487e111b778d42da631b8b2" + integrity sha512-5wny+F6H4/8RgNlaqab4ktc3e0/blKutmq8yNlBFXA//nSFFAqAngjNVRzUvCgYROULmZZUoosL/KSoZo5aUaQ== dependencies: cosmiconfig "^5.0.0" cssnano-preset-default "^4.0.7" @@ -3258,9 +3280,9 @@ date-now@^0.1.4: integrity sha1-6vQ5/U1ISK105cx9vvIAZyueNFs= dayjs@^1.8.0: - version "1.8.8" - resolved "http://registry.npm.taobao.org/dayjs/download/dayjs-1.8.8.tgz#81c81a8bb2488ef859f6c9bead9b62d649072bfd" - integrity sha1-gcgai7JIjvhZ9sm+rZti1kkHK/0= + version "1.8.9" + resolved "https://registry.npmjs.org/dayjs/-/dayjs-1.8.9.tgz#8b5fda2f995ff5f29705894e1d23240f7f674f61" + integrity sha512-/LPzoQ77NiXf566p5babPBkqegpJ94koAQ0vUfkcfWYcuvzOTgr+N9V4IOnQ3H05Su/9dpFNOV1iPvEhAsRscw== de-indent@^1.0.2: version "1.0.2" @@ -3297,8 +3319,8 @@ debug@^4.0.1, debug@^4.1.0: debug@^4.1.1: version "4.1.1" - resolved "http://registry.npm.taobao.org/debug/download/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" - integrity sha1-O3ImAlUQnGtYnO4FDx1RYTlmR5E= + resolved "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" + integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== dependencies: ms "^2.1.1" @@ -3340,9 +3362,9 @@ deepmerge@^1.5.2: integrity sha512-95k0GDqvBjZavkuvzx/YqVLv/6YYa17fz6ILMSf7neqQITCPbnfEnQvEgMPNjH4kgobe7+WIL0yJEHku+H3qtQ== default-gateway@^4.0.1: - version "4.1.2" - resolved "http://registry.npm.taobao.org/default-gateway/download/default-gateway-4.1.2.tgz#b49196b51b26609e5d1af636287517a11a9aaf42" - integrity sha1-tJGWtRsmYJ5dGvY2KHUXoRqar0I= + version "4.2.0" + resolved "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz#167104c7500c2115f6dd69b0a536bb8ed720552b" + integrity sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA== dependencies: execa "^1.0.0" ip-regex "^2.1.0" @@ -3448,8 +3470,8 @@ detect-libc@^1.0.2: detect-node@^2.0.4: version "2.0.4" - resolved "http://registry.npm.taobao.org/detect-node/download/detect-node-2.0.4.tgz#014ee8f8f669c5c58023da64b8179c083a28c46c" - integrity sha1-AU7o+PZpxcWAI9pkuBecCDooxGw= + resolved "https://registry.npmjs.org/detect-node/-/detect-node-2.0.4.tgz#014ee8f8f669c5c58023da64b8179c083a28c46c" + integrity sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw== diffie-hellman@^5.0.0: version "5.0.3" @@ -3470,8 +3492,8 @@ dir-glob@^2.0.0: dir-glob@^2.2.1: version "2.2.2" - resolved "http://registry.npm.taobao.org/dir-glob/download/dir-glob-2.2.2.tgz#fa09f0694153c8918b18ba0deafae94769fc50c4" - integrity sha1-+gnwaUFTyJGLGLoN6vrpR2n8UMQ= + resolved "https://registry.npmjs.org/dir-glob/-/dir-glob-2.2.2.tgz#fa09f0694153c8918b18ba0deafae94769fc50c4" + integrity sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw== dependencies: path-type "^3.0.0" @@ -3512,8 +3534,8 @@ doctrine@^2.1.0: doctrine@^3.0.0: version "3.0.0" - resolved "http://registry.npm.taobao.org/doctrine/download/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" - integrity sha1-rd6+rXKmV023g2OdyHoSF3OXOWE= + resolved "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== dependencies: esutils "^2.0.2" @@ -3606,10 +3628,15 @@ dot-prop@^4.1.1: dependencies: is-obj "^1.0.0" +dotenv-expand@^4.2.0: + version "4.2.0" + resolved "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-4.2.0.tgz#def1f1ca5d6059d24a766e587942c21106ce1275" + integrity sha1-3vHxyl1gWdJKdm5YeULCEQbOEnU= + dotenv@^6.2.0: version "6.2.0" - resolved "http://registry.npm.taobao.org/dotenv/download/dotenv-6.2.0.tgz#941c0410535d942c8becf28d3f357dbd9d476064" - integrity sha1-lBwEEFNdlCyL7PKNPzV9vZ1HYGQ= + resolved "https://registry.npmjs.org/dotenv/-/dotenv-6.2.0.tgz#941c0410535d942c8becf28d3f357dbd9d476064" + integrity sha512-HygQCKUBSFl8wKQZBSemMywRWcEDNidvNbjGVyZu3nbZ8qq9ubiPoGLMdRDpfSrpkkm9BXYFkpKxxFX38o/76w== duplexer@^0.1.1: version "0.1.1" @@ -3651,8 +3678,8 @@ ejs@^2.6.1: electron-to-chromium@^1.3.113: version "1.3.113" - resolved "http://registry.npm.taobao.org/electron-to-chromium/download/electron-to-chromium-1.3.113.tgz#b1ccf619df7295aea17bc6951dc689632629e4a9" - integrity sha1-scz2Gd9yla6he8aVHcaJYyYp5Kk= + resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.113.tgz#b1ccf619df7295aea17bc6951dc689632629e4a9" + integrity sha512-De+lPAxEcpxvqPTyZAXELNpRZXABRxf+uL/rSykstQhzj/B0l1150G/ExIIxKc16lI89Hgz81J0BHAcbTqK49g== electron-to-chromium@^1.3.80, electron-to-chromium@^1.3.86: version "1.3.87" @@ -3674,8 +3701,8 @@ elliptic@^6.0.0: emoji-regex@^7.0.1: version "7.0.3" - resolved "http://registry.npm.taobao.org/emoji-regex/download/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" - integrity sha1-kzoEBShgyF6DwSJHnEdIqOTHIVY= + resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" + integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== emojis-list@^2.0.0: version "2.1.0" @@ -3779,8 +3806,8 @@ eslint-import-resolver-node@^0.3.1: eslint-loader@^2.1.2: version "2.1.2" - resolved "http://registry.npm.taobao.org/eslint-loader/download/eslint-loader-2.1.2.tgz#453542a1230d6ffac90e4e7cb9cadba9d851be68" - integrity sha1-RTVCoSMNb/rJDk58ucrbqdhRvmg= + resolved "https://registry.npmjs.org/eslint-loader/-/eslint-loader-2.1.2.tgz#453542a1230d6ffac90e4e7cb9cadba9d851be68" + integrity sha512-rA9XiXEOilLYPOIInvVH5S/hYfyTPyxag6DZhoQOduM+3TkghAEQ3VcFO8VnX4J4qg/UIBzp72aOf/xvYmpmsg== dependencies: loader-fs-cache "^1.0.0" loader-utils "^1.0.2" @@ -3851,8 +3878,8 @@ eslint-plugin-vue@^4.7.1: eslint-plugin-vue@^5.1.0: version "5.2.2" - resolved "http://registry.npm.taobao.org/eslint-plugin-vue/download/eslint-plugin-vue-5.2.2.tgz#86601823b7721b70bc92d54f1728cfc03b36283c" - integrity sha1-hmAYI7dyG3C8ktVPFyjPwDs2KDw= + resolved "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-5.2.2.tgz#86601823b7721b70bc92d54f1728cfc03b36283c" + integrity sha512-CtGWH7IB0DA6BZOwcV9w9q3Ri6Yuo8qMjx05SmOGJ6X6E0Yo3y9E/gQ5tuNxg2dEt30tRnBoFTbvtmW9iEoyHA== dependencies: vue-eslint-parser "^5.0.0" @@ -3882,8 +3909,8 @@ eslint-scope@^4.0.0: eslint-scope@^4.0.2: version "4.0.2" - resolved "http://registry.npm.taobao.org/eslint-scope/download/eslint-scope-4.0.2.tgz#5f10cd6cabb1965bf479fa65745673439e21cb0e" - integrity sha1-XxDNbKuxllv0efpldFZzQ54hyw4= + resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.2.tgz#5f10cd6cabb1965bf479fa65745673439e21cb0e" + integrity sha512-5q1+B/ogmHl8+paxtOKx38Z8LtWkVGuNt3+GQNErqwLl6ViNp/gdJGMCjZNxZ8j/VYjDNZ2Fo+eQc1TAVPIzbg== dependencies: esrecurse "^4.1.0" estraverse "^4.1.1" @@ -3943,9 +3970,9 @@ eslint@^4.19.1: text-table "~0.2.0" eslint@^5.12.0: - version "5.15.0" - resolved "http://registry.npm.taobao.org/eslint/download/eslint-5.15.0.tgz#f313a2f7c7628d39adeefdba4a9c41f842012c9e" - integrity sha1-8xOi98dijTmt7v26SpxB+EIBLJ4= + version "5.15.1" + resolved "https://registry.npmjs.org/eslint/-/eslint-5.15.1.tgz#8266b089fd5391e0009a047050795b1d73664524" + integrity sha512-NTcm6vQ+PTgN3UBsALw5BMhgO6i5EpIjQF/Xb5tIh3sk9QhrFafujUOczGz4J24JBlzWclSB9Vmx8d+9Z6bFCg== dependencies: "@babel/code-frame" "^7.0.0" ajv "^6.9.1" @@ -4003,8 +4030,8 @@ espree@^4.1.0: espree@^5.0.1: version "5.0.1" - resolved "http://registry.npm.taobao.org/espree/download/espree-5.0.1.tgz#5d6526fa4fc7f0788a5cf75b15f30323e2f81f7a" - integrity sha1-XWUm+k/H8HiKXPdbFfMDI+L4H3o= + resolved "https://registry.npmjs.org/espree/-/espree-5.0.1.tgz#5d6526fa4fc7f0788a5cf75b15f30323e2f81f7a" + integrity sha512-qWAZcWh4XE/RwzLJejfcofscgMc9CamR6Tn1+XRXNzrvUSSbiAjGOI/fggztjIi7y9VLPqnICMIPiGyr8JaZ0A== dependencies: acorn "^6.0.7" acorn-jsx "^5.0.0" @@ -4193,8 +4220,8 @@ external-editor@^2.0.4: external-editor@^3.0.3: version "3.0.3" - resolved "http://registry.npm.taobao.org/external-editor/download/external-editor-3.0.3.tgz#5866db29a97826dbe4bf3afd24070ead9ea43a27" - integrity sha1-WGbbKal4Jtvkvzr9JAcOrZ6kOic= + resolved "https://registry.npmjs.org/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" @@ -4236,8 +4263,8 @@ fast-deep-equal@^2.0.1: fast-glob@^2.2.6: version "2.2.6" - resolved "http://registry.npm.taobao.org/fast-glob/download/fast-glob-2.2.6.tgz#a5d5b697ec8deda468d85a74035290a025a95295" - integrity sha1-pdW2l+yN7aRo2Fp0A1KQoCWpUpU= + resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.6.tgz#a5d5b697ec8deda468d85a74035290a025a95295" + integrity sha512-0BvMaZc1k9F+MeWWMe8pL6YltFzZYcJsYU7D4JyDA6PAczaXvxqQQ/z+mDF7/4Mw01DeUc+i3CTKajnkANkV4w== dependencies: "@mrmlnc/readdir-enhanced" "^2.2.1" "@nodelib/fs.stat" "^1.1.2" @@ -4302,15 +4329,15 @@ file-entry-cache@^2.0.0: file-entry-cache@^5.0.1: version "5.0.1" - resolved "http://registry.npm.taobao.org/file-entry-cache/download/file-entry-cache-5.0.1.tgz#ca0f6efa6dd3d561333fb14515065c2fafdf439c" - integrity sha1-yg9u+m3T1WEzP7FFFQZcL6/fQ5w= + resolved "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz#ca0f6efa6dd3d561333fb14515065c2fafdf439c" + integrity sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g== dependencies: flat-cache "^2.0.1" file-loader@^3.0.1: version "3.0.1" - resolved "http://registry.npm.taobao.org/file-loader/download/file-loader-3.0.1.tgz#f8e0ba0b599918b51adfe45d66d1e771ad560faa" - integrity sha1-+OC6C1mZGLUa3+RdZtHnca1WD6o= + resolved "https://registry.npmjs.org/file-loader/-/file-loader-3.0.1.tgz#f8e0ba0b599918b51adfe45d66d1e771ad560faa" + integrity sha512-4sNIOXgtH/9WZq4NvlfU3Opn5ynUsqBwSLyM+I7UOwdGigTBYfVVQEwe/msZNX/j4pCJTIM14Fsw66Svo1oVrw== dependencies: loader-utils "^1.0.2" schema-utils "^1.0.0" @@ -4404,8 +4431,8 @@ flat-cache@^1.2.1: flat-cache@^2.0.1: version "2.0.1" - resolved "http://registry.npm.taobao.org/flat-cache/download/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0" - integrity sha1-XSltbwS9pEpGMKMBQTvbwuwIXsA= + resolved "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0" + integrity sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA== dependencies: flatted "^2.0.0" rimraf "2.6.3" @@ -4413,8 +4440,8 @@ flat-cache@^2.0.1: flatted@^2.0.0: version "2.0.0" - resolved "http://registry.npm.taobao.org/flatted/download/flatted-2.0.0.tgz#55122b6536ea496b4b44893ee2608141d10d9916" - integrity sha1-VRIrZTbqSWtLRIk+4mCBQdENmRY= + resolved "https://registry.npmjs.org/flatted/-/flatted-2.0.0.tgz#55122b6536ea496b4b44893ee2608141d10d9916" + integrity sha512-R+H8IZclI8AAkSBRQJLVOsxwAoHd6WC40b4QTNWIjzAa6BXOBfQcM587MXDTVPeYaopFNWHUFLx7eNmHDSxMWg== flush-write-stream@^1.0.0: version "1.0.3" @@ -4691,8 +4718,8 @@ globby@^7.1.1: globby@^9.0.0: version "9.1.0" - resolved "http://registry.npm.taobao.org/globby/download/globby-9.1.0.tgz#e90f4d5134109e6d855abdd31bdb1b085428592e" - integrity sha1-6Q9NUTQQnm2FWr3TG9sbCFQoWS4= + resolved "https://registry.npmjs.org/globby/-/globby-9.1.0.tgz#e90f4d5134109e6d855abdd31bdb1b085428592e" + integrity sha512-VtYjhHr7ncls724Of5W6Kaahz0ag7dB4G62/2HsN+xEKG6SrPzM1AJMerGxQTwJGnN9reeyxdvXbuZYpfssCvg== dependencies: "@types/glob" "^7.1.1" array-union "^1.0.2" @@ -4739,8 +4766,8 @@ gzip-size@^5.0.0: handle-thing@^2.0.0: version "2.0.0" - resolved "http://registry.npm.taobao.org/handle-thing/download/handle-thing-2.0.0.tgz#0e039695ff50c93fc288557d696f3c1dc6776754" - integrity sha1-DgOWlf9QyT/CiFV9aW88HcZ3Z1Q= + resolved "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.0.tgz#0e039695ff50c93fc288557d696f3c1dc6776754" + integrity sha512-d4sze1JNC454Wdo2fkuyzCr6aHcbL6PGGuFAz0Li/NcOm1tCHGnWDRmJP85dh9IhQErTc2svWFEX5xHIOo//kQ== har-schema@^2.0.0: version "2.0.0" @@ -4867,8 +4894,8 @@ hoek@5.x.x: hoek@6.x.x: version "6.1.2" - resolved "http://registry.npm.taobao.org/hoek/download/hoek-6.1.2.tgz#99e6d070561839de74ee427b61aa476bd6bddfd6" - integrity sha1-mebQcFYYOd507kJ7YapHa9a939Y= + resolved "https://registry.npmjs.org/hoek/-/hoek-6.1.2.tgz#99e6d070561839de74ee427b61aa476bd6bddfd6" + integrity sha512-6qhh/wahGYZHFSFw12tBbJw5fsAhhwrrG/y3Cs0YMTv2WzMnL0oLPnQJjv1QJvEfylRSOFuP+xCu+tdx0tD16Q== hoopy@^0.1.2: version "0.1.4" @@ -4925,7 +4952,7 @@ html-minifier@^3.2.3: html-tags@^2.0.0: version "2.0.0" - resolved "http://registry.npm.taobao.org/html-tags/download/html-tags-2.0.0.tgz#10b30a386085f43cede353cc8fa7cb0deeea668b" + resolved "https://registry.npmjs.org/html-tags/-/html-tags-2.0.0.tgz#10b30a386085f43cede353cc8fa7cb0deeea668b" integrity sha1-ELMKOGCF9Dzt41PMj6fLDe7qZos= html-webpack-plugin@^3.2.0: @@ -4973,8 +5000,8 @@ http-parser-js@>=0.4.0: http-proxy-middleware@^0.19.1: version "0.19.1" - resolved "http://registry.npm.taobao.org/http-proxy-middleware/download/http-proxy-middleware-0.19.1.tgz#183c7dc4aa1479150306498c210cdaf96080a43a" - integrity sha1-GDx9xKoUeRUDBkmMIQza+WCApDo= + resolved "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz#183c7dc4aa1479150306498c210cdaf96080a43a" + integrity sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q== dependencies: http-proxy "^1.17.0" is-glob "^4.0.0" @@ -4983,8 +5010,8 @@ http-proxy-middleware@^0.19.1: http-proxy@^1.17.0: version "1.17.0" - resolved "http://registry.npm.taobao.org/http-proxy/download/http-proxy-1.17.0.tgz#7ad38494658f84605e2f6db4436df410f4e5be9a" - integrity sha1-etOElGWPhGBeL220Q230EPTlvpo= + resolved "https://registry.npmjs.org/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" @@ -5054,8 +5081,8 @@ ignore@^3.3.3, ignore@^3.3.5: ignore@^4.0.3, ignore@^4.0.6: version "4.0.6" - resolved "http://registry.npm.taobao.org/ignore/download/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" - integrity sha1-dQ49tYYgh7RzfrrIIH/9HvJ7Jfw= + resolved "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" + integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== ignore@^5.0.2: version "5.0.4" @@ -5076,8 +5103,8 @@ import-cwd@^2.0.0: import-fresh@^3.0.0: version "3.0.0" - resolved "http://registry.npm.taobao.org/import-fresh/download/import-fresh-3.0.0.tgz#a3d897f420cab0e671236897f75bc14b4885c390" - integrity sha1-o9iX9CDKsOZxI2iX91vBS0iFw5A= + resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-3.0.0.tgz#a3d897f420cab0e671236897f75bc14b4885c390" + integrity sha512-pOnA9tfM3Uwics+SaBLCNyZZZbK+4PTu0OPZtLlMIrv17EdBoC15S9Kn8ckJ9TZTyKb3ywNE5y1yeDxxGA7nTQ== dependencies: parent-module "^1.0.0" resolve-from "^4.0.0" @@ -5169,8 +5196,8 @@ inquirer@^3.0.6: inquirer@^6.2.2: version "6.2.2" - resolved "http://registry.npm.taobao.org/inquirer/download/inquirer-6.2.2.tgz#46941176f65c9eb20804627149b743a218f25406" - integrity sha1-RpQRdvZcnrIIBGJxSbdDohjyVAY= + resolved "https://registry.npmjs.org/inquirer/-/inquirer-6.2.2.tgz#46941176f65c9eb20804627149b743a218f25406" + integrity sha512-Z2rREiXA6cHRR9KBOarR3WuLlFzlIfAEIiB45ll5SSadMg7WqOh1MKEjjndfuH5ewXdixWCxqnVfGOQzPeiztA== dependencies: ansi-escapes "^3.2.0" chalk "^2.4.2" @@ -5188,8 +5215,8 @@ inquirer@^6.2.2: internal-ip@^4.2.0: version "4.2.0" - resolved "http://registry.npm.taobao.org/internal-ip/download/internal-ip-4.2.0.tgz#46e81b638d84c338e5c67e42b1a17db67d0814fa" - integrity sha1-RugbY42Ewzjlxn5CsaF9tn0IFPo= + resolved "https://registry.npmjs.org/internal-ip/-/internal-ip-4.2.0.tgz#46e81b638d84c338e5c67e42b1a17db67d0814fa" + integrity sha512-ZY8Rk+hlvFeuMmG5uH1MXhhdeMntmIaxaInvAmzMq/SHV8rv4Kh+6GiQNNDQd0wZFrcO+FiTBo8lui/osKOyJw== dependencies: default-gateway "^4.0.1" ipaddr.js "^1.9.0" @@ -5233,8 +5260,8 @@ ipaddr.js@1.8.0: ipaddr.js@^1.9.0: version "1.9.0" - resolved "http://registry.npm.taobao.org/ipaddr.js/download/ipaddr.js-1.9.0.tgz#37df74e430a0e47550fe54a2defe30d8acd95f65" - integrity sha1-N9905DCg5HVQ/lSi3v4w2KzZX2U= + resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.0.tgz#37df74e430a0e47550fe54a2defe30d8acd95f65" + integrity sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA== is-absolute-url@^2.0.0: version "2.1.0" @@ -5523,8 +5550,8 @@ isexe@^2.0.0: ismobilejs@^0.5.1: version "0.5.1" - resolved "http://registry.npm.taobao.org/ismobilejs/download/ismobilejs-0.5.1.tgz#0e3f825e29e32f84ad5ddbb60e9e04a894046488" - integrity sha1-Dj+CXinjL4StXdu2Dp4EqJQEZIg= + resolved "https://registry.npmjs.org/ismobilejs/-/ismobilejs-0.5.1.tgz#0e3f825e29e32f84ad5ddbb60e9e04a894046488" + integrity sha512-QX4STsOcBYqlTjVGuAdP1MiRVxtiUbRHOKH0v7Gn1EvfUVIQnrSdgCM4zB4VCZuIejnb2NUMUx0Bwd3EIG6yyA== isobject@^2.0.0: version "2.1.0" @@ -5550,8 +5577,8 @@ javascript-stringify@^1.6.0: joi@^14.3.0: version "14.3.1" - resolved "http://registry.npm.taobao.org/joi/download/joi-14.3.1.tgz#164a262ec0b855466e0c35eea2a885ae8b6c703c" - integrity sha1-FkomLsC4VUZuDDXuoqiFrotscDw= + resolved "https://registry.npmjs.org/joi/-/joi-14.3.1.tgz#164a262ec0b855466e0c35eea2a885ae8b6c703c" + integrity sha512-LQDdM+pkOrpAn4Lp+neNIFV3axv1Vna3j38bisbQhETPMANYRbFJFUyOZcOClYvM/hppMhGWuKSFEK9vjrB+bQ== dependencies: hoek "6.x.x" isemail "3.x.x" @@ -5832,8 +5859,8 @@ loader-runner@^2.3.0: loader-runner@^2.3.1: version "2.4.0" - resolved "http://registry.npm.taobao.org/loader-runner/download/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357" - integrity sha1-7UcGa/5TTX6ExMe5mYwqdWB9k1c= + resolved "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357" + integrity sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw== loader-utils@^0.2.16: version "0.2.17" @@ -5897,7 +5924,7 @@ lodash.get@^4.4.2: lodash.kebabcase@^4.1.1: version "4.1.1" - resolved "http://registry.npm.taobao.org/lodash.kebabcase/download/lodash.kebabcase-4.1.1.tgz#8489b1cb0d29ff88195cceca448ff6d6cc295c36" + resolved "https://registry.npmjs.org/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz#8489b1cb0d29ff88195cceca448ff6d6cc295c36" integrity sha1-hImxyw0p/4gZXM7KRI/21swpXDY= lodash.mapvalues@^4.6.0: @@ -5935,7 +5962,7 @@ lodash.uniq@^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: +lodash@^4.0.0, lodash@^4.11.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== @@ -5995,8 +6022,8 @@ lru-cache@^4.1.2, lru-cache@^4.1.3: lru-cache@^5.1.1: version "5.1.1" - resolved "http://registry.npm.taobao.org/lru-cache/download/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" - integrity sha1-HaJ+ZxAnGUdpXa9oSOhH8B2EuSA= + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== dependencies: yallist "^3.0.2" @@ -6106,8 +6133,8 @@ merge-source-map@^1.1.0: merge2@^1.2.3: version "1.2.3" - resolved "http://registry.npm.taobao.org/merge2/download/merge2-1.2.3.tgz#7ee99dbd69bb6481689253f018488a1b902b0ed5" - integrity sha1-fumdvWm7ZIFoklPwGEiKG5ArDtU= + resolved "https://registry.npmjs.org/merge2/-/merge2-1.2.3.tgz#7ee99dbd69bb6481689253f018488a1b902b0ed5" + integrity sha512-gdUU1Fwj5ep4kplwcmftruWofEFt6lfpkkr3h860CXbAB9c3hGb55EOL2ali0Td5oebvW0E1+3Sr+Ur7XfKpRA== methods@~1.1.2: version "1.1.2" @@ -6175,8 +6202,8 @@ mimic-fn@^1.0.0: mini-css-extract-plugin@^0.5.0: version "0.5.0" - resolved "http://registry.npm.taobao.org/mini-css-extract-plugin/download/mini-css-extract-plugin-0.5.0.tgz#ac0059b02b9692515a637115b0cc9fed3a35c7b0" - integrity sha1-rABZsCuWklFaY3EVsMyf7To1x7A= + resolved "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.5.0.tgz#ac0059b02b9692515a637115b0cc9fed3a35c7b0" + integrity sha512-IuaLjruM0vMKhUUT51fQdQzBYTX49dLj8w68ALEAe2A4iYNpIC4eMac67mt3NzycvjOlf07/kYxJDc0RTl1Wqw== dependencies: loader-utils "^1.1.0" schema-utils "^1.0.0" @@ -6321,8 +6348,8 @@ multicast-dns@^6.0.1: mutationobserver-shim@^0.3.2: version "0.3.3" - resolved "http://registry.npm.taobao.org/mutationobserver-shim/download/mutationobserver-shim-0.3.3.tgz#65869630bc89d7bf8c9cd9cb82188cd955aacd2b" - integrity sha1-ZYaWMLyJ17+MnNnLghiM2VWqzSs= + resolved "https://registry.npmjs.org/mutationobserver-shim/-/mutationobserver-shim-0.3.3.tgz#65869630bc89d7bf8c9cd9cb82188cd955aacd2b" + integrity sha512-gciOLNN8Vsf7YzcqRjKzlAJ6y7e+B86u7i3KXes0xfxx/nfLmozlW1Vn+Sc9x3tPIePFgc1AeIFhtRgkqTjzDQ== mute-stream@0.0.7: version "0.0.7" @@ -6472,16 +6499,16 @@ node-releases@^1.0.0-alpha.14, node-releases@^1.0.5: semver "^5.3.0" node-releases@^1.1.8: - version "1.1.9" - resolved "http://registry.npm.taobao.org/node-releases/download/node-releases-1.1.9.tgz#70d0985ec4bf7de9f08fc481f5dae111889ca482" - integrity sha1-cNCYXsS/fenwj8SB9drhEYicpII= + version "1.1.10" + resolved "https://registry.npmjs.org/node-releases/-/node-releases-1.1.10.tgz#5dbeb6bc7f4e9c85b899e2e7adcc0635c9b2adf7" + integrity sha512-KbUPCpfoBvb3oBkej9+nrU0/7xPlVhmhhUJ1PZqwIP5/1dJkRWKWD3OONjo6M2J7tSCBtDCumLwwqeI+DWWaLQ== dependencies: semver "^5.3.0" node-sass@^4.11.0: version "4.11.0" - resolved "http://registry.npm.taobao.org/node-sass/download/node-sass-4.11.0.tgz#183faec398e9cbe93ba43362e2768ca988a6369a" - integrity sha1-GD+uw5jpy+k7pDNi4naMqYimNpo= + resolved "https://registry.npmjs.org/node-sass/-/node-sass-4.11.0.tgz#183faec398e9cbe93ba43362e2768ca988a6369a" + integrity sha512-bHUdHTphgQJZaF1LASx0kAviPH7sGlcyNhWade4eVIpFp6tsn7SV8xNMTbsQFpEV9VXpnwTTnNYlfsZXgGgmkA== dependencies: async-foreach "^0.1.3" chalk "^1.1.1" @@ -6542,8 +6569,8 @@ normalize-path@^2.1.1: normalize-path@^3.0.0: version "3.0.0" - resolved "http://registry.npm.taobao.org/normalize-path/download/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" - integrity sha1-Dc1p/yOhybEf0JeDFmRKA4ghamU= + resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== normalize-range@^0.1.2: version "0.1.2" @@ -6745,22 +6772,10 @@ optionator@^0.8.2: type-check "~0.3.2" wordwrap "~1.0.0" -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" - ora@^3.1.0: version "3.2.0" - resolved "http://registry.npm.taobao.org/ora/download/ora-3.2.0.tgz#67e98a7e11f7f0ac95deaaaf11bb04de3d09e481" - integrity sha1-Z+mKfhH38KyV3qqvEbsE3j0J5IE= + resolved "https://registry.npmjs.org/ora/-/ora-3.2.0.tgz#67e98a7e11f7f0ac95deaaaf11bb04de3d09e481" + integrity sha512-XHMZA5WieCbtg+tu0uPF8CjvwQdNzKCX6BVh3N6GFsEXH40mTk5dsw/ya1lBTUGJslcEFJFQ8cBhOgkkZXQtMA== dependencies: chalk "^2.4.2" cli-cursor "^2.1.0" @@ -6896,8 +6911,8 @@ param-case@2.1.x: parent-module@^1.0.0: version "1.0.0" - resolved "http://registry.npm.taobao.org/parent-module/download/parent-module-1.0.0.tgz#df250bdc5391f4a085fb589dad761f5ad6b865b5" - integrity sha1-3yUL3FOR9KCF+1idrXYfWta4ZbU= + resolved "https://registry.npmjs.org/parent-module/-/parent-module-1.0.0.tgz#df250bdc5391f4a085fb589dad761f5ad6b865b5" + integrity sha512-8Mf5juOMmiE4FcmzYc4IaiS9L3+9paz2KOiXzkRviCP6aDmN49Hz6EMWz0lGNp9pX80GvvAuLADtyGfW/Em3TA== dependencies: callsites "^3.0.0" @@ -7040,8 +7055,8 @@ pify@^3.0.0: pify@^4.0.1: version "4.0.1" - resolved "http://registry.npm.taobao.org/pify/download/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" - integrity sha1-SyzSXFDVmHNcUCkiJP2MbfQeMjE= + resolved "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" + integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== pinkie-promise@^2.0.0: version "2.0.1" @@ -7092,8 +7107,8 @@ point-at-length@~1.0.2: portfinder@^1.0.20: version "1.0.20" - resolved "http://registry.npm.taobao.org/portfinder/download/portfinder-1.0.20.tgz#bea68632e54b2e13ab7b0c4775e9b41bf270e44a" - integrity sha1-vqaGMuVLLhOrewxHdem0G/Jw5Eo= + resolved "https://registry.npmjs.org/portfinder/-/portfinder-1.0.20.tgz#bea68632e54b2e13ab7b0c4775e9b41bf270e44a" + integrity sha512-Yxe4mTyDzTd59PZJY4ojZR8F+E5e97iq2ZOHPz3HDgSvYC5siNad2tLooQ5y5QHyQhc3xVqvyk/eNA3wuoa7Sw== dependencies: async "^1.5.2" debug "^2.2.0" @@ -7125,8 +7140,8 @@ postcss-calc@^7.0.0: postcss-calc@^7.0.1: version "7.0.1" - resolved "http://registry.npm.taobao.org/postcss-calc/download/postcss-calc-7.0.1.tgz#36d77bab023b0ecbb9789d84dcb23c4941145436" - integrity sha1-Ntd7qwI7Dsu5eJ2E3LI8SUEUVDY= + resolved "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.1.tgz#36d77bab023b0ecbb9789d84dcb23c4941145436" + integrity sha512-oXqx0m6tb4N3JGdmeMSc/i91KppbYsFZKdH0xMOqK8V1rJlzrKlTdokz8ozUXLVejydRN6u2IddxpcijRj2FqQ== dependencies: css-unit-converter "^1.1.1" postcss "^7.0.5" @@ -7146,8 +7161,8 @@ postcss-colormin@^4.0.2: postcss-colormin@^4.0.3: version "4.0.3" - resolved "http://registry.npm.taobao.org/postcss-colormin/download/postcss-colormin-4.0.3.tgz#ae060bce93ed794ac71264f08132d550956bd381" - integrity sha1-rgYLzpPteUrHEmTwgTLVUJVr04E= + resolved "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-4.0.3.tgz#ae060bce93ed794ac71264f08132d550956bd381" + integrity sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw== dependencies: browserslist "^4.0.0" color "^3.0.0" @@ -7172,8 +7187,8 @@ postcss-discard-comments@^4.0.1: postcss-discard-comments@^4.0.2: version "4.0.2" - resolved "http://registry.npm.taobao.org/postcss-discard-comments/download/postcss-discard-comments-4.0.2.tgz#1fbabd2c246bff6aaad7997b2b0918f4d7af4033" - integrity sha1-H7q9LCRr/2qq15l7KwkY9NevQDM= + resolved "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz#1fbabd2c246bff6aaad7997b2b0918f4d7af4033" + integrity sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg== dependencies: postcss "^7.0.0" @@ -7218,8 +7233,8 @@ postcss-loader@^3.0.0: postcss-merge-longhand@^4.0.11: version "4.0.11" - resolved "http://registry.npm.taobao.org/postcss-merge-longhand/download/postcss-merge-longhand-4.0.11.tgz#62f49a13e4a0ee04e7b98f42bb16062ca2549e24" - integrity sha1-YvSaE+Sg7gTnuY9CuxYGLKJUniQ= + resolved "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz#62f49a13e4a0ee04e7b98f42bb16062ca2549e24" + integrity sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw== dependencies: css-color-names "0.0.4" postcss "^7.0.0" @@ -7250,8 +7265,8 @@ postcss-merge-rules@^4.0.2: postcss-merge-rules@^4.0.3: version "4.0.3" - resolved "http://registry.npm.taobao.org/postcss-merge-rules/download/postcss-merge-rules-4.0.3.tgz#362bea4ff5a1f98e4075a713c6cb25aefef9a650" - integrity sha1-NivqT/Wh+Y5AdacTxsslrv75plA= + resolved "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz#362bea4ff5a1f98e4075a713c6cb25aefef9a650" + integrity sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ== dependencies: browserslist "^4.0.0" caniuse-api "^3.0.0" @@ -7280,8 +7295,8 @@ postcss-minify-gradients@^4.0.1: postcss-minify-gradients@^4.0.2: version "4.0.2" - resolved "http://registry.npm.taobao.org/postcss-minify-gradients/download/postcss-minify-gradients-4.0.2.tgz#93b29c2ff5099c535eecda56c4aa6e665a663471" - integrity sha1-k7KcL/UJnFNe7NpWxKpuZlpmNHE= + resolved "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz#93b29c2ff5099c535eecda56c4aa6e665a663471" + integrity sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q== dependencies: cssnano-util-get-arguments "^4.0.0" is-color-stop "^1.0.0" @@ -7302,8 +7317,8 @@ postcss-minify-params@^4.0.1: postcss-minify-params@^4.0.2: version "4.0.2" - resolved "http://registry.npm.taobao.org/postcss-minify-params/download/postcss-minify-params-4.0.2.tgz#6b9cef030c11e35261f95f618c90036d680db874" - integrity sha1-a5zvAwwR41Jh+V9hjJADbWgNuHQ= + resolved "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz#6b9cef030c11e35261f95f618c90036d680db874" + integrity sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg== dependencies: alphanum-sort "^1.0.0" browserslist "^4.0.0" @@ -7324,8 +7339,8 @@ postcss-minify-selectors@^4.0.1: postcss-minify-selectors@^4.0.2: version "4.0.2" - resolved "http://registry.npm.taobao.org/postcss-minify-selectors/download/postcss-minify-selectors-4.0.2.tgz#e2e5eb40bfee500d0cd9243500f5f8ea4262fbd8" - integrity sha1-4uXrQL/uUA0M2SQ1APX46kJi+9g= + resolved "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz#e2e5eb40bfee500d0cd9243500f5f8ea4262fbd8" + integrity sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g== dependencies: alphanum-sort "^1.0.0" has "^1.0.0" @@ -7381,8 +7396,8 @@ postcss-normalize-display-values@^4.0.1: postcss-normalize-display-values@^4.0.2: version "4.0.2" - resolved "http://registry.npm.taobao.org/postcss-normalize-display-values/download/postcss-normalize-display-values-4.0.2.tgz#0dbe04a4ce9063d4667ed2be476bb830c825935a" - integrity sha1-Db4EpM6QY9RmftK+R2u4MMglk1o= + resolved "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz#0dbe04a4ce9063d4667ed2be476bb830c825935a" + integrity sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ== dependencies: cssnano-util-get-match "^4.0.0" postcss "^7.0.0" @@ -7400,8 +7415,8 @@ postcss-normalize-positions@^4.0.1: postcss-normalize-positions@^4.0.2: version "4.0.2" - resolved "http://registry.npm.taobao.org/postcss-normalize-positions/download/postcss-normalize-positions-4.0.2.tgz#05f757f84f260437378368a91f8932d4b102917f" - integrity sha1-BfdX+E8mBDc3g2ipH4ky1LECkX8= + resolved "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz#05f757f84f260437378368a91f8932d4b102917f" + integrity sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA== dependencies: cssnano-util-get-arguments "^4.0.0" has "^1.0.0" @@ -7420,8 +7435,8 @@ postcss-normalize-repeat-style@^4.0.1: postcss-normalize-repeat-style@^4.0.2: version "4.0.2" - resolved "http://registry.npm.taobao.org/postcss-normalize-repeat-style/download/postcss-normalize-repeat-style-4.0.2.tgz#c4ebbc289f3991a028d44751cbdd11918b17910c" - integrity sha1-xOu8KJ85kaAo1EdRy90RkYsXkQw= + resolved "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz#c4ebbc289f3991a028d44751cbdd11918b17910c" + integrity sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q== dependencies: cssnano-util-get-arguments "^4.0.0" cssnano-util-get-match "^4.0.0" @@ -7439,8 +7454,8 @@ postcss-normalize-string@^4.0.1: postcss-normalize-string@^4.0.2: version "4.0.2" - resolved "http://registry.npm.taobao.org/postcss-normalize-string/download/postcss-normalize-string-4.0.2.tgz#cd44c40ab07a0c7a36dc5e99aace1eca4ec2690c" - integrity sha1-zUTECrB6DHo23F6Zqs4eyk7CaQw= + resolved "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz#cd44c40ab07a0c7a36dc5e99aace1eca4ec2690c" + integrity sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA== dependencies: has "^1.0.0" postcss "^7.0.0" @@ -7457,8 +7472,8 @@ postcss-normalize-timing-functions@^4.0.1: postcss-normalize-timing-functions@^4.0.2: version "4.0.2" - resolved "http://registry.npm.taobao.org/postcss-normalize-timing-functions/download/postcss-normalize-timing-functions-4.0.2.tgz#8e009ca2a3949cdaf8ad23e6b6ab99cb5e7d28d9" - integrity sha1-jgCcoqOUnNr4rSPmtquZy159KNk= + resolved "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz#8e009ca2a3949cdaf8ad23e6b6ab99cb5e7d28d9" + integrity sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A== dependencies: cssnano-util-get-match "^4.0.0" postcss "^7.0.0" @@ -7493,8 +7508,8 @@ postcss-normalize-whitespace@^4.0.1: postcss-normalize-whitespace@^4.0.2: version "4.0.2" - resolved "http://registry.npm.taobao.org/postcss-normalize-whitespace/download/postcss-normalize-whitespace-4.0.2.tgz#bf1d4070fe4fcea87d1348e825d8cc0c5faa7d82" - integrity sha1-vx1AcP5Pzqh9E0joJdjMDF+qfYI= + resolved "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz#bf1d4070fe4fcea87d1348e825d8cc0c5faa7d82" + integrity sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA== dependencies: postcss "^7.0.0" postcss-value-parser "^3.0.0" @@ -7510,8 +7525,8 @@ postcss-ordered-values@^4.1.1: postcss-ordered-values@^4.1.2: version "4.1.2" - resolved "http://registry.npm.taobao.org/postcss-ordered-values/download/postcss-ordered-values-4.1.2.tgz#0cf75c820ec7d5c4d280189559e0b571ebac0eee" - integrity sha1-DPdcgg7H1cTSgBiVWeC1ceusDu4= + resolved "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz#0cf75c820ec7d5c4d280189559e0b571ebac0eee" + integrity sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw== dependencies: cssnano-util-get-arguments "^4.0.0" postcss "^7.0.0" @@ -7529,8 +7544,8 @@ postcss-reduce-initial@^4.0.2: postcss-reduce-initial@^4.0.3: version "4.0.3" - resolved "http://registry.npm.taobao.org/postcss-reduce-initial/download/postcss-reduce-initial-4.0.3.tgz#7fd42ebea5e9c814609639e2c2e84ae270ba48df" - integrity sha1-f9QuvqXpyBRgljniwuhK4nC6SN8= + resolved "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz#7fd42ebea5e9c814609639e2c2e84ae270ba48df" + integrity sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA== dependencies: browserslist "^4.0.0" caniuse-api "^3.0.0" @@ -7549,8 +7564,8 @@ postcss-reduce-transforms@^4.0.1: postcss-reduce-transforms@^4.0.2: version "4.0.2" - resolved "http://registry.npm.taobao.org/postcss-reduce-transforms/download/postcss-reduce-transforms-4.0.2.tgz#17efa405eacc6e07be3414a5ca2d1074681d4e29" - integrity sha1-F++kBerMbge+NBSlyi0QdGgdTik= + resolved "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz#17efa405eacc6e07be3414a5ca2d1074681d4e29" + integrity sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg== dependencies: cssnano-util-get-match "^4.0.0" has "^1.0.0" @@ -7568,8 +7583,8 @@ postcss-selector-parser@^3.0.0: postcss-selector-parser@^5.0.0, postcss-selector-parser@^5.0.0-rc.4: version "5.0.0" - resolved "http://registry.npm.taobao.org/postcss-selector-parser/download/postcss-selector-parser-5.0.0.tgz#249044356697b33b64f1a8f7c80922dddee7195c" - integrity sha1-JJBENWaXsztk8aj3yAki3d7nGVw= + resolved "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz#249044356697b33b64f1a8f7c80922dddee7195c" + integrity sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ== dependencies: cssesc "^2.0.0" indexes-of "^1.0.1" @@ -7597,8 +7612,8 @@ postcss-svgo@^4.0.1: postcss-svgo@^4.0.2: version "4.0.2" - resolved "http://registry.npm.taobao.org/postcss-svgo/download/postcss-svgo-4.0.2.tgz#17b997bc711b333bab143aaed3b8d3d6e3d38258" - integrity sha1-F7mXvHEbMzurFDqu07jT1uPTglg= + resolved "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-4.0.2.tgz#17b997bc711b333bab143aaed3b8d3d6e3d38258" + integrity sha512-C6wyjo3VwFm0QgBy+Fu7gCYOkCmgmClghO+pjcxvrcBKtiKt0uCF+hvbMO1fyv5BMImRK90SMb+dwUnfbGd+jw== dependencies: is-svg "^3.0.0" postcss "^7.0.0" @@ -7639,8 +7654,8 @@ postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.2: postcss@^7.0.14, postcss@^7.0.5: version "7.0.14" - resolved "http://registry.npm.taobao.org/postcss/download/postcss-7.0.14.tgz#4527ed6b1ca0d82c53ce5ec1a2041c2346bbd6e5" - integrity sha1-RSftaxyg2CxTzl7BogQcI0a71uU= + resolved "https://registry.npmjs.org/postcss/-/postcss-7.0.14.tgz#4527ed6b1ca0d82c53ce5ec1a2041c2346bbd6e5" + integrity sha512-NsbD6XUUMZvBxtQAJuWDJeeC4QFsmWsfozWxCJPWf3M55K9iu2iMDaKqyoOdTJ1R4usBXuxlVFAIo8rZPQD4Bg== dependencies: chalk "^2.4.2" source-map "^0.6.1" @@ -7653,8 +7668,8 @@ prelude-ls@~1.1.2: prettier@1.16.3: version "1.16.3" - resolved "http://registry.npm.taobao.org/prettier/download/prettier-1.16.3.tgz#8c62168453badef702f34b45b6ee899574a6a65d" - integrity sha1-jGIWhFO63vcC80tFtu6JlXSmpl0= + resolved "https://registry.npmjs.org/prettier/-/prettier-1.16.3.tgz#8c62168453badef702f34b45b6ee899574a6a65d" + integrity sha512-kn/GU6SMRYPxUakNXhpP0EedT/KmaPzr0H5lIsDogrykbaxOpOfAFfk5XA7DZrJyMAv1wlMV3CPcZruGXVVUZw== pretty-error@^2.0.2: version "2.1.1" @@ -7689,6 +7704,11 @@ promise-inflight@^1.0.1: resolved "http://registry.npm.taobao.org/promise-inflight/download/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM= +promise-polyfill@8.1.0: + version "8.1.0" + resolved "https://registry.npmjs.org/promise-polyfill/-/promise-polyfill-8.1.0.tgz#30059da54d1358ce905ac581f287e184aedf995d" + integrity sha512-OzSf6gcCUQ01byV4BgwyUCswlaQQ6gzXc23aLQWhicvfX9kfsUiUhgt3CCQej8jDnl8/PhGF31JdHX2/MzF3WA== + promise@^7.1.1: version "7.3.1" resolved "http://registry.npm.taobao.org/promise/download/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf" @@ -7719,6 +7739,11 @@ psl@^1.1.24: resolved "http://registry.npm.taobao.org/psl/download/psl-1.1.29.tgz#60f580d360170bb722a797cc704411e6da850c67" integrity sha1-YPWA02AXC7cip5fMcEQR5tqFDGc= +psl@^1.1.28: + version "1.1.31" + resolved "https://registry.npmjs.org/psl/-/psl-1.1.31.tgz#e9aa86d0101b5b105cbe93ac6b784cd547276184" + integrity sha512-/6pt4+C+T+wZUieKR620OpzN/LlnNKuWjy1iFLQ/UG35JqHlR/89MP1d96dUfkf6Dne3TuLQzOYEYshJ+Hx8mw== + 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" @@ -7761,7 +7786,7 @@ punycode@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: +punycode@2.x.x, punycode@^2.1.0, punycode@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== @@ -7911,8 +7936,8 @@ readable-stream@1.0: readable-stream@^3.0.6: version "3.2.0" - resolved "http://registry.npm.taobao.org/readable-stream/download/readable-stream-3.2.0.tgz#de17f229864c120a9f56945756e4f32c4045245d" - integrity sha1-3hfyKYZMEgqfVpRXVuTzLEBFJF0= + resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-3.2.0.tgz#de17f229864c120a9f56945756e4f32c4045245d" + integrity sha512-RV20kLjdmpZuTF1INEb9IA3L68Nmi+Ri7ppZqo78wj//Pn62fCoJyV9zalccNzDD/OuJpMG4f+pfMl8+L6QdGw== dependencies: inherits "^2.0.3" string_decoder "^1.1.1" @@ -8070,21 +8095,21 @@ repeating@^2.0.0: 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= +request-promise-core@1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.2.tgz#339f6aababcafdb31c799ff158700336301d3346" + integrity sha512-UHYyq1MO8GsefGEt7EprS8UrXsm1TxEvFUX1IMTuSLU2Rh7fTIdFtl8xD7JiEYiWU2dl+NYAjCTksTehQUxPag== dependencies: - lodash "^4.13.1" + lodash "^4.17.11" -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= +request-promise-native@^1.0.7: + version "1.0.7" + resolved "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.7.tgz#a49868a624bdea5069f1251d0a836e0d89aa2c59" + integrity sha512-rIMnbBdgNViL37nZ1b3L/VfPOpSi0TqVDQPAvO6U14lMzOLrt5nilxCQqtDKhZeDiW0/hkCXGoQjhgJd/tCh6w== dependencies: - request-promise-core "1.1.1" - stealthy-require "^1.1.0" - tough-cookie ">=2.3.3" + request-promise-core "1.1.2" + stealthy-require "^1.1.1" + tough-cookie "^2.3.3" request@^2.83.0, request@^2.87.0, request@^2.88.0: version "2.88.0" @@ -8142,8 +8167,8 @@ requires-port@^1.0.0: resize-observer-polyfill@^1.5.1: version "1.5.1" - resolved "http://registry.npm.taobao.org/resize-observer-polyfill/download/resize-observer-polyfill-1.5.1.tgz#0e9020dd3d21024458d4ebd27e23e40269810464" - integrity sha1-DpAg3T0hAkRY1OvSfiPkAmmBBGQ= + resolved "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz#0e9020dd3d21024458d4ebd27e23e40269810464" + integrity sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg== resolve-cwd@^2.0.0: version "2.0.0" @@ -8164,8 +8189,8 @@ resolve-from@^3.0.0: resolve-from@^4.0.0: version "4.0.0" - resolved "http://registry.npm.taobao.org/resolve-from/download/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" - integrity sha1-SrzYUq0y3Xuqv+m0DgCjbbXzkuY= + resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== resolve-url@^0.2.1: version "0.2.1" @@ -8232,8 +8257,8 @@ rimraf@2, rimraf@^2.2.8, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2: rimraf@2.6.3: version "2.6.3" - resolved "http://registry.npm.taobao.org/rimraf/download/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" - integrity sha1-stEE/g2Psnz54KHNqCYt04M8bKs= + resolved "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" + integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== dependencies: glob "^7.1.3" @@ -8287,8 +8312,8 @@ rx-lite@*, rx-lite@^4.0.8: rxjs@^6.4.0: version "6.4.0" - resolved "http://registry.npm.taobao.org/rxjs/download/rxjs-6.4.0.tgz#f3bb0fe7bda7fb69deac0c16f17b50b0b8790504" - integrity sha1-87sP572n+2nerAwW8XtQsLh5BQQ= + resolved "https://registry.npmjs.org/rxjs/-/rxjs-6.4.0.tgz#f3bb0fe7bda7fb69deac0c16f17b50b0b8790504" + integrity sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw== dependencies: tslib "^1.9.0" @@ -8550,8 +8575,8 @@ slice-ansi@1.0.0: slice-ansi@^2.1.0: version "2.1.0" - resolved "http://registry.npm.taobao.org/slice-ansi/download/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636" - integrity sha1-ys12k0YaY3pXiNkqfdT7oGjoFjY= + resolved "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636" + integrity sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ== dependencies: ansi-styles "^3.2.0" astral-regex "^1.0.0" @@ -8640,8 +8665,8 @@ source-map-support@~0.5.6: source-map-support@~0.5.9: version "0.5.10" - resolved "http://registry.npm.taobao.org/source-map-support/download/source-map-support-0.5.10.tgz#2214080bc9d51832511ee2bab96e3c2f9353120c" - integrity sha1-IhQIC8nVGDJRHuK6uW48L5NTEgw= + resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.10.tgz#2214080bc9d51832511ee2bab96e3c2f9353120c" + integrity sha512-YfQ3tQFTK/yzlGJuX8pTwa4tifQj4QS2Mj7UegOu8jAz59MqIiMGPXxQhVQiIMNzayuUSF/jEuVnfFF5JqybmQ== dependencies: buffer-from "^1.0.0" source-map "^0.6.0" @@ -8703,8 +8728,8 @@ spdx-license-ids@^3.0.0: spdy-transport@^3.0.0: version "3.0.0" - resolved "http://registry.npm.taobao.org/spdy-transport/download/spdy-transport-3.0.0.tgz#00d4863a6400ad75df93361a1608605e5dcdcf31" - integrity sha1-ANSGOmQArXXfkzYaFghgXl3NzzE= + resolved "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz#00d4863a6400ad75df93361a1608605e5dcdcf31" + integrity sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw== dependencies: debug "^4.1.0" detect-node "^2.0.4" @@ -8715,8 +8740,8 @@ spdy-transport@^3.0.0: spdy@^4.0.0: version "4.0.0" - resolved "http://registry.npm.taobao.org/spdy/download/spdy-4.0.0.tgz#81f222b5a743a329aa12cea6a390e60e9b613c52" - integrity sha1-gfIitadDoymqEs6mo5DmDpthPFI= + resolved "https://registry.npmjs.org/spdy/-/spdy-4.0.0.tgz#81f222b5a743a329aa12cea6a390e60e9b613c52" + integrity sha512-ot0oEGT/PGUpzf/6uk4AWLqkq+irlqHXkrdbk51oWONh3bxQmBuljxPNl66zlRRcIJStWq0QkLUCPOPjgjvU0Q== dependencies: debug "^4.1.0" handle-thing "^2.0.0" @@ -8800,9 +8825,9 @@ stdout-stream@^1.4.0: dependencies: readable-stream "^2.0.1" -stealthy-require@^1.1.0: +stealthy-require@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" + resolved "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" integrity sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks= stream-browserify@^2.0.1: @@ -8860,13 +8885,13 @@ string-width@^1.0.1, string-width@^1.0.2: strip-ansi "^4.0.0" string-width@^3.0.0: - version "3.0.0" - resolved "http://registry.npm.taobao.org/string-width/download/string-width-3.0.0.tgz#5a1690a57cc78211fffd9bf24bbe24d090604eb1" - integrity sha1-WhaQpXzHghH//ZvyS74k0JBgTrE= + version "3.1.0" + resolved "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" + integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== dependencies: emoji-regex "^7.0.1" is-fullwidth-code-point "^2.0.0" - strip-ansi "^5.0.0" + strip-ansi "^5.1.0" string.prototype.padend@^3.0.0: version "3.0.0" @@ -8935,6 +8960,13 @@ strip-ansi@^5.0.0: dependencies: ansi-regex "^4.0.0" +strip-ansi@^5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.1.0.tgz#55aaa54e33b4c0649a7338a43437b1887d153ec4" + integrity sha512-TjxrkPONqO2Z8QDCpeE2j6n0M6EwxzyDgzEeGp+FbdvaJAt//ClYi6W5my+3ROlC/hZX2KACUwDfK49Ka5eDvg== + dependencies: + ansi-regex "^4.1.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" @@ -9000,16 +9032,64 @@ supports-color@^5.3.0, supports-color@^5.4.0, supports-color@^5.5.0: supports-color@^6.1.0: version "6.1.0" - resolved "http://registry.npm.taobao.org/supports-color/download/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3" - integrity sha1-B2Srxpxj1ayELdSGfo0CXogN+PM= + resolved "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3" + integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ== dependencies: has-flag "^3.0.0" svg-tags@^1.0.0: version "1.0.0" - resolved "http://registry.npm.taobao.org/svg-tags/download/svg-tags-1.0.0.tgz#58f71cee3bd519b59d4b2a843b6c7de64ac04764" + resolved "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz#58f71cee3bd519b59d4b2a843b6c7de64ac04764" integrity sha1-WPcc7jvVGbWdSyqEO2x95krAR2Q= +svg.draggable.js@^2.2.1: + version "2.2.2" + resolved "https://registry.npmjs.org/svg.draggable.js/-/svg.draggable.js-2.2.2.tgz#c514a2f1405efb6f0263e7958f5b68fce50603ba" + integrity sha512-JzNHBc2fLQMzYCZ90KZHN2ohXL0BQJGQimK1kGk6AvSeibuKcIdDX9Kr0dT9+UJ5O8nYA0RB839Lhvk4CY4MZw== + dependencies: + svg.js "^2.0.1" + +svg.easing.js@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/svg.easing.js/-/svg.easing.js-2.0.0.tgz#8aa9946b0a8e27857a5c40a10eba4091e5691f12" + integrity sha1-iqmUawqOJ4V6XEChDrpAkeVpHxI= + dependencies: + svg.js ">=2.3.x" + +svg.filter.js@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/svg.filter.js/-/svg.filter.js-2.0.2.tgz#91008e151389dd9230779fcbe6e2c9a362d1c203" + integrity sha1-kQCOFROJ3ZIwd5/L5uLJo2LRwgM= + dependencies: + svg.js "^2.2.5" + +svg.js@>=2.3.x, svg.js@^2.0.1, svg.js@^2.2.5, svg.js@^2.4.0, svg.js@^2.6.5, svg.js@^2.6.6: + version "2.7.1" + resolved "https://registry.npmjs.org/svg.js/-/svg.js-2.7.1.tgz#eb977ed4737001eab859949b4a398ee1bb79948d" + integrity sha512-ycbxpizEQktk3FYvn/8BH+6/EuWXg7ZpQREJvgacqn46gIddG24tNNe4Son6omdXCnSOaApnpZw6MPCBA1dODA== + +svg.pathmorphing.js@^0.1.3: + version "0.1.3" + resolved "https://registry.npmjs.org/svg.pathmorphing.js/-/svg.pathmorphing.js-0.1.3.tgz#c25718a1cc7c36e852ecabc380e758ac09bb2b65" + integrity sha512-49HWI9X4XQR/JG1qXkSDV8xViuTLIWm/B/7YuQELV5KMOPtXjiwH4XPJvr/ghEDibmLQ9Oc22dpWpG0vUDDNww== + dependencies: + svg.js "^2.4.0" + +svg.resize.js@^1.4.1: + version "1.4.3" + resolved "https://registry.npmjs.org/svg.resize.js/-/svg.resize.js-1.4.3.tgz#885abd248e0cd205b36b973c4b578b9a36f23332" + integrity sha512-9k5sXJuPKp+mVzXNvxz7U0uC9oVMQrrf7cFsETznzUDDm0x8+77dtZkWdMfRlmbkEEYvUn9btKuZ3n41oNA+uw== + dependencies: + svg.js "^2.6.5" + svg.select.js "^2.1.2" + +svg.select.js@^2.1.2: + version "2.1.2" + resolved "https://registry.npmjs.org/svg.select.js/-/svg.select.js-2.1.2.tgz#e41ce13b1acff43a7441f9f8be87a2319c87be73" + integrity sha512-tH6ABEyJsAOVAhwcCjF8mw4crjXSI1aa7j2VQR8ZuJ37H2MBUbyeqYr5nEO7sSN3cy9AR9DUwNg0t/962HlDbQ== + dependencies: + svg.js "^2.2.5" + svgo@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/svgo/-/svgo-1.1.1.tgz#12384b03335bcecd85cfa5f4e3375fed671cb985" @@ -9044,8 +9124,8 @@ table@4.0.2: table@^5.2.3: version "5.2.3" - resolved "http://registry.npm.taobao.org/table/download/table-5.2.3.tgz#cde0cc6eb06751c009efab27e8c820ca5b67b7f2" - integrity sha1-zeDMbrBnUcAJ76sn6Mggyltnt/I= + resolved "https://registry.npmjs.org/table/-/table-5.2.3.tgz#cde0cc6eb06751c009efab27e8c820ca5b67b7f2" + integrity sha512-N2RsDAMvDLvYwFcwbPyF3VmVSSkuF+G1e+8inhBLtHpvwXGw4QRPEZhihQNeEN0i1up6/f6ObCJXNdlRG3YVyQ== dependencies: ajv "^6.9.1" lodash "^4.17.11" @@ -9114,8 +9194,8 @@ terser-webpack-plugin@^1.1.0: terser-webpack-plugin@^1.2.2: version "1.2.3" - resolved "http://registry.npm.taobao.org/terser-webpack-plugin/download/terser-webpack-plugin-1.2.3.tgz#3f98bc902fac3e5d0de730869f50668561262ec8" - integrity sha1-P5i8kC+sPl0N5zCGn1BmhWEmLsg= + resolved "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.2.3.tgz#3f98bc902fac3e5d0de730869f50668561262ec8" + integrity sha512-GOK7q85oAb/5kE12fMuLdn2btOS9OBZn4VsecpHDywoUC/jLhSAKOiYo0ezx7ss2EXPMzyEWFoE0s1WLE+4+oA== dependencies: cacache "^11.0.2" find-cache-dir "^2.0.0" @@ -9128,8 +9208,8 @@ terser-webpack-plugin@^1.2.2: terser@^3.16.1: version "3.16.1" - resolved "http://registry.npm.taobao.org/terser/download/terser-3.16.1.tgz#5b0dd4fa1ffd0b0b43c2493b2c364fd179160493" - integrity sha1-Ww3U+h/9CwtDwkk7LDZP0XkWBJM= + resolved "https://registry.npmjs.org/terser/-/terser-3.16.1.tgz#5b0dd4fa1ffd0b0b43c2493b2c364fd179160493" + integrity sha512-JDJjgleBROeek2iBcSNzOHLKsB/MdDf+E/BOAJ0Tk9r7p9/fVobfv7LMJ/g/k3v9SXdmjZnIlFd5nfn/Rt0Xow== dependencies: commander "~2.17.1" source-map "~0.6.1" @@ -9151,8 +9231,8 @@ text-table@^0.2.0, text-table@~0.2.0: thread-loader@^2.1.2: version "2.1.2" - resolved "http://registry.npm.taobao.org/thread-loader/download/thread-loader-2.1.2.tgz#f585dd38e852c7f9cded5d092992108148f5eb30" - integrity sha1-9YXdOOhSx/nN7V0JKZIQgUj16zA= + resolved "https://registry.npmjs.org/thread-loader/-/thread-loader-2.1.2.tgz#f585dd38e852c7f9cded5d092992108148f5eb30" + integrity sha512-7xpuc9Ifg6WU+QYw/8uUqNdRwMD+N5gjwHKMqETrs96Qn+7BHwECpt2Brzr4HFlf4IAkZsayNhmGdbkBsTJ//w== dependencies: loader-runner "^2.3.1" loader-utils "^1.1.0" @@ -9190,9 +9270,14 @@ timsort@^0.3.0: tinycolor2@^1.4.1: version "1.4.1" - resolved "http://registry.npm.taobao.org/tinycolor2/download/tinycolor2-1.4.1.tgz#f4fad333447bc0b07d4dc8e9209d8f39a8ac77e8" + resolved "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.4.1.tgz#f4fad333447bc0b07d4dc8e9209d8f39a8ac77e8" integrity sha1-9PrTM0R7wLB9TcjpIJ2POaisd+g= +tinymce@^5.0.2: + version "5.0.3" + resolved "https://registry.npmjs.org/tinymce/-/tinymce-5.0.3.tgz#40fa8658b5bdf58e7f04c816b38e1b06f96f6cfe" + integrity sha512-x7D0ttqn176Z4CWQIITMjcEtMGUjiaK0Y2FN2vO8DiyUeIHCdr70jJDSoGhuXtXX70Sw4Bd5UFfqIn/bG3HXcg== + tmp@^0.0.33: version "0.0.33" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" @@ -9254,7 +9339,15 @@ toposort@^1.0.0: 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: +tough-cookie@^2.3.3: + version "2.5.0" + resolved "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" + integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== + dependencies: + psl "^1.1.28" + punycode "^2.1.1" + +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== @@ -9561,8 +9654,8 @@ verror@1.10.0: viser-vue@^2.4.4: version "2.4.5" - resolved "http://registry.npm.taobao.org/viser-vue/download/viser-vue-2.4.5.tgz#77318bb32113c5c10868c85c79cbbbff4a16d394" - integrity sha1-dzGLsyETxcEIaMhcecu7/0oW05Q= + resolved "https://registry.npmjs.org/viser-vue/-/viser-vue-2.4.5.tgz#77318bb32113c5c10868c85c79cbbbff4a16d394" + integrity sha512-wSs07wKqsYj9hBzRLqSb87ytfnZrpP/KXQ54bMcjjrX+/ubSLoj1cVEoQcU9ivLy0KUTi1mANHQPA2i9q8UVTQ== dependencies: "@types/node" "*" viser "^2.0.0" @@ -9589,15 +9682,20 @@ vm-browserify@0.0.4: dependencies: indexof "0.0.1" +vue-apexcharts@^1.3.2: + version "1.3.2" + resolved "https://registry.npmjs.org/vue-apexcharts/-/vue-apexcharts-1.3.2.tgz#f4c0475146d39a668983e7311244987da4a35176" + integrity sha512-3a3v6FKUlpD3BHWiDhuN/7Jcho9pE3+r6PEUccdzfpRFj0jn9W+zAHtaiKrdbBsTqXPKDfbd4dkT25SvBo/cxw== + vue-class-component@^6.0.0, vue-class-component@^6.2.0: version "6.3.2" - resolved "http://registry.npm.taobao.org/vue-class-component/download/vue-class-component-6.3.2.tgz#e6037e84d1df2af3bde4f455e50ca1b9eec02be6" - integrity sha1-5gN+hNHfKvO95PRV5Qyhue7AK+Y= + resolved "https://registry.npmjs.org/vue-class-component/-/vue-class-component-6.3.2.tgz#e6037e84d1df2af3bde4f455e50ca1b9eec02be6" + integrity sha512-cH208IoM+jgZyEf/g7mnFyofwPDJTM/QvBNhYMjqGB8fCsRyTf68rH2ISw/G20tJv+5mIThQ3upKwoL4jLTr1A== vue-cropper@^0.4.8: version "0.4.8" - resolved "http://registry.npm.taobao.org/vue-cropper/download/vue-cropper-0.4.8.tgz#9bd26a93335cded988d135d9f25575a61a9fb795" - integrity sha1-m9JqkzNc3tmI0TXZ8lV1phqft5U= + resolved "https://registry.npmjs.org/vue-cropper/-/vue-cropper-0.4.8.tgz#9bd26a93335cded988d135d9f25575a61a9fb795" + integrity sha512-xS+23lhyZvTSExmsO3x14lXra5xmykEoAy6iyjLiXH+5l+koP3F+aP8EjJmT9hGOvT5b8fVu9nts9pHAeXb78w== dependencies: "@babel/core" "^7.1.2" "@babel/plugin-transform-runtime" "^7.1.0" @@ -9625,8 +9723,8 @@ vue-eslint-parser@^2.0.3: vue-eslint-parser@^5.0.0: version "5.0.0" - resolved "http://registry.npm.taobao.org/vue-eslint-parser/download/vue-eslint-parser-5.0.0.tgz#00f4e4da94ec974b821a26ff0ed0f7a78402b8a1" - integrity sha1-APTk2pTsl0uCGib/DtD3p4QCuKE= + resolved "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-5.0.0.tgz#00f4e4da94ec974b821a26ff0ed0f7a78402b8a1" + integrity sha512-JlHVZwBBTNVvzmifwjpZYn0oPWH2SgWv5dojlZBsrhablDu95VFD+hriB1rQGwbD+bms6g+rAFhQHk6+NyiS6g== dependencies: debug "^4.1.0" eslint-scope "^4.0.0" @@ -9641,14 +9739,14 @@ vue-hot-reload-api@^2.3.0: integrity sha512-AA86yKZ5uOKz87/q1UpngEXhbRkaYg1b7HMMVRobNV1IVKqZe8oLIzo6iMocVwZXnYitlGwf2k4ZRLOZlS8oPQ== vue-i18n@^8.7.0: - version "8.8.2" - resolved "http://registry.npm.taobao.org/vue-i18n/download/vue-i18n-8.8.2.tgz#57baa73dc8f215d68e4b8f2743724657cbb77591" - integrity sha1-V7qnPcjyFdaOS48nQ3JGV8u3dZE= + version "8.9.0" + resolved "https://registry.npmjs.org/vue-i18n/-/vue-i18n-8.9.0.tgz#5f084001fe5b4c7ad8c00ee5f11396a88ff2e55b" + integrity sha512-8wr/D9yU8CLC8ne9stdQn/N58E7GRSUSO75bCucj2AIFTDyjGfoze5RxFvh2w3e7yxgnz5x+ooOIcoX59PHguQ== -vue-loader@^15.6.2: +vue-loader@^15.6.4: version "15.7.0" - resolved "http://registry.npm.taobao.org/vue-loader/download/vue-loader-15.7.0.tgz#27275aa5a3ef4958c5379c006dd1436ad04b25b3" - integrity sha1-JydapaPvSVjFN5wAbdFDatBLJbM= + resolved "https://registry.npmjs.org/vue-loader/-/vue-loader-15.7.0.tgz#27275aa5a3ef4958c5379c006dd1436ad04b25b3" + integrity sha512-x+NZ4RIthQOxcFclEcs8sXGEWqnZHodL2J9Vq+hUz+TDZzBaDIh1j3d9M2IUlTjtrHTZy4uMuRdTi8BGws7jLA== dependencies: "@vue/component-compiler-utils" "^2.5.1" hash-sum "^1.0.2" @@ -9661,24 +9759,24 @@ vue-ls@^3.2.0: resolved "https://registry.yarnpkg.com/vue-ls/-/vue-ls-3.2.0.tgz#33356ad3ec9c30dac203757cf4036abe4ff767b3" integrity sha512-39FGQMrT9NbG5WGDJfxWj19ZD1tsVoBBN1n8qvq6/+uRB9BansQ9NSyclQ9TzZatRkkM/VEQo5oTsijdM5hGFw== -vue-print-nb@^1.0.3: - version "1.0.3" - resolved "http://registry.npm.taobao.org/vue-print-nb/download/vue-print-nb-1.0.3.tgz#9cf0f67a808a7635c6e79a0cf4c96d652bc32cc6" - integrity sha1-nPD2eoCKdjXG55oM9MltZSvDLMY= +vue-print-nb-jeecg@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/vue-print-nb-jeecg/-/vue-print-nb-jeecg-1.0.5.tgz#d426d3c11aef1a2decdc0dcbd5564e92f9dfe0dc" + integrity sha512-ErmPhIlo2/jqfe69f1Ds3bUcQJQo62pOneqrfPSHUkMi5bChQdx6m/ZEuqdRS3MT6ipZbQeEa4WrnNNyi6MSyA== dependencies: babel-plugin-transform-runtime "^6.23.0" vue-property-decorator@^7.3.0: version "7.3.0" - resolved "http://registry.npm.taobao.org/vue-property-decorator/download/vue-property-decorator-7.3.0.tgz#d50d67f0b0f1c814f9f2fba36d6eeccbcc62dbb6" - integrity sha1-1Q1n8LDxyBT58vujbW7sy8xi27Y= + resolved "https://registry.npmjs.org/vue-property-decorator/-/vue-property-decorator-7.3.0.tgz#d50d67f0b0f1c814f9f2fba36d6eeccbcc62dbb6" + integrity sha512-HarXfTQ/Nxm4s/APpAaGIGHq5ZzslApImQy8ZrtkfGamw8rUFAVgMS5C50/AQ80+wfw3Wpnf4bNzbmj75m/k2Q== dependencies: vue-class-component "^6.2.0" vue-ref@^1.0.4: - version "1.0.5" - resolved "http://registry.npm.taobao.org/vue-ref/download/vue-ref-1.0.5.tgz#c2f3ff2a3e6fc90c514bad55dd08f86bc0d198cc" - integrity sha1-wvP/Kj5vyQxRS61V3Qj4a8DRmMw= + version "1.0.6" + resolved "https://registry.npmjs.org/vue-ref/-/vue-ref-1.0.6.tgz#b9b3d7d0e290ee2fd3d50d5d7bdac520806cb265" + integrity sha512-UzD8t1CG+aoWVOOpGd5KcaCNtCgUc0byaKhJMH+6N7H/p1ThVkYl/VCt7DmCrdhUlzZK+hT5JPTKAdrbWi0nNw== vue-router@^3.0.1: version "3.0.2" @@ -9703,16 +9801,16 @@ vue-template-compiler@^2.5.17: vue-template-compiler@^2.5.22: version "2.6.8" - resolved "http://registry.npm.taobao.org/vue-template-compiler/download/vue-template-compiler-2.6.8.tgz#750802604595134775b9c53141b9850b35255e1c" - integrity sha1-dQgCYEWVE0d1ucUxQbmFCzUlXhw= + resolved "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.6.8.tgz#750802604595134775b9c53141b9850b35255e1c" + integrity sha512-SwWKANE5ee+oJg+dEJmsdxsxWYICPsNwk68+1AFjOS8l0O/Yz2845afuJtFqf3UjS/vXG7ECsPeHHEAD65Cjng== dependencies: de-indent "^1.0.2" he "^1.1.0" vue-template-es2015-compiler@^1.9.0: version "1.9.1" - resolved "http://registry.npm.taobao.org/vue-template-es2015-compiler/download/vue-template-es2015-compiler-1.9.1.tgz#1ee3bc9a16ecbf5118be334bb15f9c46f82f5825" - integrity sha1-HuO8mhbsv1EYvjNLsV+cRvgvWCU= + resolved "https://registry.npmjs.org/vue-template-es2015-compiler/-/vue-template-es2015-compiler-1.9.1.tgz#1ee3bc9a16ecbf5118be334bb15f9c46f82f5825" + integrity sha512-4gDntzrifFnCEvyoO8PqyJDmguXgVPxKiIxrBKjIowvL9l+N66196+72XVYR8BBf1Uv1Fgt3bGevJ+sEmxfZzw== vue@^2.5.17, vue@^2.5.3: version "2.5.17" @@ -9721,13 +9819,13 @@ vue@^2.5.17, vue@^2.5.3: vue@^2.5.22: version "2.6.8" - resolved "http://registry.npm.taobao.org/vue/download/vue-2.6.8.tgz#f21cbc536bfc14f7d1d792a137bb12f69e60ea91" - integrity sha1-8hy8U2v8FPfR15KhN7sS9p5g6pE= + resolved "https://registry.npmjs.org/vue/-/vue-2.6.8.tgz#f21cbc536bfc14f7d1d792a137bb12f69e60ea91" + integrity sha512-+vp9lEC2Kt3yom673pzg1J7T1NVGuGzO9j8Wxno+rQN2WYVBX2pyo/RGQ3fXCLh2Pk76Skw/laAPCuBuEQ4diw== vuex-class@^0.3.1: version "0.3.1" - resolved "http://registry.npm.taobao.org/vuex-class/download/vuex-class-0.3.1.tgz#3c0b946bcff4cf2be1904de5b0cab1a3dd5c41d5" - integrity sha1-PAuUa8/0zyvhkE3lsMqxo91cQdU= + resolved "https://registry.npmjs.org/vuex-class/-/vuex-class-0.3.1.tgz#3c0b946bcff4cf2be1904de5b0cab1a3dd5c41d5" + integrity sha512-d7Hc+ItQx6p9E/2mEWiyrvyEuo7Uj0mq4VNImd7dmxTelnkhOavKPMEG1Xdypug2RlPEYv0920IOa3hdVZ+4AA== vuex@^3.0.1: version "3.0.1" @@ -9766,8 +9864,8 @@ wcwidth@^1.0.1: webpack-bundle-analyzer@^3.0.4: version "3.1.0" - resolved "http://registry.npm.taobao.org/webpack-bundle-analyzer/download/webpack-bundle-analyzer-3.1.0.tgz#2f19cbb87bb6d4f3cb4e59cb67c837bd9436e89d" - integrity sha1-LxnLuHu21PPLTlnLZ8g3vZQ26J0= + resolved "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-3.1.0.tgz#2f19cbb87bb6d4f3cb4e59cb67c837bd9436e89d" + integrity sha512-nyDyWEs7C6DZlgvu1pR1zzJfIWSiGPbtaByZr8q+Fd2xp70FuM/8ngCJzj3Er1TYRLSFmp1F1OInbEm4DZH8NA== dependencies: acorn "^6.0.7" acorn-walk "^6.1.1" @@ -9792,19 +9890,19 @@ webpack-chain@^4.11.0: javascript-stringify "^1.6.0" webpack-dev-middleware@^3.5.1: - version "3.6.0" - resolved "http://registry.npm.taobao.org/webpack-dev-middleware/download/webpack-dev-middleware-3.6.0.tgz#71f1b04e52ff8d442757af2be3a658237d53a3e5" - integrity sha1-cfGwTlL/jUQnV68r46ZYI31To+U= + version "3.6.1" + resolved "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.6.1.tgz#91f2531218a633a99189f7de36045a331a4b9cd4" + integrity sha512-XQmemun8QJexMEvNFbD2BIg4eSKrmSIMrTfnl2nql2Sc6OGAYFyb8rwuYrCjl/IiEYYuyTEiimMscu7EXji/Dw== 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: +webpack-dev-server@^3.2.0: version "3.2.1" - resolved "http://registry.npm.taobao.org/webpack-dev-server/download/webpack-dev-server-3.2.1.tgz#1b45ce3ecfc55b6ebe5e36dab2777c02bc508c4e" - integrity sha1-G0XOPs/FW26+Xjbasnd8ArxQjE4= + resolved "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.2.1.tgz#1b45ce3ecfc55b6ebe5e36dab2777c02bc508c4e" + integrity sha512-sjuE4mnmx6JOh9kvSbPYw3u/6uxCLHNWfhWaIPwcXWsvWOPN+nc5baq4i9jui3oOBRXGonK9+OI0jVkaz6/rCw== dependencies: ansi-html "0.0.7" bonjour "^3.5.0" @@ -9847,8 +9945,8 @@ webpack-log@^2.0.0: webpack-merge@^4.2.1: version "4.2.1" - resolved "http://registry.npm.taobao.org/webpack-merge/download/webpack-merge-4.2.1.tgz#5e923cf802ea2ace4fd5af1d3247368a633489b4" - integrity sha1-XpI8+ALqKs5P1a8dMkc2imM0ibQ= + resolved "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.2.1.tgz#5e923cf802ea2ace4fd5af1d3247368a633489b4" + integrity sha512-4p8WQyS98bUJcCvFMbdGZyZmsKuWjWVnVHnAS3FFg0HDaRVrPbkivx2RYCre8UiemD67RsiFFLfn4JhLAin8Vw== dependencies: lodash "^4.17.5" @@ -9862,8 +9960,8 @@ webpack-sources@^1.1.0, webpack-sources@^1.3.0: "webpack@>=4 < 4.29": version "4.28.4" - resolved "http://registry.npm.taobao.org/webpack/download/webpack-4.28.4.tgz#1ddae6c89887d7efb752adf0c3cd32b9b07eacd0" - integrity sha1-HdrmyJiH1++3Uq3ww80yubB+rNA= + resolved "https://registry.npmjs.org/webpack/-/webpack-4.28.4.tgz#1ddae6c89887d7efb752adf0c3cd32b9b07eacd0" + integrity sha512-NxjD61WsK/a3JIdwWjtIpimmvE6UrRi3yG54/74Hk9rwNj5FPkA4DJCf1z4ByDWLkvZhTZE+P3C/eh6UD5lDcw== dependencies: "@webassemblyjs/ast" "1.7.11" "@webassemblyjs/helper-module-context" "1.7.11" @@ -9999,8 +10097,8 @@ wrappy@1: write@1.0.3: version "1.0.3" - resolved "http://registry.npm.taobao.org/write/download/write-1.0.3.tgz#0800e14523b923a387e415123c865616aae0f5c3" - integrity sha1-CADhRSO5I6OH5BUSPIZWFqrg9cM= + resolved "https://registry.npmjs.org/write/-/write-1.0.3.tgz#0800e14523b923a387e415123c865616aae0f5c3" + integrity sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig== dependencies: mkdirp "^0.5.1" diff --git a/jeecg-boot/README.md b/jeecg-boot/README.md new file mode 100644 index 0000000..a12e0d4 --- /dev/null +++ b/jeecg-boot/README.md @@ -0,0 +1,101 @@ +Jeecg-Boot 快速开发平台 +=============== + +当前最新版本: 1.1(发布日期:20190415) + + +## 后端技术架构 +- 基础框架:Spring Boot 2.0.3.RELEASE + +- 持久层框架:Mybatis-plus_3.0.6 + +- 安全框架:Apache Shiro 1.4.0-RC2,Jwt_3.4.1 + +- 数据库连接池:阿里巴巴Druid 1.1.10 + +- 缓存框架:redis + +- 日志打印:logback + +- 其他:fastjson,poi,Swagger-ui,quartz, lombok(简化代码)等。 + + + +## 开发环境 + +- 语言:Java 8 + +- IDE(JAVA): 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) + +- QQ交流群 : 284271917 + +- 视频教程 : https://pan.baidu.com/s/1Il0TS50I70vH1AG1y40wtw 提取码:hok5 + +- 学习思路 : [跟着我们零基础学习前后端分离开发](http://jeecg-boot.mydoc.io/?t=340820) + +- 常见问题 : [新手入门必看,汇总了常见各种问题](http://www.jeecg.org/forum.php?mod=viewthread&tid=7816&page=1&extra=#pid21237) + + + +## 专项文档区 + +- 查询过滤器用法 + +``` +QueryWrapper<?> queryWrapper = QueryGenerator.initQueryWrapper(?, req.getParameterMap()); +``` + +代码示例: + +``` + + @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>>(); + + //调用QueryGenerator的initQueryWrapper + QueryWrapper<JeecgDemo> queryWrapper = QueryGenerator.initQueryWrapper(jeecgDemo, req.getParameterMap()); + + Page<JeecgDemo> page = new Page<JeecgDemo>(pageNo, pageSize); + IPage<JeecgDemo> pageList = jeecgDemoService.page(page, queryWrapper); + result.setSuccess(true); + result.setResult(pageList); + return result; + } + +``` + + + +- 查询规则 (本规则不适用于高级查询,高级查询有自己对应的查询类型可以选择 ) + +| 查询模式 | 用法 | 说明 | +|---------- |-------------------------------------------------------|------------------| +| 模糊查询 | 支持左右模糊和全模糊 需要在查询输入框内前或后带\*或是前后全部带\* | | +| 取非查询 | 在查询输入框前面输入! 则查询该字段不等于输入值的数据(数值类型不支持此种查询,可以将数值字段定义为字符串类型的) | | +| \> \>= < <= | 同取非查询 在输入框前面输入对应特殊字符即表示走对应规则查询 | | +| in查询 | 若传入的数据带,(逗号) 则表示该查询为in查询 | | +| 多选字段模糊查询 | 上述4 有一个特例,若某一查询字段前后都带逗号 则会将其视为走这种查询方式 ,该查询方式是将查询条件以逗号分割再遍历数组 将每个元素作like查询 用or拼接,例如 现在name传入值 ,a,b,c, 那么结果sql就是 name like '%a%' or name like '%b%' or name like '%c%' | | + + +- Autopoi使用文档(EXCEL工具类 - EasyPOI衍变升级重构版本) + + [在线文档](https://github.com/zhangdaiscott/autopoi) + + + \ No newline at end of file diff --git a/jeecg-boot/docs/- 项目说明 b/jeecg-boot/docs/- 项目说明 index 8d6e9ee..5be93e8 100644 --- a/jeecg-boot/docs/- 项目说明 +++ b/jeecg-boot/docs/- 项目说明 @@ -2,10 +2,16 @@ 一、技术文档 http://jeecg-boot.mydoc.io -二、部署文档 - 修改redis、数据库配置文件 - 修改上传文件目录 - 修改登录页面提示账号密码 - 修改前端API的图片访问域名 + +二、 零基础学习看这个 + http://jeecg-boot.mydoc.io/?t=344845 + +三、线上部署文档 + 1. 修改redis、 + 2. 数据库配置文件 + 3. 修改上传文件目录 + 4. 修改前端API的图片访问域名 + 详细看这个链接:http://jeecg-boot.mydoc.io/?t=344852 +四、默认账号密码(需手工初始化数据库脚步) 默认账号密码: admin/123456 \ No newline at end of file diff --git a/jeecg-boot/docs/db/jeecg-boot_1.1.0-20190415.sql b/jeecg-boot/docs/db/jeecg-boot_1.1.0-20190415.sql new file mode 100644 index 0000000..e68002c --- /dev/null +++ b/jeecg-boot/docs/db/jeecg-boot_1.1.0-20190415.sql @@ -0,0 +1,2392 @@ +/* +Navicat MySQL Data Transfer + +Source Server : mysql +Source Server Version : 50037 +Source Host : localhost:3306 +Source Database : jeecg-boot-20190411 + +Target Server Type : MYSQL +Target Server Version : 50037 +File Encoding : 65001 + +Date: 2019-04-14 15:31:06 +*/ + +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 ('08375a2dff80e821d5a158dd98302b23', '导入小虎', null, null, null, null, '2', '28', null, null, null, 'jeecg-boot', '2019-04-10 11:42:57', null, null); +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, 'admin', '2019-02-25 16:29:27'); +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 ('4981637bf71b0c1ed1365241dfcfa0ea', '小虎', 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 ('5c16e6a5c31296bcd3f1053d5d118815', '导入zhangdaiscott', null, null, null, null, '1', null, '2019-01-03', null, null, 'jeecg-boot', '2019-04-10 11:42:57', 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 ('73bc58611012617ca446d8999379e4ac', '郭靖11a', '777', '2018-12-07 00:00:00', null, null, null, null, null, null, null, 'jeecg-boot', '2019-03-28 18:16:39', 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 ('95740656751c5f22e5932ab0ae33b1e4', '杨康22a', '奸臣', null, null, null, null, null, null, null, null, 'jeecg-boot', '2019-03-28 18:16:39', null, null); +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 ('c28fa8391ef81d6fabd8bd894a7615aa', '小麦', null, null, null, null, '2', null, null, 'zhangdaiscott@163.com', null, 'jeecg-boot', '2019-04-04 17:18:09', null, null); +INSERT INTO `demo` VALUES ('c2c0d49e3c01913067cf8d1fb3c971d2', 'zhang daihao', null, null, null, null, '2', null, null, 'zhangdaiscott@163.com', null, 'admin', '2019-01-19 23:37:18', 'admin', '2019-01-21 16:49:06'); +INSERT INTO `demo` VALUES ('c96279c666b4b82e3ef1e4e2978701ce', '报名时间', null, null, null, null, null, null, null, null, null, 'jeecg-boot', '2019-03-28 18:00:52', null, null); +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 ('15538561502720', '3333', '1', '', null, '', '0d4a2e67b538ee1bc881e5ed34f670f0', 'jeecg-boot', '2019-03-29 18:42:55', null, null); +INSERT INTO `jeecg_order_customer` VALUES ('15538561512681', '3332333', '2', '', null, '', '0d4a2e67b538ee1bc881e5ed34f670f0', 'jeecg-boot', '2019-03-29 18:42:55', 'admin', '2019-03-29 18:43:12'); +INSERT INTO `jeecg_order_customer` VALUES ('15538561550142', '4442', '2', '', null, '', '0d4a2e67b538ee1bc881e5ed34f670f0', 'jeecg-boot', '2019-03-29 18:42:55', null, null); +INSERT INTO `jeecg_order_customer` VALUES ('15541168497342', '444', '', '', '', '', 'f71f7f8930b5b6b1703d9948d189982b', 'admin', '2019-04-01 19:08:45', null, null); +INSERT INTO `jeecg_order_customer` VALUES ('15541168499553', '5555', '', '', '', '', 'f71f7f8930b5b6b1703d9948d189982b', 'admin', '2019-04-01 19:08:45', null, null); +INSERT INTO `jeecg_order_customer` VALUES ('15541169272690', '小王1', '1', '', '', '18611788525', 'f618a85b17e2c4dd58d268220c8dd9a1', 'admin', '2019-04-01 19:10:07', null, null); +INSERT INTO `jeecg_order_customer` VALUES ('15541169288141', '效力1', '1', '', '', '18611788525', 'f618a85b17e2c4dd58d268220c8dd9a1', 'admin', '2019-04-01 19:10:07', null, null); +INSERT INTO `jeecg_order_customer` VALUES ('15541169441372', '小红1', '1', '', '', '18611788525', 'f618a85b17e2c4dd58d268220c8dd9a1', 'admin', '2019-04-01 19:10:07', null, null); +INSERT INTO `jeecg_order_customer` VALUES ('15543695362380', '1111', '', '', '', '', '5d6e2b9e44037526270b6206196f6689', 'admin', '2019-04-04 17:19:40', null, null); +INSERT INTO `jeecg_order_customer` VALUES ('15543695397221', '222', '', '', '', '', '5d6e2b9e44037526270b6206196f6689', 'admin', '2019-04-04 17:19:40', null, null); +INSERT INTO `jeecg_order_customer` VALUES ('15543695398992', '333', '', '', '', '', '5d6e2b9e44037526270b6206196f6689', 'admin', '2019-04-04 17:19:40', null, null); +INSERT INTO `jeecg_order_customer` VALUES ('18dc5eb1068ccdfe90e358951ca1a3d6', 'dr2', '', '', '', '', '8ab1186410a65118c4d746eb085d3bed', 'admin', '2019-04-04 17:25:33', null, null); +INSERT INTO `jeecg_order_customer` VALUES ('195d280490fe88ca1475512ddcaf2af9', '12', null, null, null, null, '54e739bef5b67569c963c38da52581ec', 'admin', '2019-03-15 16:50:15', null, null); +INSERT INTO `jeecg_order_customer` VALUES ('217a2bf83709775d2cd85bf598392327', '2', null, null, null, null, '54e739bef5b67569c963c38da52581ec', 'admin', '2019-03-15 16:50:15', null, null); +INSERT INTO `jeecg_order_customer` VALUES ('22bc052ae53ed09913b946abba93fa89', '1', null, null, null, null, '54e739bef5b67569c963c38da52581ec', 'admin', '2019-03-15 16:50:15', null, null); +INSERT INTO `jeecg_order_customer` VALUES ('23bafeae88126c3bf3322a29a04f0d5e', 'x秦风', null, null, null, null, '163e2efcbc6d7d54eb3f8a137da8a75a', 'jeecg-boot', '2019-03-29 18:43:59', null, null); +INSERT INTO `jeecg_order_customer` VALUES ('25c4a552c6843f36fad6303bfa99a382', '1', null, null, null, null, '54e739bef5b67569c963c38da52581ec', 'admin', '2019-03-15 16:50:15', null, null); +INSERT INTO `jeecg_order_customer` VALUES ('2d32144e2bee63264f3f16215c258381', '33333', '2', null, null, null, 'd908bfee3377e946e59220c4a4eb414a', 'admin', '2019-04-01 16:27:03', null, null); +INSERT INTO `jeecg_order_customer` VALUES ('2d43170d6327f941bd1a017999495e25', '1', null, null, null, null, '54e739bef5b67569c963c38da52581ec', 'admin', '2019-03-15 16:50:15', null, null); +INSERT INTO `jeecg_order_customer` VALUES ('2e5f62a8b6e0a0ce19b52a6feae23d48', '3', null, null, null, null, '54e739bef5b67569c963c38da52581ec', 'admin', '2019-03-15 16:50:15', null, null); +INSERT INTO `jeecg_order_customer` VALUES ('313abf99558ac5f13ecca3b87e562ad1', 'scott', '2', null, null, null, 'b190737bd04cca8360e6f87c9ef9ec4e', 'admin', '2019-02-25 16:29:48', null, null); +INSERT INTO `jeecg_order_customer` VALUES ('34a1c5cf6cee360ed610ed0bed70e0f9', '导入秦风', null, null, null, null, 'a2cce75872cc8fcc47f78de9ffd378c2', 'jeecg-boot', '2019-03-29 18:43:59', null, null); +INSERT INTO `jeecg_order_customer` VALUES ('3c87400f8109b4cf43c5598f0d40e34d', '2', null, null, null, null, '54e739bef5b67569c963c38da52581ec', 'admin', '2019-03-15 16:50:15', null, null); +INSERT INTO `jeecg_order_customer` VALUES ('40964bcbbecb38e5ac15e6d08cf3cd43', '233', null, null, null, null, '54e739bef5b67569c963c38da52581ec', 'admin', '2019-03-15 16:50:15', null, null); +INSERT INTO `jeecg_order_customer` VALUES ('41e3dee0b0b6e6530eccb7fbb22fd7a3', '4555', '1', '370285198602058823', null, '18611788674', '54e739bef5b67569c963c38da52581ec', 'admin', '2019-03-15 16:50:15', null, null); +INSERT INTO `jeecg_order_customer` VALUES ('4808ae8344c7679a4a2f461db5dc3a70', '44', '1', '370285198602058823', null, '18611788674', '54e739bef5b67569c963c38da52581ec', 'admin', '2019-03-15 16:50:15', null, null); +INSERT INTO `jeecg_order_customer` VALUES ('4b6cef12f195fad94d57279b2241770d', 'dr12', '', '', '', '', '8ab1186410a65118c4d746eb085d3bed', 'admin', '2019-04-04 17:25:33', null, null); +INSERT INTO `jeecg_order_customer` VALUES ('524e695283f8e8c256cc24f39d6d8542', '小王', '2', '370285198604033222', null, '18611788674', 'eb13ab35d2946a2b0cfe3452bca1e73f', 'admin', '2019-02-25 16:29:41', null, null); +INSERT INTO `jeecg_order_customer` VALUES ('57c2a8367db34016114cbc9fa368dba0', '2', null, null, null, null, '54e739bef5b67569c963c38da52581ec', 'admin', '2019-03-15 16:50:15', null, null); +INSERT INTO `jeecg_order_customer` VALUES ('5df36a1608b8c7ac99ad9bc408fe54bf', '4', null, null, null, null, '54e739bef5b67569c963c38da52581ec', 'admin', '2019-03-15 16:50:15', null, null); +INSERT INTO `jeecg_order_customer` VALUES ('6b694e9ba54bb289ae9cc499e40031e7', 'x秦风', '1', null, null, null, 'b190737bd04cca8360e6f87c9ef9ec4e', 'admin', '2019-02-25 16:29:48', null, null); +INSERT INTO `jeecg_order_customer` VALUES ('6c6fd2716c2dcd044ed03c2c95d261f8', '李四', '2', '370285198602058833', '', '18611788676', 'f71f7f8930b5b6b1703d9948d189982b', 'admin', '2019-04-01 19:08:45', null, null); +INSERT INTO `jeecg_order_customer` VALUES ('742d008214dee0afff2145555692973e', '秦风', '1', '370285198602058822', null, '18611788676', '54e739bef5b67569c963c38da52581ec', 'admin', '2019-03-15 16:50:15', null, null); +INSERT INTO `jeecg_order_customer` VALUES ('7469c3e5d371767ff90a739d297689b5', '导入秦风', '2', null, null, null, '3a867ebf2cebce9bae3f79676d8d86f3', 'jeecg-boot', '2019-03-29 18:43:59', 'admin', '2019-04-08 17:35:02'); +INSERT INTO `jeecg_order_customer` VALUES ('7a96e2c7b24847d4a29940dbc0eda6e5', 'drscott', null, null, null, null, 'e73434dad84ebdce2d4e0c2a2f06d8ea', 'jeecg-boot', '2019-03-29 18:43:59', null, null); +INSERT INTO `jeecg_order_customer` VALUES ('7f5a40818e225ee18bda6da7932ac5f9', '2', null, null, null, null, '54e739bef5b67569c963c38da52581ec', 'admin', '2019-03-15 16:50:15', null, null); +INSERT INTO `jeecg_order_customer` VALUES ('8011575abfd7c8085e71ff66df1124b9', '1', null, null, null, null, '54e739bef5b67569c963c38da52581ec', 'admin', '2019-03-15 16:50:15', null, null); +INSERT INTO `jeecg_order_customer` VALUES ('8404f31d7196221a573c9bd6c8f15003', '小张', '1', '370285198602058211', null, '18611788676', 'eb13ab35d2946a2b0cfe3452bca1e73f', 'admin', '2019-02-25 16:29:41', null, null); +INSERT INTO `jeecg_order_customer` VALUES ('859020e10a2f721f201cdbff78cf7b9f', 'scott', null, null, null, null, '163e2efcbc6d7d54eb3f8a137da8a75a', 'jeecg-boot', '2019-03-29 18:43:59', null, null); +INSERT INTO `jeecg_order_customer` VALUES ('8cc3c4d26e3060975df3a2adb781eeb4', 'dr33', null, null, null, null, 'b2feb454e43c46b2038768899061e464', 'jeecg-boot', '2019-04-04 17:23:09', null, null); +INSERT INTO `jeecg_order_customer` VALUES ('8d1725c23a6a50685ff0dedfd437030d', '4', null, null, null, null, '54e739bef5b67569c963c38da52581ec', 'admin', '2019-03-15 16:50:15', null, null); +INSERT INTO `jeecg_order_customer` VALUES ('933cae3a79f60a93922d59aace5346ce', '小王', null, '370285198604033222', null, '18611788674', '6a719071a29927a14f19482f8693d69a', 'jeecg-boot', '2019-03-29 18:43:59', null, null); +INSERT INTO `jeecg_order_customer` VALUES ('9bdb5400b709ba4eaf3444de475880d7', 'dr22', null, null, null, null, '22c17790dcd04b296c4a2a089f71895f', 'jeecg-boot', '2019-04-04 17:23:09', null, null); +INSERT INTO `jeecg_order_customer` VALUES ('9f87677f70e5f864679314389443a3eb', '33', '2', '370285198602058823', null, '18611788674', '54e739bef5b67569c963c38da52581ec', 'admin', '2019-03-15 16:50:15', null, null); +INSERT INTO `jeecg_order_customer` VALUES ('a2c2b7101f75c02deb328ba777137897', '44', '2', '370285198602058823', null, '18611788674', '54e739bef5b67569c963c38da52581ec', 'admin', '2019-03-15 16:50:15', null, null); +INSERT INTO `jeecg_order_customer` VALUES ('ab4d002dc552c326147e318c87d3bed4', 'ddddd', '1', '370285198604033222', null, '18611755848', '9a57c850e4f68cf94ef7d8585dbaf7e6', 'admin', '2019-04-04 17:30:47', 'admin', '2019-04-04 17:31:17'); +INSERT INTO `jeecg_order_customer` VALUES ('ad116f722a438e5f23095a0b5fcc8e89', 'dr秦风', null, null, null, null, 'e73434dad84ebdce2d4e0c2a2f06d8ea', 'jeecg-boot', '2019-03-29 18:43:59', null, null); +INSERT INTO `jeecg_order_customer` VALUES ('b1ba147b75f5eaa48212586097fc3fd1', '2', null, null, null, null, '54e739bef5b67569c963c38da52581ec', 'admin', '2019-03-15 16:50:15', null, null); +INSERT INTO `jeecg_order_customer` VALUES ('b43bf432c251f0e6b206e403b8ec29bc', 'lisi', null, null, null, null, 'f8889aaef6d1bccffd98d2889c0aafb5', 'jeecg-boot', '2019-03-29 18:43:59', null, null); +INSERT INTO `jeecg_order_customer` VALUES ('bcdd300a7d44c45a66bdaac14903c801', '33', null, null, null, null, '54e739bef5b67569c963c38da52581ec', 'admin', '2019-03-15 16:50:15', null, null); +INSERT INTO `jeecg_order_customer` VALUES ('beb983293e47e2dc1a9b3d649aa3eb34', 'ddd3', null, null, null, null, 'd908bfee3377e946e59220c4a4eb414a', 'admin', '2019-04-01 16:27:03', null, null); +INSERT INTO `jeecg_order_customer` VALUES ('c219808196406f1b8c7f1062589de4b5', '44', '1', '370285198602058823', null, '18611788674', '54e739bef5b67569c963c38da52581ec', 'admin', '2019-03-15 16:50:15', null, null); +INSERT INTO `jeecg_order_customer` VALUES ('c8ed061d4b27c0c7a64e100f2b1c8ab5', '张经理', '2', '370285198602058823', null, '18611788674', '54e739bef5b67569c963c38da52581ec', 'admin', '2019-03-15 16:50:15', null, null); +INSERT INTO `jeecg_order_customer` VALUES ('cc5de4af7f06cd6d250965ebe92a0395', '1', null, null, null, null, '54e739bef5b67569c963c38da52581ec', 'admin', '2019-03-15 16:50:15', null, null); +INSERT INTO `jeecg_order_customer` VALUES ('cf8817bd703bf7c7c77a2118edc26cc7', '1', null, null, null, null, '54e739bef5b67569c963c38da52581ec', 'admin', '2019-03-15 16:50:15', null, null); +INSERT INTO `jeecg_order_customer` VALUES ('d72b26fae42e71270fce2097a88da58a', '导入scott', null, 'www', null, null, '3a867ebf2cebce9bae3f79676d8d86f3', 'jeecg-boot', '2019-03-29 18:43:59', 'admin', '2019-04-08 17:35:05'); +INSERT INTO `jeecg_order_customer` VALUES ('dbdc60a6ac1a8c43f24afee384039b68', 'xiaowang', null, null, null, null, 'f8889aaef6d1bccffd98d2889c0aafb5', 'jeecg-boot', '2019-03-29 18:43:59', null, null); +INSERT INTO `jeecg_order_customer` VALUES ('dc5883b50466de94d900919ed96d97af', '33', '1', '370285198602058823', null, '18611788674', '54e739bef5b67569c963c38da52581ec', 'admin', '2019-03-15 16:50:15', null, null); +INSERT INTO `jeecg_order_customer` VALUES ('deeb73e553ad8dc0a0b3cfd5a338de8e', '3333', null, null, null, null, '54e739bef5b67569c963c38da52581ec', 'admin', '2019-03-15 16:50:15', null, null); +INSERT INTO `jeecg_order_customer` VALUES ('e2570278bf189ac05df3673231326f47', '1', null, null, null, null, '54e739bef5b67569c963c38da52581ec', 'admin', '2019-03-15 16:50:15', null, null); +INSERT INTO `jeecg_order_customer` VALUES ('e39cb23bb950b2bdedfc284686c6128a', '1', null, null, null, null, '54e739bef5b67569c963c38da52581ec', 'admin', '2019-03-15 16:50:15', null, null); +INSERT INTO `jeecg_order_customer` VALUES ('e46fe9111a9100844af582a18a2aa402', '1', null, null, null, null, '54e739bef5b67569c963c38da52581ec', 'admin', '2019-03-15 16:50:15', null, null); +INSERT INTO `jeecg_order_customer` VALUES ('ee7af0acb9beb9bf8d8b3819a8a7fdc3', '2', null, null, null, null, '54e739bef5b67569c963c38da52581ec', 'admin', '2019-03-15 16:50:15', null, null); +INSERT INTO `jeecg_order_customer` VALUES ('f5d2605e844192d9e548f9bd240ac908', '小张', null, '370285198602058211', null, '18611788676', '6a719071a29927a14f19482f8693d69a', 'jeecg-boot', '2019-03-29 18:43:59', null, null); +INSERT INTO `jeecg_order_customer` VALUES ('f6db6547382126613a3e46e7cd58a5f2', '导入scott', null, null, null, null, 'a2cce75872cc8fcc47f78de9ffd378c2', 'jeecg-boot', '2019-03-29 18:43:59', 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 ('163e2efcbc6d7d54eb3f8a137da8a75a', 'B100', null, null, '3000.000', null, 'jeecg-boot', '2019-03-29 18:43:59', null, null); +INSERT INTO `jeecg_order_main` VALUES ('3a867ebf2cebce9bae3f79676d8d86f3', '导入B100', '2222', null, '3000.000', null, 'jeecg-boot', '2019-03-29 18:43:59', 'admin', '2019-04-08 17:35:13'); +INSERT INTO `jeecg_order_main` VALUES ('4bca3ea6881d39dbf67ef1e42c649766', '1212', null, null, null, null, 'admin', '2019-04-03 10:55:43', null, null); +INSERT INTO `jeecg_order_main` VALUES ('4cba137333127e8e31df7ad168cc3732', '青岛订单A0001', '2', '2019-04-03 10:56:07', null, null, 'admin', '2019-04-03 10:56:11', null, null); +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 ('5d6e2b9e44037526270b6206196f6689', 'N333', null, '2019-04-04 17:19:11', null, '聪明00', 'admin', '2019-04-04 17:19:40', null, null); +INSERT INTO `jeecg_order_main` VALUES ('6a719071a29927a14f19482f8693d69a', 'c100', null, null, '5000.000', null, 'jeecg-boot', '2019-03-29 18:43:59', null, null); +INSERT INTO `jeecg_order_main` VALUES ('8ab1186410a65118c4d746eb085d3bed', '导入400', '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 ('9a57c850e4f68cf94ef7d8585dbaf7e6', 'halou100dd', null, '2019-04-04 17:30:32', null, null, 'admin', '2019-04-04 17:30:41', 'admin', '2019-04-04 17:31:08'); +INSERT INTO `jeecg_order_main` VALUES ('a2cce75872cc8fcc47f78de9ffd378c2', '导入B100', null, null, '3000.000', null, 'jeecg-boot', '2019-03-29 18:43:59', null, null); +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 ('d908bfee3377e946e59220c4a4eb414a', 'SSSS001', null, null, '599.000', null, 'admin', '2019-04-01 15:43:03', 'admin', '2019-04-01 16:26:52'); +INSERT INTO `jeecg_order_main` VALUES ('e73434dad84ebdce2d4e0c2a2f06d8ea', '导入200', null, null, '3000.000', null, 'jeecg-boot', '2019-03-29 18:43:59', null, null); +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'); +INSERT INTO `jeecg_order_main` VALUES ('f618a85b17e2c4dd58d268220c8dd9a1', 'N001', null, '2019-04-01 19:09:02', '2222.000', null, 'admin', '2019-04-01 19:09:47', 'admin', '2019-04-01 19:10:00'); +INSERT INTO `jeecg_order_main` VALUES ('f71f7f8930b5b6b1703d9948d189982b', 'BY911', null, '2019-04-06 19:08:39', null, null, 'admin', '2019-04-01 16:36:02', 'admin', '2019-04-01 16:36:08'); +INSERT INTO `jeecg_order_main` VALUES ('f8889aaef6d1bccffd98d2889c0aafb5', 'A100', null, '2018-10-10 00:00:00', '6000.000', null, 'jeecg-boot', '2019-03-29 18:43:59', null, null); +INSERT INTO `jeecg_order_main` VALUES ('fe81ee5d19bbf9eef2066d4f29dfbe0f', 'uuuu', null, null, null, null, 'jeecg-boot', '2019-04-03 11:00:39', null, null); + +-- ---------------------------- +-- 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 ('0f0e3a40a215958f807eea08a6e1ac0a', '88', null, '54e739bef5b67569c963c38da52581ec', 'admin', '2019-03-15 16:50:15', null, null); +INSERT INTO `jeecg_order_ticket` VALUES ('0fa3bd0bbcf53650c0bb3c0cac6d8cb7', 'ffff', '2019-02-21 00:00:00', 'eb13ab35d2946a2b0cfe3452bca1e73f', 'admin', '2019-02-25 16:29:41', null, null); +INSERT INTO `jeecg_order_ticket` VALUES ('14221afb4f5f749c1deef26ac56fdac3', '33', '2019-03-09 00:00:00', '54e739bef5b67569c963c38da52581ec', 'admin', '2019-03-15 16:50:15', null, null); +INSERT INTO `jeecg_order_ticket` VALUES ('15538561502730', '222', null, '0d4a2e67b538ee1bc881e5ed34f670f0', 'jeecg-boot', '2019-03-29 18:42:55', null, null); +INSERT INTO `jeecg_order_ticket` VALUES ('15538561526461', '2244', '2019-03-29 00:00:00', '0d4a2e67b538ee1bc881e5ed34f670f0', 'jeecg-boot', '2019-03-29 18:42:55', 'admin', '2019-03-29 18:43:26'); +INSERT INTO `jeecg_order_ticket` VALUES ('15541168478913', 'hhhhh', null, 'f71f7f8930b5b6b1703d9948d189982b', 'admin', '2019-04-01 19:08:45', null, null); +INSERT INTO `jeecg_order_ticket` VALUES ('15541169272810', '22211', '2019-04-01 19:09:40', 'f618a85b17e2c4dd58d268220c8dd9a1', 'admin', '2019-04-01 19:10:07', null, null); +INSERT INTO `jeecg_order_ticket` VALUES ('15541169302331', '333311', '2019-04-01 19:09:40', 'f618a85b17e2c4dd58d268220c8dd9a1', 'admin', '2019-04-01 19:10:07', null, null); +INSERT INTO `jeecg_order_ticket` VALUES ('15541169713092', '333311', '2019-04-01 19:09:47', 'f618a85b17e2c4dd58d268220c8dd9a1', 'admin', '2019-04-01 19:10:07', null, null); +INSERT INTO `jeecg_order_ticket` VALUES ('15542604293170', 'c', null, 'fe81ee5d19bbf9eef2066d4f29dfbe0f', 'jeecg-boot', '2019-04-03 11:00:39', null, null); +INSERT INTO `jeecg_order_ticket` VALUES ('15542604374431', 'd', null, 'fe81ee5d19bbf9eef2066d4f29dfbe0f', 'jeecg-boot', '2019-04-03 11:00:39', null, null); +INSERT INTO `jeecg_order_ticket` VALUES ('15543695362380', 'ccc2', null, '5d6e2b9e44037526270b6206196f6689', 'admin', '2019-04-04 17:19:40', null, null); +INSERT INTO `jeecg_order_ticket` VALUES ('15543695381291', 'cccc1', null, '5d6e2b9e44037526270b6206196f6689', 'admin', '2019-04-04 17:19:40', null, null); +INSERT INTO `jeecg_order_ticket` VALUES ('15543695740352', 'dddd', null, '5d6e2b9e44037526270b6206196f6689', 'admin', '2019-04-04 17:19:40', null, null); +INSERT INTO `jeecg_order_ticket` VALUES ('18905bc89ee3851805aab38ed3b505ec', '44', null, '54e739bef5b67569c963c38da52581ec', 'admin', '2019-03-15 16:50:15', null, null); +INSERT INTO `jeecg_order_ticket` VALUES ('1f809cbd26f4e574697e1c10de575d72', 'A100', null, 'e73434dad84ebdce2d4e0c2a2f06d8ea', 'jeecg-boot', '2019-03-29 18:43:59', null, null); +INSERT INTO `jeecg_order_ticket` VALUES ('21051adb51529bdaa8798b5a3dd7f7f7', 'C10029', '2019-02-20 00:00:00', '54e739bef5b67569c963c38da52581ec', 'admin', '2019-03-15 16:50:15', null, null); +INSERT INTO `jeecg_order_ticket` VALUES ('269576e766b917f8b6509a2bb0c4d4bd', 'A100', null, '163e2efcbc6d7d54eb3f8a137da8a75a', 'jeecg-boot', '2019-03-29 18:43:59', null, null); +INSERT INTO `jeecg_order_ticket` VALUES ('2d473ffc79e5b38a17919e15f8b7078e', '66', '2019-03-29 00:00:00', '54e739bef5b67569c963c38da52581ec', 'admin', '2019-03-15 16:50:15', null, null); +INSERT INTO `jeecg_order_ticket` VALUES ('3655b66fca5fef9c6aac6d70182ffda2', 'AA123', '2019-04-01 00:00:00', 'd908bfee3377e946e59220c4a4eb414a', 'admin', '2019-04-01 16:27:03', null, null); +INSERT INTO `jeecg_order_ticket` VALUES ('365d5919155473ade45840fd626c51a9', 'dddd', '2019-04-04 17:25:29', '8ab1186410a65118c4d746eb085d3bed', 'admin', '2019-04-04 17:25:33', null, null); +INSERT INTO `jeecg_order_ticket` VALUES ('4889a782e78706ab4306a925cfb163a5', 'C34', '2019-04-01 00:00:00', 'd908bfee3377e946e59220c4a4eb414a', 'admin', '2019-04-01 16:35:00', 'admin', '2019-04-01 16:35:07'); +INSERT INTO `jeecg_order_ticket` VALUES ('48d385796382cf87fa4bdf13b42d9a28', '导入A100', null, '3a867ebf2cebce9bae3f79676d8d86f3', 'jeecg-boot', '2019-03-29 18:43:59', null, null); +INSERT INTO `jeecg_order_ticket` VALUES ('541faed56efbeb4be9df581bd8264d3a', '88', null, '54e739bef5b67569c963c38da52581ec', 'admin', '2019-03-15 16:50:15', null, null); +INSERT INTO `jeecg_order_ticket` VALUES ('57a27a7dfd6a48e7d981f300c181b355', '6', '2019-03-30 00:00:00', '54e739bef5b67569c963c38da52581ec', 'admin', '2019-03-15 16:50:15', null, null); +INSERT INTO `jeecg_order_ticket` VALUES ('5ce4dc439c874266e42e6c0ff8dc8b5c', '导入A100', null, 'a2cce75872cc8fcc47f78de9ffd378c2', 'jeecg-boot', '2019-03-29 18:43:59', null, null); +INSERT INTO `jeecg_order_ticket` VALUES ('5f16e6a64ab22a161bd94cc205f2c662', '222', '2019-02-23 00:00:00', 'b190737bd04cca8360e6f87c9ef9ec4e', 'admin', '2019-02-25 16:29:48', null, null); +INSERT INTO `jeecg_order_ticket` VALUES ('645a06152998a576c051474157625c41', '88', '2019-04-04 17:25:31', '8ab1186410a65118c4d746eb085d3bed', 'admin', '2019-04-04 17:25:33', null, null); +INSERT INTO `jeecg_order_ticket` VALUES ('6e3562f2571ea9e96b2d24497b5f5eec', '55', '2019-03-23 00:00:00', '54e739bef5b67569c963c38da52581ec', 'admin', '2019-03-15 16:50:15', null, null); +INSERT INTO `jeecg_order_ticket` VALUES ('8fd2b389151568738b1cc4d8e27a6110', '导入A100', null, 'a2cce75872cc8fcc47f78de9ffd378c2', 'jeecg-boot', '2019-03-29 18:43:59', null, null); +INSERT INTO `jeecg_order_ticket` VALUES ('93f1a84053e546f59137432ff5564cac', '55', null, '54e739bef5b67569c963c38da52581ec', 'admin', '2019-03-15 16:50:15', null, null); +INSERT INTO `jeecg_order_ticket` VALUES ('969ddc5d2e198d50903686917f996470', 'A10029', '2019-04-01 00:00:00', 'f71f7f8930b5b6b1703d9948d189982b', 'admin', '2019-04-01 19:08:45', null, null); +INSERT INTO `jeecg_order_ticket` VALUES ('96e7303a8d22a5c384e08d7bcf7ac2bf', 'A100', null, 'e73434dad84ebdce2d4e0c2a2f06d8ea', 'jeecg-boot', '2019-03-29 18:43:59', null, null); +INSERT INTO `jeecg_order_ticket` VALUES ('9e8a3336f6c63f558f2b68ce2e1e666e', 'dddd', null, '9a57c850e4f68cf94ef7d8585dbaf7e6', 'admin', '2019-04-04 17:30:55', null, null); +INSERT INTO `jeecg_order_ticket` VALUES ('a28db02c810c65660015095cb81ed434', 'A100', null, 'f8889aaef6d1bccffd98d2889c0aafb5', 'jeecg-boot', '2019-03-29 18:43:59', null, null); +INSERT INTO `jeecg_order_ticket` VALUES ('b217bb0e4ec6a45b6cbf6db880060c0f', 'A100', null, '6a719071a29927a14f19482f8693d69a', 'jeecg-boot', '2019-03-29 18:43:59', null, null); +INSERT INTO `jeecg_order_ticket` VALUES ('ba708df70bb2652ed1051a394cfa0bb3', '333', null, '54e739bef5b67569c963c38da52581ec', 'admin', '2019-03-15 16:50:15', null, null); +INSERT INTO `jeecg_order_ticket` VALUES ('beabbfcb195d39bedeeafe8318794562', 'A1345', '2019-04-01 00:00:00', 'd908bfee3377e946e59220c4a4eb414a', 'admin', '2019-04-01 16:27:04', null, null); +INSERT INTO `jeecg_order_ticket` VALUES ('bf450223cb505f89078a311ef7b6ed16', '777', '2019-03-30 00:00:00', '54e739bef5b67569c963c38da52581ec', 'admin', '2019-03-15 16:50:15', null, null); +INSERT INTO `jeecg_order_ticket` VALUES ('c06165b6603e3e1335db187b3c841eef', 'fff', null, '9a57c850e4f68cf94ef7d8585dbaf7e6', 'admin', '2019-04-04 17:30:58', null, null); +INSERT INTO `jeecg_order_ticket` VALUES ('c113136abc26ace3a6da4e41d7dc1c7e', '44', '2019-03-15 00:00:00', '54e739bef5b67569c963c38da52581ec', 'admin', '2019-03-15 16:50:15', null, null); +INSERT INTO `jeecg_order_ticket` VALUES ('c1abdc2e30aeb25de13ad6ee3488ac24', '77', '2019-03-22 00:00:00', '54e739bef5b67569c963c38da52581ec', 'admin', '2019-03-15 16:50:15', null, null); +INSERT INTO `jeecg_order_ticket` VALUES ('c23751a7deb44f553ce50a94948c042a', '33', '2019-03-09 00:00:00', '8ab1186410a65118c4d746eb085d3bed', 'admin', '2019-04-04 17:25:33', null, null); +INSERT INTO `jeecg_order_ticket` VALUES ('c64547666b634b3d6a0feedcf05f25ce', 'C10019', '2019-04-01 00:00:00', 'f71f7f8930b5b6b1703d9948d189982b', 'admin', '2019-04-01 19:08:45', null, null); +INSERT INTO `jeecg_order_ticket` VALUES ('c8b8d3217f37da78dddf711a1f7da485', 'A100', null, '163e2efcbc6d7d54eb3f8a137da8a75a', 'jeecg-boot', '2019-03-29 18:43:59', null, null); +INSERT INTO `jeecg_order_ticket` VALUES ('cab691c1c1ff7a6dfd7248421917fd3c', 'A100', null, 'f8889aaef6d1bccffd98d2889c0aafb5', 'jeecg-boot', '2019-03-29 18:43:59', null, null); +INSERT INTO `jeecg_order_ticket` VALUES ('cca10a9a850b456d9b72be87da7b0883', '77', null, '54e739bef5b67569c963c38da52581ec', 'admin', '2019-03-15 16:50:15', null, null); +INSERT INTO `jeecg_order_ticket` VALUES ('d2fbba11f4814d9b1d3cb1a3f342234a', 'C10019', '2019-02-18 00:00:00', '54e739bef5b67569c963c38da52581ec', 'admin', '2019-03-15 16:50:15', null, null); +INSERT INTO `jeecg_order_ticket` VALUES ('d746c1ed956a562e97eef9c6faf94efa', '111', '2019-02-01 00:00:00', 'b190737bd04cca8360e6f87c9ef9ec4e', 'admin', '2019-02-25 16:29:48', null, null); +INSERT INTO `jeecg_order_ticket` VALUES ('dbdb07a16826808e4276e84b2aa4731a', '导入A100', null, '3a867ebf2cebce9bae3f79676d8d86f3', 'jeecg-boot', '2019-03-29 18:43:59', null, null); +INSERT INTO `jeecg_order_ticket` VALUES ('e7075639c37513afc0bbc4bf7b5d98b9', '88', null, '54e739bef5b67569c963c38da52581ec', 'admin', '2019-03-15 16:50:15', null, null); +INSERT INTO `jeecg_order_ticket` VALUES ('fa759dc104d0371f8aa28665b323dab6', '888', null, '54e739bef5b67569c963c38da52581ec', 'admin', '2019-03-15 16:50:15', null, null); +INSERT INTO `jeecg_order_ticket` VALUES ('ff197da84a9a3af53878eddc91afbb2e', '33', null, '54e739bef5b67569c963c38da52581ec', 'admin', '2019-03-15 16:50:15', null, null); + +-- ---------------------------- +-- Table structure for onl_cgreport_head +-- ---------------------------- +DROP TABLE IF EXISTS `onl_cgreport_head`; +CREATE TABLE `onl_cgreport_head` ( + `id` varchar(36) NOT NULL, + `code` varchar(100) NOT NULL COMMENT '报表编码', + `name` varchar(100) NOT NULL COMMENT '报表名字', + `cgr_sql` varchar(1000) NOT NULL COMMENT '报表SQL', + `return_val_field` varchar(100) default NULL COMMENT '返回值字段', + `return_txt_field` varchar(100) default NULL COMMENT '返回文本字段', + `return_type` varchar(2) default '1' COMMENT '返回类型,单选或多选', + `db_source` varchar(100) default NULL COMMENT '动态数据源', + `content` varchar(1000) default NULL COMMENT '描述', + `update_time` datetime default NULL COMMENT '修改时间', + `update_by` varchar(32) default NULL COMMENT '修改人id', + `create_time` datetime default NULL COMMENT '创建时间', + `create_by` varchar(32) default NULL COMMENT '创建人id', + PRIMARY KEY (`id`), + UNIQUE KEY `index_onlinereport_code` USING BTREE (`code`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- ---------------------------- +-- Records of onl_cgreport_head +-- ---------------------------- +INSERT INTO `onl_cgreport_head` VALUES ('6c7f59741c814347905a938f06ee003c', 'report_user', '统计在线用户', 'select * from sys_user', null, null, '1', null, null, '2019-03-25 11:21:04', 'admin', '2019-03-25 11:20:45', 'admin'); +INSERT INTO `onl_cgreport_head` VALUES ('87b55a515d3441b6b98e48e5b35474a6', 'demo', 'Report Demo', 'select * from demo', null, null, '1', null, null, '2019-03-15 18:18:17', 'admin', '2019-03-12 11:25:16', 'admin'); + +-- ---------------------------- +-- Table structure for onl_cgreport_item +-- ---------------------------- +DROP TABLE IF EXISTS `onl_cgreport_item`; +CREATE TABLE `onl_cgreport_item` ( + `id` varchar(36) NOT NULL, + `cgrhead_id` varchar(36) NOT NULL COMMENT '报表ID', + `field_name` varchar(36) NOT NULL COMMENT '字段名字', + `field_txt` varchar(300) default NULL COMMENT '字段文本', + `field_width` int(3) default NULL, + `field_type` varchar(10) default NULL COMMENT '字段类型', + `search_mode` varchar(10) default NULL COMMENT '查询模式', + `is_order` int(2) default '0' COMMENT '是否排序 0否,1是', + `is_search` int(2) default '0' COMMENT '是否查询 0否,1是', + `dict_code` varchar(36) default NULL COMMENT '字典CODE', + `field_href` varchar(120) default NULL COMMENT '字段跳转URL', + `is_show` int(2) default '1' COMMENT '是否显示 0否,1显示', + `order_num` int(11) default NULL COMMENT '排序', + `replace_val` varchar(200) 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`), + KEY `index_CGRHEAD_ID` USING BTREE (`cgrhead_id`), + KEY `index_isshow` USING BTREE (`is_show`), + KEY `index_order_num` USING BTREE (`order_num`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- ---------------------------- +-- Records of onl_cgreport_item +-- ---------------------------- +INSERT INTO `onl_cgreport_item` VALUES ('1740bb02519db90c44cb2cba8b755136', '6c7f59741c814347905a938f06ee003c', 'realname', '用户名', null, 'String', null, '0', '0', '', '', '1', '3', '', 'admin', '2019-03-25 11:20:45', 'admin', '2019-04-03 15:40:31'); +INSERT INTO `onl_cgreport_item` VALUES ('1b181e6d2813bcb263adc39737f9df46', '87b55a515d3441b6b98e48e5b35474a6', 'name', '用户名', null, 'String', 'single', '0', '1', '', '', '1', '4', '', 'admin', '2019-03-20 19:26:39', 'admin', '2019-03-27 18:05:04'); +INSERT INTO `onl_cgreport_item` VALUES ('1fb45af29af4e792bdc5a4a2c06a4d4d', '402880ec5d872157015d87f2dd940010', 'data_table', '表名', null, 'String', null, '0', '0', null, null, '1', '0', null, 'admin', '2019-03-20 13:24:21', 'admin', '2019-03-20 13:25:08'); +INSERT INTO `onl_cgreport_item` VALUES ('402881f167cf82600167cfa154ec0003', '402880e64e1ef94d014e1efefc2a0001', 'id', 'id', '0', 'String', '', null, '0', '', '', '0', '0', '', null, null, null, null); +INSERT INTO `onl_cgreport_item` VALUES ('402881f167cf82600167cfa154ed0004', '402880e64e1ef94d014e1efefc2a0001', 'accountname', 'accountname', '0', 'String', '', null, '0', '', '', '0', '1', '', null, null, null, null); +INSERT INTO `onl_cgreport_item` VALUES ('402881f167cf82600167cfa154ed0005', '402880e64e1ef94d014e1efefc2a0001', 'accounttoken', 'accounttoken', '0', 'String', '', null, '0', '', '', '0', '2', '', null, null, null, null); +INSERT INTO `onl_cgreport_item` VALUES ('402881f167cf82600167cfa154ed0006', '402880e64e1ef94d014e1efefc2a0001', 'accountnumber', 'accountnumber', '0', 'String', '', null, '0', '', '', '0', '3', '', null, null, null, null); +INSERT INTO `onl_cgreport_item` VALUES ('402881f167cf82600167cfa154ed0007', '402880e64e1ef94d014e1efefc2a0001', 'accounttype', 'accounttype', '0', 'String', '', null, '0', '', '', '0', '4', '', null, null, null, null); +INSERT INTO `onl_cgreport_item` VALUES ('402881f167cf82600167cfa154ed0008', '402880e64e1ef94d014e1efefc2a0001', 'accountemail', 'accountemail', '0', 'String', '', null, '0', '', '', '0', '5', '', null, null, null, null); +INSERT INTO `onl_cgreport_item` VALUES ('402881f167cf82600167cfa154ed0009', '402880e64e1ef94d014e1efefc2a0001', 'accountdesc', 'accountdesc', '0', 'String', '', null, '0', '', '', '0', '6', '', null, null, null, null); +INSERT INTO `onl_cgreport_item` VALUES ('402881f167cf82600167cfa154ee000b', '402880e64e1ef94d014e1efefc2a0001', 'accountappid', 'accountappid', '0', 'String', '', null, '0', '', '', '0', '8', '', null, null, null, null); +INSERT INTO `onl_cgreport_item` VALUES ('402881f167cf82600167cfa154ee000c', '402880e64e1ef94d014e1efefc2a0001', 'accountappsecret', 'accountappsecret', '0', 'String', '', null, '0', '', '', '0', '9', '', null, null, null, null); +INSERT INTO `onl_cgreport_item` VALUES ('402881f167cf82600167cfa154ee000d', '402880e64e1ef94d014e1efefc2a0001', 'ADDTOEKNTIME', 'ADDTOEKNTIME', '0', 'String', '', null, '0', '', '', '0', '10', '', null, null, null, null); +INSERT INTO `onl_cgreport_item` VALUES ('402881f167cf82600167cfa154ee000e', '402880e64e1ef94d014e1efefc2a0001', 'USERNAME', 'USERNAME', '0', 'String', '', null, '0', '', '', '0', '11', '', null, null, null, null); +INSERT INTO `onl_cgreport_item` VALUES ('402881f167cf82600167cfa154ee0010', '402880e64e1ef94d014e1efefc2a0001', 'jsapiticket', 'jsapiticket', '0', 'String', '', null, '0', '', '', '0', '13', '', null, null, null, null); +INSERT INTO `onl_cgreport_item` VALUES ('402881f167cf82600167cfa154ee0011', '402880e64e1ef94d014e1efefc2a0001', 'jsapitickettime', 'jsapitickettime', '0', 'String', '', null, '0', '', '', '0', '14', '', null, null, null, null); +INSERT INTO `onl_cgreport_item` VALUES ('402881f167cf82600167cfa154ef0012', '402880e64e1ef94d014e1efefc2a0001', 'init_data_flag', 'init_data_flag', '0', 'String', '', null, '0', '', '', '0', '15', '', null, null, null, null); +INSERT INTO `onl_cgreport_item` VALUES ('402881f363aa9a380163aa9ebe490002', '402881f363aa9a380163aa9ebe480001', 'id', 'id', '0', 'String', '', null, '0', '', '', '0', '0', '', null, null, null, null); +INSERT INTO `onl_cgreport_item` VALUES ('402881f363aa9a380163aa9ebe490003', '402881f363aa9a380163aa9ebe480001', 'name', 'name', '0', 'String', 'single', null, '0', '', '', '0', '10', '', null, null, null, null); +INSERT INTO `onl_cgreport_item` VALUES ('402881f363aa9a380163aa9ebe490004', '402881f363aa9a380163aa9ebe480001', 'sex', 'sex', '0', 'String', 'single', null, '0', 'sex', '', '0', '11', '', null, null, null, null); +INSERT INTO `onl_cgreport_item` VALUES ('402881f363aa9a380163aa9ebe490005', '402881f363aa9a380163aa9ebe480001', 'age', 'age', '0', 'String', '', null, '0', '', '', '0', '12', '', null, null, null, null); +INSERT INTO `onl_cgreport_item` VALUES ('402881f363aa9a380163aa9ebe490006', '402881f363aa9a380163aa9ebe480001', 'address', 'address', '0', 'String', '', null, '0', '', '', '0', '13', '', null, null, null, null); +INSERT INTO `onl_cgreport_item` VALUES ('402881f363aa9a380163aa9ebe490007', '402881f363aa9a380163aa9ebe480001', 'phone', 'phone', '0', 'String', '', null, '0', '', '', '0', '14', '', null, null, null, null); +INSERT INTO `onl_cgreport_item` VALUES ('402881f363aa9a380163aa9ebe4a0008', '402881f363aa9a380163aa9ebe480001', 'memo', 'memo', '0', 'String', '', null, '0', '', '', '0', '15', '', null, null, null, null); +INSERT INTO `onl_cgreport_item` VALUES ('402881f36402f3de016403035d2c0004', '402880e64eb9a22c014eb9a4d5890001', 'ID', 'ID', '0', 'String', '', null, '0', '', '', '0', '0', '', null, null, null, null); +INSERT INTO `onl_cgreport_item` VALUES ('402881f36402f3de016403035d2c0005', '402880e64eb9a22c014eb9a4d5890001', 'activitiSync', 'activitiSync', '0', 'String', '', null, '0', '', '', '0', '1', '', null, null, null, null); +INSERT INTO `onl_cgreport_item` VALUES ('402881f36402f3de016403035d2d0006', '402880e64eb9a22c014eb9a4d5890001', 'browser', 'browser', '0', 'String', '', null, '0', '', '', '0', '2', '', null, null, null, null); +INSERT INTO `onl_cgreport_item` VALUES ('402881f36402f3de016403035d2d0007', '402880e64eb9a22c014eb9a4d5890001', 'password', 'password', '0', 'String', '', null, '0', '', '', '0', '3', '', null, null, null, null); +INSERT INTO `onl_cgreport_item` VALUES ('402881f36402f3de016403035d2e0008', '402880e64eb9a22c014eb9a4d5890001', 'realname', 'realname', '0', 'String', '', null, '0', '', '', '0', '4', '', null, null, null, null); +INSERT INTO `onl_cgreport_item` VALUES ('402881f36402f3de016403035d2e0009', '402880e64eb9a22c014eb9a4d5890001', 'signature', 'signature', '0', 'String', '', null, '0', '', '', '0', '5', '', null, null, null, null); +INSERT INTO `onl_cgreport_item` VALUES ('402881f36402f3de016403035d2f000a', '402880e64eb9a22c014eb9a4d5890001', 'status', 'status', '0', 'String', '', null, '0', '', '', '0', '6', '', null, null, null, null); +INSERT INTO `onl_cgreport_item` VALUES ('402881f36402f3de016403035d30000b', '402880e64eb9a22c014eb9a4d5890001', 'userkey', 'userkey', '0', 'String', '', null, '0', '', '', '0', '7', '', null, null, null, null); +INSERT INTO `onl_cgreport_item` VALUES ('402881f36402f3de016403035d30000c', '402880e64eb9a22c014eb9a4d5890001', 'username', 'username', '0', 'String', '', null, '0', '', '', '0', '8', '', null, null, null, null); +INSERT INTO `onl_cgreport_item` VALUES ('402881f36402f3de016403035d31000d', '402880e64eb9a22c014eb9a4d5890001', 'departid', 'departid', '0', 'String', '', null, '0', '', '', '0', '9', '', null, null, null, null); +INSERT INTO `onl_cgreport_item` VALUES ('402881f36402f3de016403035d31000e', '402880e64eb9a22c014eb9a4d5890001', 'user_name_en', 'user_name_en', '0', 'String', '', null, '0', '', '', '0', '10', '', null, null, null, null); +INSERT INTO `onl_cgreport_item` VALUES ('402881f36402f3de016403035d32000f', '402880e64eb9a22c014eb9a4d5890001', 'delete_flag', 'delete_flag', '0', 'String', '', null, '0', '', '', '0', '11', '', null, null, null, null); +INSERT INTO `onl_cgreport_item` VALUES ('402881f3647e95be01647eb88c400003', '402880e74d76e784014d76f9e783001e', 'account', 'account', '0', 'String', 'single', null, '0', '', '', '0', '0', '', null, null, null, null); +INSERT INTO `onl_cgreport_item` VALUES ('402881f3647e95be01647eb88c410004', '402880e74d76e784014d76f9e783001e', 'realname', 'realname', '0', 'String', '', null, '0', '', '', '0', '1', '', null, null, null, null); +INSERT INTO `onl_cgreport_item` VALUES ('61ef5b323134938fdd07ad5e3ea16cd3', '87b55a515d3441b6b98e48e5b35474a6', 'key_word', '关键词', null, 'String', 'single', '0', '1', '', '', '1', '5', '', 'admin', '2019-03-20 19:26:39', 'admin', '2019-03-27 18:05:04'); +INSERT INTO `onl_cgreport_item` VALUES ('627768efd9ba2c41e905579048f21000', '6c7f59741c814347905a938f06ee003c', 'username', '用户名', null, 'String', null, '0', '0', '', '', '1', '2', '', 'admin', '2019-03-25 11:20:45', 'admin', '2019-04-03 15:40:31'); +INSERT INTO `onl_cgreport_item` VALUES ('8a2dfe672f3c0d391ace4a9f9bf564ff', '402880ec5d872157015d87f2dd940010', 'data_id', '数据ID', null, 'String', null, '0', '0', null, null, '1', '0', null, 'admin', '2019-03-20 13:24:21', 'admin', '2019-03-20 13:25:08'); +INSERT INTO `onl_cgreport_item` VALUES ('8bb087a9aa2000bcae17a1b3f5768435', '6c7f59741c814347905a938f06ee003c', 'sex', '性别', null, 'String', null, '0', '0', 'sex', '', '1', '5', '', 'admin', '2019-03-25 11:20:45', 'admin', '2019-04-03 15:40:31'); +INSERT INTO `onl_cgreport_item` VALUES ('90d4fa57d301801abb26a9b86b6b94c4', '6c7f59741c814347905a938f06ee003c', 'birthday', '生日', null, 'Date', null, '0', '0', '', '', '1', '4', '', 'admin', '2019-03-25 11:20:45', 'admin', '2019-04-03 15:40:31'); +INSERT INTO `onl_cgreport_item` VALUES ('9a0a7375479b7657e16c6a228354b495', '402880ec5d872157015d87f2dd940010', 'data_version', '数据版本', null, 'String', null, '0', '0', null, null, '1', '0', null, 'admin', '2019-03-20 13:24:21', 'admin', '2019-03-20 13:25:08'); +INSERT INTO `onl_cgreport_item` VALUES ('a4ac355f07a05218854e5f23e2930163', '6c7f59741c814347905a938f06ee003c', 'avatar', '头像', null, 'String', null, '0', '0', '', '', '0', '6', '', 'admin', '2019-03-25 11:20:45', 'admin', '2019-04-03 15:40:31'); +INSERT INTO `onl_cgreport_item` VALUES ('ae4d621e391a1392779175cf5a65134c', '87b55a515d3441b6b98e48e5b35474a6', 'update_by', '修改人', null, 'String', null, '0', '0', '', '', '1', '7', '', 'admin', '2019-03-20 19:26:39', 'admin', '2019-03-27 18:05:04'); +INSERT INTO `onl_cgreport_item` VALUES ('b27bea35b1264003c79d38cb86d6929e', '6c7f59741c814347905a938f06ee003c', 'id', 'id', null, 'String', null, '0', '0', '', '', '0', '1', '', 'admin', '2019-03-25 11:20:45', 'admin', '2019-04-03 15:40:31'); +INSERT INTO `onl_cgreport_item` VALUES ('ce5168755a734ea09dd190e28bf8d9f4', '87b55a515d3441b6b98e48e5b35474a6', 'update_time', '修改时间', null, 'String', null, '0', '0', '', '', '1', '2', '', 'admin', '2019-03-20 19:26:39', 'admin', '2019-03-27 18:05:04'); +INSERT INTO `onl_cgreport_item` VALUES ('d6e86b5ffd096ddcc445c0f320a45004', '6c7f59741c814347905a938f06ee003c', 'phone', '手机号', null, 'String', null, '0', '0', '', '', '1', '11', '', 'admin', '2019-03-25 11:20:45', 'admin', '2019-04-03 15:40:31'); +INSERT INTO `onl_cgreport_item` VALUES ('df365cd357699eea96c29763d1dd7f9d', '6c7f59741c814347905a938f06ee003c', 'email', '邮箱', null, 'String', null, '0', '0', '', '', '1', '14', '', 'admin', '2019-03-25 11:20:45', 'admin', '2019-04-03 15:40:31'); +INSERT INTO `onl_cgreport_item` VALUES ('edf9932912b81ad01dd557d3d593a559', '87b55a515d3441b6b98e48e5b35474a6', 'age', '年龄', null, 'String', null, '0', '0', '', '', '1', '8', '', 'admin', '2019-03-20 19:26:39', 'admin', '2019-03-27 18:05:04'); +INSERT INTO `onl_cgreport_item` VALUES ('f985883e509a6faaaf62ca07fd24a73c', '87b55a515d3441b6b98e48e5b35474a6', 'birthday', '生日', null, 'Date', 'single', '0', '1', '', '', '1', '1', '', 'admin', '2019-03-20 19:26:39', 'admin', '2019-03-27 18:05:04'); +INSERT INTO `onl_cgreport_item` VALUES ('fce83e4258de3e2f114ab3116397670c', '87b55a515d3441b6b98e48e5b35474a6', 'punch_time', '发布时间', null, 'String', null, '0', '0', '', '', '1', '3', '', 'admin', '2019-03-20 19:26:39', 'admin', '2019-03-27 18:05:04'); + +-- ---------------------------- +-- Table structure for onl_cgreport_param +-- ---------------------------- +DROP TABLE IF EXISTS `onl_cgreport_param`; +CREATE TABLE `onl_cgreport_param` ( + `id` varchar(36) NOT NULL, + `cgrhead_id` varchar(36) NOT NULL COMMENT '动态报表ID', + `param_name` varchar(32) NOT NULL COMMENT '参数字段', + `param_txt` varchar(32) default NULL COMMENT '参数文本', + `param_value` varchar(32) default NULL COMMENT '参数默认值', + `order_num` int(11) default NULL COMMENT '排序', + `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`), + KEY `idx_cgrheadid` USING BTREE (`cgrhead_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- ---------------------------- +-- Records of onl_cgreport_param +-- ---------------------------- +INSERT INTO `onl_cgreport_param` VALUES ('402881f36402f3de016403035d350010', '402880e64eb9a22c014eb9a4d5890001', 'usekey', 'usekey', '', '0', 'admin', '2018-06-15 18:35:09', 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 COMMENT='InnoDB free: 504832 kB; (`SCHED_NAME` `TRIGGER_NAME` `TRIGGE'; + +-- ---------------------------- +-- 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 COMMENT='InnoDB free: 504832 kB; (`SCHED_NAME` `TRIGGER_NAME` `TRIGGE'; + +-- ---------------------------- +-- Records of qrtz_cron_triggers +-- ---------------------------- + +-- ---------------------------- +-- 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 +-- ---------------------------- + +-- ---------------------------- +-- 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 COMMENT='InnoDB free: 504832 kB; (`SCHED_NAME` `TRIGGER_NAME` `TRIGGE'; + +-- ---------------------------- +-- 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 COMMENT='InnoDB free: 504832 kB; (`SCHED_NAME` `TRIGGER_NAME` `TRIGGE'; + +-- ---------------------------- +-- 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` USING BTREE (`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 COMMENT='InnoDB free: 504832 kB; (`SCHED_NAME` `JOB_NAME` `JOB_GROUP`'; + +-- ---------------------------- +-- Records of qrtz_triggers +-- ---------------------------- + +-- ---------------------------- +-- 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(1) default NULL COMMENT '删除状态(0,正常,1已删除)', + `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 '更新时间', + `user_ids` text COMMENT '指定用户', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='系统通告表'; + +-- ---------------------------- +-- Records of sys_announcement +-- ---------------------------- +INSERT INTO `sys_announcement` VALUES ('1b714f8ebc3cc33f8b4f906103b6a18d', '5467567', null, null, null, 'admin', null, null, '1', '2019-03-30 12:40:38', null, '0', 'admin', '2019-02-26 17:23:26', 'admin', '2019-02-26 17:35:10', null); +INSERT INTO `sys_announcement` VALUES ('3d11237ccdf62450d20bb8abdb331178', '111222', null, null, null, null, null, null, '0', null, null, '1', 'admin', '2019-03-29 17:19:47', 'admin', '2019-03-29 17:19:50', null); +INSERT INTO `sys_announcement` VALUES ('7ef04e95f8de030b1d5f7a9144090dc6', '111', null, '2019-02-06 17:28:10', '2019-03-08 17:28:11', null, null, null, '0', null, null, '1', 'admin', '2019-02-26 17:28:17', 'admin', '2019-03-26 19:59:49', null); +INSERT INTO `sys_announcement` VALUES ('93a9060a1c20e4bf98b3f768a02c2ff9', '111', '111', '2019-02-06 17:20:17', '2019-02-21 17:20:20', 'admin', 'M', 'ALL', '1', '2019-02-26 17:24:29', null, '0', 'admin', '2019-02-26 17:16:26', 'admin', '2019-02-26 17:19:35', null); +INSERT INTO `sys_announcement` VALUES ('de1dc57f31037079e1e55c8347fe6ef7', '222', '2222', '2019-02-06 17:28:26', '2019-02-23 17:28:28', 'admin', 'M', 'ALL', '1', '2019-03-29 17:19:56', null, '1', 'admin', '2019-02-26 17:28:36', 'admin', '2019-02-26 17:28:40', null); +INSERT INTO `sys_announcement` VALUES ('e52f3eb6215f139cb2224c52517af3bd', '334', '334', null, null, null, null, null, '0', null, null, '1', 'admin', '2019-03-30 12:40:28', 'admin', '2019-03-30 12:40:32', null); + +-- ---------------------------- +-- 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(32) default NULL COMMENT '创建人', + `create_time` datetime default NULL COMMENT '创建时间', + `update_by` varchar(32) default NULL COMMENT '更新人', + `update_time` datetime default NULL COMMENT '更新时间' +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户通告阅读标记表'; + +-- ---------------------------- +-- Records of sys_announcement_send +-- ---------------------------- + +-- ---------------------------- +-- Table structure for sys_data_log +-- ---------------------------- +DROP TABLE IF EXISTS `sys_data_log`; +CREATE TABLE `sys_data_log` ( + `id` varchar(32) NOT NULL COMMENT 'id', + `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 '更新日期', + `data_table` varchar(32) default NULL COMMENT '表名', + `data_id` varchar(32) default NULL COMMENT '数据ID', + `data_content` text COMMENT '数据内容', + `data_version` int(11) default NULL COMMENT '版本号', + PRIMARY KEY (`id`), + KEY `sindex` USING BTREE (`data_table`,`data_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- ---------------------------- +-- Records of sys_data_log +-- ---------------------------- +INSERT INTO `sys_data_log` VALUES ('402880f05ab0d198015ab12274bf0006', 'admin', '2017-03-09 11:35:09', null, null, 'jeecg_demo', '4028ef81550c1a7901550c1cd6e70001', '{\"mobilePhone\":\"\",\"officePhone\":\"\",\"email\":\"\",\"createDate\":\"Jun 23, 2016 12:00:00 PM\",\"sex\":\"1\",\"depId\":\"402880e447e99cf10147e9a03b320003\",\"userName\":\"9001\",\"status\":\"1\",\"content\":\"111\",\"id\":\"4028ef81550c1a7901550c1cd6e70001\"}', '3'); +INSERT INTO `sys_data_log` VALUES ('402880f05ab6d12b015ab700bead0009', 'admin', '2017-03-10 14:56:03', null, null, 'jeecg_demo', '402880f05ab6d12b015ab700be8d0008', '{\"mobilePhone\":\"\",\"officePhone\":\"\",\"email\":\"\",\"createDate\":\"Mar 10, 2017 2:56:03 PM\",\"sex\":\"0\",\"depId\":\"402880e447e99cf10147e9a03b320003\",\"userName\":\"111\",\"status\":\"0\",\"id\":\"402880f05ab6d12b015ab700be8d0008\"}', '1'); +INSERT INTO `sys_data_log` VALUES ('402880f05ab6d12b015ab705a23f000d', 'admin', '2017-03-10 15:01:24', null, null, 'jeecg_demo', '402880f05ab6d12b015ab705a233000c', '{\"mobilePhone\":\"\",\"officePhone\":\"11\",\"email\":\"\",\"createDate\":\"Mar 10, 2017 3:01:24 PM\",\"sex\":\"0\",\"depId\":\"402880e447e99cf10147e9a03b320003\",\"userName\":\"11\",\"status\":\"0\",\"id\":\"402880f05ab6d12b015ab705a233000c\"}', '1'); +INSERT INTO `sys_data_log` VALUES ('402880f05ab6d12b015ab712a6420013', 'admin', '2017-03-10 15:15:37', null, null, 'jeecg_demo', '402880f05ab6d12b015ab712a6360012', '{\"mobilePhone\":\"\",\"officePhone\":\"\",\"email\":\"\",\"createDate\":\"Mar 10, 2017 3:15:37 PM\",\"sex\":\"0\",\"depId\":\"402880e447e99cf10147e9a03b320003\",\"userName\":\"小王\",\"status\":\"0\",\"id\":\"402880f05ab6d12b015ab712a6360012\"}', '1'); +INSERT INTO `sys_data_log` VALUES ('402880f05ab6d12b015ab712d0510015', 'admin', '2017-03-10 15:15:47', null, null, 'jeecg_demo', '402880f05ab6d12b015ab712a6360012', '{\"mobilePhone\":\"18611788525\",\"officePhone\":\"\",\"email\":\"\",\"createDate\":\"Mar 10, 2017 3:15:37 AM\",\"sex\":\"0\",\"depId\":\"402880e447e99cf10147e9a03b320003\",\"userName\":\"小王\",\"status\":\"0\",\"id\":\"402880f05ab6d12b015ab712a6360012\"}', '2'); +INSERT INTO `sys_data_log` VALUES ('402880f05ab6d12b015ab71308240018', 'admin', '2017-03-10 15:16:02', null, null, 'jeecg_demo', '8a8ab0b246dc81120146dc81860f016f', '{\"mobilePhone\":\"13111111111\",\"officePhone\":\"66666666\",\"email\":\"demo@jeecg.com\",\"age\":12,\"salary\":10.00,\"birthday\":\"Feb 14, 2014 12:00:00 AM\",\"sex\":\"1\",\"depId\":\"402880e447e99cf10147e9a03b320003\",\"userName\":\"小明\",\"status\":\"\",\"content\":\"\",\"id\":\"8a8ab0b246dc81120146dc81860f016f\"}', '1'); +INSERT INTO `sys_data_log` VALUES ('402880f05ab6d12b015ab72806c3001b', 'admin', '2017-03-10 15:38:58', null, null, 'jeecg_demo', '8a8ab0b246dc81120146dc81860f016f', '{\"mobilePhone\":\"18611788888\",\"officePhone\":\"66666666\",\"email\":\"demo@jeecg.com\",\"age\":12,\"salary\":10.00,\"birthday\":\"Feb 14, 2014 12:00:00 AM\",\"sex\":\"1\",\"depId\":\"402880e447e99cf10147e9a03b320003\",\"userName\":\"小明\",\"status\":\"\",\"content\":\"\",\"id\":\"8a8ab0b246dc81120146dc81860f016f\"}', '2'); +INSERT INTO `sys_data_log` VALUES ('4028ef815318148a0153181567690001', 'admin', '2016-02-25 18:59:29', null, null, 'jeecg_demo', '4028ef815318148a0153181566270000', '{\"mobilePhone\":\"13423423423\",\"officePhone\":\"1\",\"email\":\"\",\"age\":1,\"salary\":1,\"birthday\":\"Feb 25, 2016 12:00:00 AM\",\"createDate\":\"Feb 25, 2016 6:59:24 PM\",\"depId\":\"402880e447e9a9570147e9b6a3be0005\",\"userName\":\"1\",\"status\":\"0\",\"id\":\"4028ef815318148a0153181566270000\"}', '1'); +INSERT INTO `sys_data_log` VALUES ('4028ef815318148a01531815ec5c0003', 'admin', '2016-02-25 19:00:03', null, null, 'jeecg_demo', '4028ef815318148a0153181566270000', '{\"mobilePhone\":\"13426498659\",\"officePhone\":\"1\",\"email\":\"\",\"age\":1,\"salary\":1.00,\"birthday\":\"Feb 25, 2016 12:00:00 AM\",\"createDate\":\"Feb 25, 2016 6:59:24 AM\",\"depId\":\"402880e447e9a9570147e9b6a3be0005\",\"userName\":\"1\",\"status\":\"0\",\"id\":\"4028ef815318148a0153181566270000\"}', '2'); +INSERT INTO `sys_data_log` VALUES ('4028ef8153c028db0153c0502e6b0003', 'admin', '2016-03-29 10:59:53', null, null, 'jeecg_demo', '4028ef8153c028db0153c0502d420002', '{\"mobilePhone\":\"18455477548\",\"officePhone\":\"123\",\"email\":\"\",\"createDate\":\"Mar 29, 2016 10:59:53 AM\",\"depId\":\"402880e447e99cf10147e9a03b320003\",\"userName\":\"123\",\"status\":\"0\",\"id\":\"4028ef8153c028db0153c0502d420002\"}', '1'); +INSERT INTO `sys_data_log` VALUES ('4028ef8153c028db0153c0509aa40006', 'admin', '2016-03-29 11:00:21', null, null, 'jeecg_demo', '4028ef8153c028db0153c0509a3e0005', '{\"mobilePhone\":\"13565486458\",\"officePhone\":\"\",\"email\":\"\",\"createDate\":\"Mar 29, 2016 11:00:21 AM\",\"depId\":\"402880e447e99cf10147e9a03b320003\",\"userName\":\"22\",\"status\":\"0\",\"id\":\"4028ef8153c028db0153c0509a3e0005\"}', '1'); +INSERT INTO `sys_data_log` VALUES ('4028ef8153c028db0153c051c4a70008', 'admin', '2016-03-29 11:01:37', null, null, 'jeecg_demo', '4028ef8153c028db0153c0509a3e0005', '{\"mobilePhone\":\"13565486458\",\"officePhone\":\"\",\"email\":\"\",\"createDate\":\"Mar 29, 2016 11:00:21 AM\",\"depId\":\"402880e447e99cf10147e9a03b320003\",\"userName\":\"22\",\"status\":\"0\",\"id\":\"4028ef8153c028db0153c0509a3e0005\"}', '2'); +INSERT INTO `sys_data_log` VALUES ('4028ef8153c028db0153c051d4b5000a', 'admin', '2016-03-29 11:01:41', null, null, 'jeecg_demo', '4028ef8153c028db0153c0502d420002', '{\"mobilePhone\":\"13565486458\",\"officePhone\":\"123\",\"email\":\"\",\"createDate\":\"Mar 29, 2016 10:59:53 AM\",\"depId\":\"402880e447e99cf10147e9a03b320003\",\"userName\":\"123\",\"status\":\"0\",\"id\":\"4028ef8153c028db0153c0502d420002\"}', '2'); +INSERT INTO `sys_data_log` VALUES ('4028ef8153c028db0153c07033d8000d', 'admin', '2016-03-29 11:34:52', null, null, 'jeecg_demo', '4028ef8153c028db0153c0502d420002', '{\"mobilePhone\":\"13565486458\",\"officePhone\":\"123\",\"email\":\"\",\"age\":23,\"createDate\":\"Mar 29, 2016 10:59:53 AM\",\"depId\":\"402880e447e99cf10147e9a03b320003\",\"userName\":\"123\",\"status\":\"0\",\"id\":\"4028ef8153c028db0153c0502d420002\"}', '3'); +INSERT INTO `sys_data_log` VALUES ('4028ef8153c028db0153c070492e000f', 'admin', '2016-03-29 11:34:57', null, null, 'jeecg_demo', '4028ef8153c028db0153c0509a3e0005', '{\"mobilePhone\":\"13565486458\",\"officePhone\":\"\",\"email\":\"\",\"age\":22,\"createDate\":\"Mar 29, 2016 11:00:21 AM\",\"depId\":\"402880e447e99cf10147e9a03b320003\",\"userName\":\"22\",\"status\":\"0\",\"id\":\"4028ef8153c028db0153c0509a3e0005\"}', '3'); +INSERT INTO `sys_data_log` VALUES ('4028ef81550c1a7901550c1cd7850002', 'admin', '2016-06-01 21:17:44', null, null, 'jeecg_demo', '4028ef81550c1a7901550c1cd6e70001', '{\"mobilePhone\":\"\",\"officePhone\":\"\",\"email\":\"\",\"createDate\":\"Jun 1, 2016 9:17:44 PM\",\"sex\":\"1\",\"depId\":\"402880e447e99cf10147e9a03b320003\",\"userName\":\"121221\",\"status\":\"0\",\"id\":\"4028ef81550c1a7901550c1cd6e70001\"}', '1'); +INSERT INTO `sys_data_log` VALUES ('4028ef81568c31ec01568c3307080004', 'admin', '2016-08-15 11:16:09', null, null, 'jeecg_demo', '4028ef81550c1a7901550c1cd6e70001', '{\"mobilePhone\":\"\",\"officePhone\":\"\",\"email\":\"\",\"createDate\":\"Jun 23, 2016 12:00:00 PM\",\"sex\":\"1\",\"depId\":\"402880e447e99cf10147e9a03b320003\",\"userName\":\"9001\",\"status\":\"1\",\"content\":\"111\",\"id\":\"4028ef81550c1a7901550c1cd6e70001\"}', '2'); + +-- ---------------------------- +-- 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(1) default NULL COMMENT '状态(1启用,0不启用)', + `del_flag` varchar(1) default NULL COMMENT '删除状态(0,正常,1已删除)', + `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`), + KEY `index_depart_parent_id` USING BTREE (`parent_id`), + KEY `index_depart_depart_order` USING BTREE (`depart_order`), + KEY `index_depart_org_code` USING BTREE (`org_code`) +) 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', 'admin', '2019-02-26 16:36:18'); +INSERT INTO `sys_depart` VALUES ('5159cde220114246b045e574adceafe9', '6d35e179cd814e3299bd588ea7daed3f', '研发部', null, null, '0', null, '2', 'A02A02', null, null, null, null, null, '0', 'admin', '2019-02-26 16:44:38', 'admin', '2019-03-07 09:36:53'); +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', 'admin', '2019-03-27 19:05:49'); +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 ('6d35e179cd814e3299bd588ea7daed3f', '', '卓尔互动公司', null, null, '0', null, '1', 'A02', null, null, null, null, null, '0', 'admin', '2019-02-26 16:36:39', 'admin', '2019-03-22 16:47:25'); +INSERT INTO `sys_depart` VALUES ('743ba9dbdc114af8953a11022ef3096a', 'f28c6f53abd841ac87ead43afc483433', '财务部', null, null, '0', null, '2', 'A03A01', null, null, null, null, null, '0', 'admin', '2019-03-22 16:45:43', null, null); +INSERT INTO `sys_depart` VALUES ('a7d7e77e06c84325a40932163adcdaa6', '6d35e179cd814e3299bd588ea7daed3f', '财务部', null, null, '0', null, '2', 'A02A01', null, null, null, null, null, '0', 'admin', '2019-02-26 16:36:47', 'admin', '2019-02-26 16:37:25'); +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-03-22 16:47:19'); + +-- ---------------------------- +-- Table structure for sys_dict +-- ---------------------------- +DROP TABLE IF EXISTS `sys_dict`; +CREATE TABLE `sys_dict` ( + `id` varchar(32) NOT NULL, + `dict_name` varchar(100) default NULL COMMENT '字典名称', + `dict_code` varchar(100) default NULL COMMENT '字典编码', + `description` varchar(255) default NULL COMMENT '描述', + `del_flag` int(1) 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 '更新时间', + `type` int(1) unsigned zerofill default '0' COMMENT '字典类型0为string,1为number', + PRIMARY KEY (`id`), + UNIQUE KEY `indextable_dict_code` USING BTREE (`dict_code`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- ---------------------------- +-- Records of sys_dict +-- ---------------------------- +INSERT INTO `sys_dict` VALUES ('2f0320997ade5dd147c90130f7218c3e', '推送类别', 'msg_type', '', '1', 'admin', '2019-03-17 21:21:32', 'admin', '2019-03-26 19:57:45', '0'); +INSERT INTO `sys_dict` VALUES ('3486f32803bb953e7155dab3513dc68b', '删除状态', 'del_flag', null, '1', 'admin', '2019-01-18 21:46:26', 'admin', '2019-03-30 11:17:11', '0'); +INSERT INTO `sys_dict` VALUES ('3d9a351be3436fbefb1307d4cfb49bf2', '性别', 'sex', null, '1', null, '2019-01-04 14:56:32', 'admin', '2019-03-30 11:28:27', '1'); +INSERT INTO `sys_dict` VALUES ('404a04a15f371566c658ee9ef9fc392a', 'cehis2', '22', null, '2', 'admin', '2019-01-30 11:17:21', 'admin', '2019-03-30 11:18:12', '0'); +INSERT INTO `sys_dict` VALUES ('4c753b5293304e7a445fd2741b46529d', '字典状态', 'dict_item_status', null, '1', 'admin', '2020-06-18 23:18:42', 'admin', '2019-03-30 19:33:52', '1'); +INSERT INTO `sys_dict` VALUES ('4e4602b3e3686f0911384e188dc7efb4', '条件规则', 'rule_conditions', '', '1', 'admin', '2019-04-01 10:15:03', 'admin', '2019-04-01 10:30:47', '0'); +INSERT INTO `sys_dict` VALUES ('4f69be5f507accea8d5df5f11346181a', '发送消息类型', 'msgType', null, '1', 'admin', '2019-04-11 14:27:09', null, null, '0'); +INSERT INTO `sys_dict` VALUES ('6b78e3f59faec1a4750acff08030a79b', '用户类型', 'user_type', null, '2', null, '2019-01-04 14:59:01', 'admin', '2019-03-18 23:28:18', '0'); +INSERT INTO `sys_dict` VALUES ('72cce0989df68887546746d8f09811aa', 'Online表单类型', 'cgform_table_type', '', '1', 'admin', '2019-01-27 10:13:02', 'admin', '2019-03-30 11:37:36', '0'); +INSERT INTO `sys_dict` VALUES ('83bfb33147013cc81640d5fd9eda030c', '日志类型', 'log_type', null, '1', 'admin', '2019-03-18 23:22:19', null, null, '1'); +INSERT INTO `sys_dict` VALUES ('845da5006c97754728bf48b6a10f79cc', '状态', 'status', null, '2', 'admin', '2019-03-18 21:45:25', 'admin', '2019-03-18 21:58:25', '0'); +INSERT INTO `sys_dict` VALUES ('a9d9942bd0eccb6e89de92d130ec4c4a', '消息发送状态', 'msgSendStatus', null, '1', 'admin', '2019-04-12 18:18:17', null, null, '0'); +INSERT INTO `sys_dict` VALUES ('ac2f7c0c5c5775fcea7e2387bcb22f01', '菜单类型', 'menu_type', null, '1', 'admin', '2020-12-18 23:24:32', 'admin', '2019-04-01 15:27:06', '1'); +INSERT INTO `sys_dict` VALUES ('ad7c65ba97c20a6805d5dcdf13cdaf36', 'onlineT类型', 'ceshi_online', null, '2', 'admin', '2019-03-22 16:31:49', 'admin', '2019-03-22 16:34:16', '0'); +INSERT INTO `sys_dict` VALUES ('c36169beb12de8a71c8683ee7c28a503', '部门状态', 'depart_status', null, '1', 'admin', '2019-03-18 21:59:51', null, null, '0'); +INSERT INTO `sys_dict` VALUES ('d6e1152968b02d69ff358c75b48a6ee1', '流程类型', 'bpm_process_type', null, '1', 'admin', '2021-02-22 19:26:54', 'admin', '2019-03-30 18:14:44', '0'); +INSERT INTO `sys_dict` VALUES ('fc6cd58fde2e8481db10d3a1e68ce70c', '用户状态', 'user_status', null, '1', 'admin', '2019-03-18 21:57:25', 'admin', '2019-03-18 23:11:58', '1'); + +-- ---------------------------- +-- Table structure for sys_dict_item +-- ---------------------------- +DROP TABLE IF EXISTS `sys_dict_item`; +CREATE TABLE `sys_dict_item` ( + `id` varchar(32) NOT NULL, + `dict_id` varchar(32) default NULL COMMENT '字典id', + `item_text` varchar(100) default NULL COMMENT '字典项文本', + `item_value` varchar(100) default NULL COMMENT '字典项值', + `description` varchar(255) default NULL COMMENT '描述', + `sort_order` int(10) default NULL COMMENT '排序', + `status` int(11) default NULL COMMENT '状态(1启用 0不启用)', + `create_by` varchar(32) default NULL, + `create_time` datetime default NULL, + `update_by` varchar(32) default NULL, + `update_time` datetime default NULL, + PRIMARY KEY (`id`), + KEY `index_table_dict_id` USING BTREE (`dict_id`), + KEY `index_table_sort_order` USING BTREE (`sort_order`), + KEY `index_table_dict_status` USING BTREE (`status`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- ---------------------------- +-- Records of sys_dict_item +-- ---------------------------- +INSERT INTO `sys_dict_item` VALUES ('05a2e732ce7b00aa52141ecc3e330b4e', '3486f32803bb953e7155dab3513dc68b', '已删除', '1', null, null, '1', 'admin', '2025-10-18 21:46:56', 'admin', '2019-03-28 22:23:20'); +INSERT INTO `sys_dict_item` VALUES ('0c9532916f5cd722017b46bc4d953e41', '2f0320997ade5dd147c90130f7218c3e', '指定用户', 'USER', null, null, '1', 'admin', '2019-03-17 21:22:19', 'admin', '2019-03-17 21:22:28'); +INSERT INTO `sys_dict_item` VALUES ('0ca4beba9efc4f9dd54af0911a946d5c', '72cce0989df68887546746d8f09811aa', '附表', '3', null, '3', '1', 'admin', '2019-03-27 10:13:43', null, null); +INSERT INTO `sys_dict_item` VALUES ('147c48ff4b51545032a9119d13f3222a', 'd6e1152968b02d69ff358c75b48a6ee1', '测试流程', 'test', null, '1', '1', 'admin', '2019-03-22 19:27:05', null, null); +INSERT INTO `sys_dict_item` VALUES ('1b8a6341163062dad8cb2fddd34e0c3b', '404a04a15f371566c658ee9ef9fc392a', '22', '222', null, '1', '1', 'admin', '2019-03-30 11:17:48', null, null); +INSERT INTO `sys_dict_item` VALUES ('1ce390c52453891f93514c1bd2795d44', 'ad7c65ba97c20a6805d5dcdf13cdaf36', '000', '00', null, '1', '1', 'admin', '2019-03-22 16:34:34', null, null); +INSERT INTO `sys_dict_item` VALUES ('23a5bb76004ed0e39414e928c4cde155', '4e4602b3e3686f0911384e188dc7efb4', '不等于', '!=', '不等于', '3', '1', 'admin', '2019-04-01 16:46:15', 'admin', '2019-04-01 17:48:40'); +INSERT INTO `sys_dict_item` VALUES ('25847e9cb661a7c711f9998452dc09e6', '4e4602b3e3686f0911384e188dc7efb4', '小于等于', '<=', '小于等于', '6', '1', 'admin', '2019-04-01 16:44:34', 'admin', '2019-04-01 17:49:10'); +INSERT INTO `sys_dict_item` VALUES ('33bc9d9f753cf7dc40e70461e50fdc54', 'a9d9942bd0eccb6e89de92d130ec4c4a', '发送失败', '2', null, '3', '1', 'admin', '2019-04-12 18:20:02', null, null); +INSERT INTO `sys_dict_item` VALUES ('41fa1e9571505d643aea87aeb83d4d76', '4e4602b3e3686f0911384e188dc7efb4', '等于', '=', '等于', '4', '1', 'admin', '2019-04-01 16:45:24', 'admin', '2019-04-01 17:49:00'); +INSERT INTO `sys_dict_item` VALUES ('43d2295b8610adce9510ff196a49c6e9', '845da5006c97754728bf48b6a10f79cc', '正常', '1', null, null, '1', 'admin', '2019-03-18 21:45:51', null, null); +INSERT INTO `sys_dict_item` VALUES ('4f05fb5376f4c61502c5105f52e4dd2b', '83bfb33147013cc81640d5fd9eda030c', '操作日志', '2', null, null, '1', 'admin', '2019-03-18 23:22:49', null, null); +INSERT INTO `sys_dict_item` VALUES ('50223341bfb5ba30bf6319789d8d17fe', 'd6e1152968b02d69ff358c75b48a6ee1', '业务办理', 'business', null, '3', '1', 'admin', '2023-04-22 19:28:05', 'admin', '2019-03-22 23:24:39'); +INSERT INTO `sys_dict_item` VALUES ('5584c21993bde231bbde2b966f2633ac', '4e4602b3e3686f0911384e188dc7efb4', '自定义SQL表达式', 'USE_SQL_RULES', '自定义SQL表达式', '9', '1', 'admin', '2019-04-01 10:45:24', 'admin', '2019-04-01 17:49:27'); +INSERT INTO `sys_dict_item` VALUES ('58b73b344305c99b9d8db0fc056bbc0a', '72cce0989df68887546746d8f09811aa', '主表', '2', null, '2', '1', 'admin', '2019-03-27 10:13:36', null, null); +INSERT INTO `sys_dict_item` VALUES ('5b65a88f076b32e8e69d19bbaadb52d5', '2f0320997ade5dd147c90130f7218c3e', '全体用户', 'ALL', null, null, '1', 'admin', '2020-10-17 21:22:43', 'admin', '2019-03-28 22:17:09'); +INSERT INTO `sys_dict_item` VALUES ('5d84a8634c8fdfe96275385075b105c9', '3d9a351be3436fbefb1307d4cfb49bf2', '女', '2', null, '2', '1', null, '2019-01-04 14:56:56', null, '2019-01-04 17:38:12'); +INSERT INTO `sys_dict_item` VALUES ('66c952ae2c3701a993e7db58f3baf55e', '4e4602b3e3686f0911384e188dc7efb4', '大于', '>', '大于', '1', '1', 'admin', '2019-04-01 10:45:46', 'admin', '2019-04-01 17:48:29'); +INSERT INTO `sys_dict_item` VALUES ('6937c5dde8f92e9a00d4e2ded9198694', 'ad7c65ba97c20a6805d5dcdf13cdaf36', 'easyui', '3', null, '1', '1', 'admin', '2019-03-22 16:32:15', null, null); +INSERT INTO `sys_dict_item` VALUES ('69cacf64e244100289ddd4aa9fa3b915', 'a9d9942bd0eccb6e89de92d130ec4c4a', '未发送', '0', null, '1', '1', 'admin', '2019-04-12 18:19:23', null, null); +INSERT INTO `sys_dict_item` VALUES ('6c682d78ddf1715baf79a1d52d2aa8c2', '72cce0989df68887546746d8f09811aa', '单表', '1', null, '1', '1', 'admin', '2019-03-27 10:13:29', null, null); +INSERT INTO `sys_dict_item` VALUES ('6d404fd2d82311fbc87722cd302a28bc', '4e4602b3e3686f0911384e188dc7efb4', '模糊', 'LIKE', '模糊', '7', '1', 'admin', '2019-04-01 16:46:02', 'admin', '2019-04-01 17:49:20'); +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 ('71b924faa93805c5c1579f12e001c809', 'd6e1152968b02d69ff358c75b48a6ee1', 'OA办公', 'oa', null, '2', '1', 'admin', '2021-03-22 19:27:17', 'admin', '2019-03-22 23:24:36'); +INSERT INTO `sys_dict_item` VALUES ('75b260d7db45a39fc7f21badeabdb0ed', 'c36169beb12de8a71c8683ee7c28a503', '不启用', '0', null, null, '1', 'admin', '2019-03-18 23:29:41', 'admin', '2019-03-18 23:29:54'); +INSERT INTO `sys_dict_item` VALUES ('7688469db4a3eba61e6e35578dc7c2e5', 'c36169beb12de8a71c8683ee7c28a503', '启用', '1', null, null, '1', 'admin', '2019-03-18 23:29:28', null, null); +INSERT INTO `sys_dict_item` VALUES ('78ea6cadac457967a4b1c4eb7aaa418c', 'fc6cd58fde2e8481db10d3a1e68ce70c', '正常', '1', null, null, '1', 'admin', '2019-03-18 23:30:28', null, null); +INSERT INTO `sys_dict_item` VALUES ('7ccf7b80c70ee002eceb3116854b75cb', 'ac2f7c0c5c5775fcea7e2387bcb22f01', '按钮权限', '2', null, null, '1', 'admin', '2019-03-18 23:25:40', null, null); +INSERT INTO `sys_dict_item` VALUES ('81fb2bb0e838dc68b43f96cc309f8257', 'fc6cd58fde2e8481db10d3a1e68ce70c', '冻结', '2', null, null, '1', 'admin', '2019-03-18 23:30:37', null, null); +INSERT INTO `sys_dict_item` VALUES ('84778d7e928bc843ad4756db1322301f', '4e4602b3e3686f0911384e188dc7efb4', '大于等于', '>=', '大于等于', '5', '1', 'admin', '2019-04-01 10:46:02', 'admin', '2019-04-01 17:49:05'); +INSERT INTO `sys_dict_item` VALUES ('86f19c7e0a73a0bae451021ac05b99dd', 'ac2f7c0c5c5775fcea7e2387bcb22f01', '子菜单', '1', null, null, '1', 'admin', '2019-03-18 23:25:27', null, null); +INSERT INTO `sys_dict_item` VALUES ('8bccb963e1cd9e8d42482c54cc609ca2', '4f69be5f507accea8d5df5f11346181a', '微信', '3', null, '3', '1', 'admin', '2021-05-11 14:29:12', 'admin', '2019-04-11 14:29:31'); +INSERT INTO `sys_dict_item` VALUES ('8c618902365ca681ebbbe1e28f11a548', '4c753b5293304e7a445fd2741b46529d', '启用', '1', null, '0', '0', 'admin', '2019-03-18 23:19:27', 'admin', '2019-03-20 09:33:30'); +INSERT INTO `sys_dict_item` VALUES ('9a96c4a4e4c5c9b4e4d0cbf6eb3243cc', '4c753b5293304e7a445fd2741b46529d', '不启用', '0', null, '1', '1', 'admin', '2019-03-18 23:19:53', null, null); +INSERT INTO `sys_dict_item` VALUES ('a2321496db6febc956a6c70fab94cb0c', '404a04a15f371566c658ee9ef9fc392a', '3', '3', null, '1', '1', 'admin', '2019-03-30 11:18:18', null, null); +INSERT INTO `sys_dict_item` VALUES ('aa0d8a8042a18715a17f0a888d360aa4', 'ac2f7c0c5c5775fcea7e2387bcb22f01', '一级菜单', '0', null, null, '1', 'admin', '2019-03-18 23:24:52', null, null); +INSERT INTO `sys_dict_item` VALUES ('adcf2a1fe93bb99a84833043f475fe0b', '4e4602b3e3686f0911384e188dc7efb4', '包含', 'IN', '包含', '8', '1', 'admin', '2019-04-01 16:45:47', 'admin', '2019-04-01 17:49:24'); +INSERT INTO `sys_dict_item` VALUES ('b2a8b4bb2c8e66c2c4b1bb086337f393', '3486f32803bb953e7155dab3513dc68b', '正常', '0', null, null, '1', 'admin', '2022-10-18 21:46:48', 'admin', '2019-03-28 22:22:20'); +INSERT INTO `sys_dict_item` VALUES ('b4a887dc3ff01d2daadaa412e63189ed', '4f69be5f507accea8d5df5f11346181a', '邮件', '2', null, '2', '1', 'admin', '2021-05-11 14:29:03', 'admin', '2019-04-11 14:29:25'); +INSERT INTO `sys_dict_item` VALUES ('b57f98b88363188daf38d42f25991956', '6b78e3f59faec1a4750acff08030a79b', '22', '222', null, null, '0', 'admin', '2019-02-21 19:59:43', 'admin', '2019-03-11 21:23:27'); +INSERT INTO `sys_dict_item` VALUES ('d75b5b3666d0742f08027af0255b4400', '4f69be5f507accea8d5df5f11346181a', '短信', '1', null, '1', '1', 'admin', '2019-04-11 14:28:49', null, null); +INSERT INTO `sys_dict_item` VALUES ('df168368dcef46cade2aadd80100d8aa', '3d9a351be3436fbefb1307d4cfb49bf2', '男', '1', null, '1', '1', null, '2027-08-04 14:56:49', 'admin', '2019-03-23 22:44:44'); +INSERT INTO `sys_dict_item` VALUES ('e6329e3a66a003819e2eb830b0ca2ea0', '4e4602b3e3686f0911384e188dc7efb4', '小于', '<', '小于', '2', '1', 'admin', '2019-04-01 16:44:15', 'admin', '2019-04-01 17:48:34'); +INSERT INTO `sys_dict_item` VALUES ('f0162f4cc572c9273f3e26b2b4d8c082', 'ad7c65ba97c20a6805d5dcdf13cdaf36', 'booostrap', '1', null, '1', '1', 'admin', '2021-08-22 16:32:04', 'admin', '2019-03-22 16:33:57'); +INSERT INTO `sys_dict_item` VALUES ('f16c5706f3ae05c57a53850c64ce7c45', 'a9d9942bd0eccb6e89de92d130ec4c4a', '发送成功', '1', null, '2', '1', 'admin', '2019-04-12 18:19:43', null, null); +INSERT INTO `sys_dict_item` VALUES ('f2a7920421f3335afdf6ad2b342f6b5d', '845da5006c97754728bf48b6a10f79cc', '冻结', '2', null, null, '1', 'admin', '2019-03-18 21:46:02', null, null); +INSERT INTO `sys_dict_item` VALUES ('f37f90c496ec9841c4c326b065e00bb2', '83bfb33147013cc81640d5fd9eda030c', '登录日志', '1', null, null, '1', 'admin', '2019-03-18 23:22:37', null, null); + +-- ---------------------------- +-- Table structure for sys_log +-- ---------------------------- +DROP TABLE IF EXISTS `sys_log`; +CREATE TABLE `sys_log` ( + `id` varchar(32) NOT NULL, + `log_type` int(2) default NULL COMMENT '日志类型(1登录日志,2操作日志)', + `log_content` varchar(1000) default NULL COMMENT '日志内容', + `operate_type` int(2) default NULL COMMENT '操作类型', + `userid` varchar(32) default NULL COMMENT '操作用户账号', + `username` varchar(100) default NULL COMMENT '操作用户名称', + `ip` varchar(100) 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(10) default NULL COMMENT '请求类型', + `cost_time` bigint(20) 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`), + KEY `index_table_userid` USING BTREE (`userid`), + KEY `index_logt_ype` USING BTREE (`log_type`), + KEY `index_operate_type` USING BTREE (`operate_type`) +) 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); +INSERT INTO `sys_log` VALUES ('fb2871cda1421b766f8e68cb36a22bf3', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-25 17:35:01', null, null); +INSERT INTO `sys_log` VALUES ('29fb5d4297748af3cd1c7f2611b7a2d6', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-25 17:38:05', null, null); +INSERT INTO `sys_log` VALUES ('580256f7c7ea658786dba919009451b6', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-25 17:39:43', null, null); +INSERT INTO `sys_log` VALUES ('8802209912ca66d56f2ea241ffd0cc13', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-25 17:52:34', null, null); +INSERT INTO `sys_log` VALUES ('4778fe2992fd5efd65f86cb0e00e338e', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-25 17:53:11', null, null); +INSERT INTO `sys_log` VALUES ('d68957c067fb27e80a23babebdb1591f', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-25 17:55:06', null, null); +INSERT INTO `sys_log` VALUES ('472c34745b8f86a46efa28f408465a63', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-25 17:56:31', null, null); +INSERT INTO `sys_log` VALUES ('26975f09c66025d1c8d87a6894a3c262', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-25 18:29:08', null, null); +INSERT INTO `sys_log` VALUES ('e4a166fcd0fc4037cb26e35cc1fb87b2', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-25 18:32:41', null, null); +INSERT INTO `sys_log` VALUES ('286af82485388bfcd3bb9821ff1a4727', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-25 18:34:37', null, null); +INSERT INTO `sys_log` VALUES ('eaf74cd1489b02d39c470eed131fc918', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-25 18:37:39', null, null); +INSERT INTO `sys_log` VALUES ('e48a6bd82c92a8005c80c5ef36746117', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-25 19:32:26', null, null); +INSERT INTO `sys_log` VALUES ('10922e0d030960e6b026c67c6179247b', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-25 20:07:59', null, null); +INSERT INTO `sys_log` VALUES ('b53c9e8ce1e129a09a3cda8c01fe644c', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-26 11:38:49', null, null); +INSERT INTO `sys_log` VALUES ('65be8e015c9f2c493bd0a4e405dd8221', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-26 11:40:20', null, null); +INSERT INTO `sys_log` VALUES ('8ff27392165c8c707ee10ec0010c7bb8', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-26 11:44:07', null, null); +INSERT INTO `sys_log` VALUES ('337b647a4085e48f61c7832e6527517d', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-26 11:45:16', null, null); +INSERT INTO `sys_log` VALUES ('caee69e55ec929f7ba904280cac971e6', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-26 11:49:15', null, null); +INSERT INTO `sys_log` VALUES ('bdeae62057ae9858b6a546c1bdb6efc7', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-26 11:49:29', null, null); +INSERT INTO `sys_log` VALUES ('ea66ed22fde49640cee5d73c6ef69718', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-26 11:50:04', null, null); +INSERT INTO `sys_log` VALUES ('47c5a5b799e10255c96ccd65286541ef', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-26 11:50:35', null, null); +INSERT INTO `sys_log` VALUES ('cfba34db2d7fbb15a2971212f09b59ec', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-26 11:51:43', null, null); +INSERT INTO `sys_log` VALUES ('faad055dd212ed9506b444f8f1a920b9', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-26 12:00:38', null, null); +INSERT INTO `sys_log` VALUES ('ef7219725c4b84cc71f56f97a8eab01a', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-26 12:08:00', null, null); +INSERT INTO `sys_log` VALUES ('2811e224e4e8d70f2946c815988b9b7c', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-26 12:08:14', null, null); +INSERT INTO `sys_log` VALUES ('7feae2fb5001ca0095c05a8b08270317', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-26 12:17:31', null, null); +INSERT INTO `sys_log` VALUES ('b4c3c7af9899b9af3f42f730cfabc9b2', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-26 12:17:58', null, null); +INSERT INTO `sys_log` VALUES ('28e8a7ed786eaced3182c70f68c7ea78', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-26 12:18:33', null, null); +INSERT INTO `sys_log` VALUES ('3a76114e431912ff9a19a4b6eb795112', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-26 12:19:41', null, null); +INSERT INTO `sys_log` VALUES ('557b3c346d9bc8f7a83fac9f5b12dc1b', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-26 12:20:28', null, null); +INSERT INTO `sys_log` VALUES ('e92544c6102243e7908e0cbb217f5198', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-26 12:48:28', null, null); +INSERT INTO `sys_log` VALUES ('61445cc950f5d04d91339089b18edef9', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-26 14:13:22', null, null); +INSERT INTO `sys_log` VALUES ('776c2e546c9ab0375d97590b048b8a9d', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-26 14:13:51', null, null); +INSERT INTO `sys_log` VALUES ('ef7669ac0350730d198f59b8411b19d1', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-26 14:28:43', null, null); +INSERT INTO `sys_log` VALUES ('b3cceb535fa5577cc21b12502535ad29', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-26 14:29:01', null, null); +INSERT INTO `sys_log` VALUES ('18a51a5f04eeaad6530665f6b0883f0c', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-26 14:34:11', null, null); +INSERT INTO `sys_log` VALUES ('8a13971104d70e35111d10dd99de392e', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-26 14:34:25', null, null); +INSERT INTO `sys_log` VALUES ('6d93d5667245ef8e5d6eafdbc9113f51', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-26 14:34:42', null, null); +INSERT INTO `sys_log` VALUES ('7ba3df5d2612ac3dd724e07a55411386', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-26 14:35:03', null, null); +INSERT INTO `sys_log` VALUES ('7148b3d58f121ef04bcbea5dd2e5fe3b', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-26 14:35:23', null, null); +INSERT INTO `sys_log` VALUES ('709b0f2bf8cb8f785f883509e54ace28', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-26 14:37:37', null, null); +INSERT INTO `sys_log` VALUES ('4114145795da30b34545e9e39b7822d9', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-26 14:39:33', null, null); +INSERT INTO `sys_log` VALUES ('f543c25bdd741055aeb4f77c5b5acf58', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-26 14:40:58', null, null); +INSERT INTO `sys_log` VALUES ('bc594b8921a0bcdb26d4a93916316092', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-26 14:42:58', null, null); +INSERT INTO `sys_log` VALUES ('11f511eeeb2e91af86b9d5e05132fc89', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-26 15:13:43', null, null); +INSERT INTO `sys_log` VALUES ('810deb9fd39fa2f0a8e30e3db42f7c2b', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-26 18:51:00', null, null); +INSERT INTO `sys_log` VALUES ('d5b9e5d9bfbbd8e6d651087ead76d9f7', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-26 20:17:41', null, null); +INSERT INTO `sys_log` VALUES ('016510fc662d9bb24d0186c5478df268', '1', '用户名: admin,登录成功!', null, 'admin', '管理员', '127.0.0.1', null, null, null, null, null, 'admin', '2019-02-26 20:27:18', null, null); +INSERT INTO `sys_log` VALUES ('eb6f5196de91dd2e8316696bddd61345', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-26 22:26:36', null, null); +INSERT INTO `sys_log` VALUES ('d762a1cba3dc23068f352323d98909e0', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-02-26 22:26:49', null, null); +INSERT INTO `sys_log` VALUES ('69fc2407b46abad64fa44482c0dca59f', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-01 12:04:25', null, null); +INSERT INTO `sys_log` VALUES ('0d6cd835072c83f46d1d2a3cf13225d3', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-01 12:04:44', null, null); +INSERT INTO `sys_log` VALUES ('e78f8832d61c1603c17767ee2b78ef07', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-01 19:50:03', null, null); +INSERT INTO `sys_log` VALUES ('0475b4445d5f58f29212258c1644f339', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-01 20:20:23', null, null); +INSERT INTO `sys_log` VALUES ('2b5a76869a7d1900487cd220de378dba', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-05 16:32:00', null, null); +INSERT INTO `sys_log` VALUES ('21b8493a05050584d9bb06cfc2a05a6b', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-05 17:29:52', null, null); +INSERT INTO `sys_log` VALUES ('a61d9db83888d42b0d24621de48a880d', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-05 22:49:48', null, null); +INSERT INTO `sys_log` VALUES ('097be3e8fdf77a245f5c85884e97b88c', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-05 22:52:45', null, null); +INSERT INTO `sys_log` VALUES ('7b2b322a47e1ce131d71c50b46d7d29e', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-06 15:55:20', null, null); +INSERT INTO `sys_log` VALUES ('cedf399271592c27dcb6f6ce3312e77d', '2', '删除测试DEMO', null, 'admin', '管理员', '127.0.0.1', 'org.jeecg.modules.demo.test.controller.JeecgDemoController.delete()', null, '[\"7501\"]', null, '24', 'admin', '2019-03-06 16:03:13', null, null); +INSERT INTO `sys_log` VALUES ('efe77038e00cfff98d6931c3e7a4c3d6', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-06 16:20:19', null, null); +INSERT INTO `sys_log` VALUES ('ffac84fff3c65bb17aa1bda3a0d2029e', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-06 20:10:50', null, null); +INSERT INTO `sys_log` VALUES ('45819fe1b96af820575a12e9f973014e', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-07 09:19:22', null, null); +INSERT INTO `sys_log` VALUES ('87885bc889d23c7c208614da8e021fb0', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-07 10:23:22', null, null); +INSERT INTO `sys_log` VALUES ('54c2bad38dafd9e636ce992aa93b26af', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-07 11:57:14', null, null); +INSERT INTO `sys_log` VALUES ('d3c4f120d8a23b62ec9e24b431a58496', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-07 14:17:24', null, null); +INSERT INTO `sys_log` VALUES ('d01d658731dac4b580a879d986b03456', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-07 15:00:37', null, null); +INSERT INTO `sys_log` VALUES ('ab550d09101a88bc999ea57cbb05aa5a', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-07 17:59:59', null, null); +INSERT INTO `sys_log` VALUES ('aeb738ab880c262772453d35fc98f2f2', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-07 18:50:30', null, null); +INSERT INTO `sys_log` VALUES ('375aadb2833e57a0d5a2ce0546a65ca4', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-07 20:38:52', null, null); +INSERT INTO `sys_log` VALUES ('96d7fe922f46123e0497e22dedf89328', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-07 23:10:48', null, null); +INSERT INTO `sys_log` VALUES ('636d37d423199e15b4030f35c60859fe', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-08 10:07:21', null, null); +INSERT INTO `sys_log` VALUES ('a7d1f4a774eb8644e2b1d37ca5f93641', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-08 10:16:03', null, null); +INSERT INTO `sys_log` VALUES ('017e9596f489951f1cc7d978085adc00', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-08 10:58:00', null, null); +INSERT INTO `sys_log` VALUES ('0b42292a532c796495a34d8d9c633afa', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-08 12:58:03', null, null); +INSERT INTO `sys_log` VALUES ('b428718441be738cf8b5ce92109068c3', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-08 16:21:37', null, null); +INSERT INTO `sys_log` VALUES ('89d2bc84e056f327291c53821d421034', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-08 16:57:46', null, null); +INSERT INTO `sys_log` VALUES ('e09bb0a74c268a9aaf1f94edcc2eb65a', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-08 18:26:14', null, null); +INSERT INTO `sys_log` VALUES ('0dc22e52c9173e4e880728bc7734ff65', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-09 11:14:47', null, null); +INSERT INTO `sys_log` VALUES ('5358b182eab53a79eec236a9cee1e0fc', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-09 13:01:21', null, null); +INSERT INTO `sys_log` VALUES ('23176e4b29c3d2f3abadd99ebeffa347', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-09 16:37:50', null, null); +INSERT INTO `sys_log` VALUES ('703fbcb7e198e8e64978ec0518971420', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-09 17:53:55', null, null); +INSERT INTO `sys_log` VALUES ('9e9d01c430b72703ce3a94589be54bbe', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-09 18:26:06', null, null); +INSERT INTO `sys_log` VALUES ('ef54197116da89bf091c0ed58321eea4', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-09 19:22:06', null, null); +INSERT INTO `sys_log` VALUES ('111156480d4d18ebf40427083f25830f', '1', '用户名: admin,登录成功!', null, null, null, '192.168.1.104', null, null, null, null, null, 'jeecg-boot', '2019-03-09 19:48:58', null, null); +INSERT INTO `sys_log` VALUES ('a9bd713f975bfbff87638432a104b715', '1', '用户名: admin,登录成功!', null, null, null, '192.168.1.104', null, null, null, null, null, 'jeecg-boot', '2019-03-09 20:04:44', null, null); +INSERT INTO `sys_log` VALUES ('06fbb85b34f518cd211b948552de72f8', '1', '登录失败,用户名:null不存在!', null, null, null, '192.168.1.104', null, null, null, null, null, 'jeecg-boot', '2019-03-09 20:08:38', null, null); +INSERT INTO `sys_log` VALUES ('9b568a868e57f24c5ba146848061613f', '1', '用户名: admin,登录成功!', null, null, null, '192.168.1.104', null, null, null, null, null, 'jeecg-boot', '2019-03-09 20:09:15', null, null); +INSERT INTO `sys_log` VALUES ('02026841bf8a9204db2c500c86a4a9be', '1', '用户名: admin,登录成功!', null, null, null, '192.168.1.104', null, null, null, null, null, 'jeecg-boot', '2019-03-09 20:44:58', null, null); +INSERT INTO `sys_log` VALUES ('c1a68605bee6b3d1264390c1cfe7a9fa', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-09 20:49:55', null, null); +INSERT INTO `sys_log` VALUES ('cbd720f20fc090c7350a98be0738816a', '1', '用户名: admin,登录成功!', null, null, null, '192.168.1.104', null, null, null, null, null, 'jeecg-boot', '2019-03-09 20:55:19', null, null); +INSERT INTO `sys_log` VALUES ('2676be4ffc66f83221fd95e23d494827', '1', '用户名: admin,登录成功!', null, null, null, '192.168.1.104', null, null, null, null, null, 'jeecg-boot', '2019-03-09 21:31:28', null, null); +INSERT INTO `sys_log` VALUES ('e9d3202c14f7f2812346fb4c2b781c67', '1', '用户名: admin,登录成功!', null, null, null, '192.168.1.104', null, null, null, null, null, 'jeecg-boot', '2019-03-09 21:38:36', null, null); +INSERT INTO `sys_log` VALUES ('d9e0150666b69cced93eb4defb19788b', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-09 23:11:12', null, null); +INSERT INTO `sys_log` VALUES ('1f0b36f7e021aa5d059ffb0a74ef6de4', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-09 23:11:25', null, null); +INSERT INTO `sys_log` VALUES ('326b2df4ab05a8dbb03a0a0087e82a25', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-10 11:53:20', null, null); +INSERT INTO `sys_log` VALUES ('7ae9cad197aee3d50e93bc3a242d68ec', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-10 13:12:26', null, null); +INSERT INTO `sys_log` VALUES ('78caf9e97aedfb8c7feef0fc8fdb4fb5', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-10 17:04:46', null, null); +INSERT INTO `sys_log` VALUES ('d00964eee24c6f9a8609a42eeebef957', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-10 17:04:48', null, null); +INSERT INTO `sys_log` VALUES ('04f97d7f906c1e97384a94f3728606a4', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-11 12:08:51', null, null); +INSERT INTO `sys_log` VALUES ('2b433e88db411bef115bc9357ba6a78b', '1', '用户名: admin,登录成功!', null, null, null, '192.168.1.105', null, null, null, null, null, 'jeecg-boot', '2019-03-11 12:09:36', null, null); +INSERT INTO `sys_log` VALUES ('63ccf8dda5d9bf825ecdbfb9ff9f456c', '1', '用户名: admin,登录成功!', null, null, null, '192.168.1.105', null, null, null, null, null, 'jeecg-boot', '2019-03-11 12:14:08', null, null); +INSERT INTO `sys_log` VALUES ('404d5fb6cce1001c3553a69089a618c8', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-11 12:29:12', null, null); +INSERT INTO `sys_log` VALUES ('9ed114408a130e69c0de4c91b2d6bf7e', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-11 13:03:40', null, null); +INSERT INTO `sys_log` VALUES ('2eb964935df6f3a4d2f3af6ac5f2ded1', '1', '用户名: admin,登录成功!', null, null, null, '192.168.1.200', null, null, null, null, null, 'jeecg-boot', '2019-03-11 13:27:18', null, null); +INSERT INTO `sys_log` VALUES ('e864c0007983211026d6987bd0cd4dc8', '1', '用户名: admin,登录成功!', null, null, null, '192.168.1.114', null, null, null, null, null, 'jeecg-boot', '2019-03-11 13:37:08', null, null); +INSERT INTO `sys_log` VALUES ('8b2ad448021fbb5509ea04c9a780b165', '1', '用户名: admin,登录成功!', null, null, null, '192.168.1.104', null, null, null, null, null, 'jeecg-boot', '2019-03-11 14:35:25', null, null); +INSERT INTO `sys_log` VALUES ('69a9dfb2fb02e4537b86c9c5c05184ae', '1', '用户名: admin,登录成功!', null, null, null, '192.168.1.104', null, null, null, null, null, 'jeecg-boot', '2019-03-11 15:22:14', null, null); +INSERT INTO `sys_log` VALUES ('98b7fc431e4654f403e27ec9af845c7b', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-11 17:31:38', null, null); +INSERT INTO `sys_log` VALUES ('42bf42af90d4df949ad0a6cd1b39805e', '1', '用户名: admin,登录成功!', null, null, null, '192.168.1.200', null, null, null, null, null, 'jeecg-boot', '2019-03-11 17:39:01', null, null); +INSERT INTO `sys_log` VALUES ('e234abc35a52f0dd2512b0ce2ea0e4f2', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-11 20:05:26', null, null); +INSERT INTO `sys_log` VALUES ('69baa4f883fe881f401ea063ddfd0079', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-12 20:51:03', null, null); +INSERT INTO `sys_log` VALUES ('a867c282a8d97f7758235f881804bb48', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-13 18:28:20', null, null); +INSERT INTO `sys_log` VALUES ('1aa593c64062f0137c0691eabac07521', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-14 10:45:10', null, null); +INSERT INTO `sys_log` VALUES ('de978382f59685babf3684d1c090d136', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-14 12:55:55', null, null); +INSERT INTO `sys_log` VALUES ('75c7fa1a7d3639be1b112e263561e43a', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-14 17:07:59', null, null); +INSERT INTO `sys_log` VALUES ('7a9d307d22fb2301d6a9396094afc82f', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-14 18:45:04', null, null); +INSERT INTO `sys_log` VALUES ('28dbc8d16f98fb4b1f481462fcaba48b', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-14 20:56:57', null, null); +INSERT INTO `sys_log` VALUES ('f1186792c6584729a0f6da4432d951f9', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-14 21:45:52', null, null); +INSERT INTO `sys_log` VALUES ('4f31f3ebaf5d1a159d2bb11dd9984909', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-15 11:14:15', null, null); +INSERT INTO `sys_log` VALUES ('9a5c1fbf3543880af6461182e24b75db', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-15 13:51:27', null, null); +INSERT INTO `sys_log` VALUES ('b86958d773b2c2bd79baa2e8c3c84050', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-15 16:49:36', null, null); +INSERT INTO `sys_log` VALUES ('a052befb699ee69b3197b139fd9263f0', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-15 17:34:58', null, null); +INSERT INTO `sys_log` VALUES ('6836a652dc96246c028577e510695c6f', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-15 20:47:02', null, null); +INSERT INTO `sys_log` VALUES ('8fe913a5b037943c6667ee4908f88bea', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-16 11:18:48', null, null); +INSERT INTO `sys_log` VALUES ('9410b7974fbc9df415867095b210e572', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-16 11:18:58', null, null); +INSERT INTO `sys_log` VALUES ('98d4b573769af6d9c10cd5c509bfb7af', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-16 11:21:25', null, null); +INSERT INTO `sys_log` VALUES ('18b16a451fec0fe7bf491ab348c65e30', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-16 11:55:45', null, null); +INSERT INTO `sys_log` VALUES ('0d85728028ed67da696137c0e82ab2f6', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-16 12:58:43', null, null); +INSERT INTO `sys_log` VALUES ('4aa770f37a7de0039ba0f720c5246486', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-17 17:26:12', null, null); +INSERT INTO `sys_log` VALUES ('2fecb508d344c5b3a40f471d7b110f14', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-17 17:36:53', null, null); +INSERT INTO `sys_log` VALUES ('61aac4cfe67ec6437cd901f95fbd6f45', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-17 17:40:21', null, null); +INSERT INTO `sys_log` VALUES ('62e208389a400e37250cfa51c204bdc8', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-17 17:44:49', null, null); +INSERT INTO `sys_log` VALUES ('eb9a522fd947c7a706c5a106ca32b8c9', '1', '用户名: jeecg,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-17 17:50:17', null, null); +INSERT INTO `sys_log` VALUES ('bd9167a87aee4574a30d67825acaad0a', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-17 17:51:03', null, null); +INSERT INTO `sys_log` VALUES ('49f1ec54eb16af2001ff6809a089e940', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-17 17:59:10', null, null); +INSERT INTO `sys_log` VALUES ('bdfd95b4d4c271d7d8d38f89f4a55da9', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-17 17:59:12', null, null); +INSERT INTO `sys_log` VALUES ('95063e0bdfa5c9817cc0f66e96baad93', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-17 17:59:16', null, null); +INSERT INTO `sys_log` VALUES ('30da94dd068a5a57f3cece2ca5ac1a25', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-17 18:01:43', null, null); +INSERT INTO `sys_log` VALUES ('8fde5f89e8ad30cf3811b8683a9a77b1', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-17 18:02:41', null, null); +INSERT INTO `sys_log` VALUES ('2ebe7f0432f01788d69d39bc6df04a1a', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-17 18:05:09', null, null); +INSERT INTO `sys_log` VALUES ('beb9ef68b586f05bd7cf43058e01ad4a', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-17 22:29:02', null, null); +INSERT INTO `sys_log` VALUES ('befbcf5a27ef8d2ca8e6234077f9413d', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-18 16:01:33', null, null); +INSERT INTO `sys_log` VALUES ('378b44af9c1042c1438450b11c707fcf', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-18 16:07:39', null, null); +INSERT INTO `sys_log` VALUES ('0571e5730ee624d0dd1b095ad7101738', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-18 16:10:50', null, null); +INSERT INTO `sys_log` VALUES ('3ec2023daa4a7d6a542bf28b11acf586', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-18 16:18:20', null, null); +INSERT INTO `sys_log` VALUES ('64c00f27ddc93fda22f91b38d2b828b5', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-18 17:34:45', null, null); +INSERT INTO `sys_log` VALUES ('21bad1470a40da8336294ca7330f443d', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-18 17:35:32', null, null); +INSERT INTO `sys_log` VALUES ('72ee87d0637fb3365fdff9ccbf286c4a', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-18 17:36:44', null, null); +INSERT INTO `sys_log` VALUES ('d8c43edd685431ab3ef7b867efc29214', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-18 17:37:18', null, null); +INSERT INTO `sys_log` VALUES ('0ad51ba59da2c8763a4e6ed6e0a292b2', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-18 17:37:53', null, null); +INSERT INTO `sys_log` VALUES ('d916bd1d956418e569549ee1c7220576', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-18 19:18:42', null, null); +INSERT INTO `sys_log` VALUES ('917dbb5db85d1a6f142135827e259bbf', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-18 20:21:03', null, null); +INSERT INTO `sys_log` VALUES ('db2b518e7086a0561f936d327a0ab522', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-18 22:39:23', null, null); +INSERT INTO `sys_log` VALUES ('61d2d2fd3e9e23f67c23b893a1ae1e72', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-18 22:44:56', null, null); +INSERT INTO `sys_log` VALUES ('671a44fd91bf267549d407e0c2a680ee', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-18 22:45:16', null, null); +INSERT INTO `sys_log` VALUES ('586e8244eff6d6761077ef15ab9a82d9', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-18 23:03:51', null, null); +INSERT INTO `sys_log` VALUES ('2b4d33d9be98e1e4cdd408a55f731050', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-19 10:32:00', null, null); +INSERT INTO `sys_log` VALUES ('3267222d9387284b864792531b450bfe', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-19 10:33:23', null, null); +INSERT INTO `sys_log` VALUES ('a28de45f52c027a3348a557efab6f430', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-19 10:34:26', null, null); +INSERT INTO `sys_log` VALUES ('9db7e7d214dbe9fe8fff5ff20634e282', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-19 11:19:34', null, null); +INSERT INTO `sys_log` VALUES ('74209dfc97285eb7919868545fc2c649', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-19 11:23:08', null, null); +INSERT INTO `sys_log` VALUES ('49d48fda33126595f6936a5d64e47af0', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-19 13:17:51', null, null); +INSERT INTO `sys_log` VALUES ('fe0dc06eaef69047131f39052fcce5c4', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-19 13:56:05', null, null); +INSERT INTO `sys_log` VALUES ('f540eff3f6e86c1e0beccd300efd357f', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-19 15:15:26', null, null); +INSERT INTO `sys_log` VALUES ('3fd0d771bbdd34fae8b48690ddd57799', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-19 17:17:22', null, null); +INSERT INTO `sys_log` VALUES ('27e8812c9a16889f14935eecacf188eb', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-19 18:52:19', null, null); +INSERT INTO `sys_log` VALUES ('88bab180edf685549c7344ec8db7d954', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-19 19:07:06', null, null); +INSERT INTO `sys_log` VALUES ('ed9b4ffc8afab10732aac2d0f84c567b', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-19 19:10:52', null, null); +INSERT INTO `sys_log` VALUES ('ad97829fe7fefcd38c80d1eb1328e40f', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-20 09:28:18', null, null); +INSERT INTO `sys_log` VALUES ('3d25a4cdd75b9c4c137394ce68e67154', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-20 09:59:31', null, null); +INSERT INTO `sys_log` VALUES ('5c7e834e089ef86555d8c2627b1b29b5', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-20 11:25:26', null, null); +INSERT INTO `sys_log` VALUES ('b3adf055f54878657611ef430f85803e', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-20 11:33:57', null, null); +INSERT INTO `sys_log` VALUES ('8d105ea6c89691bc8ee7d4fd568aa690', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-20 11:39:33', null, null); +INSERT INTO `sys_log` VALUES ('445436e800d306ec1d7763c0fe28ad38', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-20 11:43:00', null, null); +INSERT INTO `sys_log` VALUES ('7f9c3d539030049a39756208670be394', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-20 11:44:40', null, null); +INSERT INTO `sys_log` VALUES ('feaf7c377abc5824c1757d280dd3c164', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-20 11:58:54', null, null); +INSERT INTO `sys_log` VALUES ('c72bb25acd132303788699834ae039b4', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-20 12:06:06', null, null); +INSERT INTO `sys_log` VALUES ('e4c06405615399d6b1ebea45c8112b4d', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-20 12:07:26', null, null); +INSERT INTO `sys_log` VALUES ('f95d517f43ba2229c80c14c1883a4ee9', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-20 12:11:59', null, null); +INSERT INTO `sys_log` VALUES ('d18bff297a5c2fa54d708f25a7d790d6', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-20 12:13:05', null, null); +INSERT INTO `sys_log` VALUES ('b5f6636c6e24e559ddf1feb3e1a77fd5', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-20 12:14:05', null, null); +INSERT INTO `sys_log` VALUES ('aeca30df24ce26f008a7e2101f7c513c', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-20 12:27:53', null, null); +INSERT INTO `sys_log` VALUES ('cd7a7c49e02ca9613b6879fda4e563cf', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-20 12:29:08', null, null); +INSERT INTO `sys_log` VALUES ('a7ee4b4c236bc0e8f56db5fdf1e5ac38', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-20 13:21:36', null, null); +INSERT INTO `sys_log` VALUES ('6d45672f99bbfd01d6385153e9c3ad91', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-20 13:49:20', null, null); +INSERT INTO `sys_log` VALUES ('905d2cf4308f70a3a2121a3476e38ed0', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-20 14:00:30', null, null); +INSERT INTO `sys_log` VALUES ('27d23027dc320175d22391d06f50082f', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-20 15:50:06', null, null); +INSERT INTO `sys_log` VALUES ('52fde989fb8bb78d03fb9c14242f5613', '1', '用户名: admin,登录成功!', null, 'admin', '管理员', '127.0.0.1', null, null, null, null, null, 'admin', '2019-03-20 17:04:09', null, null); +INSERT INTO `sys_log` VALUES ('952947331f8f3379494c4742be797fc3', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-20 18:42:11', null, null); +INSERT INTO `sys_log` VALUES ('39caf3d5d308001aeb0a18e15ae480b9', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-21 10:31:07', null, null); +INSERT INTO `sys_log` VALUES ('772f238d46531a75fff31bae5841057c', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-21 11:31:16', null, null); +INSERT INTO `sys_log` VALUES ('f79af48e6aeb150432640483f3bb7f2a', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-21 13:09:11', null, null); +INSERT INTO `sys_log` VALUES ('20fc3263762c80ab9268ddd3d4b06500', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-21 13:36:44', null, null); +INSERT INTO `sys_log` VALUES ('e8b37ad67ef15925352a4ac3342cef07', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-21 13:38:10', null, null); +INSERT INTO `sys_log` VALUES ('d6aaf0f8e2428bf3c957becbf4bcedb4', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-21 13:38:14', null, null); +INSERT INTO `sys_log` VALUES ('3bc73699a9fd3245b87336787422729b', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-21 13:41:07', null, null); +INSERT INTO `sys_log` VALUES ('862aa0e6e101a794715174eef96f7847', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-21 13:41:09', null, null); +INSERT INTO `sys_log` VALUES ('a6209166e1e9b224cca09de1e9ea1ed7', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-21 13:41:10', null, null); +INSERT INTO `sys_log` VALUES ('b954f7c34dfbe9f6a1fc12244e0a7d59', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-21 13:41:10', null, null); +INSERT INTO `sys_log` VALUES ('64711edfb8c4eb24517d86baca005c96', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-21 13:41:11', null, null); +INSERT INTO `sys_log` VALUES ('0efc9df0d52c65ec318e7b46db21655f', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-21 13:42:47', null, null); +INSERT INTO `sys_log` VALUES ('c03985d6e038b5d8ebdeec27fce249ba', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-21 13:43:24', null, null); +INSERT INTO `sys_log` VALUES ('69e6fd7891d4b42b0cccdc0874a43752', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-21 13:45:58', null, null); +INSERT INTO `sys_log` VALUES ('9b23981621d5265a55681883ec19fa91', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-21 13:46:05', null, null); +INSERT INTO `sys_log` VALUES ('37ca8ff7098b9d118adb0a586bdc0d13', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-21 13:46:07', null, null); +INSERT INTO `sys_log` VALUES ('ea5f9191b0f593a1d6cb585538caa815', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-21 13:46:08', null, null); +INSERT INTO `sys_log` VALUES ('8e03def9e0283005161d062d4c0a5a80', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-21 13:46:09', null, null); +INSERT INTO `sys_log` VALUES ('f78e24f5e841acac2a720f46f6c554bc', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-21 13:47:17', null, null); +INSERT INTO `sys_log` VALUES ('f93279c6899dc5e6cec975906f8bf811', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-21 13:47:20', null, null); +INSERT INTO `sys_log` VALUES ('cd5af66a87bb40026c72a748155b47e8', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-21 13:47:26', null, null); +INSERT INTO `sys_log` VALUES ('5902fb4ba61ccf7ff4d2dd97072b7e5b', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-21 13:48:30', null, null); +INSERT INTO `sys_log` VALUES ('e1d1fc464cf48ec26b7412585bdded1a', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-21 13:49:15', null, null); +INSERT INTO `sys_log` VALUES ('5ea258e1f478d27e0879e2f4bcb89ecd', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-21 14:01:59', null, null); +INSERT INTO `sys_log` VALUES ('2e44c368eda5a7f7a23305b61d82cddb', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-21 18:14:23', null, null); +INSERT INTO `sys_log` VALUES ('34a6b86424857a63159f0e8254e238c2', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-21 18:22:08', null, null); +INSERT INTO `sys_log` VALUES ('ffc6178ffa099bb90b9a4d0a64dae42b', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-21 18:28:32', null, null); +INSERT INTO `sys_log` VALUES ('3612f8d40add5a7754ea3d54de0b5f20', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-21 19:59:59', null, null); +INSERT INTO `sys_log` VALUES ('7a511b225189342b778647db3db385cd', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-21 20:50:10', null, null); +INSERT INTO `sys_log` VALUES ('b7085f003b4336af4d4ba18147f8e5ae', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-21 22:29:37', null, null); +INSERT INTO `sys_log` VALUES ('c66e22782dd3916d1361c76b0cc4ec8a', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-21 22:44:06', null, null); +INSERT INTO `sys_log` VALUES ('c6cbe54fcb194d025a081e5f91a7e3f0', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-22 10:26:38', null, null); +INSERT INTO `sys_log` VALUES ('1ab7c74d217152081f4fa59e4a56cc7b', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-22 12:03:39', null, null); +INSERT INTO `sys_log` VALUES ('5f00b5514a11cd2fe240c131e9ddd136', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-22 16:30:52', null, null); +INSERT INTO `sys_log` VALUES ('82cee1c403025fc1db514c60fc7d8d29', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-22 16:41:50', null, null); +INSERT INTO `sys_log` VALUES ('af5869701738a6f4c2c58fe8dfe02726', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-22 16:42:40', null, null); +INSERT INTO `sys_log` VALUES ('233e39d8b7aa90459ebef23587c25448', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-22 17:38:36', null, null); +INSERT INTO `sys_log` VALUES ('b0cebd174565a88bb850a2475ce14625', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-22 18:19:39', null, null); +INSERT INTO `sys_log` VALUES ('26529d5753ceebbd0d774542ec83a43e', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-22 20:17:41', null, null); +INSERT INTO `sys_log` VALUES ('f3e1f7fb81004ccd64df12d94ef1e695', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-22 21:30:37', null, null); +INSERT INTO `sys_log` VALUES ('a2e0435673b17f4fb848eecdf8ecacd6', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-22 21:32:37', null, null); +INSERT INTO `sys_log` VALUES ('5323f848cddbb80ba4f0d19c0580eba9', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-22 22:58:40', null, null); +INSERT INTO `sys_log` VALUES ('5858f2f8436460a94a517904c0bfcacb', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-22 23:42:21', null, null); +INSERT INTO `sys_log` VALUES ('8d9ce65020320d46882be43b22b12a62', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-23 10:56:43', null, null); +INSERT INTO `sys_log` VALUES ('11802c7a3644af411bc4e085553cfd4f', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-23 14:46:35', null, null); +INSERT INTO `sys_log` VALUES ('fc69a1640a4772c8edf2548d053fa6de', '1', '用户名: admin,登录成功!', null, 'admin', '管理员', '127.0.0.1', null, null, null, null, null, 'admin', '2019-03-23 14:55:33', null, null); +INSERT INTO `sys_log` VALUES ('e3031f999984909f9048d8ec15543ad0', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-23 18:43:02', null, null); +INSERT INTO `sys_log` VALUES ('f43e38800d779422c75075448af738d1', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-23 18:47:11', null, null); +INSERT INTO `sys_log` VALUES ('dcfe23b155d5c6fa9a302c063b19451e', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-23 18:47:21', null, null); +INSERT INTO `sys_log` VALUES ('802cec0efbe9d862b7cea29fefc5448b', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-23 18:58:50', null, null); +INSERT INTO `sys_log` VALUES ('f58e160e97d13a851f59b70bf54e0d06', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-23 20:11:58', null, null); +INSERT INTO `sys_log` VALUES ('b8bd2a9de3fb917dfb6b435e58389901', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-23 20:13:31', null, null); +INSERT INTO `sys_log` VALUES ('e01ed1516e8ae3a2180acbd4e4508fa5', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-23 20:28:12', null, null); +INSERT INTO `sys_log` VALUES ('b7f33b5a514045878447fc64636ac3e6', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-23 22:00:34', null, null); +INSERT INTO `sys_log` VALUES ('d0ce9bfc790a573d48d49d3bbbf1a1cb', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-23 22:09:06', null, null); +INSERT INTO `sys_log` VALUES ('74c991568d8bcb2049a0dbff53f72875', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-23 22:12:15', null, null); +INSERT INTO `sys_log` VALUES ('0251bbee51c28f83459f4a57eeb61777', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-23 22:14:27', null, null); +INSERT INTO `sys_log` VALUES ('a5848ab4e8d0fb6ecf71ee1d99165468', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-23 22:14:50', null, null); +INSERT INTO `sys_log` VALUES ('79a1737fcc199c8262f344e48afb000d', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-23 23:25:25', null, null); +INSERT INTO `sys_log` VALUES ('6cfeaf6a6be5bb993b9578667999c354', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-24 11:43:34', null, null); +INSERT INTO `sys_log` VALUES ('c5d4597b38275dcb890c6568a7c113f2', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-24 12:18:46', null, null); +INSERT INTO `sys_log` VALUES ('0f173ec7e8819358819aa14aafc724c0', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-25 11:15:58', null, null); +INSERT INTO `sys_log` VALUES ('ce9893f4d0dd163e900fcd537f2c292d', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-25 11:55:55', null, null); +INSERT INTO `sys_log` VALUES ('90711ddb861e28bd8774631c98f3edb9', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-25 11:57:42', null, null); +INSERT INTO `sys_log` VALUES ('fb73d58bf6503270025972f99e50335d', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-25 11:57:56', null, null); +INSERT INTO `sys_log` VALUES ('3a290289b4b30a1caaac2d03ad3161cd', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-25 11:58:13', null, null); +INSERT INTO `sys_log` VALUES ('716f9f5f066a6f75a58b7b05f2f7f861', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-25 11:59:01', null, null); +INSERT INTO `sys_log` VALUES ('151a9f1b01e4e749124d274313cd138c', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-25 11:59:17', null, null); +INSERT INTO `sys_log` VALUES ('0ef3e7ae8c073a7e3bdd736068f86c84', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-25 12:02:27', null, null); +INSERT INTO `sys_log` VALUES ('d7e7cb4c21372e48b8e0ec7e679466e3', '1', '用户名: null,退出成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-25 12:02:34', null, null); +INSERT INTO `sys_log` VALUES ('15b9599cb02b49a62fb4a1a71ccebc18', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-25 12:02:50', null, null); +INSERT INTO `sys_log` VALUES ('ecfee5b948602a274093b8890e5e7f3f', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-25 12:05:11', null, null); +INSERT INTO `sys_log` VALUES ('cbf83d11486a8d57814ae38c9822b022', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-25 12:05:39', null, null); +INSERT INTO `sys_log` VALUES ('f2ce8024e62740f63c134c3cfb3cae23', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-25 12:07:41', null, null); +INSERT INTO `sys_log` VALUES ('c665d704539483630cc9ed5715ed57a8', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-25 12:10:12', null, null); +INSERT INTO `sys_log` VALUES ('e93f1a170e3cd33f90dd132540c7a39b', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-25 12:12:43', null, null); +INSERT INTO `sys_log` VALUES ('fded8eb5d78d13791baec769019fee54', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-25 12:15:07', null, null); +INSERT INTO `sys_log` VALUES ('03ec66b6b6d17c007ec2f918efe5b898', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-25 12:16:03', null, null); +INSERT INTO `sys_log` VALUES ('5e8bac7831de49146d568c9a8477ddad', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-25 12:16:37', null, null); +INSERT INTO `sys_log` VALUES ('cd064a2f6cb6c640cb97a74aaa6041d7', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-25 12:17:10', null, null); +INSERT INTO `sys_log` VALUES ('a521d9f2a0087daa37923fa704dea85b', '1', '用户名: 管理员,退出成功!', null, 'admin', '管理员', '127.0.0.1', null, null, null, null, null, 'admin', '2019-03-25 12:45:52', null, null); +INSERT INTO `sys_log` VALUES ('4816854636129e31c2a5f9d38af842ef', '1', '用户名: 管理员,退出成功!', null, 'admin', '管理员', '127.0.0.1', null, null, null, null, null, 'admin', '2019-03-25 12:45:54', null, null); +INSERT INTO `sys_log` VALUES ('90b4bad7939233a1e0d7935f079ea0fa', '1', '用户名: 管理员,退出成功!', null, 'admin', '管理员', '127.0.0.1', null, null, null, null, null, 'admin', '2019-03-25 12:45:54', null, null); +INSERT INTO `sys_log` VALUES ('aec0817ecc0063bde76c1f6b6889d117', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-25 12:47:06', null, null); +INSERT INTO `sys_log` VALUES ('e169938510c9320cb1495ddb9aabb9d1', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-25 12:47:40', null, null); +INSERT INTO `sys_log` VALUES ('b7478d917ab6f663e03d458f0bb022a3', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-25 12:50:55', null, null); +INSERT INTO `sys_log` VALUES ('642e48f2e5ac8fe64f1bfacf4d234dc8', '1', '用户名: 管理员,退出成功!', null, 'admin', '管理员', '127.0.0.1', null, null, null, null, null, 'admin', '2019-03-25 12:51:21', null, null); +INSERT INTO `sys_log` VALUES ('ed2740de487c684be9fa3cf72113ae30', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-25 12:51:43', null, null); +INSERT INTO `sys_log` VALUES ('b1e9797721dbfcc51bbe7182142cbdcd', '1', '用户名: 管理员,退出成功!', null, 'admin', '管理员', '127.0.0.1', null, null, null, null, null, 'admin', '2019-03-25 12:52:25', null, null); +INSERT INTO `sys_log` VALUES ('6a67bf2ff924548dee04aa97e1d64d38', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-25 12:52:41', null, null); +INSERT INTO `sys_log` VALUES ('a56661bbc72b8586778513c71f4764f5', '1', '用户名: jeecg,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-25 12:53:09', null, null); +INSERT INTO `sys_log` VALUES ('ae61be664d2f30d4f2248347c5998a45', '1', '用户名: jeecg,退出成功!', null, 'jeecg', 'jeecg', '127.0.0.1', null, null, null, null, null, 'jeecg', '2019-03-25 12:53:17', null, null); +INSERT INTO `sys_log` VALUES ('4ab79469ba556fa890258a532623d1dc', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-25 12:54:20', null, null); +INSERT INTO `sys_log` VALUES ('3a0330033a8d3b51ffbfb2e0a7db9bba', '1', '用户名: jeecg,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-25 12:54:27', null, null); +INSERT INTO `sys_log` VALUES ('b972484d206b36420efac466fae1c53f', '1', '用户名: jeecg,退出成功!', null, 'jeecg', 'jeecg', '127.0.0.1', null, null, null, null, null, 'jeecg', '2019-03-25 12:54:38', null, null); +INSERT INTO `sys_log` VALUES ('7e92abdc0c1f54596df499a5a2d11683', '1', '用户名: jeecg,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-25 12:59:34', null, null); +INSERT INTO `sys_log` VALUES ('fa9b4d7d42bc9d1ba058455b4afedbfb', '1', '用户名: 管理员,退出成功!', null, 'admin', '管理员', '127.0.0.1', null, null, null, null, null, 'admin', '2019-03-25 12:59:46', null, null); +INSERT INTO `sys_log` VALUES ('1d970c0e396ffc869e3a723d51f88b46', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-25 13:01:17', null, null); +INSERT INTO `sys_log` VALUES ('88d7136ed5c7630057451816dbaff183', '1', '用户名: jeecg,退出成功!', null, 'jeecg', 'jeecg', '127.0.0.1', null, null, null, null, null, 'jeecg', '2019-03-25 13:01:24', null, null); +INSERT INTO `sys_log` VALUES ('48eac0dd1c11fe8f0cb49f1bd14529c2', '1', '用户名: jeecg,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-25 13:01:31', null, null); +INSERT INTO `sys_log` VALUES ('a8c7ba2d11315b171940def2cbeb0e8f', '1', '用户名: 管理员,退出成功!', null, 'admin', '管理员', '127.0.0.1', null, null, null, null, null, 'admin', '2019-03-25 13:01:40', null, null); +INSERT INTO `sys_log` VALUES ('20fea778f4e1ac5c01b5a5a58e3805be', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-25 19:01:49', null, null); +INSERT INTO `sys_log` VALUES ('48e5faf2d21ead650422dc2eaf1bb6c5', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-25 22:08:09', null, null); +INSERT INTO `sys_log` VALUES ('f74f759b43afa639fd1c4f215c984ae0', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-25 22:08:18', null, null); +INSERT INTO `sys_log` VALUES ('d82b170459d99fc05eb8aa1774e1a1c9', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-26 18:45:14', null, null); +INSERT INTO `sys_log` VALUES ('e088a2607864d3e6aadf239874d51756', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-26 18:46:56', null, null); +INSERT INTO `sys_log` VALUES ('95d906e6f048c3e71ddbcc0c9448cf49', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-26 19:23:30', null, null); +INSERT INTO `sys_log` VALUES ('3767186b722b7fefd465e147d3170ad1', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-26 21:57:19', null, null); +INSERT INTO `sys_log` VALUES ('f21e30d73c337ea913849ed65808525c', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-27 10:23:22', null, null); +INSERT INTO `sys_log` VALUES ('189e3428e35e27dfe92ece2848b10ba8', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-27 15:52:21', null, null); +INSERT INTO `sys_log` VALUES ('e2b6d0e751f130d35c0c3b8c6bd2a77e', '1', '用户名: 管理员,退出成功!', null, 'admin', '管理员', '127.0.0.1', null, null, null, null, null, 'admin', '2019-03-27 16:18:40', null, null); +INSERT INTO `sys_log` VALUES ('586002e1fb4e60902735070bab48afe3', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-27 16:18:52', null, null); +INSERT INTO `sys_log` VALUES ('611fa74c70bd5a7a8af376464a2133e8', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-27 17:48:13', null, null); +INSERT INTO `sys_log` VALUES ('90555a39c0b02180df74752e4d33f253', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-27 18:26:25', null, null); +INSERT INTO `sys_log` VALUES ('217aa2f713b0903e6be699136e374012', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-27 20:07:32', null, null); +INSERT INTO `sys_log` VALUES ('5554869b3475770046602061775e0e57', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-28 14:38:05', null, null); +INSERT INTO `sys_log` VALUES ('bfec8c8c88868391041667d924e3af7f', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-28 14:38:27', null, null); +INSERT INTO `sys_log` VALUES ('675153568c479d8b7c6fe63327066c9f', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-28 15:29:42', null, null); +INSERT INTO `sys_log` VALUES ('4930e32672465979adbc592e116226a6', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-28 16:53:28', null, null); +INSERT INTO `sys_log` VALUES ('9a1456ef58a2b1fb63cdc54b723f2539', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-28 17:26:39', null, null); +INSERT INTO `sys_log` VALUES ('484cdb8db40e3f76ef686552f57d8099', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-28 18:14:49', null, null); +INSERT INTO `sys_log` VALUES ('02d4447c9d97ac4fc1c3a9a4c789c2a8', '1', '用户名: 管理员,退出成功!', null, 'admin', '管理员', '127.0.0.1', null, null, null, null, null, 'admin', '2019-03-28 18:24:18', null, null); +INSERT INTO `sys_log` VALUES ('59558082e1b1d754fa3def125ed4db3c', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-28 18:24:19', null, null); +INSERT INTO `sys_log` VALUES ('c434dc5172dc993ee7cd96187ca58653', '1', '用户名: 管理员,退出成功!', null, 'admin', '管理员', '127.0.0.1', null, null, null, null, null, 'admin', '2019-03-28 19:46:08', null, null); +INSERT INTO `sys_log` VALUES ('a6261bbbf8e964324935722ea1384a5d', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-28 19:46:27', null, null); +INSERT INTO `sys_log` VALUES ('f0748a25728348591c7b73a66f273457', '1', '用户名: 管理员,退出成功!', null, 'admin', '管理员', '127.0.0.1', null, null, null, null, null, 'admin', '2019-03-28 19:46:27', null, null); +INSERT INTO `sys_log` VALUES ('14f447d9b60725cc86b3100a5cb20b75', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-28 19:46:30', null, null); +INSERT INTO `sys_log` VALUES ('7c88e9cf6018a1b97b420b8cb6122815', '1', '用户名: 管理员,退出成功!', null, 'admin', '管理员', '127.0.0.1', null, null, null, null, null, 'admin', '2019-03-28 19:46:30', null, null); +INSERT INTO `sys_log` VALUES ('cb7c6178101ef049d3f1820ee41df539', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-28 19:59:19', null, null); +INSERT INTO `sys_log` VALUES ('21fed0f2d080e04cf0901436721a77a6', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-28 21:53:31', null, null); +INSERT INTO `sys_log` VALUES ('4ba055970859a6f1afcc01227cb82a2d', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-29 09:43:56', null, null); +INSERT INTO `sys_log` VALUES ('3ba1e54aa9aa760b59dfe1d1259459bc', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-29 09:44:07', null, null); +INSERT INTO `sys_log` VALUES ('7b44138c1b80b67da13b89db756a22b0', '2', '添加测试DEMO', null, null, null, '127.0.0.1', 'org.jeecg.modules.demo.test.controller.JeecgDemoController.add()', null, '[{\"createBy\":\"jeecg-boot\",\"createTime\":1553824172062,\"id\":\"5fce01cb7f0457746c97d8ca05628f81\",\"name\":\"1212\"}]', null, '25', 'jeecg-boot', '2019-03-29 09:49:32', null, null); +INSERT INTO `sys_log` VALUES ('d7e8a7f14967c70d68f5569cb4d11d0a', '2', '删除测试DEMO', null, null, null, '127.0.0.1', 'org.jeecg.modules.demo.test.controller.JeecgDemoController.delete()', null, '[\"5fce01cb7f0457746c97d8ca05628f81\"]', null, '9', 'jeecg-boot', '2019-03-29 09:49:39', null, null); +INSERT INTO `sys_log` VALUES ('e7f2b0a7493e7858c5db1f1595fa54b1', '2', '添加测试DEMO', null, null, null, '127.0.0.1', 'org.jeecg.modules.demo.test.controller.JeecgDemoController.add()', null, '[{\"createBy\":\"jeecg-boot\",\"createTime\":1553824376817,\"id\":\"e771211b77cd3b326d3e61edfd9a5a19\",\"keyWord\":\"222\",\"name\":\"222\"}]', null, '7', 'jeecg-boot', '2019-03-29 09:52:56', null, null); +INSERT INTO `sys_log` VALUES ('997bb4cb1ad24439b6f7656222af0710', '2', '添加测试DEMO', null, null, null, '127.0.0.1', 'org.jeecg.modules.demo.test.controller.JeecgDemoController.add()', null, '[{\"createBy\":\"jeecg-boot\",\"createTime\":1553824768819,\"id\":\"ee84471f0dff5ae88c45e852bfa0280f\",\"keyWord\":\"22\",\"name\":\"222\"}]', null, '5', 'jeecg-boot', '2019-03-29 09:59:28', null, null); +INSERT INTO `sys_log` VALUES ('a6c3b28530416dace21371abe8cae00b', '2', '删除测试DEMO', null, null, null, '127.0.0.1', 'org.jeecg.modules.demo.test.controller.JeecgDemoController.delete()', null, '[\"ee84471f0dff5ae88c45e852bfa0280f\"]', null, '9', 'jeecg-boot', '2019-03-29 09:59:48', null, null); +INSERT INTO `sys_log` VALUES ('d2fe98d661f1651b639bf74499f124db', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-29 10:16:29', null, null); +INSERT INTO `sys_log` VALUES ('2186244ae450e83d1487aa01fbeae664', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-29 14:47:43', null, null); +INSERT INTO `sys_log` VALUES ('a5daa58b078cb8b3653af869aeecebd0', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-29 17:14:31', null, null); +INSERT INTO `sys_log` VALUES ('f29f3b7b7e14b1389a0c53d263c0b26b', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-29 17:44:25', null, null); +INSERT INTO `sys_log` VALUES ('2659c59136fb1a284ab0642361b10cdd', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-29 18:40:22', null, null); +INSERT INTO `sys_log` VALUES ('a42e5cd05566ea226c2e2fc201860f2c', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-30 11:15:50', null, null); +INSERT INTO `sys_log` VALUES ('f06048c147c5bcdbed672e32b2c86b1c', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-30 14:07:28', null, null); +INSERT INTO `sys_log` VALUES ('13c83c56a0de8a702aeb2aa0c330e42c', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-30 14:53:52', null, null); +INSERT INTO `sys_log` VALUES ('ab1d707bbfdf44aa17307d30ca872403', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-30 15:50:42', null, null); +INSERT INTO `sys_log` VALUES ('5d8ed15778aa7d99224ee62c606589fb', '1', '用户名: 管理员,退出成功!', null, 'admin', '管理员', '127.0.0.1', null, null, null, null, null, 'admin', '2019-03-30 15:51:02', null, null); +INSERT INTO `sys_log` VALUES ('42aef93749cc6222d5debe3fb31ba41b', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-30 15:51:04', null, null); +INSERT INTO `sys_log` VALUES ('5c04e3d9429e3bcff4d55f6205c4aa83', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-30 18:14:29', null, null); +INSERT INTO `sys_log` VALUES ('af8fe96a9f0b325e4833fc0d9c4721bf', '1', '用户名: 管理员,退出成功!', null, 'admin', '管理员', '127.0.0.1', null, null, null, null, null, 'admin', '2019-03-30 18:14:56', null, null); +INSERT INTO `sys_log` VALUES ('21910e350c9083e107d39ff4278f51d6', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-30 18:14:59', null, null); +INSERT INTO `sys_log` VALUES ('636309eec5e750bc94ce06fb98526fb2', '1', '用户名: 管理员,退出成功!', null, 'admin', '管理员', '127.0.0.1', null, null, null, null, null, 'admin', '2019-03-30 18:15:03', null, null); +INSERT INTO `sys_log` VALUES ('9d0416e09fae7aeeeefc8511a61650c2', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-30 18:15:05', null, null); +INSERT INTO `sys_log` VALUES ('2e63fd1b3b6a6145bc04b2a1df18d2f5', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-30 19:01:33', null, null); +INSERT INTO `sys_log` VALUES ('2966ed2bdf67c9f3306b058d13bef301', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-30 21:25:10', null, null); +INSERT INTO `sys_log` VALUES ('3683743d1936d06f3aaa03d6470e5178', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-30 22:40:12', null, null); +INSERT INTO `sys_log` VALUES ('0ba24c5f61ff53f93134cf932dd486db', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-31 21:06:05', null, null); +INSERT INTO `sys_log` VALUES ('bbd3e1f27e025502a67cf54945b0b269', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-03-31 22:13:16', null, null); +INSERT INTO `sys_log` VALUES ('1f8f46118336b2cacf854c1abf8ae144', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-04-01 11:02:59', null, null); +INSERT INTO `sys_log` VALUES ('ac8cf22c2f10a38c7a631fc590551c40', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-04-01 12:04:16', null, null); +INSERT INTO `sys_log` VALUES ('7d11535270734de80bd52ec0daa4fc1f', '1', '用户名: admin,登录成功!', null, null, null, '192.168.1.105', null, null, null, null, null, 'jeecg-boot', '2019-04-01 12:20:14', null, null); +INSERT INTO `sys_log` VALUES ('6b4cdd499885ccba43b40f10abf64a78', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-04-01 13:04:43', null, null); +INSERT INTO `sys_log` VALUES ('77a329e5eb85754075165b06b7d877fd', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-04-01 13:25:17', null, null); +INSERT INTO `sys_log` VALUES ('0e754ee377033067f7b2f10b56b8784c', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-04-01 17:17:45', null, null); +INSERT INTO `sys_log` VALUES ('9b7a830914668881335da1b0ce2274b1', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-04-01 17:19:02', null, null); +INSERT INTO `sys_log` VALUES ('a1b870eee811cfa4960f577b667b0973', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-04-01 18:23:44', null, null); +INSERT INTO `sys_log` VALUES ('85b3106d757d136b48172a9ab1f35bb6', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-04-01 18:34:34', null, null); +INSERT INTO `sys_log` VALUES ('7f31435ca2f5a4ef998a4152b2433dec', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-04-01 18:36:40', null, null); +INSERT INTO `sys_log` VALUES ('f20cf3fe228ba6196a48015b98d0d354', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-04-01 19:25:22', null, null); +INSERT INTO `sys_log` VALUES ('65771bce3f5786dfb4d84570df61a47a', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-04-01 22:07:57', null, null); +INSERT INTO `sys_log` VALUES ('c98a6367b152cf5311d0eec98fab390c', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-04-01 22:13:34', null, null); +INSERT INTO `sys_log` VALUES ('93b4d26f60d7fb45a60524760bf053e4', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-04-01 22:20:06', null, null); +INSERT INTO `sys_log` VALUES ('3087ac4988a961fa1ec0b4713615c719', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-04-01 22:54:24', null, null); +INSERT INTO `sys_log` VALUES ('a69f4ff4e48754de96ae6fa4fabc1579', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-04-02 09:18:48', null, null); +INSERT INTO `sys_log` VALUES ('a63147887c6ca54ce31f6c9e6279a714', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-04-02 09:19:07', null, null); +INSERT INTO `sys_log` VALUES ('a2950ae3b86f786a6a6c1ce996823b53', '1', '用户名: 管理员,退出成功!', null, 'admin', '管理员', '127.0.0.1', null, null, null, null, null, 'admin', '2019-04-02 09:47:11', null, null); +INSERT INTO `sys_log` VALUES ('615625178b01fc20c60184cd28e64a70', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-04-02 09:47:13', null, null); +INSERT INTO `sys_log` VALUES ('89fbc93e77defb34c609c84a7fe83039', '1', '用户名: 管理员,退出成功!', null, 'admin', '管理员', '127.0.0.1', null, null, null, null, null, 'admin', '2019-04-02 09:47:14', null, null); +INSERT INTO `sys_log` VALUES ('432067d777447423f1ce3db11a273f6f', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-04-02 09:47:17', null, null); +INSERT INTO `sys_log` VALUES ('7d8539ff876aad698fba235a1c467fb8', '1', '用户名: 管理员,退出成功!', null, 'admin', '管理员', '127.0.0.1', null, null, null, null, null, 'admin', '2019-04-02 09:47:18', null, null); +INSERT INTO `sys_log` VALUES ('689b8f2110f99c52e18268cbaf05bbb6', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-04-02 09:58:44', null, null); +INSERT INTO `sys_log` VALUES ('2919d2f18db064978a619707bde4d613', '1', '用户名: 管理员,退出成功!', null, 'admin', '管理员', '127.0.0.1', null, null, null, null, null, 'admin', '2019-04-02 09:58:45', null, null); +INSERT INTO `sys_log` VALUES ('0dc6d04b99e76ad400eef1ded2d3d97c', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-04-02 09:59:45', null, null); +INSERT INTO `sys_log` VALUES ('45f0309632984f5f7c70b3d40dbafe8b', '1', '用户名: 管理员,退出成功!', null, 'admin', '管理员', '127.0.0.1', null, null, null, null, null, 'admin', '2019-04-02 09:59:46', null, null); +INSERT INTO `sys_log` VALUES ('d869534109332e770c70fad65ef37998', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-04-02 10:02:30', null, null); +INSERT INTO `sys_log` VALUES ('c21422fa08f8480a53367fda7ddddf12', '1', '用户名: 管理员,退出成功!', null, 'admin', '管理员', '127.0.0.1', null, null, null, null, null, 'admin', '2019-04-02 10:02:30', null, null); +INSERT INTO `sys_log` VALUES ('1e4533a02fb9c739a3555fa7be6e7899', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-04-02 10:04:56', null, null); +INSERT INTO `sys_log` VALUES ('03c0ab177bd7d840b778713b37daf86f', '1', '用户名: 管理员,退出成功!', null, 'admin', '管理员', '127.0.0.1', null, null, null, null, null, 'admin', '2019-04-02 10:04:57', null, null); +INSERT INTO `sys_log` VALUES ('60886d5de8a18935824faf8b0bed489e', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-04-02 10:11:35', null, null); +INSERT INTO `sys_log` VALUES ('4218b30015501ee966548c139c14f43f', '1', '用户名: 管理员,退出成功!', null, 'admin', '管理员', '127.0.0.1', null, null, null, null, null, 'admin', '2019-04-02 10:11:35', null, null); +INSERT INTO `sys_log` VALUES ('de938485a45097d1bf3fa311d0216ed4', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-04-02 10:15:22', null, null); +INSERT INTO `sys_log` VALUES ('e1d0b1fd3be59e465b740e32346e85b0', '1', '用户名: 管理员,退出成功!', null, 'admin', '管理员', '127.0.0.1', null, null, null, null, null, 'admin', '2019-04-02 10:16:37', null, null); +INSERT INTO `sys_log` VALUES ('4234117751af62ac87343cbf8a6f1e0f', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-04-02 10:17:17', null, null); +INSERT INTO `sys_log` VALUES ('845f732f6a0f0d575debc4103e92bea2', '1', '用户名: 管理员,退出成功!', null, 'admin', '管理员', '127.0.0.1', null, null, null, null, null, 'admin', '2019-04-02 10:17:18', null, null); +INSERT INTO `sys_log` VALUES ('cc39057ae0a8a996fb0b3a8ad5b8f341', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-04-02 10:20:05', null, null); +INSERT INTO `sys_log` VALUES ('155d2991204d541388d837d1457e56ab', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-04-02 11:32:57', null, null); +INSERT INTO `sys_log` VALUES ('2312c2693d6b50ca06799fee0ad2554a', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-04-02 12:11:32', null, null); +INSERT INTO `sys_log` VALUES ('d98115c02c0ac478a16d6c35de35053d', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-04-02 12:50:09', null, null); +INSERT INTO `sys_log` VALUES ('55e906361eeabb6ec16d66c7196a06f0', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-04-02 12:50:20', null, null); +INSERT INTO `sys_log` VALUES ('3836dc3f91d072e838092bc8d3143906', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-04-02 12:50:32', null, null); +INSERT INTO `sys_log` VALUES ('add13f513772a63f8ca8bf85634bb72c', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-04-02 13:09:03', null, null); +INSERT INTO `sys_log` VALUES ('a6971e63e3d9158020e0186cda81467d', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-04-02 14:59:23', null, null); +INSERT INTO `sys_log` VALUES ('2eb75cb6ca5bc60241e01fa7471c0ccf', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-04-02 18:34:04', null, null); +INSERT INTO `sys_log` VALUES ('3e69108be63179550afe424330a8a9e4', '1', '用户名: 管理员,退出成功!', null, 'admin', '管理员', '127.0.0.1', null, null, null, null, null, 'admin', '2019-04-02 18:38:05', null, null); +INSERT INTO `sys_log` VALUES ('6c558d70dc5794f9f473d8826485727a', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-04-02 18:38:44', null, null); +INSERT INTO `sys_log` VALUES ('687810e7fea7e480962c58db515a5e1c', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-04-02 18:42:30', null, null); +INSERT INTO `sys_log` VALUES ('d23e6766cecf911fb2e593eeee354e18', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-04-02 18:42:35', null, null); +INSERT INTO `sys_log` VALUES ('0819ea9729ddf70f64ace59370a62cf1', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-04-02 18:59:43', null, null); +INSERT INTO `sys_log` VALUES ('939b3ff4733247a47efe1352157b1f27', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-04-02 19:01:06', null, null); +INSERT INTO `sys_log` VALUES ('6cf638853ef5384bf81ed84572a6445d', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-04-02 19:25:24', null, null); +INSERT INTO `sys_log` VALUES ('bc28d4275c7c7fcd067e1aef40ec1dd4', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-04-03 10:53:03', null, null); +INSERT INTO `sys_log` VALUES ('43536edd8aa99f9b120872e2c768206c', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-04-03 10:53:26', null, null); +INSERT INTO `sys_log` VALUES ('7268539fbe77c5cc572fb46d71d838f1', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-04-03 13:22:48', null, null); +INSERT INTO `sys_log` VALUES ('f0409312093beb563ac4016f2b2c6dfd', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-04-03 13:24:59', null, null); +INSERT INTO `sys_log` VALUES ('a710ed2de7e31fd72b1efb1b54ba5a87', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-04-03 15:30:43', null, null); +INSERT INTO `sys_log` VALUES ('b01c3f89bcfd263de7cb1a9b0210a7af', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-04-03 17:53:55', null, null); +INSERT INTO `sys_log` VALUES ('e1fa52ecbcc0970622cc5a0c06de9317', '1', '用户名: 管理员,退出成功!', null, 'admin', '管理员', '127.0.0.1', null, null, null, null, null, 'admin', '2019-04-03 18:33:04', null, null); +INSERT INTO `sys_log` VALUES ('790b722fa99a8f3a0bc38f61e13c1cf4', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-04-03 18:34:07', null, null); +INSERT INTO `sys_log` VALUES ('20e5887d0c9c7981159fe91a51961141', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-04-03 20:12:07', null, null); +INSERT INTO `sys_log` VALUES ('ce6aa822166b97a78b0bbea62366f8e0', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-04-03 20:14:29', null, null); +INSERT INTO `sys_log` VALUES ('3e6116220fa8d4808175738c6de51b12', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-04-03 21:04:46', null, null); +INSERT INTO `sys_log` VALUES ('10a434c326e39b1d046defddc8c57f4a', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-04-03 21:18:29', null, null); +INSERT INTO `sys_log` VALUES ('317e3ae1b6ccdfb5db6940789e12d300', '1', '用户名: 管理员,退出成功!', null, 'admin', '管理员', '127.0.0.1', null, null, null, null, null, 'admin', '2019-04-03 21:44:31', null, null); +INSERT INTO `sys_log` VALUES ('2b801129457c05d23653ecaca88f1711', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-04-03 21:44:34', null, null); +INSERT INTO `sys_log` VALUES ('7a99cf653439ca82ac3b0d189ddaad4a', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-04-04 10:41:34', null, null); +INSERT INTO `sys_log` VALUES ('68e90e08a866de748e9901e923406959', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-04-04 12:37:06', null, null); +INSERT INTO `sys_log` VALUES ('2942a12521ac8e3d441429e6c4b04207', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-04-04 14:12:10', null, null); +INSERT INTO `sys_log` VALUES ('dfacaa7c01ccf0bade680044cced3f11', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-04-04 15:25:10', null, null); +INSERT INTO `sys_log` VALUES ('f3cafb545e5693e446f641fa0b5ac8cd', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-04-04 17:07:56', null, null); +INSERT INTO `sys_log` VALUES ('060d541a9571ca2b0d24790a98d170a6', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-04-04 19:28:04', null, null); +INSERT INTO `sys_log` VALUES ('9df97c1b3213aa64eda81c6bf818b02b', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-04-04 22:42:48', null, null); +INSERT INTO `sys_log` VALUES ('43079866b75ee6a031835795bb681e16', '1', '用户名: 管理员,退出成功!', null, 'admin', '管理员', '127.0.0.1', null, null, null, null, null, 'admin', '2019-04-04 22:44:16', null, null); +INSERT INTO `sys_log` VALUES ('55d649432efa7eaecd750b4b6b883f83', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-04-04 22:44:19', null, null); +INSERT INTO `sys_log` VALUES ('ca737885d9034f71f70c4ae7986fafa8', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-04-04 22:47:28', null, null); +INSERT INTO `sys_log` VALUES ('1534f0c50e67c5682e91af5160a67a80', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-04-04 22:47:28', null, null); +INSERT INTO `sys_log` VALUES ('93bb98ba996dacebfb4f61503067352e', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-04-04 22:47:28', null, null); +INSERT INTO `sys_log` VALUES ('5c48703e3a2d4f81ee5227f0e2245990', '1', '用户名: 管理员,退出成功!', null, 'admin', '管理员', '127.0.0.1', null, null, null, null, null, 'admin', '2019-04-04 23:12:04', null, null); +INSERT INTO `sys_log` VALUES ('70849167f54fd50d8906647176d90fdf', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-04-04 23:12:29', null, null); +INSERT INTO `sys_log` VALUES ('310bb368795f4985ed4eada030a435a0', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-04-04 23:22:20', null, null); +INSERT INTO `sys_log` VALUES ('477592ab95cd219a2ccad79de2f69f51', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-04-05 10:38:24', null, null); +INSERT INTO `sys_log` VALUES ('e39f051ba6fdb7447f975421f3b090a7', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-04-05 12:49:18', null, null); +INSERT INTO `sys_log` VALUES ('4d1be4b4991a5c2d4d17d0275e4209cf', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-04-05 20:47:21', null, null); +INSERT INTO `sys_log` VALUES ('9eb3fb6d9d45e3847a88f65ed47da935', '1', '用户名: jeecg,登录成功!', null, null, null, '192.168.3.22', null, null, null, null, null, 'jeecg-boot', '2019-04-05 20:52:47', null, null); +INSERT INTO `sys_log` VALUES ('6664dc299f547f6702f93e2358810cc1', '1', '用户名: admin,登录成功!', null, null, null, '192.168.3.22', null, null, null, null, null, 'jeecg-boot', '2019-04-05 21:04:14', null, null); +INSERT INTO `sys_log` VALUES ('9c32ec437d8f8d407b1bd1165fc0305d', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-04-08 15:01:25', null, null); +INSERT INTO `sys_log` VALUES ('68df65639e82cc6a889282fbef53afbb', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-04-08 15:01:37', null, null); +INSERT INTO `sys_log` VALUES ('79e76353faffd0beb0544c0aede8564f', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-04-08 17:28:14', null, null); +INSERT INTO `sys_log` VALUES ('da3fda67aea2e565574ec2bcfab5b750', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-04-08 22:36:20', null, null); +INSERT INTO `sys_log` VALUES ('de37620b6921abcfe642606a0358d30f', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-04-09 15:42:46', null, null); +INSERT INTO `sys_log` VALUES ('b0e6b3a0ec5d8c73166fb8129d21a834', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-04-09 16:56:16', null, null); +INSERT INTO `sys_log` VALUES ('01075aa535274735e0df0a8bc44f62f9', '1', '用户名: 管理员,退出成功!', null, 'admin', '管理员', '127.0.0.1', null, null, null, null, null, 'admin', '2019-04-09 16:56:46', null, null); +INSERT INTO `sys_log` VALUES ('01ebe1cbeae916a9228770f63130fdac', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-04-09 16:56:50', null, null); +INSERT INTO `sys_log` VALUES ('baa53d6a534e669f6150ea47565fa5b9', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-04-09 17:27:24', null, null); +INSERT INTO `sys_log` VALUES ('e232f89df26cc9e5eced10476c4e4a2b', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-04-10 10:05:11', null, null); +INSERT INTO `sys_log` VALUES ('335956cbad23d1974138752199bf1d84', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-04-10 10:05:36', null, null); +INSERT INTO `sys_log` VALUES ('bd6d7d720b9dd803f8ad26e2d40870f3', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-04-10 11:04:06', null, null); +INSERT INTO `sys_log` VALUES ('ff3f7dbda20cd2734b1238fa5ba17fcf', '1', '用户名: 管理员,退出成功!', null, 'admin', '管理员', '127.0.0.1', null, null, null, null, null, 'admin', '2019-04-10 11:26:43', null, null); +INSERT INTO `sys_log` VALUES ('672b527c49dc349689288ebf2c43ed4d', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-04-10 11:26:47', null, null); +INSERT INTO `sys_log` VALUES ('21510ebaa4eca640852420ed6f6cbe01', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-04-10 11:41:26', null, null); +INSERT INTO `sys_log` VALUES ('3e2574b7b723fbc9c712b8e200ea0c84', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-04-10 14:24:34', null, null); +INSERT INTO `sys_log` VALUES ('0d4582c6b7719b0bfc0260939d97274f', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-04-10 21:48:47', null, null); +INSERT INTO `sys_log` VALUES ('3e64011b4bea7cdb76953bfbf57135ce', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-04-10 23:09:32', null, null); +INSERT INTO `sys_log` VALUES ('a83e37b55a07fe48272b0005a193dee6', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-04-11 09:17:59', null, null); +INSERT INTO `sys_log` VALUES ('30ec2dc50347240f131c1004ee9b3a40', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-04-11 10:19:05', null, null); +INSERT INTO `sys_log` VALUES ('7ce1934fb542a406e92867aec5b7254d', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-04-11 14:53:23', null, null); +INSERT INTO `sys_log` VALUES ('5ee6d5fe1e6adcc4ad441b230fae802d', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-04-11 15:56:33', null, null); +INSERT INTO `sys_log` VALUES ('d4ef00700436645680657f72445d38db', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-04-11 18:05:29', null, null); +INSERT INTO `sys_log` VALUES ('aa49341b29865b45588ad2f9b89c47ea', '1', '用户名: 管理员,退出成功!', null, 'admin', '管理员', '127.0.0.1', null, null, null, null, null, 'admin', '2019-04-11 19:42:42', null, null); +INSERT INTO `sys_log` VALUES ('d3b54be0510db6a6da27bf30becb5335', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-04-11 19:42:46', null, null); +INSERT INTO `sys_log` VALUES ('dd4e1ab492e59719173d8ae0f5dbc9a2', '1', '用户名: 管理员,退出成功!', null, 'admin', '管理员', '127.0.0.1', null, null, null, null, null, 'admin', '2019-04-11 19:47:12', null, null); +INSERT INTO `sys_log` VALUES ('056dd4466f4ed51de26c535fd9864828', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-04-11 19:47:15', null, null); +INSERT INTO `sys_log` VALUES ('89bfd8b9d6fa57a8e7017a2345ec1534', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-04-12 09:27:32', null, null); +INSERT INTO `sys_log` VALUES ('51aeabed335ab4e238640a4d17dd51a3', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-04-12 10:12:41', null, null); +INSERT INTO `sys_log` VALUES ('85780936e962607ee10ce7b6b4838d66', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-04-12 10:43:38', null, null); +INSERT INTO `sys_log` VALUES ('7efea1a687e28610a7ccdfc04b27c66a', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-04-12 12:10:02', null, null); +INSERT INTO `sys_log` VALUES ('fd4a496c56bacd76f93f95a2836965c8', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-04-12 18:35:11', null, null); +INSERT INTO `sys_log` VALUES ('973b3d25b4defcac4fe8c62bd0b7dd8e', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-04-12 19:01:30', null, null); +INSERT INTO `sys_log` VALUES ('26be99abd7a62d27c751675df196b011', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-04-12 20:50:55', null, null); +INSERT INTO `sys_log` VALUES ('9c1148d0c35f9ae2d77ccddee84f6761', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-04-12 22:35:43', null, null); +INSERT INTO `sys_log` VALUES ('2d02b1f2e72203070b0e5e34ae6a39b2', '1', '用户名: admin,登录成功!', null, null, null, '127.0.0.1', null, null, null, null, null, 'jeecg-boot', '2019-04-14 15:21:25', null, null); +INSERT INTO `sys_log` VALUES ('dcbee150c5158457b8bb696e5a74aa89', '1', '用户名: 管理员,退出成功!', null, 'admin', '管理员', '127.0.0.1', null, null, null, null, null, 'admin', '2019-04-14 15:22:25', 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(100) default NULL COMMENT '菜单标题', + `url` varchar(255) default NULL COMMENT '路径', + `component` varchar(255) default NULL COMMENT '组件', + `component_name` varchar(100) 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` tinyint(1) default NULL COMMENT '聚合子路由: 1是0否', + `icon` varchar(100) default NULL COMMENT '菜单图标', + `is_route` tinyint(1) default '1' COMMENT '是否路由菜单: 0:不是 1:是(默认值1)', + `is_leaf` tinyint(1) default NULL COMMENT '是否叶子节点: 1:是 0:不是', + `hidden` int(2) default '0' COMMENT '是否隐藏路由: 0否,1是', + `description` varchar(255) 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 '更新时间', + `del_flag` int(1) default '0' COMMENT '删除状态 0正常 1已删除', + PRIMARY KEY (`id`), + KEY `index_prem_pid` USING BTREE (`parent_id`), + KEY `index_prem_is_route` USING BTREE (`is_route`), + KEY `index_prem_is_leaf` USING BTREE (`is_leaf`), + KEY `index_prem_sort_no` USING BTREE (`sort_no`), + KEY `index_prem_del_flag` USING BTREE (`del_flag`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='菜单权限表'; + +-- ---------------------------- +-- Records of sys_permission +-- ---------------------------- +INSERT INTO `sys_permission` VALUES ('00a2a0ae65cdca5e93209cdbde97cbe6', '2e42e3835c2b44ec9f7bc26c146ee531', '成功', '/result/success', 'result/Success', null, null, '1', null, '1.00', null, null, '1', '1', null, null, null, '2018-12-25 20:34:38', null, null, '0'); +INSERT INTO `sys_permission` VALUES ('020b06793e4de2eee0007f603000c769', 'f0675b52d89100ee88472b6800754a08', 'ViserChartDemo', '/report/ViserChartDemo', 'jeecg/report/ViserChartDemo', null, null, '1', null, '0.00', '0', null, '1', '1', '0', null, 'admin', '2019-04-03 19:08:53', 'admin', '2019-04-12 10:54:29', '0'); +INSERT INTO `sys_permission` VALUES ('024f1fd1283dc632458976463d8984e1', '700b7f95165c46cc7a78bf227aa8fed3', 'Tomcat信息', '/monitor/TomcatInfo', 'monitor/TomcatInfo', null, null, '1', null, '4.00', '0', null, '1', '1', '0', null, 'admin', '2019-04-02 09:44:29', 'admin', '2019-04-02 11:36:25', '0'); +INSERT INTO `sys_permission` VALUES ('05b3c82ddb2536a4a5ee1a4c46b5abef', '540a2936940846cb98114ffb0d145cb8', '用户列表', '/list/user-list', 'list/UserList', null, null, '1', null, '3.00', null, null, '1', '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, null, '1', null, '1.00', '0', null, '1', '1', '0', null, 'admin', '2019-02-12 14:00:34', 'admin', '2019-02-12 14:17:54', '0'); +INSERT INTO `sys_permission` VALUES ('08e6b9dc3c04489c8e1ff2ce6f105aa4', '', '系统监控', '/dashboard3', 'layouts/RouteView', null, null, '0', null, '6.00', '0', 'dashboard', '1', '0', '0', null, null, '2018-12-25 20:34:38', 'admin', '2019-03-31 22:19:58', '0'); +INSERT INTO `sys_permission` VALUES ('109c78a583d4693ce2f16551b7786786', 'e41b69c57a941a3bbcce45032fe57605', 'Online报表配置', '/online/cgreport', 'modules/online/cgreport/OnlCgreportHeadList', null, null, '1', null, '2.00', '0', null, '1', '1', '0', null, 'admin', '2019-03-08 10:51:07', 'admin', '2019-03-30 19:04:28', '0'); +INSERT INTO `sys_permission` VALUES ('13212d3416eb690c2e1d5033166ff47a', '2e42e3835c2b44ec9f7bc26c146ee531', '失败', '/result/fail', 'result/Error', null, null, '1', null, '2.00', null, null, '1', '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, null, '1', 'BaseSettings', null, '0', null, '1', '1', '1', null, null, '2018-12-26 18:58:35', 'admin', '2019-03-20 12:57:31', '0'); +INSERT INTO `sys_permission` VALUES ('200006f0edf145a2b50eacca07585451', 'fb07ca05a3e13674dbf6d3245956da2e', '搜索列表(应用)', '/list/search/application', 'list/TableList', null, null, '1', null, '1.00', '0', null, '1', '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, null, '1', null, '1.00', '0', null, '1', '0', '0', null, null, '2018-12-25 20:34:38', 'admin', '2019-02-26 17:02:08', '0'); +INSERT INTO `sys_permission` VALUES ('2a470fc0c3954d9dbb61de6d80846549', '', '常见案例', '/jeecg', 'layouts/RouteView', null, null, '0', null, '7.00', '0', 'qrcode', '1', '0', '0', null, null, '2018-12-25 20:34:38', 'admin', '2019-04-02 11:46:42', '0'); +INSERT INTO `sys_permission` VALUES ('2aeddae571695cd6380f6d6d334d6e7d', 'f0675b52d89100ee88472b6800754a08', '布局统计报表', '/report/ArchivesStatisticst', 'jeecg/report/ArchivesStatisticst', null, null, '1', null, '1.00', '0', null, '1', '1', '0', null, 'admin', '2019-04-03 18:32:48', null, null, '0'); +INSERT INTO `sys_permission` VALUES ('2dbbafa22cda07fa5d169d741b81fe12', '08e6b9dc3c04489c8e1ff2ce6f105aa4', '在线文档', '{{ window._CONFIG[\'domianURL\'] }}/swagger-ui.html#/', 'layouts/IframePageView', null, null, '1', null, '3.00', '0', null, '1', '1', '0', null, 'admin', '2019-01-30 10:00:01', 'admin', '2019-03-23 19:44:43', '0'); +INSERT INTO `sys_permission` VALUES ('2e42e3835c2b44ec9f7bc26c146ee531', '', '结果页', '/result', 'layouts/PageView', null, null, '0', null, '8.00', '0', 'check-circle-o', '1', '0', '0', null, null, '2018-12-25 20:34:38', 'admin', '2019-04-02 11:46:56', '0'); +INSERT INTO `sys_permission` VALUES ('339329ed54cf255e1f9392e84f136901', '2a470fc0c3954d9dbb61de6d80846549', 'helloworld', '/jeecg/helloworld', 'jeecg/helloworld', null, null, '1', null, '4.00', '0', null, '1', '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, null, '1', null, '1.00', '0', null, '1', '0', '0', null, null, '2018-12-25 20:34:38', 'admin', '2019-03-16 11:20:33', '0'); +INSERT INTO `sys_permission` VALUES ('4148ec82b6acd69f470bea75fe41c357', '2a470fc0c3954d9dbb61de6d80846549', '单表模型示例', '/jeecg/jeecgDemoList', 'jeecg/JeecgDemoList', 'DemoList', null, '1', null, '1.00', '0', null, '1', '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, null, '1', null, '1.00', null, null, '1', '1', null, null, null, '2018-12-25 20:34:38', null, null, '0'); +INSERT INTO `sys_permission` VALUES ('4356a1a67b564f0988a484f5531fd4d9', '2a470fc0c3954d9dbb61de6d80846549', '内嵌Table', '/jeecg/TableExpandeSub', 'jeecg/TableExpandeSub', null, null, '1', null, '1.00', '0', null, '1', '1', '0', null, 'admin', '2019-04-04 22:48:13', null, null, '0'); +INSERT INTO `sys_permission` VALUES ('45c966826eeff4c99b8f8ebfe74511fc', 'd7d6e2e4e2934f2c9385a623fd98c6f3', '部门管理', '/isystem/depart', 'system/DepartList', null, null, '1', null, '1.00', '0', null, '1', '1', '0', null, 'admin', '2019-01-29 18:47:40', 'admin', '2019-03-07 19:23:16', '0'); +INSERT INTO `sys_permission` VALUES ('4875ebe289344e14844d8e3ea1edd73f', '', '详情页', '/profile', 'layouts/RouteView', null, null, '0', null, '8.00', '0', 'profile', '1', '0', '0', null, null, '2018-12-25 20:34:38', 'admin', '2019-04-02 11:46:48', '0'); +INSERT INTO `sys_permission` VALUES ('4f66409ef3bbd69c1d80469d6e2a885e', '6e73eb3c26099c191bf03852ee1310a1', '账户绑定', '/account/settings/binding', 'account/settings/Binding', null, null, '1', 'BindingSettings', null, null, null, '1', '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, null, '1', null, '4.00', null, null, '1', '1', null, null, null, '2018-12-25 20:34:38', null, null, '0'); +INSERT INTO `sys_permission` VALUES ('540a2936940846cb98114ffb0d145cb8', '', '列表页', '/list', 'layouts/PageView', null, '/list/query-list', '0', null, '9.00', '0', 'table', '1', '0', '0', null, null, '2018-12-25 20:34:38', 'admin', '2019-03-31 22:20:20', '0'); +INSERT INTO `sys_permission` VALUES ('54dd5457a3190740005c1bfec55b1c34', 'd7d6e2e4e2934f2c9385a623fd98c6f3', '菜单管理', '/isystem/permission', 'system/PermissionList', null, null, '1', null, '3.00', null, null, '1', '1', null, null, null, '2018-12-25 20:34:38', null, null, '0'); +INSERT INTO `sys_permission` VALUES ('58857ff846e61794c69208e9d3a85466', '08e6b9dc3c04489c8e1ff2ce6f105aa4', '日志管理', '/isystem/log', 'system/LogList', null, null, '1', null, '1.00', '0', '', '1', '1', '0', null, null, '2018-12-26 10:11:18', 'admin', '2019-04-02 11:38:17', '0'); +INSERT INTO `sys_permission` VALUES ('5c8042bd6c601270b2bbd9b20bccc68b', '', '消息中心', '/message', 'layouts/RouteView', null, null, '0', null, '6.00', '0', 'message', '1', '0', '0', null, 'admin', '2019-04-09 11:05:04', 'admin', '2019-04-11 19:47:54', '0'); +INSERT INTO `sys_permission` VALUES ('6531cf3421b1265aeeeabaab5e176e6d', 'e3c13679c73a4f829bcff2aba8fd68b1', '分步表单', '/form/step-form', 'form/stepForm/StepForm', null, null, '1', null, '2.00', null, null, '1', '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, null, '1', null, '1.00', null, null, '1', '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, null, '1', null, '2.00', '0', null, '1', '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, null, '1', null, '2.00', '1', null, '1', '0', null, null, null, '2018-12-25 20:34:38', null, '2018-12-26 19:05:26', '0'); +INSERT INTO `sys_permission` VALUES ('700b7f95165c46cc7a78bf227aa8fed3', '08e6b9dc3c04489c8e1ff2ce6f105aa4', '性能监控', '/monitor', 'layouts/RouteView', null, null, '1', null, '0.00', '0', null, '1', '0', '0', null, 'admin', '2019-04-02 11:34:34', 'admin', '2019-04-14 15:21:54', '0'); +INSERT INTO `sys_permission` VALUES ('717f6bee46f44a3897eca9abd6e2ec44', null, '个人页', '/account', 'layouts/RouteView', null, null, '0', null, '9.00', '0', 'user', '1', '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, null, '1', null, '5.00', null, null, '1', '1', null, null, null, '2018-12-25 20:34:38', null, null, '0'); +INSERT INTO `sys_permission` VALUES ('7593c9e3523a17bca83b8d7fe8a34e58', '3f915b2769fc80648e92d04e84ca059d', '添加用户按钮', '', null, null, null, '2', 'user:add', '1.00', '0', null, '1', '1', '0', null, 'admin', '2019-03-16 11:20:33', 'admin', '2019-03-16 11:54:15', '0'); +INSERT INTO `sys_permission` VALUES ('7960961b0063228937da5fa8dd73d371', '2a470fc0c3954d9dbb61de6d80846549', 'JEditableTable示例', '/jeecg/JEditableTable', 'jeecg/JeecgEditableTableExample', null, null, '1', null, '7.00', '0', null, '1', '1', '0', null, 'admin', '2019-03-22 15:22:18', null, null, '0'); +INSERT INTO `sys_permission` VALUES ('7ac9eb9ccbde2f7a033cd4944272bf1e', '540a2936940846cb98114ffb0d145cb8', '卡片列表', '/list/card', 'list/CardList', null, null, '1', null, '7.00', null, null, '1', '1', null, null, null, '2018-12-25 20:34:38', null, null, '0'); +INSERT INTO `sys_permission` VALUES ('841057b8a1bef8f6b4b20f9a618a7fa6', '08e6b9dc3c04489c8e1ff2ce6f105aa4', '数据日志', '/sys/dataLog-list', 'system/DataLogList', null, null, '1', null, '1.00', '0', null, '1', '1', '0', null, 'admin', '2019-03-11 19:26:49', 'admin', '2019-03-12 11:40:47', '0'); +INSERT INTO `sys_permission` VALUES ('882a73768cfd7f78f3a37584f7299656', '6e73eb3c26099c191bf03852ee1310a1', '个性化设置', '/account/settings/custom', 'account/settings/Custom', null, null, '1', 'CustomSettings', null, null, null, '1', '1', null, null, null, '2018-12-26 19:00:46', null, '2018-12-26 21:13:25', '0'); +INSERT INTO `sys_permission` VALUES ('8b3bff2eee6f1939147f5c68292a1642', '700b7f95165c46cc7a78bf227aa8fed3', '服务器信息', '/monitor/SystemInfo', 'monitor/SystemInfo', null, null, '1', null, '4.00', '0', null, '1', '1', '0', null, 'admin', '2019-04-02 11:39:19', 'admin', '2019-04-02 15:40:02', '0'); +INSERT INTO `sys_permission` VALUES ('8d1ebd663688965f1fd86a2f0ead3416', '700b7f95165c46cc7a78bf227aa8fed3', 'Redis监控', '/monitor/redis/info', 'monitor/RedisInfo', null, null, '1', null, '1.00', '0', null, '1', '1', '0', null, 'admin', '2019-04-02 13:11:33', 'admin', '2019-04-02 13:24:43', '0'); +INSERT INTO `sys_permission` VALUES ('8fb8172747a78756c11916216b8b8066', '717f6bee46f44a3897eca9abd6e2ec44', '工作台', '/dashboard/workplace', 'dashboard/Workplace', null, null, '1', null, '3.00', '0', null, '1', '1', '0', null, null, '2018-12-25 20:34:38', 'admin', '2019-04-02 11:45:02', '0'); +INSERT INTO `sys_permission` VALUES ('944abf0a8fc22fe1f1154a389a574154', '5c8042bd6c601270b2bbd9b20bccc68b', '消息管理', '/modules/message/sysMessageList', 'modules/message/SysMessageList', null, null, '1', null, '1.00', '0', null, '1', '1', '0', null, 'admin', '2019-04-09 11:27:53', 'admin', '2019-04-09 19:31:23', '0'); +INSERT INTO `sys_permission` VALUES ('9502685863ab87f0ad1134142788a385', '', '首页', '/dashboard/analysis', 'dashboard/Analysis', null, null, '0', null, '0.00', '0', 'home', '1', '1', '0', null, null, '2018-12-25 20:34:38', 'admin', '2019-03-29 11:04:13', '0'); +INSERT INTO `sys_permission` VALUES ('9a90363f216a6a08f32eecb3f0bf12a3', '2a470fc0c3954d9dbb61de6d80846549', '常用选择组件', '/jeecg/SelectDemo', 'jeecg/SelectDemo', null, null, '1', null, '1.00', '0', null, '1', '1', '0', null, 'admin', '2019-03-19 11:19:05', 'admin', '2019-04-10 15:36:50', '0'); +INSERT INTO `sys_permission` VALUES ('9cb91b8851db0cf7b19d7ecc2a8193dd', '1939e035e803a99ceecb6f5563570fb2', '我的任务表单', '/modules/bpm/task/form/FormModule', 'modules/bpm/task/form/FormModule', null, null, '1', null, '1.00', '0', null, '1', '1', '0', null, 'admin', '2019-03-08 16:49:05', 'admin', '2019-03-08 18:37:56', '0'); +INSERT INTO `sys_permission` VALUES ('9fe26464838de2ea5e90f2367e35efa0', 'e41b69c57a941a3bbcce45032fe57605', 'AUTO在线报表', '/online/cgreport/:code', 'modules/online/cgreport/auto/OnlCgreportAutoList', 'onlineAutoList', null, '1', null, '6.00', '0', null, '1', '1', '0', null, 'admin', '2019-03-12 11:06:48', 'admin', '2019-04-11 19:52:38', '0'); +INSERT INTO `sys_permission` VALUES ('a400e4f4d54f79bf5ce160ae432231af', '2a470fc0c3954d9dbb61de6d80846549', '百度', 'http://www.baidu.com', 'layouts/IframePageView', null, null, '1', null, '4.00', '0', null, '1', '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, null, '1', null, '2.00', null, null, '1', '1', null, null, null, '2018-12-25 20:34:38', null, null, '0'); +INSERT INTO `sys_permission` VALUES ('aedbf679b5773c1f25e9f7b10111da73', '08e6b9dc3c04489c8e1ff2ce6f105aa4', 'SQL监控', '{{ window._CONFIG[\'domianURL\'] }}/druid/', 'layouts/IframePageView', null, null, '1', null, '1.00', '0', null, '1', '1', '0', null, 'admin', '2019-01-30 09:43:22', 'admin', '2019-03-23 19:00:46', '0'); +INSERT INTO `sys_permission` VALUES ('b1cb0a3fedf7ed0e4653cb5a229837ee', '08e6b9dc3c04489c8e1ff2ce6f105aa4', '定时任务', '/isystem/QuartzJobList', 'system/QuartzJobList', null, null, '1', null, '3.00', '0', null, '1', '1', '0', null, null, '2019-01-03 09:38:52', 'admin', '2019-04-02 10:24:13', '0'); +INSERT INTO `sys_permission` VALUES ('b3c824fc22bd953e2eb16ae6914ac8f9', '4875ebe289344e14844d8e3ea1edd73f', '高级详情页', '/profile/advanced', 'profile/advanced/Advanced', null, null, '1', null, '2.00', null, null, '1', '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, null, '1', null, '3.00', null, null, '1', '1', null, null, null, '2018-12-25 20:34:38', null, null, '0'); +INSERT INTO `sys_permission` VALUES ('c431130c0bc0ec71b0a5be37747bb36a', '2a470fc0c3954d9dbb61de6d80846549', '一对多JEditable', '/jeecg/JeecgOrderMainListForJEditableTable', 'jeecg/JeecgOrderMainListForJEditableTable', null, null, '1', null, '3.00', '0', null, '1', '1', '0', null, 'admin', '2019-03-29 10:51:59', 'admin', '2019-04-04 20:09:39', '0'); +INSERT INTO `sys_permission` VALUES ('c65321e57b7949b7a975313220de0422', null, '异常页', '/exception', 'layouts/RouteView', null, null, '0', null, '8.00', null, 'warning', '1', '0', null, null, null, '2018-12-25 20:34:38', null, null, '0'); +INSERT INTO `sys_permission` VALUES ('c6cf95444d80435eb37b2f9db3971ae6', '2a470fc0c3954d9dbb61de6d80846549', '数据回执模拟', '/jeecg/InterfaceTest', 'jeecg/InterfaceTest', null, null, '1', null, '6.00', '0', null, '1', '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, null, '1', null, '1.00', null, null, '1', '1', null, null, null, '2018-12-25 20:34:38', null, null, '0'); +INSERT INTO `sys_permission` VALUES ('d07a2c87a451434c99ab06296727ec4f', '700b7f95165c46cc7a78bf227aa8fed3', 'JVM信息', '/monitor/JvmInfo', 'monitor/JvmInfo', null, null, '1', null, '4.00', '0', null, '1', '1', '0', null, 'admin', '2019-04-01 23:07:48', 'admin', '2019-04-02 11:37:16', '0'); +INSERT INTO `sys_permission` VALUES ('d2bbf9ebca5a8fa2e227af97d2da7548', 'c65321e57b7949b7a975313220de0422', '404', '/exception/404', 'exception/404', null, null, '1', null, '2.00', null, null, '1', '1', null, null, null, '2018-12-25 20:34:38', null, null, '0'); +INSERT INTO `sys_permission` VALUES ('d7d6e2e4e2934f2c9385a623fd98c6f3', '', '系统管理', '/isystem', 'layouts/RouteView', null, null, '1', null, '4.00', '0', 'setting', '1', '0', '0', null, null, '2018-12-25 20:34:38', 'admin', '2019-03-31 22:19:52', '0'); +INSERT INTO `sys_permission` VALUES ('d86f58e7ab516d3bc6bfb1fe10585f97', '717f6bee46f44a3897eca9abd6e2ec44', '个人中心', '/account/center', 'account/center/Index', null, null, '1', null, '1.00', null, null, '1', '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, null, '1', null, '1.00', '0', null, '1', '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, null, '1', 'annountCement', '6.00', null, '', '1', '1', null, null, null, '2019-01-02 17:23:01', null, '2019-01-02 17:31:23', '0'); +INSERT INTO `sys_permission` VALUES ('e3c13679c73a4f829bcff2aba8fd68b1', '', '表单页', '/form', 'layouts/PageView', null, null, '0', null, '9.00', '0', 'form', '1', '0', '0', null, null, '2018-12-25 20:34:38', 'admin', '2019-03-31 22:20:14', '0'); +INSERT INTO `sys_permission` VALUES ('e41b69c57a941a3bbcce45032fe57605', '', '在线开发', '/online', 'layouts/RouteView', null, null, '0', null, '5.00', '0', 'cloud', '1', '0', '0', null, 'admin', '2019-03-08 10:43:10', 'admin', '2019-03-31 22:20:35', '0'); +INSERT INTO `sys_permission` VALUES ('e5973686ed495c379d829ea8b2881fc6', 'e3c13679c73a4f829bcff2aba8fd68b1', '高级表单', '/form/advanced-form', 'form/advancedForm/AdvancedForm', null, null, '1', null, '3.00', null, null, '1', '1', null, null, null, '2018-12-25 20:34:38', null, null, '0'); +INSERT INTO `sys_permission` VALUES ('e6bfd1fcabfd7942fdd05f076d1dad38', '2a470fc0c3954d9dbb61de6d80846549', '打印测试', '/jeecg/PrintDemo', 'jeecg/PrintDemoList', null, null, '1', null, '3.00', '0', null, '1', '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, null, '1', null, '2.00', null, null, '1', '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, null, '1', 'SecuritySettings', null, null, null, '1', '1', null, null, null, '2018-12-26 18:59:52', null, null, '0'); +INSERT INTO `sys_permission` VALUES ('f0675b52d89100ee88472b6800754a08', '', '统计报表', '/report', 'layouts/RouteView', null, null, '0', null, '7.00', '0', 'bar-chart', '1', '0', '0', null, 'admin', '2019-04-03 18:32:02', 'admin', '2019-04-11 19:48:39', '0'); +INSERT INTO `sys_permission` VALUES ('f1cb187abf927c88b89470d08615f5ac', 'd7d6e2e4e2934f2c9385a623fd98c6f3', '数据字典', '/isystem/dict', 'system/DictList', null, null, '1', null, '5.00', null, null, '1', '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, null, '1', null, '6.00', null, null, '1', '1', null, null, null, '2018-12-25 20:34:38', null, null, '0'); +INSERT INTO `sys_permission` VALUES ('f780d0d3083d849ccbdb1b1baee4911d', '5c8042bd6c601270b2bbd9b20bccc68b', '模板管理', '/modules/message/sysMessageTemplateList', 'modules/message/SysMessageTemplateList', null, null, '1', null, '1.00', '0', null, '1', '1', '0', null, 'admin', '2019-04-09 11:50:31', 'admin', '2019-04-12 10:16:34', '0'); +INSERT INTO `sys_permission` VALUES ('fb07ca05a3e13674dbf6d3245956da2e', '540a2936940846cb98114ffb0d145cb8', '搜索列表', '/list/search', 'list/search/SearchLayout', null, '/list/search/article', '1', null, '8.00', '0', null, '1', '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, null, '1', null, '2.00', '0', null, '1', '1', '0', null, 'admin', '2019-02-15 16:24:11', 'admin', '2019-02-18 10:50:14', '0'); +INSERT INTO `sys_permission` VALUES ('fc810a2267dd183e4ef7c71cc60f4670', '700b7f95165c46cc7a78bf227aa8fed3', '请求追踪', '/monitor/HttpTrace', 'monitor/HttpTrace', null, null, '1', null, '4.00', '0', null, '1', '1', '0', null, 'admin', '2019-04-02 09:46:19', 'admin', '2019-04-02 11:37:27', '0'); +INSERT INTO `sys_permission` VALUES ('fedfbf4420536cacc0218557d263dfea', '6e73eb3c26099c191bf03852ee1310a1', '新消息通知', '/account/settings/notification', 'account/settings/Notification', null, null, '1', 'NotificationSettings', null, null, '', '1', '1', null, null, null, '2018-12-26 19:02:05', null, null, '0'); + +-- ---------------------------- +-- Table structure for sys_permission_data_rule +-- ---------------------------- +DROP TABLE IF EXISTS `sys_permission_data_rule`; +CREATE TABLE `sys_permission_data_rule` ( + `id` varchar(32) NOT NULL COMMENT 'ID', + `permission_id` varchar(32) default NULL COMMENT '菜单ID', + `rule_name` varchar(50) default NULL COMMENT '规则名称', + `rule_column` varchar(50) default NULL COMMENT '字段', + `rule_conditions` varchar(50) default NULL COMMENT '条件', + `rule_value` varchar(300) default NULL COMMENT '规则值', + `create_time` datetime default NULL COMMENT '创建时间', + `create_by` varchar(32) default NULL, + `update_time` datetime default NULL COMMENT '修改时间', + `update_by` varchar(32) default NULL COMMENT '修改人', + PRIMARY KEY (`id`), + KEY `index_fucntionid` USING BTREE (`permission_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- ---------------------------- +-- Records of sys_permission_data_rule +-- ---------------------------- +INSERT INTO `sys_permission_data_rule` VALUES ('40283181614231d401614234fe670003', '40283181614231d401614232cd1c0001', 'createBy', 'createBy', '=', '#{sys_user_code}', '2018-01-29 21:57:04', 'admin', null, null); +INSERT INTO `sys_permission_data_rule` VALUES ('4028318161424e730161424fca6f0004', '4028318161424e730161424f61510002', 'createBy', 'createBy', '=', '#{sys_user_code}', '2018-01-29 22:26:20', 'admin', null, null); +INSERT INTO `sys_permission_data_rule` VALUES ('402880e6487e661a01487e732c020005', '402889fb486e848101486e93a7c80014', 'SYS_ORG_CODE', 'SYS_ORG_CODE', 'LIKE', '010201%', '2014-09-16 20:32:30', 'admin', null, null); +INSERT INTO `sys_permission_data_rule` VALUES ('402880e6487e661a01487e8153ee0007', '402889fb486e848101486e93a7c80014', 'create_by', 'create_by', '', '#{SYS_USER_CODE}', '2014-09-16 20:47:57', 'admin', null, null); +INSERT INTO `sys_permission_data_rule` VALUES ('402880ec5ddec439015ddf9225060038', '40288088481d019401481d2fcebf000d', '复杂关系', '', 'USE_SQL_RULES', 'name like \'%张%\' or age > 10', null, null, '2017-08-14 15:10:25', 'demo'); +INSERT INTO `sys_permission_data_rule` VALUES ('402880ec5ddfdd26015ddfe3e0570011', '4028ab775dca0d1b015dca3fccb60016', '复杂sql配置', '', 'USE_SQL_RULES', 'table_name like \'%test%\' or is_tree = \'Y\'', null, null, '2017-08-14 16:38:55', 'demo'); +INSERT INTO `sys_permission_data_rule` VALUES ('402880f25b1e2ac7015b1e5fdebc0012', '402880f25b1e2ac7015b1e5cdc340010', '只能看自己数据', 'create_by', '=', '#{sys_user_code}', '2017-03-30 16:40:51', 'admin', null, null); +INSERT INTO `sys_permission_data_rule` VALUES ('402881875b19f141015b19f8125e0014', '40288088481d019401481d2fcebf000d', '可看下属业务数据', 'sys_org_code', 'LIKE', '#{sys_org_code}', null, null, '2017-08-14 15:04:32', 'demo'); +INSERT INTO `sys_permission_data_rule` VALUES ('402881e45394d66901539500a4450001', '402881e54df73c73014df75ab670000f', 'sysCompanyCode', 'sysCompanyCode', '=', '#{SYS_COMPANY_CODE}', '2016-03-21 01:09:21', 'admin', null, null); +INSERT INTO `sys_permission_data_rule` VALUES ('402881e45394d6690153950177cb0003', '402881e54df73c73014df75ab670000f', 'sysOrgCode', 'sysOrgCode', '=', '#{SYS_ORG_CODE}', '2016-03-21 01:10:15', 'admin', null, null); +INSERT INTO `sys_permission_data_rule` VALUES ('402881e56266f43101626727aff60067', '402881e56266f43101626724eb730065', '销售自己看自己的数据', 'createBy', '=', '#{sys_user_code}', '2018-03-27 19:11:16', 'admin', null, null); +INSERT INTO `sys_permission_data_rule` VALUES ('402881e56266f4310162672fb1a70082', '402881e56266f43101626724eb730065', '销售经理看所有下级数据', 'sysOrgCode', 'LIKE', '#{sys_org_code}', '2018-03-27 19:20:01', 'admin', null, null); +INSERT INTO `sys_permission_data_rule` VALUES ('402881e56266f431016267387c9f0088', '402881e56266f43101626724eb730065', '只看金额大于1000的数据', 'money', '>=', '1000', '2018-03-27 19:29:37', 'admin', null, null); +INSERT INTO `sys_permission_data_rule` VALUES ('402881f3650de25101650dfb5a3a0010', '402881e56266f4310162671d62050044', '22', '', 'USE_SQL_RULES', '22', '2018-08-06 14:45:01', 'admin', null, null); +INSERT INTO `sys_permission_data_rule` VALUES ('402889fb486e848101486e913cd6000b', '402889fb486e848101486e8e2e8b0007', 'userName', 'userName', '=', 'admin', '2014-09-13 18:31:25', 'admin', null, null); +INSERT INTO `sys_permission_data_rule` VALUES ('402889fb486e848101486e98d20d0016', '402889fb486e848101486e93a7c80014', 'title', 'title', '=', '12', null, null, '2014-09-13 22:18:22', 'scott'); +INSERT INTO `sys_permission_data_rule` VALUES ('402889fe47fcb29c0147fcb6b6220001', '8a8ab0b246dc81120146dc8180fe002b', '12', '12', '>', '12', '2014-08-22 15:55:38', '8a8ab0b246dc81120146dc8181950052', null, null); +INSERT INTO `sys_permission_data_rule` VALUES ('4028ab775dca0d1b015dca4183530018', '4028ab775dca0d1b015dca3fccb60016', '表名限制', 'isDbSynch', '=', 'Y', null, null, '2017-08-14 16:43:45', 'demo'); +INSERT INTO `sys_permission_data_rule` VALUES ('4028ef815595a881015595b0ccb60001', '40288088481d019401481d2fcebf000d', '限只能看自己', 'create_by', '=', '#{sys_user_code}', null, null, '2017-08-14 15:03:56', 'demo'); +INSERT INTO `sys_permission_data_rule` VALUES ('4028ef81574ae99701574aed26530005', '4028ef81574ae99701574aeb97bd0003', '用户名', 'userName', '!=', 'admin', '2016-09-21 12:07:18', 'admin', null, null); +INSERT INTO `sys_permission_data_rule` VALUES ('f852d85d47f224990147f2284c0c0005', null, '小于', 'test', '<=', '11', '2014-08-20 14:43:52', '8a8ab0b246dc81120146dc8181950052', null, null); + +-- ---------------------------- +-- Table structure for sys_quartz_job +-- ---------------------------- +DROP TABLE IF EXISTS `sys_quartz_job`; +CREATE TABLE `sys_quartz_job` ( + `id` varchar(32) NOT NULL, + `create_by` varchar(32) default NULL COMMENT '创建人', + `create_time` datetime default NULL COMMENT '创建时间', + `del_flag` int(1) default NULL COMMENT '删除状态', + `update_by` varchar(32) 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(1) 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 ('a253cdfc811d69fa0efc70d052bc8128', 'admin', '2019-03-30 12:44:48', '0', 'admin', '2019-03-30 12:44:52', 'org.jeecg.modules.quartz.job.SampleJob', '0/1 * * * * ?', null, null, '-1'); +INSERT INTO `sys_quartz_job` VALUES ('5b3d2c087ad41aa755fc4f89697b01e7', 'admin', '2019-04-11 19:04:21', '0', 'admin', '2019-04-11 19:49:49', 'org.jeecg.modules.message.job.SendMsgJob', '0/60 * * * * ?', null, null, '0'); + +-- ---------------------------- +-- 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(200) default NULL COMMENT '角色名称', + `role_code` varchar(100) default NULL COMMENT '角色编码', + `description` varchar(255) 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`), + UNIQUE KEY `index_role_code` USING BTREE (`role_code`) +) 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-03-17 18:30:41'); +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', + `data_rule_ids` varchar(1000) default NULL, + PRIMARY KEY (`id`), + KEY `index_group_role_per_id` USING BTREE (`role_id`,`permission_id`), + KEY `index_group_role_id` USING BTREE (`role_id`), + KEY `index_group_per_id` USING BTREE (`permission_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='角色权限表'; + +-- ---------------------------- +-- Records of sys_role_permission +-- ---------------------------- +INSERT INTO `sys_role_permission` VALUES ('00b0748f04d3ea52c8cfa179c1c9d384', '52b0cf022ac4187b2a70dfa4f8b2d940', 'd7d6e2e4e2934f2c9385a623fd98c6f3', null); +INSERT INTO `sys_role_permission` VALUES ('01221378db3443dbddaa494597fb10e3', 'f6817f48af4fb3af11b9e8bf182f618b', '024f1fd1283dc632458976463d8984e1', null); +INSERT INTO `sys_role_permission` VALUES ('012fe07d6c7d54306f497174ae4ff4c7', 'f6817f48af4fb3af11b9e8bf182f618b', 'f23d9bfff4d9aa6b68569ba2cff38415', null); +INSERT INTO `sys_role_permission` VALUES ('02cf2fd105e49aeb90bd2868f59659a3', 'f6817f48af4fb3af11b9e8bf182f618b', 'b3c824fc22bd953e2eb16ae6914ac8f9', null); +INSERT INTO `sys_role_permission` VALUES ('0538e66f1151b80ad45fee3ab99a83b2', 'f6817f48af4fb3af11b9e8bf182f618b', '339329ed54cf255e1f9392e84f136901', null); +INSERT INTO `sys_role_permission` VALUES ('05a6fadb2a7e774852e19650577f4431', 'f6817f48af4fb3af11b9e8bf182f618b', '8b3bff2eee6f1939147f5c68292a1642', null); +INSERT INTO `sys_role_permission` VALUES ('077f0484204f514efdf82565e8e2ad0c', 'f6817f48af4fb3af11b9e8bf182f618b', 'e3c13679c73a4f829bcff2aba8fd68b1', null); +INSERT INTO `sys_role_permission` VALUES ('0aeacc20f807204bee6cbb595602fcb5', 'f6817f48af4fb3af11b9e8bf182f618b', '2a470fc0c3954d9dbb61de6d80846549', null); +INSERT INTO `sys_role_permission` VALUES ('0be9294ad987d5f2d65738307d18a658', 'f6817f48af4fb3af11b9e8bf182f618b', '078f9558cdeab239aecb2bda1a8ed0d1', null); +INSERT INTO `sys_role_permission` VALUES ('0c76a4acf236d8e8a777c1072f63556b', 'f6817f48af4fb3af11b9e8bf182f618b', 'c431130c0bc0ec71b0a5be37747bb36a', null); +INSERT INTO `sys_role_permission` VALUES ('0d9d14bc66e9d5e99b0280095fdc8587', 'ee8626f80f7c2619917b6236f3a7f02b', '277bfabef7d76e89b33062b16a9a5020', null); +INSERT INTO `sys_role_permission` VALUES ('0dec36b68c234767cd35466efef3b941', 'ee8626f80f7c2619917b6236f3a7f02b', '54dd5457a3190740005c1bfec55b1c34', null); +INSERT INTO `sys_role_permission` VALUES ('105c2ac10741e56a618a82cd58c461d7', 'e51758fa916c881624b046d26bd09230', '1663f3faba244d16c94552f849627d84', null); +INSERT INTO `sys_role_permission` VALUES ('115a6673ae6c0816d3f60de221520274', '21c5a3187763729408b40afb0d0fdfa8', '63b551e81c5956d5c861593d366d8c57', null); +INSERT INTO `sys_role_permission` VALUES ('120693092740d63656a7dc6ddeda6dd0', 'f6817f48af4fb3af11b9e8bf182f618b', '418964ba087b90a84897b62474496b93', null); +INSERT INTO `sys_role_permission` VALUES ('145eac8dd88eddbd4ce0a800ab40a92c', 'e51758fa916c881624b046d26bd09230', '08e6b9dc3c04489c8e1ff2ce6f105aa4', null); +INSERT INTO `sys_role_permission` VALUES ('14880dc3cc885742ac91b885bd73ac7a', 'f6817f48af4fb3af11b9e8bf182f618b', '2e42e3835c2b44ec9f7bc26c146ee531', null); +INSERT INTO `sys_role_permission` VALUES ('15db74f6c965d75f4127e6bdc9d25594', 'f6817f48af4fb3af11b9e8bf182f618b', 'a4fc7b64b01a224da066bb16230f9c5a', null); +INSERT INTO `sys_role_permission` VALUES ('16ef8ed3865ccc6f6306200760896c50', 'ee8626f80f7c2619917b6236f3a7f02b', 'e8af452d8948ea49d37c934f5100ae6a', null); +INSERT INTO `sys_role_permission` VALUES ('17ead5b7d97ed365398ab20009a69ea3', '52b0cf022ac4187b2a70dfa4f8b2d940', 'e08cb190ef230d5d4f03824198773950', null); +INSERT INTO `sys_role_permission` VALUES ('1ac1688ef8456f384091a03d88a89ab1', '52b0cf022ac4187b2a70dfa4f8b2d940', '693ce69af3432bd00be13c3971a57961', null); +INSERT INTO `sys_role_permission` VALUES ('1af4babaa4227c3cbb830bc5eb513abb', 'ee8626f80f7c2619917b6236f3a7f02b', 'e08cb190ef230d5d4f03824198773950', null); +INSERT INTO `sys_role_permission` VALUES ('1ba162bbc2076c25561f8622f610d5bf', 'ee8626f80f7c2619917b6236f3a7f02b', 'aedbf679b5773c1f25e9f7b10111da73', null); +INSERT INTO `sys_role_permission` VALUES ('1bf767127ea2e467d9293d570a16605c', 'f6817f48af4fb3af11b9e8bf182f618b', 'f9d3f4f27653a71c52faa9fb8070fbe7', null); +INSERT INTO `sys_role_permission` VALUES ('1c55c4ced20765b8ebab383caa60f0b6', 'e51758fa916c881624b046d26bd09230', 'fb367426764077dcf94640c843733985', null); +INSERT INTO `sys_role_permission` VALUES ('1caf6f14df1566bd270b4ef4299d91f1', 'f6817f48af4fb3af11b9e8bf182f618b', 'fef097f3903caf3a3c3a6efa8de43fbb', null); +INSERT INTO `sys_role_permission` VALUES ('1de539a7fd0a48421d6b86a14b1985c5', 'f6817f48af4fb3af11b9e8bf182f618b', '4f66409ef3bbd69c1d80469d6e2a885e', null); +INSERT INTO `sys_role_permission` VALUES ('1e099baeae01b747d67aca06bdfc34d1', 'e51758fa916c881624b046d26bd09230', '6ad53fd1b220989a8b71ff482d683a5a', null); +INSERT INTO `sys_role_permission` VALUES ('1ec19c55dd19d898724d87ea5014dd98', 'f6817f48af4fb3af11b9e8bf182f618b', '93d5cfb4448f11e9916698e7f462b4b6', null); +INSERT INTO `sys_role_permission` VALUES ('1fe4d408b85f19618c15bcb768f0ec22', '1750a8fb3e6d90cb7957c02de1dc8e59', '9502685863ab87f0ad1134142788a385', null); +INSERT INTO `sys_role_permission` VALUES ('248d288586c6ff3bd14381565df84163', '52b0cf022ac4187b2a70dfa4f8b2d940', '3f915b2769fc80648e92d04e84ca059d', null); +INSERT INTO `sys_role_permission` VALUES ('25f5443f19c34d99718a016d5f54112e', 'ee8626f80f7c2619917b6236f3a7f02b', '6e73eb3c26099c191bf03852ee1310a1', null); +INSERT INTO `sys_role_permission` VALUES ('26368ba64b5572e3282e4eac0bbe902b', 'f6817f48af4fb3af11b9e8bf182f618b', '8d4683aacaa997ab86b966b464360338', null); +INSERT INTO `sys_role_permission` VALUES ('27489816708b18859768dfed5945c405', 'a799c3b1b12dd3ed4bd046bfaef5fe6e', '9502685863ab87f0ad1134142788a385', null); +INSERT INTO `sys_role_permission` VALUES ('296f9c75ca0e172ae5ce4c1022c996df', '646c628b2b8295fbdab2d34044de0354', '732d48f8e0abe99fe6a23d18a3171cd1', null); +INSERT INTO `sys_role_permission` VALUES ('29fb4d37aa29b9fa400f389237cf9fe7', 'ee8626f80f7c2619917b6236f3a7f02b', '05b3c82ddb2536a4a5ee1a4c46b5abef', null); +INSERT INTO `sys_role_permission` VALUES ('2a0734aa10d68c01c16f73ded008c147', 'f6817f48af4fb3af11b9e8bf182f618b', '1939e035e803a99ceecb6f5563570fb2', null); +INSERT INTO `sys_role_permission` VALUES ('2b81f6c5c5e0bd11e8a550b65548390a', 'f6817f48af4fb3af11b9e8bf182f618b', '6e73eb3c26099c191bf03852ee1310a1', null); +INSERT INTO `sys_role_permission` VALUES ('2c462293cbb0eab7e8ae0a3600361b5f', '52b0cf022ac4187b2a70dfa4f8b2d940', '9502685863ab87f0ad1134142788a385', null); +INSERT INTO `sys_role_permission` VALUES ('2dc1a0eb5e39aaa131ddd0082a492d76', 'ee8626f80f7c2619917b6236f3a7f02b', '08e6b9dc3c04489c8e1ff2ce6f105aa4', null); +INSERT INTO `sys_role_permission` VALUES ('2e067c4cd3d56c5b1906711c7ce4f44c', 'f6817f48af4fb3af11b9e8bf182f618b', 'f1cb187abf927c88b89470d08615f5ac', null); +INSERT INTO `sys_role_permission` VALUES ('2ea2382af618ba7d1e80491a0185fb8a', 'ee8626f80f7c2619917b6236f3a7f02b', 'f23d9bfff4d9aa6b68569ba2cff38415', null); +INSERT INTO `sys_role_permission` VALUES ('2fcfa2ac3dcfadc7c67107dae9a0de6d', 'ee8626f80f7c2619917b6236f3a7f02b', '73678f9daa45ed17a3674131b03432fb', null); +INSERT INTO `sys_role_permission` VALUES ('2fdaed22dfa4c8d4629e44ef81688c6a', '52b0cf022ac4187b2a70dfa4f8b2d940', 'aedbf679b5773c1f25e9f7b10111da73', null); +INSERT INTO `sys_role_permission` VALUES ('300c462b7fec09e2ff32574ef8b3f0bd', '52b0cf022ac4187b2a70dfa4f8b2d940', '2a470fc0c3954d9dbb61de6d80846549', null); +INSERT INTO `sys_role_permission` VALUES ('30312072349ea41db06ecf587d8be6e7', 'f6817f48af4fb3af11b9e8bf182f618b', 'a400e4f4d54f79bf5ce160ae432231af', null); +INSERT INTO `sys_role_permission` VALUES ('31c1e8a7a37dec06d85c4eeba90f1942', 'f6817f48af4fb3af11b9e8bf182f618b', '65a8f489f25a345836b7f44b1181197a', null); +INSERT INTO `sys_role_permission` VALUES ('3249742372a0356bb313f19c1bd6f6ee', 'f6817f48af4fb3af11b9e8bf182f618b', '7d08d3885671cf0ff1c4fe5d82fcd0e2', null); +INSERT INTO `sys_role_permission` VALUES ('326181da3248a62a05e872119a462be1', 'ee8626f80f7c2619917b6236f3a7f02b', '3f915b2769fc80648e92d04e84ca059d', null); +INSERT INTO `sys_role_permission` VALUES ('3369650f5072b330543f8caa556b1b33', 'e51758fa916c881624b046d26bd09230', 'a400e4f4d54f79bf5ce160ae432231af', null); +INSERT INTO `sys_role_permission` VALUES ('35a7e156c20e93aa7e825fe514bf9787', 'e51758fa916c881624b046d26bd09230', 'c6cf95444d80435eb37b2f9db3971ae6', null); +INSERT INTO `sys_role_permission` VALUES ('35ac7cae648de39eb56213ca1b649713', '52b0cf022ac4187b2a70dfa4f8b2d940', 'b1cb0a3fedf7ed0e4653cb5a229837ee', null); +INSERT INTO `sys_role_permission` VALUES ('370127be64a2bfda6203ce72c4811bf4', 'f6817f48af4fb3af11b9e8bf182f618b', '765dd244f37b804e3d00f475fd56149b', null); +INSERT INTO `sys_role_permission` VALUES ('370e842a683fc6395a1958da681fe749', 'f6817f48af4fb3af11b9e8bf182f618b', '841057b8a1bef8f6b4b20f9a618a7fa6', null); +INSERT INTO `sys_role_permission` VALUES ('37112f4d372541e105473f18da3dc50d', 'ee8626f80f7c2619917b6236f3a7f02b', 'a400e4f4d54f79bf5ce160ae432231af', null); +INSERT INTO `sys_role_permission` VALUES ('37789f70cd8bd802c4a69e9e1f633eaa', 'ee8626f80f7c2619917b6236f3a7f02b', 'ae4fed059f67086fd52a73d913cf473d', null); +INSERT INTO `sys_role_permission` VALUES ('381504a717cb3ce77dcd4070c9689a7e', 'ee8626f80f7c2619917b6236f3a7f02b', '4f84f9400e5e92c95f05b554724c2b58', null); +INSERT INTO `sys_role_permission` VALUES ('38c74d670bf1ebc612b72b69ebf067cf', 'f6817f48af4fb3af11b9e8bf182f618b', 'baf16b7174bd821b6bab23fa9abb200d', null); +INSERT INTO `sys_role_permission` VALUES ('38dd7a19711e7ffe864232954c06fae9', 'e51758fa916c881624b046d26bd09230', 'd2bbf9ebca5a8fa2e227af97d2da7548', null); +INSERT INTO `sys_role_permission` VALUES ('3ab440506de8f51378762d02b79d45c5', 'f6817f48af4fb3af11b9e8bf182f618b', 'fb07ca05a3e13674dbf6d3245956da2e', null); +INSERT INTO `sys_role_permission` VALUES ('3b6fcd36c9e1114003fc1e6c6a092ab9', 'f6817f48af4fb3af11b9e8bf182f618b', '7ac9eb9ccbde2f7a033cd4944272bf1e', null); +INSERT INTO `sys_role_permission` VALUES ('3e563751942b0879c88ca4de19757b50', '1750a8fb3e6d90cb7957c02de1dc8e59', '58857ff846e61794c69208e9d3a85466', null); +INSERT INTO `sys_role_permission` VALUES ('412e2de37a35b3442d68db8dd2f3c190', '52b0cf022ac4187b2a70dfa4f8b2d940', 'f1cb187abf927c88b89470d08615f5ac', null); +INSERT INTO `sys_role_permission` VALUES ('4276c23200b37c3be419d16466b21496', 'f6817f48af4fb3af11b9e8bf182f618b', 'e5973686ed495c379d829ea8b2881fc6', null); +INSERT INTO `sys_role_permission` VALUES ('44b5a73541bcb854dd5d38c6d1fb93a1', 'ee8626f80f7c2619917b6236f3a7f02b', '418964ba087b90a84897b62474496b93', null); +INSERT INTO `sys_role_permission` VALUES ('45325d8dbf7c9ee548ae06b490b045d3', 'f6817f48af4fb3af11b9e8bf182f618b', 'cc50656cf9ca528e6f2150eba4714ad2', null); +INSERT INTO `sys_role_permission` VALUES ('45767d6c72d2ca1ce83025d9241d113a', 'f6817f48af4fb3af11b9e8bf182f618b', '05b3c82ddb2536a4a5ee1a4c46b5abef', null); +INSERT INTO `sys_role_permission` VALUES ('459aa2e7021b435b4d65414cfbc71c66', 'e51758fa916c881624b046d26bd09230', '4148ec82b6acd69f470bea75fe41c357', null); +INSERT INTO `sys_role_permission` VALUES ('467da0025bf89d8155aa6d290f6d9422', 'f6817f48af4fb3af11b9e8bf182f618b', '03dc3d93261dda19fc86dd7ca486c6cf', null); +INSERT INTO `sys_role_permission` VALUES ('4a00cb21e8f14d362e3779cdc9abae62', 'f6817f48af4fb3af11b9e8bf182f618b', 'fc810a2267dd183e4ef7c71cc60f4670', null); +INSERT INTO `sys_role_permission` VALUES ('4ac09a099adad69ab897254dda2db0d3', 'f6817f48af4fb3af11b9e8bf182f618b', '2d83d62bd2544b8994c8f38cf17b0ddf', null); +INSERT INTO `sys_role_permission` VALUES ('4c0940badae3ef9231ee9d042338f2a4', 'e51758fa916c881624b046d26bd09230', '2a470fc0c3954d9dbb61de6d80846549', null); +INSERT INTO `sys_role_permission` VALUES ('4d56ce2f67c94b74a1d3abdbea340e42', 'ee8626f80f7c2619917b6236f3a7f02b', 'd86f58e7ab516d3bc6bfb1fe10585f97', null); +INSERT INTO `sys_role_permission` VALUES ('4da321638e32b193f1b56027ef803a76', 'f6817f48af4fb3af11b9e8bf182f618b', 'd86f58e7ab516d3bc6bfb1fe10585f97', null); +INSERT INTO `sys_role_permission` VALUES ('4faad8ff93cb2b5607cd3d07c1b624ee', 'a799c3b1b12dd3ed4bd046bfaef5fe6e', '70b8f33da5f39de1981bf89cf6c99792', null); +INSERT INTO `sys_role_permission` VALUES ('4fb0c63fcd0a2bb7f304e914013ee9e3', 'f6817f48af4fb3af11b9e8bf182f618b', 'c65321e57b7949b7a975313220de0422', null); +INSERT INTO `sys_role_permission` VALUES ('54aeeecd4405b6e0189da1b5f82e6a9e', 'f6817f48af4fb3af11b9e8bf182f618b', 'de13e0f6328c069748de7399fcc1dbbd', null); +INSERT INTO `sys_role_permission` VALUES ('552a143a7f527d1d2a4769793824aa84', 'f6817f48af4fb3af11b9e8bf182f618b', '45c966826eeff4c99b8f8ebfe74511fc', null); +INSERT INTO `sys_role_permission` VALUES ('57c0b3a547b815ea3ec8e509b08948b3', '1750a8fb3e6d90cb7957c02de1dc8e59', '3f915b2769fc80648e92d04e84ca059d', null); +INSERT INTO `sys_role_permission` VALUES ('57ef0491da429c0ea949e6aa2f36383e', 'f6817f48af4fb3af11b9e8bf182f618b', 'aedbf679b5773c1f25e9f7b10111da73', null); +INSERT INTO `sys_role_permission` VALUES ('593ee05c4fe4645c7826b7d5e14f23ec', '52b0cf022ac4187b2a70dfa4f8b2d940', '8fb8172747a78756c11916216b8b8066', null); +INSERT INTO `sys_role_permission` VALUES ('59e64243d9b015a67fa8aace53801c2b', 'f6817f48af4fb3af11b9e8bf182f618b', 'd7d6e2e4e2934f2c9385a623fd98c6f3', null); +INSERT INTO `sys_role_permission` VALUES ('5a93a14d6edcc28020a3e1bb58b550a9', 'f6817f48af4fb3af11b9e8bf182f618b', 'f780d0d3083d849ccbdb1b1baee4911d', null); +INSERT INTO `sys_role_permission` VALUES ('5affc85021fcba07d81c09a6fdfa8dc6', 'ee8626f80f7c2619917b6236f3a7f02b', '078f9558cdeab239aecb2bda1a8ed0d1', null); +INSERT INTO `sys_role_permission` VALUES ('5e0c8b2aaf853fe6b1c8b726db5342dc', 'f6817f48af4fb3af11b9e8bf182f618b', '200006f0edf145a2b50eacca07585451', null); +INSERT INTO `sys_role_permission` VALUES ('5e634a89f75b7a421c02aecfd520325f', 'e51758fa916c881624b046d26bd09230', '339329ed54cf255e1f9392e84f136901', null); +INSERT INTO `sys_role_permission` VALUES ('5e74637c4bec048d1880ad0bd1b00552', 'e51758fa916c881624b046d26bd09230', 'a400e4f4d54f79bf5ce160a3432231af', null); +INSERT INTO `sys_role_permission` VALUES ('5f88c86ffc73ea6b311e221245c6bbf9', 'f6817f48af4fb3af11b9e8bf182f618b', '56ca78fe0f22d815fabc793461af67b8', null); +INSERT INTO `sys_role_permission` VALUES ('5fc194b709336d354640fe29fefd65a3', 'a799c3b1b12dd3ed4bd046bfaef5fe6e', '9ba60e626bf2882c31c488aba62b89f0', null); +INSERT INTO `sys_role_permission` VALUES ('60c4f0b59a0029429f744ab20b1bb7fa', 'f6817f48af4fb3af11b9e8bf182f618b', 'edfa74d66e8ea63ea432c2910837b150', null); +INSERT INTO `sys_role_permission` VALUES ('61c71e973503479e8b795c5d40363f13', 'f6817f48af4fb3af11b9e8bf182f618b', 'e6bfd1fcabfd7942fdd05f076d1dad38', null); +INSERT INTO `sys_role_permission` VALUES ('6369b641d2fa1b4bb9ef2fa630073bd8', 'f6817f48af4fb3af11b9e8bf182f618b', '54097c6a3cf50fad0793a34beff1efdf', null); +INSERT INTO `sys_role_permission` VALUES ('63e66c8481aa89d2a2a614e7d5bc0184', 'f6817f48af4fb3af11b9e8bf182f618b', 'e8af452d8948ea49d37c934f5100ae6a', null); +INSERT INTO `sys_role_permission` VALUES ('6451dac67ba4acafb570fd6a03f47460', 'ee8626f80f7c2619917b6236f3a7f02b', 'e3c13679c73a4f829bcff2aba8fd68b1', null); +INSERT INTO `sys_role_permission` VALUES ('68ffc3f37266f287496e43ff6a329c36', 'f6817f48af4fb3af11b9e8bf182f618b', '109c78a583d4693ce2f16551b7786786', null); +INSERT INTO `sys_role_permission` VALUES ('6a2375344192922f9bf3ee0f32e042eb', 'f6817f48af4fb3af11b9e8bf182f618b', '13212d3416eb690c2e1d5033166ff47a', null); +INSERT INTO `sys_role_permission` VALUES ('6a9a93ac415e8ebb98fb5d75ed1bc970', 'f6817f48af4fb3af11b9e8bf182f618b', '700b7f95165c46cc7a78bf227aa8fed3', null); +INSERT INTO `sys_role_permission` VALUES ('6c43fd3f10fdaf2a0646434ae68709b5', 'ee8626f80f7c2619917b6236f3a7f02b', '540a2936940846cb98114ffb0d145cb8', null); +INSERT INTO `sys_role_permission` VALUES ('6d230b680a3cbe5081a86e944734435f', 'f6817f48af4fb3af11b9e8bf182f618b', 'fedfbf4420536cacc0218557d263dfea', null); +INSERT INTO `sys_role_permission` VALUES ('6fe1ccedfebfe359e9cb0dbd4329d257', 'f6817f48af4fb3af11b9e8bf182f618b', 'b1cb0a3fedf7ed0e4653cb5a229837ee', null); +INSERT INTO `sys_role_permission` VALUES ('71a5f54a90aa8c7a250a38b7dba39f6f', 'ee8626f80f7c2619917b6236f3a7f02b', '8fb8172747a78756c11916216b8b8066', null); +INSERT INTO `sys_role_permission` VALUES ('7335d2c31f17ec8e91f11e20fdae00ef', 'f6817f48af4fb3af11b9e8bf182f618b', 'e08cb190ef230d5d4f03824198773950', null); +INSERT INTO `sys_role_permission` VALUES ('737d35f582036cd18bfd4c8e5748eaa4', 'e51758fa916c881624b046d26bd09230', '693ce69af3432bd00be13c3971a57961', null); +INSERT INTO `sys_role_permission` VALUES ('75002588591820806', '16457350655250432', '5129710648430592', null); +INSERT INTO `sys_role_permission` VALUES ('75002588604403712', '16457350655250432', '5129710648430593', null); +INSERT INTO `sys_role_permission` VALUES ('75002588612792320', '16457350655250432', '40238597734928384', null); +INSERT INTO `sys_role_permission` VALUES ('75002588625375232', '16457350655250432', '57009744761589760', null); +INSERT INTO `sys_role_permission` VALUES ('75002588633763840', '16457350655250432', '16392452747300864', null); +INSERT INTO `sys_role_permission` VALUES ('75002588637958144', '16457350655250432', '16392767785668608', null); +INSERT INTO `sys_role_permission` VALUES ('75002588650541056', '16457350655250432', '16439068543946752', null); +INSERT INTO `sys_role_permission` VALUES ('76de49fa17c97d7ce2b647aa6985e43d', 'f6817f48af4fb3af11b9e8bf182f618b', '9a90363f216a6a08f32eecb3f0bf12a3', null); +INSERT INTO `sys_role_permission` VALUES ('77277779875336192', '496138616573952', '5129710648430592', null); +INSERT INTO `sys_role_permission` VALUES ('77277780043108352', '496138616573952', '5129710648430593', null); +INSERT INTO `sys_role_permission` VALUES ('77277780055691264', '496138616573952', '15701400130424832', null); +INSERT INTO `sys_role_permission` VALUES ('77277780064079872', '496138616573952', '16678126574637056', null); +INSERT INTO `sys_role_permission` VALUES ('77277780072468480', '496138616573952', '15701915807518720', null); +INSERT INTO `sys_role_permission` VALUES ('77277780076662784', '496138616573952', '15708892205944832', null); +INSERT INTO `sys_role_permission` VALUES ('77277780085051392', '496138616573952', '16678447719911424', null); +INSERT INTO `sys_role_permission` VALUES ('77277780089245696', '496138616573952', '25014528525733888', null); +INSERT INTO `sys_role_permission` VALUES ('77277780097634304', '496138616573952', '56898976661639168', null); +INSERT INTO `sys_role_permission` VALUES ('77277780135383040', '496138616573952', '40238597734928384', null); +INSERT INTO `sys_role_permission` VALUES ('77277780139577344', '496138616573952', '45235621697949696', null); +INSERT INTO `sys_role_permission` VALUES ('77277780147965952', '496138616573952', '45235787867885568', null); +INSERT INTO `sys_role_permission` VALUES ('77277780156354560', '496138616573952', '45235939278065664', null); +INSERT INTO `sys_role_permission` VALUES ('77277780164743168', '496138616573952', '43117268627886080', null); +INSERT INTO `sys_role_permission` VALUES ('77277780168937472', '496138616573952', '45236734832676864', null); +INSERT INTO `sys_role_permission` VALUES ('77277780181520384', '496138616573952', '45237010692050944', null); +INSERT INTO `sys_role_permission` VALUES ('77277780189908992', '496138616573952', '45237170029465600', null); +INSERT INTO `sys_role_permission` VALUES ('77277780198297600', '496138616573952', '57009544286441472', null); +INSERT INTO `sys_role_permission` VALUES ('77277780206686208', '496138616573952', '57009744761589760', null); +INSERT INTO `sys_role_permission` VALUES ('77277780215074816', '496138616573952', '57009981228060672', null); +INSERT INTO `sys_role_permission` VALUES ('77277780219269120', '496138616573952', '56309618086776832', null); +INSERT INTO `sys_role_permission` VALUES ('77277780227657728', '496138616573952', '57212882168844288', null); +INSERT INTO `sys_role_permission` VALUES ('77277780236046336', '496138616573952', '61560041605435392', null); +INSERT INTO `sys_role_permission` VALUES ('77277780244434944', '496138616573952', '61560275261722624', null); +INSERT INTO `sys_role_permission` VALUES ('77277780257017856', '496138616573952', '61560480518377472', null); +INSERT INTO `sys_role_permission` VALUES ('77277780265406464', '496138616573952', '44986029924421632', null); +INSERT INTO `sys_role_permission` VALUES ('77277780324126720', '496138616573952', '45235228800716800', null); +INSERT INTO `sys_role_permission` VALUES ('77277780332515328', '496138616573952', '45069342940860416', null); +INSERT INTO `sys_role_permission` VALUES ('77277780340903937', '496138616573952', '5129710648430594', null); +INSERT INTO `sys_role_permission` VALUES ('77277780349292544', '496138616573952', '16687383932047360', null); +INSERT INTO `sys_role_permission` VALUES ('77277780357681152', '496138616573952', '16689632049631232', null); +INSERT INTO `sys_role_permission` VALUES ('77277780366069760', '496138616573952', '16689745006432256', null); +INSERT INTO `sys_role_permission` VALUES ('77277780370264064', '496138616573952', '16689883993083904', null); +INSERT INTO `sys_role_permission` VALUES ('77277780374458369', '496138616573952', '16690313745666048', null); +INSERT INTO `sys_role_permission` VALUES ('77277780387041280', '496138616573952', '5129710648430595', null); +INSERT INTO `sys_role_permission` VALUES ('77277780395429888', '496138616573952', '16694861252005888', null); +INSERT INTO `sys_role_permission` VALUES ('77277780403818496', '496138616573952', '16695107491205120', null); +INSERT INTO `sys_role_permission` VALUES ('77277780412207104', '496138616573952', '16695243126607872', null); +INSERT INTO `sys_role_permission` VALUES ('77277780420595712', '496138616573952', '75002207560273920', null); +INSERT INTO `sys_role_permission` VALUES ('77277780428984320', '496138616573952', '76215889006956544', null); +INSERT INTO `sys_role_permission` VALUES ('77277780433178624', '496138616573952', '76216071333351424', null); +INSERT INTO `sys_role_permission` VALUES ('77277780441567232', '496138616573952', '76216264070008832', null); +INSERT INTO `sys_role_permission` VALUES ('77277780449955840', '496138616573952', '76216459709124608', null); +INSERT INTO `sys_role_permission` VALUES ('77277780458344448', '496138616573952', '76216594207870976', null); +INSERT INTO `sys_role_permission` VALUES ('77277780466733056', '496138616573952', '76216702639017984', null); +INSERT INTO `sys_role_permission` VALUES ('77277780475121664', '496138616573952', '58480609315524608', null); +INSERT INTO `sys_role_permission` VALUES ('77277780483510272', '496138616573952', '61394706252173312', null); +INSERT INTO `sys_role_permission` VALUES ('77277780491898880', '496138616573952', '61417744146370560', null); +INSERT INTO `sys_role_permission` VALUES ('77277780496093184', '496138616573952', '76606430504816640', null); +INSERT INTO `sys_role_permission` VALUES ('77277780504481792', '496138616573952', '76914082455752704', null); +INSERT INTO `sys_role_permission` VALUES ('77277780508676097', '496138616573952', '76607201262702592', null); +INSERT INTO `sys_role_permission` VALUES ('77277780517064704', '496138616573952', '39915540965232640', null); +INSERT INTO `sys_role_permission` VALUES ('77277780525453312', '496138616573952', '41370251991977984', null); +INSERT INTO `sys_role_permission` VALUES ('77277780538036224', '496138616573952', '45264987354042368', null); +INSERT INTO `sys_role_permission` VALUES ('77277780546424832', '496138616573952', '45265487029866496', null); +INSERT INTO `sys_role_permission` VALUES ('77277780554813440', '496138616573952', '45265762415284224', null); +INSERT INTO `sys_role_permission` VALUES ('77277780559007744', '496138616573952', '45265886315024384', null); +INSERT INTO `sys_role_permission` VALUES ('77277780567396352', '496138616573952', '45266070000373760', null); +INSERT INTO `sys_role_permission` VALUES ('77277780571590656', '496138616573952', '41363147411427328', null); +INSERT INTO `sys_role_permission` VALUES ('77277780579979264', '496138616573952', '41363537456533504', null); +INSERT INTO `sys_role_permission` VALUES ('77277780588367872', '496138616573952', '41364927394353152', null); +INSERT INTO `sys_role_permission` VALUES ('77277780596756480', '496138616573952', '41371711400054784', null); +INSERT INTO `sys_role_permission` VALUES ('77277780605145088', '496138616573952', '41469219249852416', null); +INSERT INTO `sys_role_permission` VALUES ('77277780613533696', '496138616573952', '39916171171991552', null); +INSERT INTO `sys_role_permission` VALUES ('77277780621922304', '496138616573952', '39918482854252544', null); +INSERT INTO `sys_role_permission` VALUES ('77277780630310912', '496138616573952', '41373430515240960', null); +INSERT INTO `sys_role_permission` VALUES ('77277780718391296', '496138616573952', '41375330996326400', null); +INSERT INTO `sys_role_permission` VALUES ('77277780722585600', '496138616573952', '63741744973352960', null); +INSERT INTO `sys_role_permission` VALUES ('77277780730974208', '496138616573952', '42082442672082944', null); +INSERT INTO `sys_role_permission` VALUES ('77277780739362816', '496138616573952', '41376192166629376', null); +INSERT INTO `sys_role_permission` VALUES ('77277780747751424', '496138616573952', '41377034236071936', null); +INSERT INTO `sys_role_permission` VALUES ('77277780756140032', '496138616573952', '56911328312299520', null); +INSERT INTO `sys_role_permission` VALUES ('77277780764528640', '496138616573952', '41378916912336896', null); +INSERT INTO `sys_role_permission` VALUES ('77277780768722944', '496138616573952', '63482475359244288', null); +INSERT INTO `sys_role_permission` VALUES ('77277780772917249', '496138616573952', '64290663792906240', null); +INSERT INTO `sys_role_permission` VALUES ('77277780785500160', '496138616573952', '66790433014943744', null); +INSERT INTO `sys_role_permission` VALUES ('77277780789694464', '496138616573952', '42087054753927168', null); +INSERT INTO `sys_role_permission` VALUES ('77277780798083072', '496138616573952', '67027338952445952', null); +INSERT INTO `sys_role_permission` VALUES ('77277780806471680', '496138616573952', '67027909637836800', null); +INSERT INTO `sys_role_permission` VALUES ('77277780810665985', '496138616573952', '67042515441684480', null); +INSERT INTO `sys_role_permission` VALUES ('77277780823248896', '496138616573952', '67082402312228864', null); +INSERT INTO `sys_role_permission` VALUES ('77277780827443200', '496138616573952', '16392452747300864', null); +INSERT INTO `sys_role_permission` VALUES ('77277780835831808', '496138616573952', '16392767785668608', null); +INSERT INTO `sys_role_permission` VALUES ('77277780840026112', '496138616573952', '16438800255291392', null); +INSERT INTO `sys_role_permission` VALUES ('77277780844220417', '496138616573952', '16438962738434048', null); +INSERT INTO `sys_role_permission` VALUES ('77277780852609024', '496138616573952', '16439068543946752', null); +INSERT INTO `sys_role_permission` VALUES ('77277860062040064', '496138616573953', '5129710648430592', null); +INSERT INTO `sys_role_permission` VALUES ('77277860070428672', '496138616573953', '5129710648430593', null); +INSERT INTO `sys_role_permission` VALUES ('77277860078817280', '496138616573953', '40238597734928384', null); +INSERT INTO `sys_role_permission` VALUES ('77277860091400192', '496138616573953', '43117268627886080', null); +INSERT INTO `sys_role_permission` VALUES ('77277860099788800', '496138616573953', '57009744761589760', null); +INSERT INTO `sys_role_permission` VALUES ('77277860112371712', '496138616573953', '56309618086776832', null); +INSERT INTO `sys_role_permission` VALUES ('77277860120760320', '496138616573953', '44986029924421632', null); +INSERT INTO `sys_role_permission` VALUES ('77277860129148928', '496138616573953', '5129710648430594', null); +INSERT INTO `sys_role_permission` VALUES ('77277860141731840', '496138616573953', '5129710648430595', null); +INSERT INTO `sys_role_permission` VALUES ('77277860150120448', '496138616573953', '75002207560273920', null); +INSERT INTO `sys_role_permission` VALUES ('77277860158509056', '496138616573953', '58480609315524608', null); +INSERT INTO `sys_role_permission` VALUES ('77277860162703360', '496138616573953', '76606430504816640', null); +INSERT INTO `sys_role_permission` VALUES ('77277860171091968', '496138616573953', '76914082455752704', null); +INSERT INTO `sys_role_permission` VALUES ('77277860179480576', '496138616573953', '76607201262702592', null); +INSERT INTO `sys_role_permission` VALUES ('77277860187869184', '496138616573953', '39915540965232640', null); +INSERT INTO `sys_role_permission` VALUES ('77277860196257792', '496138616573953', '41370251991977984', null); +INSERT INTO `sys_role_permission` VALUES ('77277860204646400', '496138616573953', '41363147411427328', null); +INSERT INTO `sys_role_permission` VALUES ('77277860208840704', '496138616573953', '41371711400054784', null); +INSERT INTO `sys_role_permission` VALUES ('77277860213035009', '496138616573953', '39916171171991552', null); +INSERT INTO `sys_role_permission` VALUES ('77277860221423616', '496138616573953', '39918482854252544', null); +INSERT INTO `sys_role_permission` VALUES ('77277860225617920', '496138616573953', '41373430515240960', null); +INSERT INTO `sys_role_permission` VALUES ('77277860234006528', '496138616573953', '41375330996326400', null); +INSERT INTO `sys_role_permission` VALUES ('77277860242395136', '496138616573953', '63741744973352960', null); +INSERT INTO `sys_role_permission` VALUES ('77277860250783744', '496138616573953', '42082442672082944', null); +INSERT INTO `sys_role_permission` VALUES ('77277860254978048', '496138616573953', '41376192166629376', null); +INSERT INTO `sys_role_permission` VALUES ('77277860263366656', '496138616573953', '41377034236071936', null); +INSERT INTO `sys_role_permission` VALUES ('77277860271755264', '496138616573953', '56911328312299520', null); +INSERT INTO `sys_role_permission` VALUES ('77277860313698304', '496138616573953', '41378916912336896', null); +INSERT INTO `sys_role_permission` VALUES ('77277860322086912', '496138616573953', '63482475359244288', null); +INSERT INTO `sys_role_permission` VALUES ('77277860326281216', '496138616573953', '64290663792906240', null); +INSERT INTO `sys_role_permission` VALUES ('77277860334669824', '496138616573953', '66790433014943744', null); +INSERT INTO `sys_role_permission` VALUES ('77277860343058432', '496138616573953', '42087054753927168', null); +INSERT INTO `sys_role_permission` VALUES ('77277860347252736', '496138616573953', '67027338952445952', null); +INSERT INTO `sys_role_permission` VALUES ('77277860351447041', '496138616573953', '67027909637836800', null); +INSERT INTO `sys_role_permission` VALUES ('77277860359835648', '496138616573953', '67042515441684480', null); +INSERT INTO `sys_role_permission` VALUES ('77277860364029952', '496138616573953', '67082402312228864', null); +INSERT INTO `sys_role_permission` VALUES ('77277860368224256', '496138616573953', '16392452747300864', null); +INSERT INTO `sys_role_permission` VALUES ('77277860372418560', '496138616573953', '16392767785668608', null); +INSERT INTO `sys_role_permission` VALUES ('77277860376612865', '496138616573953', '16438800255291392', null); +INSERT INTO `sys_role_permission` VALUES ('77277860385001472', '496138616573953', '16438962738434048', null); +INSERT INTO `sys_role_permission` VALUES ('77277860389195776', '496138616573953', '16439068543946752', null); +INSERT INTO `sys_role_permission` VALUES ('7750f9be48ee09cd561fce718219a3e2', 'ee8626f80f7c2619917b6236f3a7f02b', '882a73768cfd7f78f3a37584f7299656', null); +INSERT INTO `sys_role_permission` VALUES ('7a5d31ba48fe3fb1266bf186dc5f7ba7', '52b0cf022ac4187b2a70dfa4f8b2d940', '58857ff846e61794c69208e9d3a85466', null); +INSERT INTO `sys_role_permission` VALUES ('7d2ea745950be3357747ec7750c31c57', 'ee8626f80f7c2619917b6236f3a7f02b', '2a470fc0c3954d9dbb61de6d80846549', null); +INSERT INTO `sys_role_permission` VALUES ('7d81581210add7608f4d580ab09c1c9d', 'f6817f48af4fb3af11b9e8bf182f618b', '882a73768cfd7f78f3a37584f7299656', null); +INSERT INTO `sys_role_permission` VALUES ('7de42bdc0b8c5446b7d428c66a7abc12', '52b0cf022ac4187b2a70dfa4f8b2d940', '54dd5457a3190740005c1bfec55b1c34', null); +INSERT INTO `sys_role_permission` VALUES ('7e19d90cec0dd87aaef351b9ff8f4902', '646c628b2b8295fbdab2d34044de0354', 'f9d3f4f27653a71c52faa9fb8070fbe7', null); +INSERT INTO `sys_role_permission` VALUES ('7f862c47003eb20e8bad05f506371f92', 'ee8626f80f7c2619917b6236f3a7f02b', 'd7d6e2e4e2934f2c9385a623fd98c6f3', null); +INSERT INTO `sys_role_permission` VALUES ('806bcc05238ef1b0c24dadf18fb0af08', 'f6817f48af4fb3af11b9e8bf182f618b', 'ec8d607d0156e198b11853760319c646', null); +INSERT INTO `sys_role_permission` VALUES ('812ed54661b1a24b81b58974691a73f5', 'e51758fa916c881624b046d26bd09230', 'e6bfd1fcabfd7942fdd05f076d1dad38', null); +INSERT INTO `sys_role_permission` VALUES ('8246c649fe7f1845cdc872014c7ad962', 'f6817f48af4fb3af11b9e8bf182f618b', '9502685863ab87f0ad1134142788a385', null); +INSERT INTO `sys_role_permission` VALUES ('83f704524b21b6a3ae324b8736c65333', 'ee8626f80f7c2619917b6236f3a7f02b', '7ac9eb9ccbde2f7a033cd4944272bf1e', null); +INSERT INTO `sys_role_permission` VALUES ('84d32474316a43b01256d6644e6e7751', 'ee8626f80f7c2619917b6236f3a7f02b', 'ec8d607d0156e198b11853760319c646', null); +INSERT INTO `sys_role_permission` VALUES ('85755a6c0bdff78b3860b52d35310c7f', 'e51758fa916c881624b046d26bd09230', 'c65321e57b7949b7a975313220de0422', null); +INSERT INTO `sys_role_permission` VALUES ('859fb968f3e4560f870f6659d4d2982f', 'f6817f48af4fb3af11b9e8bf182f618b', '63b551e81c5956d5c861593d366d8c57', null); +INSERT INTO `sys_role_permission` VALUES ('85a009f7be4e792e61dc8dccfc35c273', 'f6817f48af4fb3af11b9e8bf182f618b', '8fb8172747a78756c11916216b8b8066', null); +INSERT INTO `sys_role_permission` VALUES ('86cc551bcb0cc7d61f1fc5e924cffd2f', 'f6817f48af4fb3af11b9e8bf182f618b', '9fe26464838de2ea5e90f2367e35efa0', null); +INSERT INTO `sys_role_permission` VALUES ('8703a2410cddb713c33232ce16ec04b9', 'ee8626f80f7c2619917b6236f3a7f02b', '1367a93f2c410b169faa7abcbad2f77c', null); +INSERT INTO `sys_role_permission` VALUES ('8724588961f747d321885b2c50f3ef67', 'f6817f48af4fb3af11b9e8bf182f618b', '9cb91b8851db0cf7b19d7ecc2a8193dd', null); +INSERT INTO `sys_role_permission` VALUES ('885c1a827383e5b2c6c4f8ca72a7b493', 'ee8626f80f7c2619917b6236f3a7f02b', '4148ec82b6acd69f470bea75fe41c357', null); +INSERT INTO `sys_role_permission` VALUES ('8a60df8d8b4c9ee5fa63f48aeee3ec00', '1750a8fb3e6d90cb7957c02de1dc8e59', 'd7d6e2e4e2934f2c9385a623fd98c6f3', null); +INSERT INTO `sys_role_permission` VALUES ('8b1e326791375f325d3e6b797753b65e', 'ee8626f80f7c2619917b6236f3a7f02b', '2dbbafa22cda07fa5d169d741b81fe12', null); +INSERT INTO `sys_role_permission` VALUES ('8ce1022dac4e558ff9694600515cf510', '1750a8fb3e6d90cb7957c02de1dc8e59', '08e6b9dc3c04489c8e1ff2ce6f105aa4', null); +INSERT INTO `sys_role_permission` VALUES ('8d848ca7feec5b7ebb3ecb32b2c8857a', '52b0cf022ac4187b2a70dfa4f8b2d940', '4148ec82b6acd69f470bea75fe41c357', null); +INSERT INTO `sys_role_permission` VALUES ('8eec2c510f1ac9c5eee26c041b1f00ca', 'ee8626f80f7c2619917b6236f3a7f02b', '58857ff846e61794c69208e9d3a85466', null); +INSERT INTO `sys_role_permission` VALUES ('8f762ff80253f634b08cf59a77742ba4', 'ee8626f80f7c2619917b6236f3a7f02b', '9502685863ab87f0ad1134142788a385', null); +INSERT INTO `sys_role_permission` VALUES ('903b790e6090414343502c6dc393b7c9', 'ee8626f80f7c2619917b6236f3a7f02b', 'de13e0f6328c069748de7399fcc1dbbd', null); +INSERT INTO `sys_role_permission` VALUES ('90996d56357730e173e636b99fc48bea', 'ee8626f80f7c2619917b6236f3a7f02b', 'fb07ca05a3e13674dbf6d3245956da2e', null); +INSERT INTO `sys_role_permission` VALUES ('90e1c607a0631364eec310f3cc4acebd', 'ee8626f80f7c2619917b6236f3a7f02b', '4f66409ef3bbd69c1d80469d6e2a885e', null); +INSERT INTO `sys_role_permission` VALUES ('9264104cee9b10c96241d527b2d0346d', '1750a8fb3e6d90cb7957c02de1dc8e59', '54dd5457a3190740005c1bfec55b1c34', null); +INSERT INTO `sys_role_permission` VALUES ('9435f03bc69f108d08f3efdb436de278', 'f6817f48af4fb3af11b9e8bf182f618b', '6ad53fd1b220989a8b71ff482d683a5a', null); +INSERT INTO `sys_role_permission` VALUES ('98f02353f91dd569e3c6b8fd6b4f4034', 'ee8626f80f7c2619917b6236f3a7f02b', '6531cf3421b1265aeeeabaab5e176e6d', null); +INSERT INTO `sys_role_permission` VALUES ('9b6c9e4bc89343d326f43b0ba14caa35', 'f6817f48af4fb3af11b9e8bf182f618b', '3f915b2769fc80648e92d04e84ca059d', null); +INSERT INTO `sys_role_permission` VALUES ('9c035b8416d8d074f2a24ae975f9dc66', 'f6817f48af4fb3af11b9e8bf182f618b', '00a2a0ae65cdca5e93209cdbde97cbe6', null); +INSERT INTO `sys_role_permission` VALUES ('9d8772c310b675ae43eacdbc6c7fa04a', 'a799c3b1b12dd3ed4bd046bfaef5fe6e', '1663f3faba244d16c94552f849627d84', null); +INSERT INTO `sys_role_permission` VALUES ('9f8311ecccd44e079723098cf2ffe1cc', '1750a8fb3e6d90cb7957c02de1dc8e59', '693ce69af3432bd00be13c3971a57961', null); +INSERT INTO `sys_role_permission` VALUES ('a098e2acc3f90316f161f6648d085640', 'ee8626f80f7c2619917b6236f3a7f02b', 'e6bfd1fcabfd7942fdd05f076d1dad38', null); +INSERT INTO `sys_role_permission` VALUES ('a1326a034fd39447609573ae7f209fc3', 'f6817f48af4fb3af11b9e8bf182f618b', '73678f9daa45ed17a3674131b03432fb', null); +INSERT INTO `sys_role_permission` VALUES ('a34efa870a95ff078b4a729e5aff5f48', 'f6817f48af4fb3af11b9e8bf182f618b', '732d48f8e0abe99fe6a23d18a3171cd1', null); +INSERT INTO `sys_role_permission` VALUES ('a4bbd697954d0c9edefdbebf05781cc0', 'f6817f48af4fb3af11b9e8bf182f618b', '7960961b0063228937da5fa8dd73d371', null); +INSERT INTO `sys_role_permission` VALUES ('a5b56bd1e428d23aaa3d2f4c7424533b', 'f6817f48af4fb3af11b9e8bf182f618b', '54dd5457a3190740005c1bfec55b1c34', null); +INSERT INTO `sys_role_permission` VALUES ('a66feaaf128417ad762e946abccf27ec', 'ee8626f80f7c2619917b6236f3a7f02b', 'c6cf95444d80435eb37b2f9db3971ae6', null); +INSERT INTO `sys_role_permission` VALUES ('a72c31a3913c736d4eca11d13be99183', 'e51758fa916c881624b046d26bd09230', 'a44c30db536349e91106223957e684eb', null); +INSERT INTO `sys_role_permission` VALUES ('a7ab87eac0f8fafa2efa4b1f9351923f', 'ee8626f80f7c2619917b6236f3a7f02b', 'fedfbf4420536cacc0218557d263dfea', null); +INSERT INTO `sys_role_permission` VALUES ('a80a4528118552a7a3dc9e6a6eaee439', 'f6817f48af4fb3af11b9e8bf182f618b', '717f6bee46f44a3897eca9abd6e2ec44', null); +INSERT INTO `sys_role_permission` VALUES ('a88f4cdc81d4a8d1e0a27a29c90d8c2a', 'f6817f48af4fb3af11b9e8bf182f618b', 'ffb423d25cc59dcd0532213c4a518261', null); +INSERT INTO `sys_role_permission` VALUES ('ab639f1526a4ade3411fd20db7a1815e', 'f6817f48af4fb3af11b9e8bf182f618b', '6531cf3421b1265aeeeabaab5e176e6d', null); +INSERT INTO `sys_role_permission` VALUES ('abdc324a2df9f13ee6e73d44c6e62bc8', 'ee8626f80f7c2619917b6236f3a7f02b', 'f1cb187abf927c88b89470d08615f5ac', null); +INSERT INTO `sys_role_permission` VALUES ('ac17157d44d559e528a8fb9d04406fe8', 'f6817f48af4fb3af11b9e8bf182f618b', 'c2c356bf4ddd29975347a7047a062440', null); +INSERT INTO `sys_role_permission` VALUES ('ad040f98d3c29cf93f7dc892a8ba1210', 'f6817f48af4fb3af11b9e8bf182f618b', '020b06793e4de2eee0007f603000c769', null); +INSERT INTO `sys_role_permission` VALUES ('aefc8c22e061171806e59cd222f6b7e1', '52b0cf022ac4187b2a70dfa4f8b2d940', 'e8af452d8948ea49d37c934f5100ae6a', null); +INSERT INTO `sys_role_permission` VALUES ('b05599406e8791d65afacdcb7201f563', 'f6817f48af4fb3af11b9e8bf182f618b', 'd2bbf9ebca5a8fa2e227af97d2da7548', null); +INSERT INTO `sys_role_permission` VALUES ('b131ebeafcfd059f3c7e542606ea9ff5', 'ee8626f80f7c2619917b6236f3a7f02b', 'e5973686ed495c379d829ea8b2881fc6', null); +INSERT INTO `sys_role_permission` VALUES ('b24122ddecdca94eb5754456bb2c32f2', 'f6817f48af4fb3af11b9e8bf182f618b', 'e41b69c57a941a3bbcce45032fe57605', null); +INSERT INTO `sys_role_permission` VALUES ('b2b2dcfff6986d3d7f890ea62d474651', 'ee8626f80f7c2619917b6236f3a7f02b', '200006f0edf145a2b50eacca07585451', null); +INSERT INTO `sys_role_permission` VALUES ('b3b7f425c0fc1d92d4c2dccbef66af69', 'f6817f48af4fb3af11b9e8bf182f618b', '7593c9e3523a17bca83b8d7fe8a34e58', null); +INSERT INTO `sys_role_permission` VALUES ('b3db897e3e7e8469ea6218afe42d0a5a', 'f6817f48af4fb3af11b9e8bf182f618b', 'ae4fed059f67086fd52a73d913cf473d', null); +INSERT INTO `sys_role_permission` VALUES ('b495a46fa0e0d4637abe0db7fd12fe1a', 'ee8626f80f7c2619917b6236f3a7f02b', '717f6bee46f44a3897eca9abd6e2ec44', null); +INSERT INTO `sys_role_permission` VALUES ('b9d821aae407085c0d91da70f8c09e21', 'f6817f48af4fb3af11b9e8bf182f618b', '4148ec82b6acd69f470bea75fe41c357', null); +INSERT INTO `sys_role_permission` VALUES ('ba87fd2b2c8eee82dac1cd92d39ca774', 'f6817f48af4fb3af11b9e8bf182f618b', '5c8042bd6c601270b2bbd9b20bccc68b', null); +INSERT INTO `sys_role_permission` VALUES ('bd30561f141f07827b836878137fddd8', 'e51758fa916c881624b046d26bd09230', '65a8f489f25a345836b7f44b1181197a', null); +INSERT INTO `sys_role_permission` VALUES ('be5eabad598d67bda03e314168086982', 'f6817f48af4fb3af11b9e8bf182f618b', 'c6cf95444d80435eb37b2f9db3971ae6', null); +INSERT INTO `sys_role_permission` VALUES ('c316fdb7d377bf25772ce3577677509c', 'f6817f48af4fb3af11b9e8bf182f618b', '4875ebe289344e14844d8e3ea1edd73f', null); +INSERT INTO `sys_role_permission` VALUES ('c63d3bdbb2a9a523ebfd44d2fc9008dd', 'f6817f48af4fb3af11b9e8bf182f618b', '8d1ebd663688965f1fd86a2f0ead3416', null); +INSERT INTO `sys_role_permission` VALUES ('c689539d20a445b0896270290c58d01f', 'e51758fa916c881624b046d26bd09230', '13212d3416eb690c2e1d5033166ff47a', null); +INSERT INTO `sys_role_permission` VALUES ('c77425e2129587a2efc9c7f9059699b7', 'f6817f48af4fb3af11b9e8bf182f618b', 'a2b11669e98c5fe54a53c3e3c4f35d14', null); +INSERT INTO `sys_role_permission` VALUES ('c8571839e6b14796e661f3e2843b80b6', 'ee8626f80f7c2619917b6236f3a7f02b', '45c966826eeff4c99b8f8ebfe74511fc', null); +INSERT INTO `sys_role_permission` VALUES ('c9412b70586ce8d729dac8fa3149ab1a', 'f6817f48af4fb3af11b9e8bf182f618b', '4f84f9400e5e92c95f05b554724c2b58', null); +INSERT INTO `sys_role_permission` VALUES ('c9d35261cccd67ab2932107a0967a7d7', 'e51758fa916c881624b046d26bd09230', 'b4dfc7d5dd9e8d5b6dd6d4579b1aa559', null); +INSERT INTO `sys_role_permission` VALUES ('ced7337f40e1db9a70de44d1262f0360', 'f6817f48af4fb3af11b9e8bf182f618b', '91c23960fab49335831cf43d820b0a61', null); +INSERT INTO `sys_role_permission` VALUES ('ced80e43584ce15e97bb07298e93020d', 'e51758fa916c881624b046d26bd09230', '45c966826eeff4c99b8f8ebfe74511fc', null); +INSERT INTO `sys_role_permission` VALUES ('d03d792b0f312e7b490afc5cec3dd6c5', 'e51758fa916c881624b046d26bd09230', '8fb8172747a78756c11916216b8b8066', null); +INSERT INTO `sys_role_permission` VALUES ('d3fe195d59811531c05d31d8436f5c8b', '1750a8fb3e6d90cb7957c02de1dc8e59', 'e8af452d8948ea49d37c934f5100ae6a', null); +INSERT INTO `sys_role_permission` VALUES ('d5267597a4450f06d49d2fb63859641a', 'e51758fa916c881624b046d26bd09230', '2dbbafa22cda07fa5d169d741b81fe12', null); +INSERT INTO `sys_role_permission` VALUES ('d9c64c7a34306dc4e3176d95d367520b', 'f6817f48af4fb3af11b9e8bf182f618b', 'f0675b52d89100ee88472b6800754a08', null); +INSERT INTO `sys_role_permission` VALUES ('dc4e760077a35fcef7995be9c92cef8d', 'f6817f48af4fb3af11b9e8bf182f618b', 'a400e4f4d54f79bf5ce160a3432231af', null); +INSERT INTO `sys_role_permission` VALUES ('e02b6986b273af631e1aaf169a71f810', 'f6817f48af4fb3af11b9e8bf182f618b', '4356a1a67b564f0988a484f5531fd4d9', null); +INSERT INTO `sys_role_permission` VALUES ('e258ca8bf7ee168b93bfee739668eb15', 'ee8626f80f7c2619917b6236f3a7f02b', 'fb367426764077dcf94640c843733985', null); +INSERT INTO `sys_role_permission` VALUES ('e2e29f53362b2ec40cbd4c3414d1e85f', 'f6817f48af4fb3af11b9e8bf182f618b', '58857ff846e61794c69208e9d3a85466', null); +INSERT INTO `sys_role_permission` VALUES ('e339f7db7418a4fd2bd2c113f1182186', 'ee8626f80f7c2619917b6236f3a7f02b', 'b1cb0a3fedf7ed0e4653cb5a229837ee', null); +INSERT INTO `sys_role_permission` VALUES ('e36b26c0077205bc87bb3f29b96f9039', 'f6817f48af4fb3af11b9e8bf182f618b', '540a2936940846cb98114ffb0d145cb8', null); +INSERT INTO `sys_role_permission` VALUES ('e3c30f109d09db2210f3857c1e79baad', 'f6817f48af4fb3af11b9e8bf182f618b', '944abf0a8fc22fe1f1154a389a574154', null); +INSERT INTO `sys_role_permission` VALUES ('e3e922673f4289b18366bb51b6200f17', '52b0cf022ac4187b2a70dfa4f8b2d940', '45c966826eeff4c99b8f8ebfe74511fc', null); +INSERT INTO `sys_role_permission` VALUES ('e56a61a4964e0fc71f20856713a0040d', 'f6817f48af4fb3af11b9e8bf182f618b', '2aeddae571695cd6380f6d6d334d6e7d', null); +INSERT INTO `sys_role_permission` VALUES ('ec3748f2cc58400ffbd3cd1fa3232f5d', 'f6817f48af4fb3af11b9e8bf182f618b', '1367a93f2c410b169faa7abcbad2f77c', null); +INSERT INTO `sys_role_permission` VALUES ('eeb6b2e31b35a6a2b7778f41b9922ef6', 'f6817f48af4fb3af11b9e8bf182f618b', 'd07a2c87a451434c99ab06296727ec4f', null); +INSERT INTO `sys_role_permission` VALUES ('f12b6c90e8913183d7ca547c66600891', 'e51758fa916c881624b046d26bd09230', 'aedbf679b5773c1f25e9f7b10111da73', null); +INSERT INTO `sys_role_permission` VALUES ('f17ab8ad1e71341140857ef4914ef297', '21c5a3187763729408b40afb0d0fdfa8', '732d48f8e0abe99fe6a23d18a3171cd1', null); +INSERT INTO `sys_role_permission` VALUES ('f1e64337a340851c05ce380a4cd8c827', 'f6817f48af4fb3af11b9e8bf182f618b', 'fb367426764077dcf94640c843733985', null); +INSERT INTO `sys_role_permission` VALUES ('f4587c9881865a9d25cc3bfc523da70c', 'f6817f48af4fb3af11b9e8bf182f618b', 'b4dfc7d5dd9e8d5b6dd6d4579b1aa559', null); +INSERT INTO `sys_role_permission` VALUES ('f55be9d4b4ff6ddcbd917cf4feb22ab6', 'f6817f48af4fb3af11b9e8bf182f618b', '027aee69baee98a0ed2e01806e89c891', null); +INSERT INTO `sys_role_permission` VALUES ('f641ae7d1a22add2697259d16dd0a93b', 'f6817f48af4fb3af11b9e8bf182f618b', 'c89018ea6286e852b424466fd92a2ffc', null); +INSERT INTO `sys_role_permission` VALUES ('f8f3fb503568a404dad05fd3e67e62a2', 'f6817f48af4fb3af11b9e8bf182f618b', '08e6b9dc3c04489c8e1ff2ce6f105aa4', null); +INSERT INTO `sys_role_permission` VALUES ('fa242a4d2fcf1582bd4bb72d6ed71cd7', 'f6817f48af4fb3af11b9e8bf182f618b', '277bfabef7d76e89b33062b16a9a5020', null); +INSERT INTO `sys_role_permission` VALUES ('fcd15dba62849353702fd0499fb2660f', 'f6817f48af4fb3af11b9e8bf182f618b', '2dbbafa22cda07fa5d169d741b81fe12', null); +INSERT INTO `sys_role_permission` VALUES ('fd86f6b08eb683720ba499f9d9421726', 'ee8626f80f7c2619917b6236f3a7f02b', '693ce69af3432bd00be13c3971a57961', null); +INSERT INTO `sys_role_permission` VALUES ('fed41a4671285efb266cd404f24dd378', '52b0cf022ac4187b2a70dfa4f8b2d940', '00a2a0ae65cdca5e93209cdbde97cbe6', null); + +-- ---------------------------- +-- Table structure for sys_sms +-- ---------------------------- +DROP TABLE IF EXISTS `sys_sms`; +CREATE TABLE `sys_sms` ( + `id` varchar(32) NOT NULL COMMENT 'ID', + `es_title` varchar(100) default NULL COMMENT '消息标题', + `es_type` varchar(1) default NULL COMMENT '发送方式:1短信 2邮件 3微信', + `es_receiver` varchar(50) default NULL COMMENT '接收人', + `es_param` varchar(1000) default NULL COMMENT '发送所需参数Json格式', + `es_content` longtext COMMENT '推送内容', + `es_send_time` datetime default NULL COMMENT '推送时间', + `es_send_status` varchar(1) default NULL COMMENT '推送状态 0未推送 1推送成功 2推送失败 -1失败不再发送', + `es_send_num` int(11) default NULL COMMENT '发送次数 超过5次不再发送', + `es_result` varchar(255) default NULL COMMENT '推送失败原因', + `remark` 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`), + KEY `index_type` USING BTREE (`es_type`), + KEY `index_receiver` USING BTREE (`es_receiver`), + KEY `index_sendtime` USING BTREE (`es_send_time`), + KEY `index_status` USING BTREE (`es_send_status`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- ---------------------------- +-- Records of sys_sms +-- ---------------------------- +INSERT INTO `sys_sms` VALUES ('402880e74dc2f361014dc2f8411e0001', '消息推送测试333', '2', '411944058@qq.com', null, '张三你好,你的订单4028d881436d514601436d521ae80165已付款!', '2015-06-05 17:06:01', '3', null, null, '认证失败错误的用户名或者密码', 'admin', '2015-06-05 17:05:59', 'admin', '2015-11-19 22:30:39'); +INSERT INTO `sys_sms` VALUES ('402880ea533647b00153364e74770001', '发个问候', '3', 'admin', null, '你好', '2016-03-02 00:00:00', '2', null, null, null, 'admin', '2016-03-02 15:50:24', 'admin', '2018-07-05 19:53:01'); +INSERT INTO `sys_sms` VALUES ('402880ee5a17e711015a17f3188e013f', '消息推送测试333', '2', '411944058@qq.com', null, '张三你好,你的订单4028d881436d514601436d521ae80165已付款!', null, '2', null, null, null, 'admin', '2017-02-07 17:41:31', 'admin', '2017-03-10 11:37:05'); +INSERT INTO `sys_sms` VALUES ('402880f05ab649b4015ab64b9cd80012', '消息推送测试333', '2', '411944058@qq.com', null, '张三你好,你的订单4028d881436d514601436d521ae80165已付款!', '2017-11-16 15:58:15', '3', null, null, null, 'admin', '2017-03-10 11:38:13', 'admin', '2017-07-31 17:24:54'); +INSERT INTO `sys_sms` VALUES ('402880f05ab7b035015ab7c4462c0004', '消息推送测试333', '2', '411944058@qq.com', null, '张三你好,你的订单4028d881436d514601436d521ae80165已付款!', '2017-11-16 15:58:15', '3', null, null, null, 'admin', '2017-03-10 18:29:37', null, null); +INSERT INTO `sys_sms` VALUES ('402881f3646a472b01646a4a5af00001', '催办:HR审批', '3', 'admin', null, 'admin,您好!\r\n请前待办任务办理事项!HR审批\r\n\r\n\r\n===========================\r\n此消息由系统发出', '2018-07-05 19:53:35', '2', null, null, null, 'admin', '2018-07-05 19:53:35', 'admin', '2018-07-07 13:45:24'); +INSERT INTO `sys_sms` VALUES ('402881f3647da06c01647da43a940014', '催办:HR审批', '3', 'admin', null, 'admin,您好!\r\n请前待办任务办理事项!HR审批\r\n\r\n\r\n===========================\r\n此消息由系统发出', '2018-07-09 14:04:32', '2', null, null, null, 'admin', '2018-07-09 14:04:32', 'admin', '2018-07-09 18:51:30'); +INSERT INTO `sys_sms` VALUES ('c0f7f27f65a5678961306eb0364c05cd', '催办:HR审批', '2', '445654970@qq.com', '{\"taskName\":\"HR审批\",\"userName\":\"admin\"}', 'admin,您好!\r\n请前待办任务办理事项!HR审批\r\n\r\n\r\n===========================\r\n此消息由系统发出', '2019-04-12 20:51:28', '0', '0', null, null, 'admin', '2019-04-12 20:51:28', null, null); + +-- ---------------------------- +-- Table structure for sys_sms_template +-- ---------------------------- +DROP TABLE IF EXISTS `sys_sms_template`; +CREATE TABLE `sys_sms_template` ( + `id` varchar(32) NOT NULL COMMENT '主键', + `template_name` varchar(50) default NULL COMMENT '模板标题', + `template_code` varchar(32) NOT NULL COMMENT '模板CODE', + `template_type` varchar(1) NOT NULL COMMENT '模板类型:1短信 2邮件 3微信', + `template_content` varchar(1000) NOT NULL COMMENT '模板内容', + `template_test_json` varchar(1000) default NULL COMMENT '模板测试json', + `create_time` datetime default NULL COMMENT '创建日期', + `create_by` varchar(32) default NULL COMMENT '创建人登录名称', + `update_time` datetime default NULL COMMENT '更新日期', + `update_by` varchar(32) default NULL COMMENT '更新人登录名称', + PRIMARY KEY (`id`), + UNIQUE KEY `uniq_templatecode` USING BTREE (`template_code`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- ---------------------------- +-- Records of sys_sms_template +-- ---------------------------- +INSERT INTO `sys_sms_template` VALUES ('4028608164691b000164693108140003', '催办:${taskName}', 'SYS001', '2', '${userName},您好!\r\n请前待办任务办理事项!${taskName}\r\n\r\n\r\n===========================\r\n此消息由系统发出', '{\r\n\"taskName\":\"HR审批\",\r\n\"userName\":\"admin\"\r\n}', '2018-07-05 14:46:18', 'admin', '2018-07-05 18:31:34', 'admin'); + +-- ---------------------------- +-- 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(100) 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(2) default NULL COMMENT '状态(1:正常 2:冻结 )', + `del_flag` varchar(1) default NULL COMMENT '删除状态(0,正常,1已删除)', + `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`), + UNIQUE KEY `index_user_name` USING BTREE (`username`), + KEY `index_user_status` USING BTREE (`status`), + KEY `index_user_del_flag` USING BTREE (`del_flag`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户表'; + +-- ---------------------------- +-- Records of sys_user +-- ---------------------------- +INSERT INTO `sys_user` VALUES ('42d153bffeea74f72a9c1697874fa4a7', 'test22', '23232', 'ac52e15671a377cf', '5FMD48RM', 'user/20190314/ly-plate-e_1552531617500.png', '2019-02-09 00:00:00', '1', 'zhangdaiscott@163.com', '18611782222', '1', '0', 'admin', '2019-01-26 18:01:10', 'admin', '2019-03-23 15:05:50'); +INSERT INTO `sys_user` VALUES ('a75d45a015c44384a04449ee80dc3503', 'jeecg', 'jeecg', '3dd8371f3cf8240e', 'vDDkDzrK', 'user/20190220/e1fe9925bc315c60addea1b98eb1cb1349547719_1550656892940.jpg', null, '2', null, null, '1', '0', 'admin', '2019-02-13 16:02:36', 'admin', '2019-04-09 15:47:36'); +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-02-26 17:55:02'); +INSERT INTO `sys_user` VALUES ('f0019fdebedb443c98dcb17d88222c38', 'zhagnxiao', '张小红', 'f898134e5e52ae11a2ffb2c3b57a4e90', 'go3jJ4zX', 'user/20190401/20180607175028Fn1Lq7zw_1554118444672.png', '2019-04-01 00:00:00', null, null, null, '1', '0', 'admin', '2023-10-01 19:34:10', 'admin', '2019-04-10 22:00:22'); + +-- ---------------------------- +-- 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 `index_depart_groupk_userid` USING BTREE (`user_id`), + KEY `index_depart_groupkorgid` USING BTREE (`dep_id`), + KEY `index_depart_groupk_uidanddid` USING BTREE (`user_id`,`dep_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- ---------------------------- +-- Records of sys_user_depart +-- ---------------------------- +INSERT INTO `sys_user_depart` VALUES ('0c42ba309c2c4cad35836ec2336676fa', '42d153bffeea74f72a9c1697874fa4a7', '6d35e179cd814e3299bd588ea7daed3f'); +INSERT INTO `sys_user_depart` VALUES ('2835834d133f9118ee87a666e0f5501e', 'a75d45a015c44384a04449ee80dc3503', 'a7d7e77e06c84325a40932163adcdaa6'); +INSERT INTO `sys_user_depart` VALUES ('1f3a0267811327b9eca86b0cc2b956f3', 'bcbe1290783a469a83ae3bd8effe15d4', '5159cde220114246b045e574adceafe9'); +INSERT INTO `sys_user_depart` VALUES ('577ae220081f78ceaf8cb26eb75330ab', 'e9ca23d68d884d4ebb19d07889727dae', '4f1765520d6346f9bd9c79e2479e5b12'); +INSERT INTO `sys_user_depart` VALUES ('15e0d72bcbab86a41e38222b1f09428e', 'e9ca23d68d884d4ebb19d07889727dae', 'c6d7cb4deeac411cb3384b1b31278596'); +INSERT INTO `sys_user_depart` VALUES ('ac52f23ae625eb6560c9227170b88166', 'f0019fdebedb443c98dcb17d88222c38', '57197590443c44f083d42ae24ef26a2c'); +INSERT INTO `sys_user_depart` VALUES ('179660a8b9a122f66b73603799a10924', 'f0019fdebedb443c98dcb17d88222c38', '67fc001af12a4f9b8458005d3f19934a'); + +-- ---------------------------- +-- 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`), + KEY `index2_groupuu_user_id` USING BTREE (`user_id`), + KEY `index2_groupuu_ole_id` USING BTREE (`role_id`), + KEY `index2_groupuu_useridandroleid` USING BTREE (`user_id`,`role_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户角色表'; + +-- ---------------------------- +-- Records of sys_user_role +-- ---------------------------- +INSERT INTO `sys_user_role` VALUES ('b3ffd9311a1ca296c44e2409b547384f', '01b802058ea94b978a2c96f4807f6b48', '1'); +INSERT INTO `sys_user_role` VALUES ('0ede6d23d53bc7dc990346ff14faabee', '3db4cf42353f4e868b7ccfeef90505d2', 'ee8626f80f7c2619917b6236f3a7f02b'); +INSERT INTO `sys_user_role` VALUES ('e78d210d24aaff48e0a736e2ddff4cdc', '3e177fede453430387a8279ced685679', 'ee8626f80f7c2619917b6236f3a7f02b'); +INSERT INTO `sys_user_role` VALUES ('f2de3ae7b5efd8345581aa802a6675d6', '41b1be8d4c52023b0798f51164ca682d', 'e51758fa916c881624b046d26bd09230'); +INSERT INTO `sys_user_role` VALUES ('6f9da7310489bac1e5f95e0efe92b4ce', '42d153bffeea74f72a9c1697874fa4a7', 'e51758fa916c881624b046d26bd09230'); +INSERT INTO `sys_user_role` VALUES ('f2922a38ba24fb53749e45a0c459adb3', '439ae3e9bcf7418583fcd429cadb1d72', '1'); +INSERT INTO `sys_user_role` VALUES ('f72c6190b0722e798147e73c776c6ac9', '439ae3e9bcf7418583fcd429cadb1d72', 'ee8626f80f7c2619917b6236f3a7f02b'); +INSERT INTO `sys_user_role` VALUES ('ee45d0343ecec894b6886effc92cb0b7', '4d8fef4667574b24a9ccfedaf257810c', 'f6817f48af4fb3af11b9e8bf182f618b'); +INSERT INTO `sys_user_role` VALUES ('be2639167ede09379937daca7fc3bb73', '526f300ab35e44faaed54a9fb0742845', 'ee8626f80f7c2619917b6236f3a7f02b'); +INSERT INTO `sys_user_role` VALUES ('31af310584bd5795f76b1fe8c38294a0', '70f5dcf03f36471dabba81381919291f', 'e51758fa916c881624b046d26bd09230'); +INSERT INTO `sys_user_role` VALUES ('8d7846ec783e157174e4ce2949231a65', '7ee6630e89d17afbf6d12150197b578d', 'e51758fa916c881624b046d26bd09230'); +INSERT INTO `sys_user_role` VALUES ('79d66ef7aa137cfa9957081a1483009d', '9a668858c4c74cf5a2b25ad9608ba095', 'ee8626f80f7c2619917b6236f3a7f02b'); +INSERT INTO `sys_user_role` VALUES ('f3a4ca33848daba3e43490707ae859e7', 'a75d45a015c44384a04449ee80dc3503', 'e51758fa916c881624b046d26bd09230'); +INSERT INTO `sys_user_role` VALUES ('fe38580871c5061ba59d5c03a0840b0e', 'a75d45a015c44384a04449ee80dc3503', 'ee8626f80f7c2619917b6236f3a7f02b'); +INSERT INTO `sys_user_role` VALUES ('6ec01b4aaab790eac4ddb33d7a524a58', 'e9ca23d68d884d4ebb19d07889727dae', 'f6817f48af4fb3af11b9e8bf182f618b'); +INSERT INTO `sys_user_role` VALUES ('d2233e5be091d39da5abb0073c766224', 'f0019fdebedb443c98dcb17d88222c38', 'ee8626f80f7c2619917b6236f3a7f02b'); diff --git a/jeecg-boot/docs/db/sys-init-20190225.sql b/jeecg-boot/docs/db/sys-init-20190225.sql deleted file mode 100644 index e164ad8..0000000 --- a/jeecg-boot/docs/db/sys-init-20190225.sql +++ /dev/null @@ -1,1342 +0,0 @@ -/* -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 index 3b0ab81..e2712ec 100644 --- a/jeecg-boot/pom.xml +++ b/jeecg-boot/pom.xml @@ -4,7 +4,7 @@ <modelVersion>4.0.0</modelVersion> <groupId>org.jeecgframework.boot</groupId> <artifactId>jeecg-boot</artifactId> - <version>1.0.1</version> + <version>1.1.0</version> <parent> <groupId>org.springframework.boot</groupId> @@ -39,6 +39,7 @@ <mybatis-plus.version>3.0.6</mybatis-plus.version> <druid.version>1.1.10</druid.version> <jwt.version>0.9.1</jwt.version> + <commons.version>2.6</commons.version> </properties> <dependencies> @@ -48,6 +49,10 @@ <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-mail</artifactId> + </dependency> + <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> @@ -56,32 +61,48 @@ <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> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-actuator</artifactId> + </dependency> + <!-- <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <optional>true</optional> + </dependency> --> + + <!-- commons --> + <dependency> + <groupId>commons-io</groupId> + <artifactId>commons-io</artifactId> + <version>${commons.version}</version> </dependency> <dependency> + <groupId>commons-lang</groupId> + <artifactId>commons-lang</artifactId> + <version>${commons.version}</version> + </dependency> + + <!-- freemarker --> + <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-freemarker</artifactId> </dependency> - + + <!-- Lombok --> + <dependency> + <groupId>org.projectlombok</groupId> + <artifactId>lombok</artifactId> + </dependency> + <!-- mybatis-plus --> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>${mybatis-plus.version}</version> </dependency> - <!-- mybatis-plus --> - <!-- druid阿里巴巴数据库连接池 --> + <!-- druid --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> @@ -140,7 +161,8 @@ <artifactId>springfox-swagger-ui</artifactId> <version>2.9.2</version> </dependency> - <!-- redis --> + + <!-- Redis --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> @@ -149,13 +171,34 @@ <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> + <version>1.0.2</version> </dependency> - + + <!-- AutoPoi Excel工具类--> + <dependency> + <groupId>org.jeecgframework</groupId> + <artifactId>autopoi-web</artifactId> + <version>1.0.1</version> + </dependency> + + <!-- Hibernate --> + <dependency> + <groupId>org.hibernate</groupId> + <artifactId>hibernate-core</artifactId> + <version>4.1.0.Final</version> + <exclusions> + <exclusion> + <groupId>commons-collections</groupId> + <artifactId>commons-collections</artifactId> + </exclusion> + </exclusions> + </dependency> + </dependencies> <build> @@ -174,6 +217,14 @@ <encoding>UTF-8</encoding> </configuration> </plugin> + <!-- 打包跳过测试 --> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-surefire-plugin</artifactId> + <configuration> + <skipTests>true</skipTests> + </configuration> + </plugin> </plugins> <resources> <resource> @@ -185,6 +236,7 @@ <includes> <include>**/*.xml</include> <include>**/*.json</include> + <include>**/*.ftl</include> </includes> </resource> </resources> diff --git a/jeecg-boot/src/main/java/org/jeecg/JeecgApplication.java b/jeecg-boot/src/main/java/org/jeecg/JeecgApplication.java index b90bfc2..68c68b6 100644 --- a/jeecg-boot/src/main/java/org/jeecg/JeecgApplication.java +++ b/jeecg-boot/src/main/java/org/jeecg/JeecgApplication.java @@ -5,12 +5,12 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; import springfox.documentation.swagger2.annotations.EnableSwagger2; -@EnableSwagger2 @SpringBootApplication +@EnableSwagger2 public class JeecgApplication { public static void main(String[] args) { - System.setProperty("spring.devtools.restart.enabled", "true"); + System.setProperty("spring.devtools.restart.enabled", "false"); 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 deleted file mode 100644 index 1e41e4c..0000000 --- a/jeecg-boot/src/main/java/org/jeecg/JeecgCodeGenerator.java +++ /dev/null @@ -1,46 +0,0 @@ -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/JeecgOneGUI.java b/jeecg-boot/src/main/java/org/jeecg/JeecgOneGUI.java new file mode 100644 index 0000000..f10fc23 --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/JeecgOneGUI.java @@ -0,0 +1,18 @@ +package org.jeecg; + +import org.jeecgframework.codegenerate.window.CodeWindow; + +/** + * @Title: 单表代码生成器入口 + * @author 张代浩 + * @site www.jeecg.org + * @version:V1.0.1 + */ +public class JeecgOneGUI { + + /** 详细使用手册: http://jeecg-boot.mydoc.io/?t=338140 */ + public static void main(String[] args) { + new CodeWindow().pack(); + } + +} \ No newline at end of file diff --git a/jeecg-boot/src/main/java/org/jeecg/JeecgOneToMainUtil.java b/jeecg-boot/src/main/java/org/jeecg/JeecgOneToMainUtil.java new file mode 100644 index 0000000..63a470e --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/JeecgOneToMainUtil.java @@ -0,0 +1,65 @@ +package org.jeecg; + +import java.util.ArrayList; +import java.util.List; + +import org.jeecgframework.codegenerate.generate.impl.CodeGenerateOneToMany; +import org.jeecgframework.codegenerate.generate.pojo.onetomany.MainTableVo; +import org.jeecgframework.codegenerate.generate.pojo.onetomany.SubTableVo; + +/** + * 代码生成器入口【一对多】 + * @author 张代浩 + * @site www.jeecg.org + * + */ +public class JeecgOneToMainUtil { + + /** + * 一对多(父子表)数据模型,生成方法 + * @param args + */ + public static void main(String[] args) { + //第一步:设置主表配置 + MainTableVo mainTable = new MainTableVo(); + mainTable.setTableName("jeecg_order_main");//表名 + mainTable.setEntityName("TestOrderMain"); //实体名 + mainTable.setEntityPackage("test2"); //包名 + mainTable.setFtlDescription("订单"); //描述 + + //第二步:设置子表集合配置 + List<SubTableVo> subTables = new ArrayList<SubTableVo>(); + //[1].子表一 + SubTableVo po = new SubTableVo(); + po.setTableName("jeecg_order_customer");//表名 + po.setEntityName("TestOrderCustom"); //实体名 + po.setEntityPackage("test2"); //包名 + po.setFtlDescription("客户明细"); //描述 + //子表外键参数配置 + /*说明: + * a) 子表引用主表主键ID作为外键,外键字段必须以_ID结尾; + * b) 主表和子表的外键字段名字,必须相同(除主键ID外); + * c) 多个外键字段,采用逗号分隔; + */ + po.setForeignKeys(new String[]{"order_id"}); + subTables.add(po); + //[2].子表二 + SubTableVo po2 = new SubTableVo(); + po2.setTableName("jeecg_order_ticket"); //表名 + po2.setEntityName("TestOrderTicket"); //实体名 + po2.setEntityPackage("test2"); //包名 + po2.setFtlDescription("产品明细"); //描述 + //子表外键参数配置 + /*说明: + * a) 子表引用主表主键ID作为外键,外键字段必须以_ID结尾; + * b) 主表和子表的外键字段名字,必须相同(除主键ID外); + * c) 多个外键字段,采用逗号分隔; + */ + po2.setForeignKeys(new String[]{"order_id"}); + subTables.add(po2); + mainTable.setSubTables(subTables); + + //第三步:一对多(父子表)数据模型,代码生成 + new CodeGenerateOneToMany(mainTable,subTables).generateCodeFile(); + } +} 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 index 13cc4d6..abe923d 100644 --- 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 @@ -20,23 +20,27 @@ public class Result<T> implements Serializable { /** * 成功标志 */ - private boolean success; + private boolean success = true; /** * 返回处理消息 */ - private String message; + private String message = "操作成功!"; /** * 返回代码 */ - private Integer code; + private Integer code = 0; /** * 返回数据对象 data */ private T result; + public Result() { + + } + /** * 时间戳 */ @@ -74,11 +78,11 @@ public class Result<T> implements Serializable { return r; } - public static Result<Object> ok(Object obj) { + public static Result<Object> ok(Object data) { Result<Object> r = new Result<Object>(); r.setSuccess(true); r.setCode(CommonConstant.SC_OK_200); - r.setResult(obj); + r.setResult(data); return r; } } diff --git a/jeecg-boot/src/main/java/org/jeecg/common/aspect/DictAspect.java b/jeecg-boot/src/main/java/org/jeecg/common/aspect/DictAspect.java new file mode 100644 index 0000000..689f5f1 --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/common/aspect/DictAspect.java @@ -0,0 +1,126 @@ +package org.jeecg.common.aspect; + +import java.lang.reflect.Field; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +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.jeecg.common.api.vo.Result; +import org.jeecg.common.aspect.annotation.Dict; +import org.jeecg.modules.system.service.ISysDictService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.util.StringUtils; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; + +import lombok.extern.slf4j.Slf4j; + +/** + * @Description: 字典aop类 + * @Author: dangzhenghui + * @Date: 2019-3-17 21:50 + * @Version: 1.0 + */ +@Aspect +@Component +@Slf4j +public class DictAspect { + private static final Logger logger = LoggerFactory.getLogger(DictAspect.class); + @Autowired + private ISysDictService dictService; + // 定义切点Pointcut + @Pointcut("execution(public * org.jeecg.modules.*.*.*Controller.*(..))") + public void excudeService() { + } + + @Around("excudeService()") + public Object doAround(ProceedingJoinPoint pjp) throws Throwable { + long time1=System.currentTimeMillis(); + Object result = pjp.proceed(); + long time2=System.currentTimeMillis(); + log.debug("获取JSON数据 耗时:"+(time2-time1)+"ms"); + long start=System.currentTimeMillis(); + parseDictText(result); + long end=System.currentTimeMillis(); + log.debug("解析注入JSON数据 耗时"+(end-start)+"ms"); + return result; + } + + /** + * 本方法针对返回对象为Result 的IPage的分页列表数据进行动态字典注入 + * 字典注入实现 通过对实体类添加注解@dict 来标识需要的字典内容,字典分为单字典code即可 ,table字典 code table text配合使用与原来jeecg的用法相同 + * 示例为SysUser 字段为sex 添加了注解@Dict(dicCode = "sex") 会在字典服务立马查出来对应的text 然后在请求list的时候将这个字典text,已字段名称加_dictText形式返回到前端 + * 例输入当前返回值的就会多出一个sex_dictText字段 + * { + * sex:1, + * sex_dictText:"男" + * } + * 前端直接取值sext_dictText在table里面无需再进行前端的字典转换了 + * customRender:function (text) { + * if(text==1){ + * return "男"; + * }else if(text==2){ + * return "女"; + * }else{ + * return text; + * } + * } + * 目前vue是这么进行字典渲染到table上的多了就很麻烦了 这个直接在服务端渲染完成前端可以直接用 + * @param result + */ + private void parseDictText(Object result) { + if (result instanceof Result) { + if (((Result) result).getResult() instanceof IPage) { + List<JSONObject> items = new ArrayList<>(); + for (Object record : ((IPage) ((Result) result).getResult()).getRecords()) { + ObjectMapper mapper = new ObjectMapper(); + String json="{}"; + try { + //解决@JsonFormat注解解析不了的问题详见SysAnnouncement类的@JsonFormat + json = mapper.writeValueAsString(record); + } catch (JsonProcessingException e) { + logger.error("json解析失败"+e.getMessage()); + e.printStackTrace(); + } + JSONObject item = JSONObject.parseObject(json); + for (Field field : record.getClass().getDeclaredFields()) { + if (field.getAnnotation(Dict.class) != null) { + String code = field.getAnnotation(Dict.class).dicCode(); + String text = field.getAnnotation(Dict.class).dicText(); + String table = field.getAnnotation(Dict.class).dictTable(); + String key = String.valueOf(item.get(field.getName())); + String textValue=null; + if (!StringUtils.isEmpty(table)){ + textValue= dictService.queryTableDictTextByKey(table,text,code,key); + }else { + textValue = dictService.queryDictTextByKey(code, key); + } + item.put(field.getName() + "_dictText", textValue); + } + //date类型默认转换string格式化日期 + if (field.getType().getName().equals("java.util.Date")&&field.getAnnotation(JsonFormat.class)==null&&item.get(field.getName())!=null){ + SimpleDateFormat aDate=new SimpleDateFormat("yyyy-mm-dd HH:mm:ss"); + item.put(field.getName(), aDate.format(new Date((Long) item.get(field.getName())))); + } + } + items.add(item); + } + ((IPage) ((Result) result).getResult()).setRecords(items); + } + + } + } + +} diff --git a/jeecg-boot/src/main/java/org/jeecg/common/aspect/PermissionDataAspect.java b/jeecg-boot/src/main/java/org/jeecg/common/aspect/PermissionDataAspect.java new file mode 100644 index 0000000..e5807b4 --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/common/aspect/PermissionDataAspect.java @@ -0,0 +1,175 @@ +package org.jeecg.common.aspect; + +import java.lang.reflect.Method; +import java.util.List; + +import javax.servlet.http.HttpServletRequest; + +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.PermissionData; +import org.jeecg.common.util.SpringContextUtils; +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.SysPermissionDataRule; +import org.jeecg.modules.system.model.SysUserCacheInfo; +import org.jeecg.modules.system.service.ISysPermissionDataRuleService; +import org.jeecg.modules.system.service.ISysPermissionService; +import org.jeecg.modules.system.service.ISysUserService; +import org.jeecg.modules.system.util.JeecgDataAutorUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.util.AntPathMatcher; +import org.springframework.util.PathMatcher; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; + +import lombok.extern.slf4j.Slf4j; + +/** + * 数据权限切面处理类 + * 当被请求的方法有注解PermissionData时,会在往当前request中写入数据权限信息 + * @date 2019年4月10日 + * @Version: 1.0 + */ +@Aspect +@Component +@Slf4j +public class PermissionDataAspect { + + @Autowired + private ISysPermissionService sysPermissionService; + + @Autowired + private ISysPermissionDataRuleService sysPermissionDataRuleService; + + @Autowired + private ISysUserService sysUserService; + + @Pointcut("@annotation(org.jeecg.common.aspect.annotation.PermissionData)") + public void pointCut() { + + } + + @Around("pointCut()") + public Object arround(ProceedingJoinPoint point) throws Throwable{ + HttpServletRequest request = SpringContextUtils.getHttpServletRequest(); + MethodSignature signature = (MethodSignature) point.getSignature(); + Method method = signature.getMethod(); + PermissionData pd = method.getAnnotation(PermissionData.class); + String component = pd.pageComponent(); + SysPermission currentSyspermission=null; + if(oConvertUtils.isNotEmpty(component)) { + //1.通过注解属性pageComponent 获取菜单 + LambdaQueryWrapper<SysPermission> query = new LambdaQueryWrapper<SysPermission>(); + query.eq(SysPermission::getDelFlag,0); + query.eq(SysPermission::getComponent, component); + currentSyspermission = sysPermissionService.getOne(query); + }else { + String requestMethod = request.getMethod(); + String requestPath = request.getRequestURI().substring(request.getContextPath().length()); + requestPath = filterUrl(requestPath); + log.info("拦截请求>>"+requestPath+";请求类型>>"+requestMethod); + //1.直接通过前端请求地址查询菜单 + LambdaQueryWrapper<SysPermission> query = new LambdaQueryWrapper<SysPermission>(); + query.eq(SysPermission::getMenuType,2); + query.eq(SysPermission::getDelFlag,0); + query.eq(SysPermission::getUrl, requestPath); + currentSyspermission = sysPermissionService.getOne(query); + //2.未找到 再通过正则匹配获取菜单 + if(currentSyspermission==null) { + String regUrl = getRegexpUrl(requestPath); + if(regUrl!=null) { + currentSyspermission = sysPermissionService.getOne(new LambdaQueryWrapper<SysPermission>().eq(SysPermission::getMenuType,2).eq(SysPermission::getUrl, regUrl).eq(SysPermission::getDelFlag,0)); + } + } + } + //3.通过用户名+菜单ID 找到权限配置信息 放到request中去 + if(currentSyspermission!=null) { + String username = JwtUtil.getUserNameByToken(request); + List<SysPermissionDataRule> dataRules = sysPermissionDataRuleService.queryPermissionDataRules(username, currentSyspermission.getId()); + if(dataRules!=null && dataRules.size()>0) { + JeecgDataAutorUtils.installDataSearchConditon(request, dataRules); + + //TODO 此处将用户信息查找出来放到request中实属无奈 可以优化 + SysUserCacheInfo userinfo = sysUserService.getCacheUser(username); + JeecgDataAutorUtils.installUserInfo(request, userinfo); + } + } + + return point.proceed(); + } + + private String filterUrl(String requestPath){ + String url = ""; + if(oConvertUtils.isNotEmpty(requestPath)){ + url = requestPath.replace("\\", "/"); + url = requestPath.replace("//", "/"); + if(url.indexOf("//")>=0){ + url = filterUrl(url); + } + if(url.startsWith("/")){ + url=url.substring(1); + } + } + return url; + } + + /** + * 获取请求地址 + * @param request + * @return + */ + private String getJgAuthRequsetPath(HttpServletRequest request) { + String queryString = request.getQueryString(); + String requestPath = request.getRequestURI(); + if(oConvertUtils.isNotEmpty(queryString)){ + requestPath += "?" + queryString; + } + if (requestPath.indexOf("&") > -1) {// 去掉其他参数(保留一个参数) 例如:loginController.do?login + requestPath = requestPath.substring(0, requestPath.indexOf("&")); + } + if(requestPath.indexOf("=")!=-1){ + if(requestPath.indexOf(".do")!=-1){ + requestPath = requestPath.substring(0,requestPath.indexOf(".do")+3); + }else{ + requestPath = requestPath.substring(0,requestPath.indexOf("?")); + } + } + requestPath = requestPath.substring(request.getContextPath().length() + 1);// 去掉项目路径 + return filterUrl(requestPath); + } + + private boolean moHuContain(List<String> list,String key){ + for(String str : list){ + if(key.contains(str)){ + return true; + } + } + return false; + } + + /** + * 匹配前端传过来的地址 匹配成功返回正则地址 + * AntPathMatcher匹配地址 + *()* 匹配0个或多个字符 + *()**匹配0个或多个目录 + */ + private String getRegexpUrl(String url) { + List<String> list = sysPermissionService.queryPermissionUrlWithStar(); + if(list!=null && list.size()>0) { + for (String p : list) { + PathMatcher matcher = new AntPathMatcher(); + if(matcher.match(p, url)) { + return p; + } + } + } + return null; + } + +} diff --git a/jeecg-boot/src/main/java/org/jeecg/common/aspect/annotation/Dict.java b/jeecg-boot/src/main/java/org/jeecg/common/aspect/annotation/Dict.java new file mode 100644 index 0000000..5accee8 --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/common/aspect/annotation/Dict.java @@ -0,0 +1,42 @@ +package org.jeecg.common.aspect.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 类描述: 字典注解 + * 作 者: dangzhenghui + * 日 期: 2019年03月17日-下午9:37:16 + */ +@Target(ElementType.FIELD) +@Retention(RetentionPolicy.RUNTIME) +public @interface Dict { + /** + * 方法描述: 数据code + * 作 者: dangzhenghui + * 日 期: 2019年03月17日-下午9:37:16 + * + * @return 返回类型: String + */ + String dicCode(); + + /** + * 方法描述: 数据Text + * 作 者: dangzhenghui + * 日 期: 2019年03月17日-下午9:37:16 + * + * @return 返回类型: String + */ + String dicText() default ""; + + /** + * 方法描述: 数据字典表 + * 作 者: dangzhenghui + * 日 期: 2019年03月17日-下午9:37:16 + * + * @return 返回类型: String + */ + String dictTable() default ""; +} diff --git a/jeecg-boot/src/main/java/org/jeecg/common/aspect/annotation/PermissionData.java b/jeecg-boot/src/main/java/org/jeecg/common/aspect/annotation/PermissionData.java new file mode 100644 index 0000000..79de944 --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/common/aspect/annotation/PermissionData.java @@ -0,0 +1,25 @@ +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; + +/** + * 数据权限注解 + * @author taoyan + * @date 2019年4月11日 + */ +@Retention(RetentionPolicy.RUNTIME) +@Target({ElementType.TYPE,ElementType.METHOD}) +@Documented +public @interface PermissionData { + String value() default ""; + + + /** + * 配置菜单的组件路径,用于数据权限 + */ + String pageComponent() default ""; +} \ No newline at end of file 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 index b2df937..0ed185a 100644 --- a/jeecg-boot/src/main/java/org/jeecg/common/constant/CommonConstant.java +++ b/jeecg-boot/src/main/java/org/jeecg/common/constant/CommonConstant.java @@ -41,7 +41,7 @@ public interface CommonConstant { 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 int TOKEN_EXPIRE_TIME = 3600; //3600秒即是一小时 public static String PREFIX_USER_TOKEN = "PREFIX_USER_TOKEN "; diff --git a/jeecg-boot/src/main/java/org/jeecg/common/constant/DataBaseConstant.java b/jeecg-boot/src/main/java/org/jeecg/common/constant/DataBaseConstant.java new file mode 100644 index 0000000..5c35bbc --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/common/constant/DataBaseConstant.java @@ -0,0 +1,103 @@ +package org.jeecg.common.constant; +/** + * 数据库上下文常量 + */ +public interface DataBaseConstant { + + //*********系统上下文变量**************************************** + /** + * 数据-所属公司编码 + */ + public static final String SYS_COMPANY_CODE = "sysCompanyCode"; + /** + * 数据-所属公司编码 + */ + public static final String SYS_COMPANY_CODE_TABLE = "sys_company_code"; + /** + * 数据-所属机构编码 + */ + public static final String SYS_ORG_CODE = "sysOrgCode"; + /** + * 数据-所属机构编码 + */ + public static final String SYS_ORG_CODE_TABLE = "sys_org_code"; + /** + * 数据-系统用户编码(对应登录用户账号) + */ + public static final String SYS_USER_CODE = "sysUserCode"; + /** + * 数据-系统用户编码(对应登录用户账号) + */ + public static final String SYS_USER_CODE_TABLE = "sys_user_code"; + + /** + * 登录用户真实姓名 + */ + public static final String SYS_USER_NAME = "sysUserName"; + /** + * 登录用户真实姓名 + */ + public static final String SYS_USER_NAME_TABLE = "sys_user_name"; + /** + * 系统日期"yyyy-MM-dd" + */ + public static final String SYS_DATE = "sysDate"; + /** + * 系统日期"yyyy-MM-dd" + */ + public static final String SYS_DATE_TABLE = "sys_date"; + /** + * 系统时间"yyyy-MM-dd HH:mm" + */ + public static final String SYS_TIME = "sysTime"; + /** + * 系统时间"yyyy-MM-dd HH:mm" + */ + public static final String SYS_TIME_TABLE = "sys_time"; + //*********系统上下文变量**************************************** + + + //*********系统建表标准字段**************************************** + /** + * 创建者登录名称 + */ + public static final String CREATE_BY_TABLE = "create_by"; + /** + * 创建者登录名称 + */ + public static final String CREATE_BY = "createBy"; + /** + * 创建日期时间 + */ + public static final String CREATE_TIME_TABLE = "create_time"; + /** + * 创建日期时间 + */ + public static final String CREATE_TIME = "createTime"; + /** + * 更新用户登录名称 + */ + public static final String UPDATE_BY_TABLE = "update_by"; + /** + * 更新用户登录名称 + */ + public static final String UPDATE_BY = "updateBy"; + /** + * 更新日期时间 + */ + public static final String UPDATE_TIME = "updateTime"; + /** + * 更新日期时间 + */ + public static final String UPDATE_TIME_TABLE = "update_time"; + + /** + * 业务流程状态 + */ + public static final String BPM_STATUS = "bpmStatus"; + /** + * 业务流程状态 + */ + public static final String BPM_STATUS_TABLE = "bpm_status"; + //*********系统建表标准字段**************************************** +} diff --git a/jeecg-boot/src/main/java/org/jeecg/common/jsonschema/CommonProperty.java b/jeecg-boot/src/main/java/org/jeecg/common/jsonschema/CommonProperty.java new file mode 100644 index 0000000..a3e4484 --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/common/jsonschema/CommonProperty.java @@ -0,0 +1,140 @@ +package org.jeecg.common.jsonschema; + +import java.io.Serializable; +import java.util.List; +import java.util.Map; + +import com.alibaba.fastjson.JSONObject; + +/** + * 验证通用属性 + */ +public abstract class CommonProperty implements Serializable{ + + private static final long serialVersionUID = -426159949502493187L; + + + protected String key; + + + /** + * <p>此关键字的值必须是字符串或数组。如果它是一个数组,那么数组的元素必须是字符串,并且必须是唯一的。 + * <p>字符串值必须是六种基本类型之一(“null”,“boolean”,“object”,“array”,“number”或“string”),或“integer”,它匹配任何数字,零分数部分。 + * <p>当且仅当实例位于为此关键字列出的任何集合中时,实例才会验证。 + * + */ + protected String type; + + /** + * 对应JsonSchema的enum + * <p>该关键字的值必须是一个数组。这个数组应该至少有一个元素。数组中的元素应该是唯一的。如果实例的值等于此关键字的数组值中的某个元素,则实例将对此关键字成功验证。 + * 数组中的元素可以是任何值,包括null + * + * { + * "type": "string", + * "enum": ["1", "2", "3"] 需要的话可以通过这个include转一下 + * } + */ + protected List<Map<String,Object>> include; + + /** + * 对应JsonSchema的const + * <p>此关键字的值可以是任何类型,包括null。 + * 如果实例的值等于关键字的值,则实例将针对此关键字成功验证。 + */ + protected Object constant; + + //三个自定义 属性 + protected String view;// 展示类型 + protected String title;//数据库字段备注 + protected Integer order;//字段显示排序 + + public String getView() { + return view; + } + + public void setView(String view) { + this.view = view; + } + + public String getKey() { + return key; + } + + public void setKey(String key) { + this.key = key; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public List<Map<String, Object>> getInclude() { + return include; + } + + public void setInclude(List<Map<String, Object>> include) { + this.include = include; + } + + public Object getConstant() { + return constant; + } + + public void setConstant(Object constant) { + this.constant = constant; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public Integer getOrder() { + return order; + } + + public void setOrder(Integer order) { + this.order = order; + } + + /** + * 返回一个map有两个key + * <P>key ---> Property JSON的key + * <P>prop --> JSON object + * @return + */ + public abstract Map<String,Object> getPropertyJson(); + + public JSONObject getCommonJson() { + JSONObject json = new JSONObject(); + json.put("type", type); + if(include!=null && include.size()>0) { + json.put("enum", include); + } + if(constant!=null) { + json.put("const", constant); + } + if(title!=null) { + json.put("title", title); + } + if(order!=null) { + json.put("order", order); + } + if(view==null) { + json.put("view", "input"); + }else { + json.put("view", view); + } + return json; + } + + +} diff --git a/jeecg-boot/src/main/java/org/jeecg/common/jsonschema/JsonSchemaDescrip.java b/jeecg-boot/src/main/java/org/jeecg/common/jsonschema/JsonSchemaDescrip.java new file mode 100644 index 0000000..1df0dde --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/common/jsonschema/JsonSchemaDescrip.java @@ -0,0 +1,87 @@ +package org.jeecg.common.jsonschema; + +import java.io.Serializable; +import java.util.List; + +/** + * JsonSchema 模式类 + * < http://json-schema.org/draft-07/schema# > + */ +public class JsonSchemaDescrip implements Serializable{ + + /** + * + */ + private static final long serialVersionUID = 7682073117441544718L; + + + private String $schema = "http://json-schema.org/draft-07/schema#"; + + /** + * 用它给我们的模式提供了标题。 + */ + private String title; + + /** + * 关于模式的描述。 + */ + private String description; + + /** + *type 关键字在我们的 JSON 数据上定义了第一个约束:必须是一个 JSON 对象。 可以直接设置成object + */ + private String type; + + private List<String> required; + + + public List<String> getRequired() { + return required; + } + + public void setRequired(List<String> required) { + this.required = required; + } + + public String get$schema() { + return $schema; + } + + public void set$schema(String $schema) { + this.$schema = $schema; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public JsonSchemaDescrip() {} + + public JsonSchemaDescrip(List<String> required) { + this.description="我是一个jsonschema description"; + this.title="我是一个jsonschema title"; + this.type="object"; + this.required = required; + } + +} diff --git a/jeecg-boot/src/main/java/org/jeecg/common/jsonschema/JsonschemaUtil.java b/jeecg-boot/src/main/java/org/jeecg/common/jsonschema/JsonschemaUtil.java new file mode 100644 index 0000000..8aaa757 --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/common/jsonschema/JsonschemaUtil.java @@ -0,0 +1,69 @@ +package org.jeecg.common.jsonschema; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; + +import lombok.extern.slf4j.Slf4j; + +@Slf4j +public class JsonschemaUtil { + + /** + * 生成JsonSchema + * + * @param descrip + * @param propertyList + * @return + */ + public static JSONObject getJsonSchema(JsonSchemaDescrip descrip, List<CommonProperty> propertyList) { + JSONObject obj = new JSONObject(); + obj.put("$schema", descrip.get$schema()); + obj.put("type", descrip.getType()); + obj.put("title", descrip.getTitle()); + + List<String> requiredArr = descrip.getRequired(); + obj.put("required", requiredArr); + + JSONObject properties = new JSONObject(); + for (CommonProperty commonProperty : propertyList) { + Map<String, Object> map = commonProperty.getPropertyJson(); + properties.put(map.get("key").toString(), map.get("prop")); + } + obj.put("properties", properties); + log.info("---JSONSchema--->"+obj.toString()); + return obj; + } + + /** + * 生成JsonSchema 用于子对象 + * @param title 子对象描述 + * @param requiredArr 子对象必填属性名集合 + * @param propertyList 子对象属性集合 + * @return + */ + public static JSONObject getSubJsonSchema(String title,List<String> requiredArr,List<CommonProperty> propertyList) { + JSONObject obj = new JSONObject(); + obj.put("type", "object"); + obj.put("view", "tab"); + obj.put("title", title); + + if(requiredArr==null) { + requiredArr = new ArrayList<String>(); + } + obj.put("required", requiredArr); + + JSONObject properties = new JSONObject(); + for (CommonProperty commonProperty : propertyList) { + Map<String, Object> map = commonProperty.getPropertyJson(); + properties.put(map.get("key").toString(), map.get("prop")); + } + obj.put("properties", properties); + //log.info("---JSONSchema--->"+obj.toString()); + return obj; + } + +} diff --git a/jeecg-boot/src/main/java/org/jeecg/common/jsonschema/validate/NumberProperty.java b/jeecg-boot/src/main/java/org/jeecg/common/jsonschema/validate/NumberProperty.java new file mode 100644 index 0000000..c98bfde --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/common/jsonschema/validate/NumberProperty.java @@ -0,0 +1,139 @@ +package org.jeecg.common.jsonschema.validate; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.jeecg.common.jsonschema.CommonProperty; + +import com.alibaba.fastjson.JSONObject; + +public class NumberProperty extends CommonProperty { + + private static final long serialVersionUID = -558615331436437200L; + + /** + * 倍数 + * 验证实例是否为此数值的倍数 + * “multipleOf”的值必须是一个数字,严格大于0。 + */ + private Integer multipleOf; + + /** + * 小于等于 + * “maximum”的值必须是一个数字,表示数字实例的包含上限。 + * 如果实例是数字,则仅当实例小于或等于“最大”时,此关键字才会生效。 + */ + private Integer maxinum; + + /** + * 小于 + * “exclusiveMaximum”的值必须是数字,表示数字实例的独占上限。 + * 如果实例是数字,则实例仅在其值严格小于(不等于)“exclusiveMaximum”时才有效。 + */ + private Integer exclusiveMaximum; + + /** + * 大于等于 + */ + private Integer minimum; + + /** + * 大于等于 + */ + private Integer exclusiveMinimum; + + public Integer getMultipleOf() { + return multipleOf; + } + + public void setMultipleOf(Integer multipleOf) { + this.multipleOf = multipleOf; + } + + public Integer getMaxinum() { + return maxinum; + } + + public void setMaxinum(Integer maxinum) { + this.maxinum = maxinum; + } + + public Integer getExclusiveMaximum() { + return exclusiveMaximum; + } + + public void setExclusiveMaximum(Integer exclusiveMaximum) { + this.exclusiveMaximum = exclusiveMaximum; + } + + public Integer getMinimum() { + return minimum; + } + + public void setMinimum(Integer minimum) { + this.minimum = minimum; + } + + public Integer getExclusiveMinimum() { + return exclusiveMinimum; + } + + public void setExclusiveMinimum(Integer exclusiveMinimum) { + this.exclusiveMinimum = exclusiveMinimum; + } + + public NumberProperty() {} + + /** + * 构造器 + * @param key 字段名 + * @param title 字段备注 + * @param type number和integer + */ + public NumberProperty(String key,String title,String type) { + this.key = key; + this.type = type; + this.title = title; + this.view = "number"; + } + + /** + * 列表类型的走这个构造器 字典里存储的都是字符串 没法走这个构造器 + * @param key + * @param type + * @param view list-checkbox-radio + * @param include + */ + public NumberProperty(String key,String title,String view,List<Map<String,Object>> include) { + this.type = "integer"; + this.key = key; + this.view = view; + this.title = title; + this.include = include; + } + + @Override + public Map<String,Object> getPropertyJson() { + Map<String,Object> map = new HashMap<>(); + map.put("key",getKey()); + JSONObject prop = getCommonJson(); + if(multipleOf!=null) { + prop.put("multipleOf",multipleOf); + } + if(maxinum!=null) { + prop.put("maxinum",maxinum); + } + if(exclusiveMaximum!=null) { + prop.put("exclusiveMaximum",exclusiveMaximum); + } + if(minimum!=null) { + prop.put("minimum",minimum); + } + if(exclusiveMinimum!=null) { + prop.put("exclusiveMinimum",exclusiveMinimum); + } + map.put("prop",prop); + return map; + } +} diff --git a/jeecg-boot/src/main/java/org/jeecg/common/jsonschema/validate/StringProperty.java b/jeecg-boot/src/main/java/org/jeecg/common/jsonschema/validate/StringProperty.java new file mode 100644 index 0000000..ce2cce8 --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/common/jsonschema/validate/StringProperty.java @@ -0,0 +1,100 @@ +package org.jeecg.common.jsonschema.validate; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.jeecg.common.jsonschema.CommonProperty; + +import com.alibaba.fastjson.JSONObject; + +public class StringProperty extends CommonProperty { + + private static final long serialVersionUID = -3200493311633999539L; + + private Integer maxLength; + + private Integer minLength; + + /** + * 根据ECMA 262正则表达式方言,该字符串应该是有效的正则表达式。 + */ + private String pattern; + + public Integer getMaxLength() { + return maxLength; + } + + + public void setMaxLength(Integer maxLength) { + this.maxLength = maxLength; + } + + public Integer getMinLength() { + return minLength; + } + + public void setMinLength(Integer minLength) { + this.minLength = minLength; + } + + public String getPattern() { + return pattern; + } + + public void setPattern(String pattern) { + this.pattern = pattern; + } + + public StringProperty() {} + + /** + * 一般字符串类型走这个构造器 + * @param key 字段名 + * @param title 字段备注 + * @param view 展示控件 + * @param maxLength 数据库字段最大长度 + */ + public StringProperty(String key,String title,String view,Integer maxLength) { + this.maxLength = maxLength; + this.key = key; + this.view = view; + this.title = title; + this.type = "string"; + } + + /** + * 列表类型的走这个构造器 + * @param key 字段名 + * @param title 字段备注 + * @param view 展示控件 list-checkbox-radio + * @param maxLength 数据库字段最大长度 + * @param include 数据字典 + */ + public StringProperty(String key,String title,String view,Integer maxLength,List<Map<String,Object>> include) { + this.maxLength = maxLength; + this.key = key; + this.view = view; + this.title = title; + this.type = "string"; + this.include = include; + } + @Override + public Map<String, Object> getPropertyJson() { + Map<String,Object> map = new HashMap<>(); + map.put("key",getKey()); + JSONObject prop = getCommonJson(); + if(maxLength!=null) { + prop.put("maxLength",maxLength); + } + if(minLength!=null) { + prop.put("minLength",minLength); + } + if(pattern!=null) { + prop.put("pattern",pattern); + } + map.put("prop",prop); + return map; + } + +} 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 index e93d9ac..7e1b663 100644 --- 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 @@ -40,7 +40,7 @@ import lombok.extern.slf4j.Slf4j; @RequestMapping("/sys/common") public class CommonController { - @Value(value = "${uploadpath}") + @Value(value = "${jeecg.path.upload}") private String uploadpath; @PostMapping(value = "/upload") diff --git a/jeecg-boot/src/main/java/org/jeecg/common/system/query/QueryCondition.java b/jeecg-boot/src/main/java/org/jeecg/common/system/query/QueryCondition.java new file mode 100644 index 0000000..a9bad2a --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/common/system/query/QueryCondition.java @@ -0,0 +1,55 @@ +package org.jeecg.common.system.query; + +import java.io.Serializable; + +public class QueryCondition implements Serializable { + + private static final long serialVersionUID = 4740166316629191651L; + + private String field; + private String type; + private String rule; + private String val; + + public String getField() { + return field; + } + + public void setField(String field) { + this.field = field; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getRule() { + return rule; + } + + public void setRule(String rule) { + this.rule = rule; + } + + public String getVal() { + return val; + } + + public void setVal(String val) { + this.val = val; + } + + @Override + public String toString(){ + StringBuffer sb =new StringBuffer(); + if(field == null || "".equals(field)){ + return ""; + } + sb.append(this.field).append(" ").append(this.rule).append(" ").append(this.type).append(" ").append(this.val); + return sb.toString(); + } +} diff --git a/jeecg-boot/src/main/java/org/jeecg/common/system/query/QueryGenerator.java b/jeecg-boot/src/main/java/org/jeecg/common/system/query/QueryGenerator.java new file mode 100644 index 0000000..9c921f7 --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/common/system/query/QueryGenerator.java @@ -0,0 +1,484 @@ +package org.jeecg.common.system.query; + +import java.beans.PropertyDescriptor; +import java.io.UnsupportedEncodingException; +import java.math.BigDecimal; +import java.net.URLDecoder; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import org.apache.commons.beanutils.PropertyUtils; +import org.jeecg.common.util.oConvertUtils; +import org.jeecg.modules.shiro.authc.util.JwtUtil; +import org.jeecg.modules.system.entity.SysPermissionDataRule; +import org.jeecg.modules.system.util.JeecgDataAutorUtils; +import org.springframework.util.NumberUtils; + +import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; + +import lombok.extern.slf4j.Slf4j; + +@Slf4j +public class QueryGenerator { + + public static final String SQL_RULES_COLUMN = "SQL_RULES_COLUMN"; + + private static final String BEGIN = "_begin"; + private static final String END = "_end"; + private static final String STAR = "*"; + private static final String COMMA = ","; + private static final String NOT_EQUAL = "!"; + /**高级查询前端传来的参数名*/ + private static final String SUPER_QUERY_PARAMS = "superQueryParams"; + + /**排序列*/ + private static final String ORDER_COLUMN = "column"; + /**排序方式*/ + private static final String ORDER_TYPE = "order"; + private static final String ORDER_TYPE_ASC = "ASC"; + + /**时间格式化 */ + private static final ThreadLocal<SimpleDateFormat> local = new ThreadLocal<SimpleDateFormat>(); + private static SimpleDateFormat getTime(){ + SimpleDateFormat time = local.get(); + if(time == null){ + time = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); + local.set(time); + } + return time; + } + + /** + * 获取查询条件构造器QueryWrapper实例 通用查询条件已被封装完成 + * @param searchObj 查询实体 + * @param parameterMap request.getParameterMap() + * @return QueryWrapper实例 + */ + public static <T> QueryWrapper<T> initQueryWrapper(T searchObj,Map<String, String[]> parameterMap){ + long start = System.currentTimeMillis(); + QueryWrapper<T> queryWrapper = new QueryWrapper<T>(); + installMplus(queryWrapper, searchObj, parameterMap); + log.info("---查询条件构造器初始化完成,耗时:"+(System.currentTimeMillis()-start)+"毫秒----"); + return queryWrapper; + } + + /** + * 组装Mybatis Plus 查询条件 + * <p>使用此方法 需要有如下几点注意: + * <br>1.使用QueryWrapper 而非LambdaQueryWrapper; + * <br>2.实例化QueryWrapper时不可将实体传入参数 + * <br>错误示例:如QueryWrapper<JeecgDemo> queryWrapper = new QueryWrapper<JeecgDemo>(jeecgDemo); + * <br>正确示例:QueryWrapper<JeecgDemo> queryWrapper = new QueryWrapper<JeecgDemo>(); + * <br>3.也可以不使用这个方法直接调用 {@link #initQueryWrapper}直接获取实例 + */ + public static void installMplus(QueryWrapper<?> queryWrapper,Object searchObj,Map<String, String[]> parameterMap) { + + /* + * 注意:权限查询由前端配置数据规则 当一个人有多个所属部门时候 可以在规则配置包含条件 orgCode 包含 #{sys_org_code} + 但是不支持在自定义SQL中写orgCode in #{sys_org_code} + 当一个人只有一个部门 就直接配置等于条件: orgCode 等于 #{sys_org_code} 或者配置自定义SQL: orgCode = '#{sys_org_code}' + */ + + //区间条件组装 模糊查询 高级查询组装 简单排序 权限查询 + PropertyDescriptor origDescriptors[] = PropertyUtils.getPropertyDescriptors(searchObj); + Map<String,SysPermissionDataRule> ruleMap = getRuleMap(); + + //权限规则自定义SQL表达式 + for (String c : ruleMap.keySet()) { + if(oConvertUtils.isNotEmpty(c) && c.startsWith(SQL_RULES_COLUMN)){ + queryWrapper.and(i ->i.apply(getSqlRuleValue(ruleMap.get(c).getRuleValue()))); + } + } + + String name, type; + for (int i = 0; i < origDescriptors.length; i++) { + //aliasName = origDescriptors[i].getName(); mybatis 不存在实体属性 不用处理别名的情况 + name = origDescriptors[i].getName(); + type = origDescriptors[i].getPropertyType().toString(); + try { + if (judgedIsUselessField(name)|| !PropertyUtils.isReadable(searchObj, name)) { + continue; + } + + //权限查询 + if(ruleMap.containsKey(name)) { + addRuleToQueryWrapper(ruleMap.get(name), name, origDescriptors[i].getPropertyType(), queryWrapper); + } + + // 添加 判断是否有区间值 + String endValue = null,beginValue = null; + if (parameterMap != null && parameterMap.containsKey(name + BEGIN)) { + beginValue = parameterMap.get(name + BEGIN)[0].trim(); + addQueryByRule(queryWrapper, name, type, beginValue, QueryRuleEnum.GE); + + } + if (parameterMap != null && parameterMap.containsKey(name + END)) { + endValue = parameterMap.get(name + END)[0].trim(); + addQueryByRule(queryWrapper, name, type, endValue, QueryRuleEnum.LE); + } + + //判断单值 参数带不同标识字符串 走不同的查询 + //TODO 这种前后带逗号的支持分割后模糊查询需要否 使多选字段的查询生效 + Object value = PropertyUtils.getSimpleProperty(searchObj, name); + if (null != value && value.toString().startsWith(COMMA) && value.toString().endsWith(COMMA)) { + String multiLikeval = value.toString().replace(",,", COMMA); + String[] vals = multiLikeval.substring(1, multiLikeval.length()).split(COMMA); + final String field = oConvertUtils.camelToUnderline(name); + if(vals.length>1) { + queryWrapper.and(j -> { + j = j.like(field,vals[0]); + for (int k=1;k<vals.length;k++) { + j = j.or().like(field,vals[k]); + } + return j; + }); + }else { + queryWrapper.and(j -> j.like(field,vals[0])); + } + }else { + //根据参数值带什么关键字符串判断走什么类型的查询 + QueryRuleEnum rule = convert2Rule(value); + value = replaceValue(rule,value); + addEasyQuery(queryWrapper, name, rule, value); + } + + } catch (Exception e) { + e.printStackTrace(); + } + } + // 排序逻辑 处理 + doMultiFieldsOrder(queryWrapper, parameterMap); + + //高级查询 + doSuperQuery(queryWrapper, parameterMap); + + } + + //多字段排序 TODO 需要修改前端 + public static void doMultiFieldsOrder(QueryWrapper<?> queryWrapper,Map<String, String[]> parameterMap) { + String column=null,order=null; + if(parameterMap!=null&& parameterMap.containsKey(ORDER_COLUMN)) { + column = parameterMap.get(ORDER_COLUMN)[0]; + } + if(parameterMap!=null&& parameterMap.containsKey(ORDER_TYPE)) { + order = parameterMap.get(ORDER_TYPE)[0]; + } + log.info("排序规则>>列:"+column+",排序方式:"+order); + if (oConvertUtils.isNotEmpty(column) && oConvertUtils.isNotEmpty(order)) { + if (order.toUpperCase().indexOf(ORDER_TYPE_ASC)>=0) { + queryWrapper.orderByAsc(oConvertUtils.camelToUnderline(column)); + } else { + queryWrapper.orderByDesc(oConvertUtils.camelToUnderline(column)); + } + } + } + + /** + * 高级查询 + * @param queryWrapper + * @param parameterMap + */ + public static void doSuperQuery(QueryWrapper<?> queryWrapper,Map<String, String[]> parameterMap) { + if(parameterMap!=null&& parameterMap.containsKey(SUPER_QUERY_PARAMS)){ + String superQueryParams = parameterMap.get(SUPER_QUERY_PARAMS)[0]; + // 解码 + try { + superQueryParams = URLDecoder.decode(superQueryParams, "UTF-8"); + } catch (UnsupportedEncodingException e) { + log.error("--高级查询参数转码失败!"); + e.printStackTrace(); + } + List<QueryCondition> conditions = JSON.parseArray(superQueryParams, QueryCondition.class); + log.info("---高级查询参数-->"+conditions.toString()); + + for (QueryCondition rule : conditions) { + if(oConvertUtils.isNotEmpty(rule.getField()) && oConvertUtils.isNotEmpty(rule.getRule()) && oConvertUtils.isNotEmpty(rule.getVal())){ + addEasyQuery(queryWrapper, rule.getField(), QueryRuleEnum.getByValue(rule.getRule()), rule.getVal()); + } + } + } + } + /** + * 根据所传的值 转化成对应的比较方式 + * 支持><= like in ! + * @param value + * @return + */ + private static QueryRuleEnum convert2Rule(Object value) { + // 避免空数据 + if (value == null) { + return null; + } + String val = (value + "").toString().trim(); + if (val.length() == 0) { + return null; + } + // step 1 .> < + QueryRuleEnum rule = QueryRuleEnum.getByValue(val.substring(0, 1)); + // step 2 .>= =< + if (rule == null && val.length() >= 2) { + rule = QueryRuleEnum.getByValue(val.substring(0, 2)); + } + // step 3 like + if (rule == null && val.contains(STAR)) { + if (val.startsWith(STAR) && val.endsWith(STAR)) { + rule = QueryRuleEnum.LIKE; + } else if (val.startsWith(STAR)) { + rule = QueryRuleEnum.LEFT_LIKE; + } else if(val.endsWith(STAR)){ + rule = QueryRuleEnum.RIGHT_LIKE; + } + } + // step 4 in + if (rule == null && val.contains(COMMA)) { + //TODO in 查询这里应该有个bug 如果一字段本身就是多选 此时用in查询 未必能查询出来 + rule = QueryRuleEnum.IN; + } + // step 5 != + if(rule == null && val.startsWith(NOT_EQUAL)){ + rule = QueryRuleEnum.NE; + } + return rule != null ? rule : QueryRuleEnum.EQ; + } + + /** + * 替换掉关键字字符 + * + * @param rule + * @param value + * @return + */ + private static Object replaceValue(QueryRuleEnum rule, Object value) { + if (rule == null) { + return null; + } + if (! (value instanceof String)){ + return value; + } + String val = (value + "").toString().trim(); + if (rule == QueryRuleEnum.LIKE) { + value = val.substring(1, val.length() - 1); + } else if (rule == QueryRuleEnum.LEFT_LIKE || rule == QueryRuleEnum.NE) { + value = val.substring(1); + } else if (rule == QueryRuleEnum.RIGHT_LIKE) { + value = val.substring(0, val.length() - 1); + } else if (rule == QueryRuleEnum.IN) { + value = val.split(","); + } else { + value = val.replace(rule.getValue(),""); + } + return value; + } + + private static void addQueryByRule(QueryWrapper<?> queryWrapper,String name,String type,String value,QueryRuleEnum rule) throws ParseException { + if(!"".equals(value)) { + Object temp; + switch (type) { + case "class java.lang.Integer": + temp = Integer.parseInt(value); + break; + case "class java.math.BigDecimal": + temp = new BigDecimal(value); + break; + case "class java.lang.Short": + temp = Short.parseShort(value); + break; + case "class java.lang.Long": + temp = Long.parseLong(value); + break; + case "class java.lang.Float": + temp = Float.parseFloat(value); + break; + case "class java.lang.Double": + temp = Double.parseDouble(value); + break; + case "class java.util.Date": + temp = getDateQueryByRule(value, rule); + break; + default: + temp = value; + break; + } + addEasyQuery(queryWrapper, name, rule, temp); + } + } + + /** + * 获取日期类型的值 + * @param value + * @param rule + * @return + * @throws ParseException + */ + private static Date getDateQueryByRule(String value,QueryRuleEnum rule) throws ParseException { + Date date = null; + if(value.length()==10) { + if(rule==QueryRuleEnum.GE) { + //比较大于 + date = getTime().parse(value + " 00:00:00"); + }else if(rule==QueryRuleEnum.LE) { + //比较小于 + date = getTime().parse(value + " 23:59:59"); + } + //TODO 日期类型比较特殊 可能oracle下不一定好使 + } + if(date==null) { + date = getTime().parse(value); + } + return date; + } + + /** + * 根据规则走不同的查询 + * @param queryWrapper QueryWrapper + * @param name 字段名字 + * @param rule 查询规则 + * @param value 查询条件值 + */ + private static void addEasyQuery(QueryWrapper<?> queryWrapper, String name, QueryRuleEnum rule, Object value) { + if (value == null || rule == null) { + return; + } + name = oConvertUtils.camelToUnderline(name); + log.info("--查询规则-->"+name+" "+rule.getValue()+" "+value); + 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: + if(value instanceof String) { + queryWrapper.in(name, (Object[])value.toString().split(",")); + }else if(value instanceof String[]) { + queryWrapper.in(name, (Object[]) value); + }else { + queryWrapper.in(name, 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: + log.info("--查询规则未匹配到---"); + break; + } + } + /** + * + * @param name + * @return + */ + private static boolean judgedIsUselessField(String name) { + return "class".equals(name) || "ids".equals(name) + || "page".equals(name) || "rows".equals(name) + || "sort".equals(name) || "order".equals(name); + } + + + + /** + * + * @return + */ + public static Map<String, SysPermissionDataRule> getRuleMap() { + Map<String, SysPermissionDataRule> ruleMap = new HashMap<String, SysPermissionDataRule>(); + List<SysPermissionDataRule> list =JeecgDataAutorUtils.loadDataSearchConditon(); + if(list != null&&list.size()>0){ + if(list.get(0)==null){ + return ruleMap; + } + for (SysPermissionDataRule rule : list) { + String column = rule.getRuleColumn(); + if(QueryRuleEnum.SQL_RULES.getValue().equals(rule.getRuleConditions())) { + column = SQL_RULES_COLUMN+rule.getId(); + } + ruleMap.put(column, rule); + } + } + return ruleMap; + } + + private static void addRuleToQueryWrapper(SysPermissionDataRule dataRule,String name, Class propertyType, QueryWrapper<?> queryWrapper) { + QueryRuleEnum rule = QueryRuleEnum.getByValue(dataRule.getRuleConditions()); + if(rule.equals(QueryRuleEnum.IN) && ! propertyType.equals(String.class)) { + String[] values = dataRule.getRuleValue().split(","); + Object[] objs = new Object[values.length]; + for (int i = 0; i < values.length; i++) { + objs[i] = NumberUtils.parseNumber(values[i], propertyType); + } + addEasyQuery(queryWrapper, name, rule, objs); + }else { + if (propertyType.equals(String.class)) { + addEasyQuery(queryWrapper, name, rule, converRuleValue(dataRule.getRuleValue())); + } else { + addEasyQuery(queryWrapper, name, rule, NumberUtils.parseNumber(dataRule.getRuleValue(), propertyType)); + } + } + } + + public static String converRuleValue(String ruleValue) { + String value = JwtUtil.getSessionData(ruleValue); + if(oConvertUtils.isEmpty(value)) { + value = JwtUtil.getUserSystemData(ruleValue,null); + } + return value!= null ? value : ruleValue; + } + + public static String getSqlRuleValue(String sqlRule){ + try { + Set<String> varParams = getSqlRuleParams(sqlRule); + for(String var:varParams){ + String tempValue = converRuleValue(var); + sqlRule = sqlRule.replace("#{"+var+"}",tempValue); + } + } catch (Exception e) { + e.printStackTrace(); + } + return sqlRule; + } + + private static Set<String> getSqlRuleParams(String sql) { + if(oConvertUtils.isEmpty(sql)){ + return null; + } + Set<String> varParams = new HashSet<String>(); + String regex = "\\#\\{\\w+\\}"; + + Pattern p = Pattern.compile(regex); + Matcher m = p.matcher(sql); + while(m.find()){ + String var = m.group(); + varParams.add(var.substring(var.indexOf("{")+1,var.indexOf("}"))); + } + return varParams; + } +} diff --git a/jeecg-boot/src/main/java/org/jeecg/common/system/query/QueryRuleEnum.java b/jeecg-boot/src/main/java/org/jeecg/common/system/query/QueryRuleEnum.java new file mode 100644 index 0000000..b7c86fe --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/common/system/query/QueryRuleEnum.java @@ -0,0 +1,71 @@ +package org.jeecg.common.system.query; + +import org.jeecg.common.util.oConvertUtils; + +/** + * Query 规则 常量 + * @author Scott + * @date 2019年02月14日 + */ +public enum QueryRuleEnum { + + GT(">","gt","大于"), + GE(">=","ge","大于等于"), + LT("<","lt","小于"), + LE("<=","le","小于等于"), + EQ("=","eq","等于"), + NE("!=","ne","不等于"), + IN("IN","in","包含"), + LIKE("LIKE","like","全模糊"), + LEFT_LIKE("LEFT_LIKE","left_like","左模糊"), + RIGHT_LIKE("RIGHT_LIKE","right_like","右模糊"), + SQL_RULES("USE_SQL_RULES","ext","自定义SQL片段"); + + private String value; + + private String condition; + + private String msg; + + QueryRuleEnum(String value, String condition, String msg){ + this.value = value; + this.condition = condition; + 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 String getCondition() { + return condition; + } + + public void setCondition(String condition) { + this.condition = condition; + } + + public static QueryRuleEnum getByValue(String value){ + if(oConvertUtils.isEmpty(value)) { + return null; + } + for(QueryRuleEnum val :values()){ + if (val.getValue().equals(value) || val.getCondition().equals(value)){ + return val; + } + } + return null; + } +} 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 index 2186b39..ec21068 100644 --- a/jeecg-boot/src/main/java/org/jeecg/common/util/DateUtils.java +++ b/jeecg-boot/src/main/java/org/jeecg/common/util/DateUtils.java @@ -222,7 +222,7 @@ public class DateUtils extends PropertyEditorSupport { * @return 系统当前的时间戳 */ public static Timestamp getTimestamp() { - return new Timestamp(new Date().getTime()); + return new Timestamp(System.currentTimeMillis()); } /** @@ -274,7 +274,7 @@ public class DateUtils extends PropertyEditorSupport { * @return 系统时间的毫秒数 */ public static long getMillis() { - return new Date().getTime(); + return System.currentTimeMillis(); } /** @@ -591,6 +591,7 @@ public class DateUtils extends PropertyEditorSupport { * String类型 转换为Date, 如果参数长度为10 转换格式”yyyy-MM-dd“ 如果参数长度为19 转换格式”yyyy-MM-dd * HH:mm:ss“ * @param text String类型的时间值 */ + @Override public void setAsText(String text) throws IllegalArgumentException { if (StringUtils.hasText(text)) { try { 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 index 0bba84b..cf70fa9 100644 --- a/jeecg-boot/src/main/java/org/jeecg/common/util/MD5Util.java +++ b/jeecg-boot/src/main/java/org/jeecg/common/util/MD5Util.java @@ -6,16 +6,17 @@ public class MD5Util { public static String byteArrayToHexString(byte b[]) { StringBuffer resultSb = new StringBuffer(); - for (int i = 0; i < b.length; i++) + 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) + if (n < 0) { n += 256; + } int d1 = n / 16; int d2 = n % 16; return hexDigits[d1] + hexDigits[d2]; @@ -26,10 +27,11 @@ public class MD5Util { try { resultString = new String(origin); MessageDigest md = MessageDigest.getInstance("MD5"); - if (charsetname == null || "".equals(charsetname)) + if (charsetname == null || "".equals(charsetname)) { resultString = byteArrayToHexString(md.digest(resultString.getBytes())); - else + } else { resultString = byteArrayToHexString(md.digest(resultString.getBytes(charsetname))); + } } catch (Exception exception) { } return resultString; 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 index 5f84e78..464759d 100644 --- a/jeecg-boot/src/main/java/org/jeecg/common/util/MyClassLoader.java +++ b/jeecg-boot/src/main/java/org/jeecg/common/util/MyClassLoader.java @@ -18,8 +18,9 @@ public class MyClassLoader extends ClassLoader { // 获得类的全名,包括包名 public static String getPackPath(Object object) { // 检查用户传入的参数是否为空 - if (object == null) + if (object == null) { throw new java.lang.IllegalArgumentException("参数不能为空!"); + } // 获得类的全名,包括包名 String clsName = object.getClass().getName(); return clsName; @@ -27,8 +28,9 @@ public class MyClassLoader extends ClassLoader { public static String getAppPath(Class cls) { // 检查用户传入的参数是否为空 - if (cls == null) + if (cls == null) { throw new java.lang.IllegalArgumentException("参数不能为空!"); + } ClassLoader loader = cls.getClassLoader(); // 获得类的全名,包括包名 String clsName = cls.getName() + ".class"; @@ -39,14 +41,15 @@ public class MyClassLoader extends ClassLoader { if (pack != null) { String packName = pack.getName(); // 此处简单判定是否是Java基础类库,防止用户传入JDK内置的类库 - if (packName.startsWith("java.") || packName.startsWith("javax.")) + if (packName.startsWith("java.") || packName.startsWith("javax.")) { throw new java.lang.IllegalArgumentException("不要传送系统类!"); + } // 在类的名称中,去掉包名的部分,获得类的文件名 clsName = clsName.substring(packName.length() + 1); // 判定包名是否是简单包名,如果是,则直接将包名转换为路径, - if (packName.indexOf(".") < 0) + if (packName.indexOf(".") < 0) { path = packName + "/"; - else {// 否则按照包名的组成部分,将包名转换为路径 + } else {// 否则按照包名的组成部分,将包名转换为路径 int start = 0, end = 0; end = packName.indexOf("."); while (end != -1) { @@ -63,14 +66,16 @@ public class MyClassLoader extends ClassLoader { String realPath = url.getPath(); // 去掉路径信息中的协议名"file:" int pos = realPath.indexOf("file:"); - if (pos > -1) + if (pos > -1) { realPath = realPath.substring(pos + 5); + } // 去掉路径信息最后包含类文件信息的部分,得到类所在的路径 pos = realPath.indexOf(path + clsName); realPath = realPath.substring(0, pos - 1); // 如果类文件被打包到JAR等文件中时,去掉对应的JAR等打包文件名 - if (realPath.endsWith("!")) + if (realPath.endsWith("!")) { realPath = realPath.substring(0, realPath.lastIndexOf("/")); + } /*------------------------------------------------------------ ClassLoader的getResource方法使用了utf-8对路径信息进行了编码,当路径 中存在中文和空格时,他会对这些字符进行转换,这样,得到的往往不是我们想要 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 index 7e185aa..16f8f39 100644 --- a/jeecg-boot/src/main/java/org/jeecg/common/util/RedisUtil.java +++ b/jeecg-boot/src/main/java/org/jeecg/common/util/RedisUtil.java @@ -367,8 +367,9 @@ public class RedisUtil { public long sSetAndTime(String key, long time, Object... values) { try { Long count = redisTemplate.opsForSet().add(key, values); - if (time > 0) + if (time > 0) { expire(key, time); + } return count; } catch (Exception e) { e.printStackTrace(); @@ -486,8 +487,9 @@ public class RedisUtil { public boolean lSet(String key, Object value, long time) { try { redisTemplate.opsForList().rightPush(key, value); - if (time > 0) + if (time > 0) { expire(key, time); + } return true; } catch (Exception e) { e.printStackTrace(); @@ -524,8 +526,9 @@ public class RedisUtil { public boolean lSet(String key, List<Object> value, long time) { try { redisTemplate.opsForList().rightPushAll(key, value); - if (time > 0) + if (time > 0) { expire(key, time); + } return true; } catch (Exception e) { e.printStackTrace(); diff --git a/jeecg-boot/src/main/java/org/jeecg/common/util/UUIDGenerator.java b/jeecg-boot/src/main/java/org/jeecg/common/util/UUIDGenerator.java new file mode 100644 index 0000000..6e8c667 --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/common/util/UUIDGenerator.java @@ -0,0 +1,95 @@ +package org.jeecg.common.util; + + +import java.net.InetAddress; + +/** + * + * @author 张代浩 + * + */ +public class UUIDGenerator { + + + /** + * 产生一个32位的UUID + * + * @return + */ + + public static String generate() { + return new StringBuilder(32).append(format(getIP())).append( + format(getJVM())).append(format(getHiTime())).append( + format(getLoTime())).append(format(getCount())).toString(); + + } + + private static final int IP; + static { + int ipadd; + try { + ipadd = toInt(InetAddress.getLocalHost().getAddress()); + } catch (Exception e) { + ipadd = 0; + } + IP = ipadd; + } + + private static short counter = (short) 0; + + private static final int JVM = (int) (System.currentTimeMillis() >>> 8); + + private final static String format(int intval) { + String formatted = Integer.toHexString(intval); + StringBuilder buf = new StringBuilder("00000000"); + buf.replace(8 - formatted.length(), 8, formatted); + return buf.toString(); + } + + private final static String format(short shortval) { + String formatted = Integer.toHexString(shortval); + StringBuilder buf = new StringBuilder("0000"); + buf.replace(4 - formatted.length(), 4, formatted); + return buf.toString(); + } + + private final static int getJVM() { + return JVM; + } + + private final static short getCount() { + synchronized (UUIDGenerator.class) { + if (counter < 0) { + counter = 0; + } + return counter++; + } + } + + /** + * Unique in a local network + */ + private final static int getIP() { + return IP; + } + + /** + * Unique down to millisecond + */ + private final static short getHiTime() { + return (short) (System.currentTimeMillis() >>> 32); + } + + private final static int getLoTime() { + return (int) System.currentTimeMillis(); + } + + private final static int toInt(byte[] bytes) { + int result = 0; + for (int i = 0; i < 4; i++) { + result = (result << 8) - Byte.MIN_VALUE + (int) bytes[i]; + } + return result; + } + +} 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 index 9723bb8..f8ea68e 100644 --- a/jeecg-boot/src/main/java/org/jeecg/common/util/oConvertUtils.java +++ b/jeecg-boot/src/main/java/org/jeecg/common/util/oConvertUtils.java @@ -29,10 +29,10 @@ public class oConvertUtils { if (object == null) { return (true); } - if (object.equals("")) { + if ("".equals(object)) { return (true); } - if (object.equals("null")) { + if ("null".equals(object)) { return (true); } return (false); @@ -64,8 +64,9 @@ public class oConvertUtils { private static String code2code(String strIn, String sourceCode, String targetCode) { String strOut = null; - if (strIn == null || (strIn.trim()).equals("")) + if (strIn == null || (strIn.trim()).equals("")) { return strIn; + } try { byte[] b = strIn.getBytes(sourceCode); for (int i = 0; i < b.length; i++) { @@ -160,6 +161,17 @@ public class oConvertUtils { return (defval); } } + + public static Integer getInt(Object object) { + if (isEmpty(object)) { + return null; + } + try { + return (Integer.parseInt(object.toString())); + } catch (NumberFormatException e) { + return null; + } + } public static int getInt(BigDecimal s, int defval) { if (s == null) { diff --git a/jeecg-boot/src/main/java/org/jeecg/config/AutoPoiConfig.java b/jeecg-boot/src/main/java/org/jeecg/config/AutoPoiConfig.java new file mode 100644 index 0000000..d17dc04 --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/config/AutoPoiConfig.java @@ -0,0 +1,28 @@ +package org.jeecg.config; + +import org.jeecgframework.core.util.ApplicationContextUtil; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * @author: Scott + * @date: 2018/2/7 + * @description: autopoi 配置类 + */ + +@Configuration +public class AutoPoiConfig { + + /** + * excel注解字典参数支持(导入导出字典值,自动翻译) + * 举例: @Excel(name = "性别", width = 15, dicCode = "sex") + * 1、导出的时候会根据字典配置,把值1,2翻译成:男、女; + * 2、导入的时候,会把男、女翻译成1,2存进数据库; + * @return + */ + @Bean + public ApplicationContextUtil applicationContextUtil() { + return new org.jeecgframework.core.util.ApplicationContextUtil(); + } + +} diff --git a/jeecg-boot/src/main/java/org/jeecg/config/RedisConfig.java b/jeecg-boot/src/main/java/org/jeecg/config/RedisConfig.java index 940b043..8a2c9fe 100644 --- a/jeecg-boot/src/main/java/org/jeecg/config/RedisConfig.java +++ b/jeecg-boot/src/main/java/org/jeecg/config/RedisConfig.java @@ -1,18 +1,34 @@ package org.jeecg.config; import java.lang.reflect.Method; +import java.time.Duration; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; import javax.annotation.Resource; + +import org.springframework.cache.CacheManager; import org.springframework.cache.annotation.CachingConfigurerSupport; import org.springframework.cache.annotation.EnableCaching; +import org.springframework.cache.concurrent.ConcurrentMapCache; import org.springframework.cache.interceptor.KeyGenerator; +import org.springframework.cache.support.SimpleCacheManager; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.data.redis.cache.RedisCacheConfiguration; +import org.springframework.data.redis.cache.RedisCacheManager; +import org.springframework.data.redis.cache.RedisCacheWriter; +import org.springframework.data.redis.connection.RedisConnectionFactory; 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.RedisSerializationContext; import org.springframework.data.redis.serializer.RedisSerializer; import org.springframework.data.redis.serializer.StringRedisSerializer; + +import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility; import com.fasterxml.jackson.annotation.PropertyAccessor; import com.fasterxml.jackson.databind.ObjectMapper; @@ -30,6 +46,7 @@ public class RedisConfig extends CachingConfigurerSupport { * 只需要讲注解上keyGenerator的值设置为keyGenerator即可</br> * @return 自定义策略生成的key */ + @Override @Bean public KeyGenerator keyGenerator() { return new KeyGenerator() { @@ -46,14 +63,6 @@ public class RedisConfig extends CachingConfigurerSupport { }; } - // 这个注释不能放开,发现自定义缓存管理器,会导致实体解析失败 - //TODO -// @Bean -// public CacheManager cacheManager() { -// RedisCacheManager.RedisCacheManagerBuilder builder = RedisCacheManager.RedisCacheManagerBuilder.fromConnectionFactory(lettuceConnectionFactory); -// return builder.build(); -// } - /** * RedisTemplate配置 */ @@ -76,5 +85,61 @@ public class RedisConfig extends CachingConfigurerSupport { redisTemplate.afterPropertiesSet(); return redisTemplate; } + + /** + * 此处的缓存到JAVA虚拟机内存,非存Redis + */ + @Override + @Bean + public CacheManager cacheManager() { + SimpleCacheManager cacheManager = new SimpleCacheManager(); + List<ConcurrentMapCache> list=new ArrayList<ConcurrentMapCache>(); + list.add(new ConcurrentMapCache("dictCache")); + list.add(new ConcurrentMapCache("jeecgDemo")); + list.add(new ConcurrentMapCache("permission")); + cacheManager.setCaches(list); + cacheManager.afterPropertiesSet(); + return cacheManager; + } + + + /** + * Redis缓存支持设置缓存过期时间 + * @param redisConnectionFactory + * @return + */ + @Bean + public RedisCacheManager redisCacheManager(RedisConnectionFactory redisConnectionFactory) { + return new RedisCacheManager( + RedisCacheWriter.nonLockingRedisCacheWriter(redisConnectionFactory), + this.getRedisCacheConfigurationWithTtl(3600), //3600秒,默认策略,未配置的 key 会使用这个 + this.getRedisCacheConfigurationMap() // 指定 key 策略 + ); + } + /** + * 指定redis缓存超时时间 + * @return + */ + private Map<String, RedisCacheConfiguration> getRedisCacheConfigurationMap() { + Map<String, RedisCacheConfiguration> redisCacheConfigurationMap = new HashMap<>(); + redisCacheConfigurationMap.put("dictTableCache", this.getRedisCacheConfigurationWithTtl(600));// 600秒(表数据字典只缓存10分钟) + + return redisCacheConfigurationMap; + } + private RedisCacheConfiguration getRedisCacheConfigurationWithTtl(Integer seconds) { + Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class); + ObjectMapper om = new ObjectMapper(); + om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); + om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); + jackson2JsonRedisSerializer.setObjectMapper(om); + + RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig(); + redisCacheConfiguration = redisCacheConfiguration.serializeValuesWith( + RedisSerializationContext + .SerializationPair + .fromSerializer(jackson2JsonRedisSerializer) + ).entryTtl(Duration.ofSeconds(seconds)); + return redisCacheConfiguration; + } } diff --git a/jeecg-boot/src/main/java/org/jeecg/config/ShiroConfig.java b/jeecg-boot/src/main/java/org/jeecg/config/ShiroConfig.java index 9fd0d5f..b149a34 100644 --- a/jeecg-boot/src/main/java/org/jeecg/config/ShiroConfig.java +++ b/jeecg-boot/src/main/java/org/jeecg/config/ShiroConfig.java @@ -43,44 +43,41 @@ public class ShiroConfig { Map<String, String> filterChainDefinitionMap = new LinkedHashMap<String, String>(); // 配置不会被拦截的链接 顺序判断 filterChainDefinitionMap.put("/sys/login", "anon"); //登录接口排除 + filterChainDefinitionMap.put("/auth/2step-code", "anon");//登录验证码 + filterChainDefinitionMap.put("/test/jeecgDemo/**", "anon"); //测试接口 + filterChainDefinitionMap.put("/test/jeecgOrderMain/**", "anon"); //测试接口 + filterChainDefinitionMap.put("/**/exportXls", "anon"); //导出接口 + filterChainDefinitionMap.put("/**/importExcel", "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("/", "anon"); + filterChainDefinitionMap.put("/**/*.js", "anon"); + filterChainDefinitionMap.put("/**/*.css", "anon"); + filterChainDefinitionMap.put("/**/*.html", "anon"); + filterChainDefinitionMap.put("/**/*.svg", "anon"); + filterChainDefinitionMap.put("/**/*.jpg", "anon"); + filterChainDefinitionMap.put("/**/*.png", "anon"); + filterChainDefinitionMap.put("/**/*.ico", "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"); - + //性能监控 + filterChainDefinitionMap.put("/actuator/metrics/**", "anon"); + filterChainDefinitionMap.put("/actuator/httptrace/**", "anon"); + filterChainDefinitionMap.put("/redis/**", "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]"); + filterChainDefinitionMap.put("/online/cgreport/api/exportXls/**", "anon"); // 添加自己的过滤器并且取名为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"); diff --git a/jeecg-boot/src/main/java/org/jeecg/config/WebMvcConfiguration.java b/jeecg-boot/src/main/java/org/jeecg/config/WebMvcConfiguration.java index 0dc6c0f..4ddc33a 100644 --- a/jeecg-boot/src/main/java/org/jeecg/config/WebMvcConfiguration.java +++ b/jeecg-boot/src/main/java/org/jeecg/config/WebMvcConfiguration.java @@ -1,33 +1,62 @@ package org.jeecg.config; +import org.springframework.beans.factory.annotation.Value; 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.ResourceHandlerRegistry; +import org.springframework.web.servlet.config.annotation.ViewControllerRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; /** - * Spring Boot 2.0 解决跨域问题 + * 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); - } + @Value("${jeecg.path.upload}") + private String upLoadPath; + @Value("${jeecg.path.webapp}") + private String webAppPath; + @Value("${spring.resource.static-locations}") + private String staticLocations; + + @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); + } + + /** + * 静态资源的配置 - 使得可以从磁盘中读取 Html、图片、视频、音频等 + */ + @Override + public void addResourceHandlers(ResourceHandlerRegistry registry) { + registry.addResourceHandler("/**") + .addResourceLocations("file:" + upLoadPath + "//", "file:" + webAppPath + "//") + .addResourceLocations(staticLocations.split(",")); + } + + /** + * 访问根路径默认跳转 index.html页面 (简化部署方案: 可以把前端打包直接放到项目的 webapp,上面的配置) + */ + @Override + public void addViewControllers(ViewControllerRegistry registry) { + registry.addViewController("/").setViewName("index.html"); + } } 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 index 2aa5be0..4fff963 100644 --- a/jeecg-boot/src/main/java/org/jeecg/config/mybatis/MybatisInterceptor.java +++ b/jeecg-boot/src/main/java/org/jeecg/config/mybatis/MybatisInterceptor.java @@ -38,7 +38,7 @@ public class MybatisInterceptor implements Interceptor { log.debug("------sqlId------" + sqlId); SqlCommandType sqlCommandType = mappedStatement.getSqlCommandType(); Object parameter = invocation.getArgs()[1]; - log.info("------sqlCommandType------" + sqlCommandType); + log.debug("------sqlCommandType------" + sqlCommandType); if (parameter == null) { return invocation.proceed(); 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 index 7882b67..b882a45 100644 --- 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 @@ -1,21 +1,57 @@ package org.jeecg.modules.demo.mock; +import java.io.File; import java.io.IOException; import java.io.InputStream; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.swing.filechooser.FileSystemView; import org.apache.commons.io.IOUtils; +import org.jeecg.common.api.vo.Result; import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; +import lombok.extern.slf4j.Slf4j; + @RestController @RequestMapping("/api") +@Slf4j public class MockController { + /** + * 通用json访问接口 + * 格式: http://localhost:8080/jeecg-boot/api/json/{filename} + * @param filename + * @return + */ + @RequestMapping(value = "/json/{filename}", method = RequestMethod.GET) + public String getJsonData(@PathVariable String filename) { + String jsonpath = "classpath:org/jeecg/modules/demo/mock/json/"+filename+".json"; + return readJson(jsonpath); + } + @GetMapping(value = "/user") public String user() { return readJson("classpath:org/jeecg/modules/demo/mock/json/user.json"); } + + /** + * 老的登录获取用户信息接口 + * @return + */ + @GetMapping(value = "/user/info") + public String userInfo() { + return readJson("classpath:org/jeecg/modules/demo/mock/json/user_info.json"); + } @GetMapping(value = "/role") public String role() { @@ -37,6 +73,70 @@ public class MockController { return readJson("classpath:org/jeecg/modules/demo/mock/json/permission_no_page.json"); } + /** + * 省市县 + */ + @GetMapping(value = "/area") + public String area() { + return readJson("classpath:org/jeecg/modules/demo/mock/json/area.json"); + } + + /** + * 测试报表数据 + */ + @GetMapping(value = "/report/getYearCountInfo") + public String getYearCountInfo() { + return readJson("classpath:org/jeecg/modules/demo/mock/json/getCntrNoCountInfo.json"); + } + @GetMapping(value = "/report/getMonthCountInfo") + public String getMonthCountInfo() { + return readJson("classpath:org/jeecg/modules/demo/mock/json/getCntrNoCountInfo.json"); + } + @GetMapping(value = "/report/getCntrNoCountInfo") + public String getCntrNoCountInfo() { + return readJson("classpath:org/jeecg/modules/demo/mock/json/getCntrNoCountInfo.json"); + } + @GetMapping(value = "/report/getCabinetCountInfo") + public String getCabinetCountInfo() { + return readJson("classpath:org/jeecg/modules/demo/mock/json/getCntrNoCountInfo.json"); + } + + /** + * 实时磁盘监控 + * @param request + * @param response + * @return + */ + @GetMapping("/queryDiskInfo") + public Result<List<Map<String,Object>>> queryDiskInfo(HttpServletRequest request, HttpServletResponse response){ + Result<List<Map<String,Object>>> res = new Result<>(); + try { + // 当前文件系统类 + FileSystemView fsv = FileSystemView.getFileSystemView(); + // 列出所有windows 磁盘 + File[] fs = File.listRoots(); + log.info("查询磁盘信息:"+fs.length+"个"); + List<Map<String,Object>> list = new ArrayList<>(); + + for (int i = 0; i < fs.length; i++) { + if(fs[i].getTotalSpace()==0) { + continue; + } + Map<String,Object> map = new HashMap<>(); + map.put("name", fsv.getSystemDisplayName(fs[i])); + map.put("max", fs[i].getTotalSpace()); + map.put("rest", fs[i].getFreeSpace()); + map.put("restPPT", fs[i].getFreeSpace()*100/fs[i].getTotalSpace()); + list.add(map); + log.info(map.toString()); + } + res.setResult(list); + res.success("查询成功"); + } catch (Exception e) { + res.error500("查询失败"+e.getMessage()); + } + return res; + } //------------------------------------------------------------------------------------------- /** @@ -62,8 +162,19 @@ public class MockController { public String radar() { return readJson("classpath:org/jeecg/modules/demo/mock/json/workplace_radar.json"); } + + @GetMapping(value = "/task/process") + public String taskProcess() { + return readJson("classpath:org/jeecg/modules/demo/mock/json/task_process.json"); + } //------------------------------------------------------------------------------------------- + //author:lvdandan-----date:20190315---for:添加数据日志json---- + public String sysDataLogJson() { + return readJson("classpath:org/jeecg/modules/demo/mock/json/sysdatalog.json"); + } + //author:lvdandan-----date:20190315---for:添加数据日志json---- + /** * 读取json格式文件 * @param jsonSrc diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/demo/mock/json/area.json b/jeecg-boot/src/main/java/org/jeecg/modules/demo/mock/json/area.json new file mode 100644 index 0000000..bce06a6 --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/demo/mock/json/area.json @@ -0,0 +1,13551 @@ +[ + { + "value": "110000", + "label": "北京市", + "children": [ + { + "value": "110000", + "label": "北京市", + "children": [ + { + "value": "110101", + "label": "东城区" + }, + { + "value": "110102", + "label": "西城区" + }, + { + "value": "110105", + "label": "朝阳区" + }, + { + "value": "110106", + "label": "丰台区" + }, + { + "value": "110107", + "label": "石景山区" + }, + { + "value": "110108", + "label": "海淀区" + }, + { + "value": "110109", + "label": "门头沟区" + }, + { + "value": "110111", + "label": "房山区" + }, + { + "value": "110112", + "label": "通州区" + }, + { + "value": "110113", + "label": "顺义区" + }, + { + "value": "110114", + "label": "昌平区" + }, + { + "value": "110115", + "label": "大兴区" + }, + { + "value": "110116", + "label": "怀柔区" + }, + { + "value": "110117", + "label": "平谷区" + }, + { + "value": "110118", + "label": "密云区" + }, + { + "value": "110119", + "label": "延庆区" + } + ] + } + ] + }, + { + "value": "120000", + "label": "天津市", + "children": [ + { + "value": "120000", + "label": "天津市", + "children": [ + { + "value": "120101", + "label": "和平区" + }, + { + "value": "120102", + "label": "河东区" + }, + { + "value": "120103", + "label": "河西区" + }, + { + "value": "120104", + "label": "南开区" + }, + { + "value": "120105", + "label": "河北区" + }, + { + "value": "120106", + "label": "红桥区" + }, + { + "value": "120110", + "label": "东丽区" + }, + { + "value": "120111", + "label": "西青区" + }, + { + "value": "120112", + "label": "津南区" + }, + { + "value": "120113", + "label": "北辰区" + }, + { + "value": "120114", + "label": "武清区" + }, + { + "value": "120115", + "label": "宝坻区" + }, + { + "value": "120116", + "label": "滨海新区" + }, + { + "value": "120117", + "label": "宁河区" + }, + { + "value": "120118", + "label": "静海区" + }, + { + "value": "120119", + "label": "蓟州区" + } + ] + } + ] + }, + { + "value": "130000", + "label": "河北省", + "children": [ + { + "value": "130100", + "label": "石家庄市", + "children": [ + { + "value": "130102", + "label": "长安区" + }, + { + "value": "130104", + "label": "桥西区" + }, + { + "value": "130105", + "label": "新华区" + }, + { + "value": "130107", + "label": "井陉矿区" + }, + { + "value": "130108", + "label": "裕华区" + }, + { + "value": "130109", + "label": "藁城区" + }, + { + "value": "130110", + "label": "鹿泉区" + }, + { + "value": "130111", + "label": "栾城区" + }, + { + "value": "130121", + "label": "井陉县" + }, + { + "value": "130123", + "label": "正定县" + }, + { + "value": "130125", + "label": "行唐县" + }, + { + "value": "130126", + "label": "灵寿县" + }, + { + "value": "130127", + "label": "高邑县" + }, + { + "value": "130128", + "label": "深泽县" + }, + { + "value": "130129", + "label": "赞皇县" + }, + { + "value": "130130", + "label": "无极县" + }, + { + "value": "130131", + "label": "平山县" + }, + { + "value": "130132", + "label": "元氏县" + }, + { + "value": "130133", + "label": "赵县" + }, + { + "value": "130181", + "label": "辛集市" + }, + { + "value": "130183", + "label": "晋州市" + }, + { + "value": "130184", + "label": "新乐市" + } + ] + }, + { + "value": "130200", + "label": "唐山市", + "children": [ + { + "value": "130202", + "label": "路南区" + }, + { + "value": "130203", + "label": "路北区" + }, + { + "value": "130204", + "label": "古冶区" + }, + { + "value": "130205", + "label": "开平区" + }, + { + "value": "130207", + "label": "丰南区" + }, + { + "value": "130208", + "label": "丰润区" + }, + { + "value": "130209", + "label": "曹妃甸区" + }, + { + "value": "130223", + "label": "滦县" + }, + { + "value": "130224", + "label": "滦南县" + }, + { + "value": "130225", + "label": "乐亭县" + }, + { + "value": "130227", + "label": "迁西县" + }, + { + "value": "130229", + "label": "玉田县" + }, + { + "value": "130281", + "label": "遵化市" + }, + { + "value": "130283", + "label": "迁安市" + } + ] + }, + { + "value": "130300", + "label": "秦皇岛市", + "children": [ + { + "value": "130302", + "label": "海港区" + }, + { + "value": "130303", + "label": "山海关区" + }, + { + "value": "130304", + "label": "北戴河区" + }, + { + "value": "130306", + "label": "抚宁区" + }, + { + "value": "130321", + "label": "青龙满族自治县" + }, + { + "value": "130322", + "label": "昌黎县" + }, + { + "value": "130324", + "label": "卢龙县" + } + ] + }, + { + "value": "130400", + "label": "邯郸市", + "children": [ + { + "value": "130402", + "label": "邯山区" + }, + { + "value": "130403", + "label": "丛台区" + }, + { + "value": "130404", + "label": "复兴区" + }, + { + "value": "130406", + "label": "峰峰矿区" + }, + { + "value": "130407", + "label": "肥乡区" + }, + { + "value": "130408", + "label": "永年区" + }, + { + "value": "130423", + "label": "临漳县" + }, + { + "value": "130424", + "label": "成安县" + }, + { + "value": "130425", + "label": "大名县" + }, + { + "value": "130426", + "label": "涉县" + }, + { + "value": "130427", + "label": "磁县" + }, + { + "value": "130430", + "label": "邱县" + }, + { + "value": "130431", + "label": "鸡泽县" + }, + { + "value": "130432", + "label": "广平县" + }, + { + "value": "130433", + "label": "馆陶县" + }, + { + "value": "130434", + "label": "魏县" + }, + { + "value": "130435", + "label": "曲周县" + }, + { + "value": "130481", + "label": "武安市" + } + ] + }, + { + "value": "130500", + "label": "邢台市", + "children": [ + { + "value": "130502", + "label": "桥东区" + }, + { + "value": "130503", + "label": "桥西区" + }, + { + "value": "130521", + "label": "邢台县" + }, + { + "value": "130522", + "label": "临城县" + }, + { + "value": "130523", + "label": "内丘县" + }, + { + "value": "130524", + "label": "柏乡县" + }, + { + "value": "130525", + "label": "隆尧县" + }, + { + "value": "130526", + "label": "任县" + }, + { + "value": "130527", + "label": "南和县" + }, + { + "value": "130528", + "label": "宁晋县" + }, + { + "value": "130529", + "label": "巨鹿县" + }, + { + "value": "130530", + "label": "新河县" + }, + { + "value": "130531", + "label": "广宗县" + }, + { + "value": "130532", + "label": "平乡县" + }, + { + "value": "130533", + "label": "威县" + }, + { + "value": "130534", + "label": "清河县" + }, + { + "value": "130535", + "label": "临西县" + }, + { + "value": "130581", + "label": "南宫市" + }, + { + "value": "130582", + "label": "沙河市" + } + ] + }, + { + "value": "130600", + "label": "保定市", + "children": [ + { + "value": "130602", + "label": "竞秀区" + }, + { + "value": "130606", + "label": "莲池区" + }, + { + "value": "130607", + "label": "满城区" + }, + { + "value": "130608", + "label": "清苑区" + }, + { + "value": "130609", + "label": "徐水区" + }, + { + "value": "130623", + "label": "涞水县" + }, + { + "value": "130624", + "label": "阜平县" + }, + { + "value": "130626", + "label": "定兴县" + }, + { + "value": "130627", + "label": "唐县" + }, + { + "value": "130628", + "label": "高阳县" + }, + { + "value": "130629", + "label": "容城县" + }, + { + "value": "130630", + "label": "涞源县" + }, + { + "value": "130631", + "label": "望都县" + }, + { + "value": "130632", + "label": "安新县" + }, + { + "value": "130633", + "label": "易县" + }, + { + "value": "130634", + "label": "曲阳县" + }, + { + "value": "130635", + "label": "蠡县" + }, + { + "value": "130636", + "label": "顺平县" + }, + { + "value": "130637", + "label": "博野县" + }, + { + "value": "130638", + "label": "雄县" + }, + { + "value": "130681", + "label": "涿州市" + }, + { + "value": "130682", + "label": "定州市" + }, + { + "value": "130683", + "label": "安国市" + }, + { + "value": "130684", + "label": "高碑店市" + } + ] + }, + { + "value": "130700", + "label": "张家口市", + "children": [ + { + "value": "130702", + "label": "桥东区" + }, + { + "value": "130703", + "label": "桥西区" + }, + { + "value": "130705", + "label": "宣化区" + }, + { + "value": "130706", + "label": "下花园区" + }, + { + "value": "130708", + "label": "万全区" + }, + { + "value": "130709", + "label": "崇礼区" + }, + { + "value": "130722", + "label": "张北县" + }, + { + "value": "130723", + "label": "康保县" + }, + { + "value": "130724", + "label": "沽源县" + }, + { + "value": "130725", + "label": "尚义县" + }, + { + "value": "130726", + "label": "蔚县" + }, + { + "value": "130727", + "label": "阳原县" + }, + { + "value": "130728", + "label": "怀安县" + }, + { + "value": "130730", + "label": "怀来县" + }, + { + "value": "130731", + "label": "涿鹿县" + }, + { + "value": "130732", + "label": "赤城县" + } + ] + }, + { + "value": "130800", + "label": "承德市", + "children": [ + { + "value": "130802", + "label": "双桥区" + }, + { + "value": "130803", + "label": "双滦区" + }, + { + "value": "130804", + "label": "鹰手营子矿区" + }, + { + "value": "130821", + "label": "承德县" + }, + { + "value": "130822", + "label": "兴隆县" + }, + { + "value": "130824", + "label": "滦平县" + }, + { + "value": "130825", + "label": "隆化县" + }, + { + "value": "130826", + "label": "丰宁满族自治县" + }, + { + "value": "130827", + "label": "宽城满族自治县" + }, + { + "value": "130828", + "label": "围场满族蒙古族自治县" + }, + { + "value": "130881", + "label": "平泉市" + } + ] + }, + { + "value": "130900", + "label": "沧州市", + "children": [ + { + "value": "130902", + "label": "新华区" + }, + { + "value": "130903", + "label": "运河区" + }, + { + "value": "130921", + "label": "沧县" + }, + { + "value": "130922", + "label": "青县" + }, + { + "value": "130923", + "label": "东光县" + }, + { + "value": "130924", + "label": "海兴县" + }, + { + "value": "130925", + "label": "盐山县" + }, + { + "value": "130926", + "label": "肃宁县" + }, + { + "value": "130927", + "label": "南皮县" + }, + { + "value": "130928", + "label": "吴桥县" + }, + { + "value": "130929", + "label": "献县" + }, + { + "value": "130930", + "label": "孟村回族自治县" + }, + { + "value": "130981", + "label": "泊头市" + }, + { + "value": "130982", + "label": "任丘市" + }, + { + "value": "130983", + "label": "黄骅市" + }, + { + "value": "130984", + "label": "河间市" + } + ] + }, + { + "value": "131000", + "label": "廊坊市", + "children": [ + { + "value": "131002", + "label": "安次区" + }, + { + "value": "131003", + "label": "广阳区" + }, + { + "value": "131022", + "label": "固安县" + }, + { + "value": "131023", + "label": "永清县" + }, + { + "value": "131024", + "label": "香河县" + }, + { + "value": "131025", + "label": "大城县" + }, + { + "value": "131026", + "label": "文安县" + }, + { + "value": "131028", + "label": "大厂回族自治县" + }, + { + "value": "131081", + "label": "霸州市" + }, + { + "value": "131082", + "label": "三河市" + } + ] + }, + { + "value": "131100", + "label": "衡水市", + "children": [ + { + "value": "131102", + "label": "桃城区" + }, + { + "value": "131103", + "label": "冀州区" + }, + { + "value": "131121", + "label": "枣强县" + }, + { + "value": "131122", + "label": "武邑县" + }, + { + "value": "131123", + "label": "武强县" + }, + { + "value": "131124", + "label": "饶阳县" + }, + { + "value": "131125", + "label": "安平县" + }, + { + "value": "131126", + "label": "故城县" + }, + { + "value": "131127", + "label": "景县" + }, + { + "value": "131128", + "label": "阜城县" + }, + { + "value": "131182", + "label": "深州市" + } + ] + } + ] + }, + { + "value": "140000", + "label": "山西省", + "children": [ + { + "value": "140100", + "label": "太原市", + "children": [ + { + "value": "140105", + "label": "小店区" + }, + { + "value": "140106", + "label": "迎泽区" + }, + { + "value": "140107", + "label": "杏花岭区" + }, + { + "value": "140108", + "label": "尖草坪区" + }, + { + "value": "140109", + "label": "万柏林区" + }, + { + "value": "140110", + "label": "晋源区" + }, + { + "value": "140121", + "label": "清徐县" + }, + { + "value": "140122", + "label": "阳曲县" + }, + { + "value": "140123", + "label": "娄烦县" + }, + { + "value": "140181", + "label": "古交市" + } + ] + }, + { + "value": "140200", + "label": "大同市", + "children": [ + { + "value": "140212", + "label": "新荣区" + }, + { + "value": "140213", + "label": "平城区" + }, + { + "value": "140214", + "label": "云冈区" + }, + { + "value": "140215", + "label": "云州区" + }, + { + "value": "140221", + "label": "阳高县" + }, + { + "value": "140222", + "label": "天镇县" + }, + { + "value": "140223", + "label": "广灵县" + }, + { + "value": "140224", + "label": "灵丘县" + }, + { + "value": "140225", + "label": "浑源县" + }, + { + "value": "140226", + "label": "左云县" + } + ] + }, + { + "value": "140300", + "label": "阳泉市", + "children": [ + { + "value": "140302", + "label": "城区" + }, + { + "value": "140303", + "label": "矿区" + }, + { + "value": "140311", + "label": "郊区" + }, + { + "value": "140321", + "label": "平定县" + }, + { + "value": "140322", + "label": "盂县" + } + ] + }, + { + "value": "140400", + "label": "长治市", + "children": [ + { + "value": "140402", + "label": "城区" + }, + { + "value": "140411", + "label": "郊区" + }, + { + "value": "140421", + "label": "长治县" + }, + { + "value": "140423", + "label": "襄垣县" + }, + { + "value": "140424", + "label": "屯留县" + }, + { + "value": "140425", + "label": "平顺县" + }, + { + "value": "140426", + "label": "黎城县" + }, + { + "value": "140427", + "label": "壶关县" + }, + { + "value": "140428", + "label": "长子县" + }, + { + "value": "140429", + "label": "武乡县" + }, + { + "value": "140430", + "label": "沁县" + }, + { + "value": "140431", + "label": "沁源县" + }, + { + "value": "140481", + "label": "潞城市" + } + ] + }, + { + "value": "140500", + "label": "晋城市", + "children": [ + { + "value": "140502", + "label": "城区" + }, + { + "value": "140521", + "label": "沁水县" + }, + { + "value": "140522", + "label": "阳城县" + }, + { + "value": "140524", + "label": "陵川县" + }, + { + "value": "140525", + "label": "泽州县" + }, + { + "value": "140581", + "label": "高平市" + } + ] + }, + { + "value": "140600", + "label": "朔州市", + "children": [ + { + "value": "140602", + "label": "朔城区" + }, + { + "value": "140603", + "label": "平鲁区" + }, + { + "value": "140621", + "label": "山阴县" + }, + { + "value": "140622", + "label": "应县" + }, + { + "value": "140623", + "label": "右玉县" + }, + { + "value": "140681", + "label": "怀仁市" + } + ] + }, + { + "value": "140700", + "label": "晋中市", + "children": [ + { + "value": "140702", + "label": "榆次区" + }, + { + "value": "140721", + "label": "榆社县" + }, + { + "value": "140722", + "label": "左权县" + }, + { + "value": "140723", + "label": "和顺县" + }, + { + "value": "140724", + "label": "昔阳县" + }, + { + "value": "140725", + "label": "寿阳县" + }, + { + "value": "140726", + "label": "太谷县" + }, + { + "value": "140727", + "label": "祁县" + }, + { + "value": "140728", + "label": "平遥县" + }, + { + "value": "140729", + "label": "灵石县" + }, + { + "value": "140781", + "label": "介休市" + } + ] + }, + { + "value": "140800", + "label": "运城市", + "children": [ + { + "value": "140802", + "label": "盐湖区" + }, + { + "value": "140821", + "label": "临猗县" + }, + { + "value": "140822", + "label": "万荣县" + }, + { + "value": "140823", + "label": "闻喜县" + }, + { + "value": "140824", + "label": "稷山县" + }, + { + "value": "140825", + "label": "新绛县" + }, + { + "value": "140826", + "label": "绛县" + }, + { + "value": "140827", + "label": "垣曲县" + }, + { + "value": "140828", + "label": "夏县" + }, + { + "value": "140829", + "label": "平陆县" + }, + { + "value": "140830", + "label": "芮城县" + }, + { + "value": "140881", + "label": "永济市" + }, + { + "value": "140882", + "label": "河津市" + } + ] + }, + { + "value": "140900", + "label": "忻州市", + "children": [ + { + "value": "140902", + "label": "忻府区" + }, + { + "value": "140921", + "label": "定襄县" + }, + { + "value": "140922", + "label": "五台县" + }, + { + "value": "140923", + "label": "代县" + }, + { + "value": "140924", + "label": "繁峙县" + }, + { + "value": "140925", + "label": "宁武县" + }, + { + "value": "140926", + "label": "静乐县" + }, + { + "value": "140927", + "label": "神池县" + }, + { + "value": "140928", + "label": "五寨县" + }, + { + "value": "140929", + "label": "岢岚县" + }, + { + "value": "140930", + "label": "河曲县" + }, + { + "value": "140931", + "label": "保德县" + }, + { + "value": "140932", + "label": "偏关县" + }, + { + "value": "140981", + "label": "原平市" + } + ] + }, + { + "value": "141000", + "label": "临汾市", + "children": [ + { + "value": "141002", + "label": "尧都区" + }, + { + "value": "141021", + "label": "曲沃县" + }, + { + "value": "141022", + "label": "翼城县" + }, + { + "value": "141023", + "label": "襄汾县" + }, + { + "value": "141024", + "label": "洪洞县" + }, + { + "value": "141025", + "label": "古县" + }, + { + "value": "141026", + "label": "安泽县" + }, + { + "value": "141027", + "label": "浮山县" + }, + { + "value": "141028", + "label": "吉县" + }, + { + "value": "141029", + "label": "乡宁县" + }, + { + "value": "141030", + "label": "大宁县" + }, + { + "value": "141031", + "label": "隰县" + }, + { + "value": "141032", + "label": "永和县" + }, + { + "value": "141033", + "label": "蒲县" + }, + { + "value": "141034", + "label": "汾西县" + }, + { + "value": "141081", + "label": "侯马市" + }, + { + "value": "141082", + "label": "霍州市" + } + ] + }, + { + "value": "141100", + "label": "吕梁市", + "children": [ + { + "value": "141102", + "label": "离石区" + }, + { + "value": "141121", + "label": "文水县" + }, + { + "value": "141122", + "label": "交城县" + }, + { + "value": "141123", + "label": "兴县" + }, + { + "value": "141124", + "label": "临县" + }, + { + "value": "141125", + "label": "柳林县" + }, + { + "value": "141126", + "label": "石楼县" + }, + { + "value": "141127", + "label": "岚县" + }, + { + "value": "141128", + "label": "方山县" + }, + { + "value": "141129", + "label": "中阳县" + }, + { + "value": "141130", + "label": "交口县" + }, + { + "value": "141181", + "label": "孝义市" + }, + { + "value": "141182", + "label": "汾阳市" + } + ] + } + ] + }, + { + "value": "150000", + "label": "内蒙古自治区", + "children": [ + { + "value": "150100", + "label": "呼和浩特市", + "children": [ + { + "value": "150102", + "label": "新城区" + }, + { + "value": "150103", + "label": "回民区" + }, + { + "value": "150104", + "label": "玉泉区" + }, + { + "value": "150105", + "label": "赛罕区" + }, + { + "value": "150121", + "label": "土默特左旗" + }, + { + "value": "150122", + "label": "托克托县" + }, + { + "value": "150123", + "label": "和林格尔县" + }, + { + "value": "150124", + "label": "清水河县" + }, + { + "value": "150125", + "label": "武川县" + } + ] + }, + { + "value": "150200", + "label": "包头市", + "children": [ + { + "value": "150202", + "label": "东河区" + }, + { + "value": "150203", + "label": "昆都仑区" + }, + { + "value": "150204", + "label": "青山区" + }, + { + "value": "150205", + "label": "石拐区" + }, + { + "value": "150206", + "label": "白云鄂博矿区" + }, + { + "value": "150207", + "label": "九原区" + }, + { + "value": "150221", + "label": "土默特右旗" + }, + { + "value": "150222", + "label": "固阳县" + }, + { + "value": "150223", + "label": "达尔罕茂明安联合旗" + } + ] + }, + { + "value": "150300", + "label": "乌海市", + "children": [ + { + "value": "150302", + "label": "海勃湾区" + }, + { + "value": "150303", + "label": "海南区" + }, + { + "value": "150304", + "label": "乌达区" + } + ] + }, + { + "value": "150400", + "label": "赤峰市", + "children": [ + { + "value": "150402", + "label": "红山区" + }, + { + "value": "150403", + "label": "元宝山区" + }, + { + "value": "150404", + "label": "松山区" + }, + { + "value": "150421", + "label": "阿鲁科尔沁旗" + }, + { + "value": "150422", + "label": "巴林左旗" + }, + { + "value": "150423", + "label": "巴林右旗" + }, + { + "value": "150424", + "label": "林西县" + }, + { + "value": "150425", + "label": "克什克腾旗" + }, + { + "value": "150426", + "label": "翁牛特旗" + }, + { + "value": "150428", + "label": "喀喇沁旗" + }, + { + "value": "150429", + "label": "宁城县" + }, + { + "value": "150430", + "label": "敖汉旗" + } + ] + }, + { + "value": "150500", + "label": "通辽市", + "children": [ + { + "value": "150502", + "label": "科尔沁区" + }, + { + "value": "150521", + "label": "科尔沁左翼中旗" + }, + { + "value": "150522", + "label": "科尔沁左翼后旗" + }, + { + "value": "150523", + "label": "开鲁县" + }, + { + "value": "150524", + "label": "库伦旗" + }, + { + "value": "150525", + "label": "奈曼旗" + }, + { + "value": "150526", + "label": "扎鲁特旗" + }, + { + "value": "150581", + "label": "霍林郭勒市" + } + ] + }, + { + "value": "150600", + "label": "鄂尔多斯市", + "children": [ + { + "value": "150602", + "label": "东胜区" + }, + { + "value": "150603", + "label": "康巴什区" + }, + { + "value": "150621", + "label": "达拉特旗" + }, + { + "value": "150622", + "label": "准格尔旗" + }, + { + "value": "150623", + "label": "鄂托克前旗" + }, + { + "value": "150624", + "label": "鄂托克旗" + }, + { + "value": "150625", + "label": "杭锦旗" + }, + { + "value": "150626", + "label": "乌审旗" + }, + { + "value": "150627", + "label": "伊金霍洛旗" + } + ] + }, + { + "value": "150700", + "label": "呼伦贝尔市", + "children": [ + { + "value": "150702", + "label": "海拉尔区" + }, + { + "value": "150703", + "label": "扎赉诺尔区" + }, + { + "value": "150721", + "label": "阿荣旗" + }, + { + "value": "150722", + "label": "莫力达瓦达斡尔族自治旗" + }, + { + "value": "150723", + "label": "鄂伦春自治旗" + }, + { + "value": "150724", + "label": "鄂温克族自治旗" + }, + { + "value": "150725", + "label": "陈巴尔虎旗" + }, + { + "value": "150726", + "label": "新巴尔虎左旗" + }, + { + "value": "150727", + "label": "新巴尔虎右旗" + }, + { + "value": "150781", + "label": "满洲里市" + }, + { + "value": "150782", + "label": "牙克石市" + }, + { + "value": "150783", + "label": "扎兰屯市" + }, + { + "value": "150784", + "label": "额尔古纳市" + }, + { + "value": "150785", + "label": "根河市" + } + ] + }, + { + "value": "150800", + "label": "巴彦淖尔市", + "children": [ + { + "value": "150802", + "label": "临河区" + }, + { + "value": "150821", + "label": "五原县" + }, + { + "value": "150822", + "label": "磴口县" + }, + { + "value": "150823", + "label": "乌拉特前旗" + }, + { + "value": "150824", + "label": "乌拉特中旗" + }, + { + "value": "150825", + "label": "乌拉特后旗" + }, + { + "value": "150826", + "label": "杭锦后旗" + } + ] + }, + { + "value": "150900", + "label": "乌兰察布市", + "children": [ + { + "value": "150902", + "label": "集宁区" + }, + { + "value": "150921", + "label": "卓资县" + }, + { + "value": "150922", + "label": "化德县" + }, + { + "value": "150923", + "label": "商都县" + }, + { + "value": "150924", + "label": "兴和县" + }, + { + "value": "150925", + "label": "凉城县" + }, + { + "value": "150926", + "label": "察哈尔右翼前旗" + }, + { + "value": "150927", + "label": "察哈尔右翼中旗" + }, + { + "value": "150928", + "label": "察哈尔右翼后旗" + }, + { + "value": "150929", + "label": "四子王旗" + }, + { + "value": "150981", + "label": "丰镇市" + } + ] + }, + { + "value": "152200", + "label": "兴安盟", + "children": [ + { + "value": "152201", + "label": "乌兰浩特市" + }, + { + "value": "152202", + "label": "阿尔山市" + }, + { + "value": "152221", + "label": "科尔沁右翼前旗" + }, + { + "value": "152222", + "label": "科尔沁右翼中旗" + }, + { + "value": "152223", + "label": "扎赉特旗" + }, + { + "value": "152224", + "label": "突泉县" + } + ] + }, + { + "value": "152500", + "label": "锡林郭勒盟", + "children": [ + { + "value": "152501", + "label": "二连浩特市" + }, + { + "value": "152502", + "label": "锡林浩特市" + }, + { + "value": "152522", + "label": "阿巴嘎旗" + }, + { + "value": "152523", + "label": "苏尼特左旗" + }, + { + "value": "152524", + "label": "苏尼特右旗" + }, + { + "value": "152525", + "label": "东乌珠穆沁旗" + }, + { + "value": "152526", + "label": "西乌珠穆沁旗" + }, + { + "value": "152527", + "label": "太仆寺旗" + }, + { + "value": "152528", + "label": "镶黄旗" + }, + { + "value": "152529", + "label": "正镶白旗" + }, + { + "value": "152530", + "label": "正蓝旗" + }, + { + "value": "152531", + "label": "多伦县" + } + ] + }, + { + "value": "152900", + "label": "阿拉善盟", + "children": [ + { + "value": "152921", + "label": "阿拉善左旗" + }, + { + "value": "152922", + "label": "阿拉善右旗" + }, + { + "value": "152923", + "label": "额济纳旗" + } + ] + } + ] + }, + { + "value": "210000", + "label": "辽宁省", + "children": [ + { + "value": "210100", + "label": "沈阳市", + "children": [ + { + "value": "210102", + "label": "和平区" + }, + { + "value": "210103", + "label": "沈河区" + }, + { + "value": "210104", + "label": "大东区" + }, + { + "value": "210105", + "label": "皇姑区" + }, + { + "value": "210106", + "label": "铁西区" + }, + { + "value": "210111", + "label": "苏家屯区" + }, + { + "value": "210112", + "label": "浑南区" + }, + { + "value": "210113", + "label": "沈北新区" + }, + { + "value": "210114", + "label": "于洪区" + }, + { + "value": "210115", + "label": "辽中区" + }, + { + "value": "210123", + "label": "康平县" + }, + { + "value": "210124", + "label": "法库县" + }, + { + "value": "210181", + "label": "新民市" + } + ] + }, + { + "value": "210200", + "label": "大连市", + "children": [ + { + "value": "210202", + "label": "中山区" + }, + { + "value": "210203", + "label": "西岗区" + }, + { + "value": "210204", + "label": "沙河口区" + }, + { + "value": "210211", + "label": "甘井子区" + }, + { + "value": "210212", + "label": "旅顺口区" + }, + { + "value": "210213", + "label": "金州区" + }, + { + "value": "210214", + "label": "普兰店区" + }, + { + "value": "210224", + "label": "长海县" + }, + { + "value": "210281", + "label": "瓦房店市" + }, + { + "value": "210283", + "label": "庄河市" + } + ] + }, + { + "value": "210300", + "label": "鞍山市", + "children": [ + { + "value": "210302", + "label": "铁东区" + }, + { + "value": "210303", + "label": "铁西区" + }, + { + "value": "210304", + "label": "立山区" + }, + { + "value": "210311", + "label": "千山区" + }, + { + "value": "210321", + "label": "台安县" + }, + { + "value": "210323", + "label": "岫岩满族自治县" + }, + { + "value": "210381", + "label": "海城市" + } + ] + }, + { + "value": "210400", + "label": "抚顺市", + "children": [ + { + "value": "210402", + "label": "新抚区" + }, + { + "value": "210403", + "label": "东洲区" + }, + { + "value": "210404", + "label": "望花区" + }, + { + "value": "210411", + "label": "顺城区" + }, + { + "value": "210421", + "label": "抚顺县" + }, + { + "value": "210422", + "label": "新宾满族自治县" + }, + { + "value": "210423", + "label": "清原满族自治县" + } + ] + }, + { + "value": "210500", + "label": "本溪市", + "children": [ + { + "value": "210502", + "label": "平山区" + }, + { + "value": "210503", + "label": "溪湖区" + }, + { + "value": "210504", + "label": "明山区" + }, + { + "value": "210505", + "label": "南芬区" + }, + { + "value": "210521", + "label": "本溪满族自治县" + }, + { + "value": "210522", + "label": "桓仁满族自治县" + } + ] + }, + { + "value": "210600", + "label": "丹东市", + "children": [ + { + "value": "210602", + "label": "元宝区" + }, + { + "value": "210603", + "label": "振兴区" + }, + { + "value": "210604", + "label": "振安区" + }, + { + "value": "210624", + "label": "宽甸满族自治县" + }, + { + "value": "210681", + "label": "东港市" + }, + { + "value": "210682", + "label": "凤城市" + } + ] + }, + { + "value": "210700", + "label": "锦州市", + "children": [ + { + "value": "210702", + "label": "古塔区" + }, + { + "value": "210703", + "label": "凌河区" + }, + { + "value": "210711", + "label": "太和区" + }, + { + "value": "210726", + "label": "黑山县" + }, + { + "value": "210727", + "label": "义县" + }, + { + "value": "210781", + "label": "凌海市" + }, + { + "value": "210782", + "label": "北镇市" + } + ] + }, + { + "value": "210800", + "label": "营口市", + "children": [ + { + "value": "210802", + "label": "站前区" + }, + { + "value": "210803", + "label": "西市区" + }, + { + "value": "210804", + "label": "鲅鱼圈区" + }, + { + "value": "210811", + "label": "老边区" + }, + { + "value": "210881", + "label": "盖州市" + }, + { + "value": "210882", + "label": "大石桥市" + } + ] + }, + { + "value": "210900", + "label": "阜新市", + "children": [ + { + "value": "210902", + "label": "海州区" + }, + { + "value": "210903", + "label": "新邱区" + }, + { + "value": "210904", + "label": "太平区" + }, + { + "value": "210905", + "label": "清河门区" + }, + { + "value": "210911", + "label": "细河区" + }, + { + "value": "210921", + "label": "阜新蒙古族自治县" + }, + { + "value": "210922", + "label": "彰武县" + } + ] + }, + { + "value": "211000", + "label": "辽阳市", + "children": [ + { + "value": "211002", + "label": "白塔区" + }, + { + "value": "211003", + "label": "文圣区" + }, + { + "value": "211004", + "label": "宏伟区" + }, + { + "value": "211005", + "label": "弓长岭区" + }, + { + "value": "211011", + "label": "太子河区" + }, + { + "value": "211021", + "label": "辽阳县" + }, + { + "value": "211081", + "label": "灯塔市" + } + ] + }, + { + "value": "211100", + "label": "盘锦市", + "children": [ + { + "value": "211102", + "label": "双台子区" + }, + { + "value": "211103", + "label": "兴隆台区" + }, + { + "value": "211104", + "label": "大洼区" + }, + { + "value": "211122", + "label": "盘山县" + } + ] + }, + { + "value": "211200", + "label": "铁岭市", + "children": [ + { + "value": "211202", + "label": "银州区" + }, + { + "value": "211204", + "label": "清河区" + }, + { + "value": "211221", + "label": "铁岭县" + }, + { + "value": "211223", + "label": "西丰县" + }, + { + "value": "211224", + "label": "昌图县" + }, + { + "value": "211281", + "label": "调兵山市" + }, + { + "value": "211282", + "label": "开原市" + } + ] + }, + { + "value": "211300", + "label": "朝阳市", + "children": [ + { + "value": "211302", + "label": "双塔区" + }, + { + "value": "211303", + "label": "龙城区" + }, + { + "value": "211321", + "label": "朝阳县" + }, + { + "value": "211322", + "label": "建平县" + }, + { + "value": "211324", + "label": "喀喇沁左翼蒙古族自治县" + }, + { + "value": "211381", + "label": "北票市" + }, + { + "value": "211382", + "label": "凌源市" + } + ] + }, + { + "value": "211400", + "label": "葫芦岛市", + "children": [ + { + "value": "211402", + "label": "连山区" + }, + { + "value": "211403", + "label": "龙港区" + }, + { + "value": "211404", + "label": "南票区" + }, + { + "value": "211421", + "label": "绥中县" + }, + { + "value": "211422", + "label": "建昌县" + }, + { + "value": "211481", + "label": "兴城市" + } + ] + } + ] + }, + { + "value": "220000", + "label": "吉林省", + "children": [ + { + "value": "220100", + "label": "长春市", + "children": [ + { + "value": "220102", + "label": "南关区" + }, + { + "value": "220103", + "label": "宽城区" + }, + { + "value": "220104", + "label": "朝阳区" + }, + { + "value": "220105", + "label": "二道区" + }, + { + "value": "220106", + "label": "绿园区" + }, + { + "value": "220112", + "label": "双阳区" + }, + { + "value": "220113", + "label": "九台区" + }, + { + "value": "220122", + "label": "农安县" + }, + { + "value": "220182", + "label": "榆树市" + }, + { + "value": "220183", + "label": "德惠市" + } + ] + }, + { + "value": "220200", + "label": "吉林市", + "children": [ + { + "value": "220202", + "label": "昌邑区" + }, + { + "value": "220203", + "label": "龙潭区" + }, + { + "value": "220204", + "label": "船营区" + }, + { + "value": "220211", + "label": "丰满区" + }, + { + "value": "220221", + "label": "永吉县" + }, + { + "value": "220281", + "label": "蛟河市" + }, + { + "value": "220282", + "label": "桦甸市" + }, + { + "value": "220283", + "label": "舒兰市" + }, + { + "value": "220284", + "label": "磐石市" + } + ] + }, + { + "value": "220300", + "label": "四平市", + "children": [ + { + "value": "220302", + "label": "铁西区" + }, + { + "value": "220303", + "label": "铁东区" + }, + { + "value": "220322", + "label": "梨树县" + }, + { + "value": "220323", + "label": "伊通满族自治县" + }, + { + "value": "220381", + "label": "公主岭市" + }, + { + "value": "220382", + "label": "双辽市" + } + ] + }, + { + "value": "220400", + "label": "辽源市", + "children": [ + { + "value": "220402", + "label": "龙山区" + }, + { + "value": "220403", + "label": "西安区" + }, + { + "value": "220421", + "label": "东丰县" + }, + { + "value": "220422", + "label": "东辽县" + } + ] + }, + { + "value": "220500", + "label": "通化市", + "children": [ + { + "value": "220502", + "label": "东昌区" + }, + { + "value": "220503", + "label": "二道江区" + }, + { + "value": "220521", + "label": "通化县" + }, + { + "value": "220523", + "label": "辉南县" + }, + { + "value": "220524", + "label": "柳河县" + }, + { + "value": "220581", + "label": "梅河口市" + }, + { + "value": "220582", + "label": "集安市" + } + ] + }, + { + "value": "220600", + "label": "白山市", + "children": [ + { + "value": "220602", + "label": "浑江区" + }, + { + "value": "220605", + "label": "江源区" + }, + { + "value": "220621", + "label": "抚松县" + }, + { + "value": "220622", + "label": "靖宇县" + }, + { + "value": "220623", + "label": "长白朝鲜族自治县" + }, + { + "value": "220681", + "label": "临江市" + } + ] + }, + { + "value": "220700", + "label": "松原市", + "children": [ + { + "value": "220702", + "label": "宁江区" + }, + { + "value": "220721", + "label": "前郭尔罗斯蒙古族自治县" + }, + { + "value": "220722", + "label": "长岭县" + }, + { + "value": "220723", + "label": "乾安县" + }, + { + "value": "220781", + "label": "扶余市" + } + ] + }, + { + "value": "220800", + "label": "白城市", + "children": [ + { + "value": "220802", + "label": "洮北区" + }, + { + "value": "220821", + "label": "镇赉县" + }, + { + "value": "220822", + "label": "通榆县" + }, + { + "value": "220881", + "label": "洮南市" + }, + { + "value": "220882", + "label": "大安市" + } + ] + }, + { + "value": "222400", + "label": "延边朝鲜族自治州", + "children": [ + { + "value": "222401", + "label": "延吉市" + }, + { + "value": "222402", + "label": "图们市" + }, + { + "value": "222403", + "label": "敦化市" + }, + { + "value": "222404", + "label": "珲春市" + }, + { + "value": "222405", + "label": "龙井市" + }, + { + "value": "222406", + "label": "和龙市" + }, + { + "value": "222424", + "label": "汪清县" + }, + { + "value": "222426", + "label": "安图县" + } + ] + } + ] + }, + { + "value": "230000", + "label": "黑龙江省", + "children": [ + { + "value": "230100", + "label": "哈尔滨市", + "children": [ + { + "value": "230102", + "label": "道里区" + }, + { + "value": "230103", + "label": "南岗区" + }, + { + "value": "230104", + "label": "道外区" + }, + { + "value": "230108", + "label": "平房区" + }, + { + "value": "230109", + "label": "松北区" + }, + { + "value": "230110", + "label": "香坊区" + }, + { + "value": "230111", + "label": "呼兰区" + }, + { + "value": "230112", + "label": "阿城区" + }, + { + "value": "230113", + "label": "双城区" + }, + { + "value": "230123", + "label": "依兰县" + }, + { + "value": "230124", + "label": "方正县" + }, + { + "value": "230125", + "label": "宾县" + }, + { + "value": "230126", + "label": "巴彦县" + }, + { + "value": "230127", + "label": "木兰县" + }, + { + "value": "230128", + "label": "通河县" + }, + { + "value": "230129", + "label": "延寿县" + }, + { + "value": "230183", + "label": "尚志市" + }, + { + "value": "230184", + "label": "五常市" + } + ] + }, + { + "value": "230200", + "label": "齐齐哈尔市", + "children": [ + { + "value": "230202", + "label": "龙沙区" + }, + { + "value": "230203", + "label": "建华区" + }, + { + "value": "230204", + "label": "铁锋区" + }, + { + "value": "230205", + "label": "昂昂溪区" + }, + { + "value": "230206", + "label": "富拉尔基区" + }, + { + "value": "230207", + "label": "碾子山区" + }, + { + "value": "230208", + "label": "梅里斯达斡尔族区" + }, + { + "value": "230221", + "label": "龙江县" + }, + { + "value": "230223", + "label": "依安县" + }, + { + "value": "230224", + "label": "泰来县" + }, + { + "value": "230225", + "label": "甘南县" + }, + { + "value": "230227", + "label": "富裕县" + }, + { + "value": "230229", + "label": "克山县" + }, + { + "value": "230230", + "label": "克东县" + }, + { + "value": "230231", + "label": "拜泉县" + }, + { + "value": "230281", + "label": "讷河市" + } + ] + }, + { + "value": "230300", + "label": "鸡西市", + "children": [ + { + "value": "230302", + "label": "鸡冠区" + }, + { + "value": "230303", + "label": "恒山区" + }, + { + "value": "230304", + "label": "滴道区" + }, + { + "value": "230305", + "label": "梨树区" + }, + { + "value": "230306", + "label": "城子河区" + }, + { + "value": "230307", + "label": "麻山区" + }, + { + "value": "230321", + "label": "鸡东县" + }, + { + "value": "230381", + "label": "虎林市" + }, + { + "value": "230382", + "label": "密山市" + } + ] + }, + { + "value": "230400", + "label": "鹤岗市", + "children": [ + { + "value": "230402", + "label": "向阳区" + }, + { + "value": "230403", + "label": "工农区" + }, + { + "value": "230404", + "label": "南山区" + }, + { + "value": "230405", + "label": "兴安区" + }, + { + "value": "230406", + "label": "东山区" + }, + { + "value": "230407", + "label": "兴山区" + }, + { + "value": "230421", + "label": "萝北县" + }, + { + "value": "230422", + "label": "绥滨县" + } + ] + }, + { + "value": "230500", + "label": "双鸭山市", + "children": [ + { + "value": "230502", + "label": "尖山区" + }, + { + "value": "230503", + "label": "岭东区" + }, + { + "value": "230505", + "label": "四方台区" + }, + { + "value": "230506", + "label": "宝山区" + }, + { + "value": "230521", + "label": "集贤县" + }, + { + "value": "230522", + "label": "友谊县" + }, + { + "value": "230523", + "label": "宝清县" + }, + { + "value": "230524", + "label": "饶河县" + } + ] + }, + { + "value": "230600", + "label": "大庆市", + "children": [ + { + "value": "230602", + "label": "萨尔图区" + }, + { + "value": "230603", + "label": "龙凤区" + }, + { + "value": "230604", + "label": "让胡路区" + }, + { + "value": "230605", + "label": "红岗区" + }, + { + "value": "230606", + "label": "大同区" + }, + { + "value": "230621", + "label": "肇州县" + }, + { + "value": "230622", + "label": "肇源县" + }, + { + "value": "230623", + "label": "林甸县" + }, + { + "value": "230624", + "label": "杜尔伯特蒙古族自治县" + } + ] + }, + { + "value": "230700", + "label": "伊春市", + "children": [ + { + "value": "230702", + "label": "伊春区" + }, + { + "value": "230703", + "label": "南岔区" + }, + { + "value": "230704", + "label": "友好区" + }, + { + "value": "230705", + "label": "西林区" + }, + { + "value": "230706", + "label": "翠峦区" + }, + { + "value": "230707", + "label": "新青区" + }, + { + "value": "230708", + "label": "美溪区" + }, + { + "value": "230709", + "label": "金山屯区" + }, + { + "value": "230710", + "label": "五营区" + }, + { + "value": "230711", + "label": "乌马河区" + }, + { + "value": "230712", + "label": "汤旺河区" + }, + { + "value": "230713", + "label": "带岭区" + }, + { + "value": "230714", + "label": "乌伊岭区" + }, + { + "value": "230715", + "label": "红星区" + }, + { + "value": "230716", + "label": "上甘岭区" + }, + { + "value": "230722", + "label": "嘉荫县" + }, + { + "value": "230781", + "label": "铁力市" + } + ] + }, + { + "value": "230800", + "label": "佳木斯市", + "children": [ + { + "value": "230803", + "label": "向阳区" + }, + { + "value": "230804", + "label": "前进区" + }, + { + "value": "230805", + "label": "东风区" + }, + { + "value": "230811", + "label": "郊区" + }, + { + "value": "230822", + "label": "桦南县" + }, + { + "value": "230826", + "label": "桦川县" + }, + { + "value": "230828", + "label": "汤原县" + }, + { + "value": "230881", + "label": "同江市" + }, + { + "value": "230882", + "label": "富锦市" + }, + { + "value": "230883", + "label": "抚远市" + } + ] + }, + { + "value": "230900", + "label": "七台河市", + "children": [ + { + "value": "230902", + "label": "新兴区" + }, + { + "value": "230903", + "label": "桃山区" + }, + { + "value": "230904", + "label": "茄子河区" + }, + { + "value": "230921", + "label": "勃利县" + } + ] + }, + { + "value": "231000", + "label": "牡丹江市", + "children": [ + { + "value": "231002", + "label": "东安区" + }, + { + "value": "231003", + "label": "阳明区" + }, + { + "value": "231004", + "label": "爱民区" + }, + { + "value": "231005", + "label": "西安区" + }, + { + "value": "231025", + "label": "林口县" + }, + { + "value": "231081", + "label": "绥芬河市" + }, + { + "value": "231083", + "label": "海林市" + }, + { + "value": "231084", + "label": "宁安市" + }, + { + "value": "231085", + "label": "穆棱市" + }, + { + "value": "231086", + "label": "东宁市" + } + ] + }, + { + "value": "231100", + "label": "黑河市", + "children": [ + { + "value": "231102", + "label": "爱辉区" + }, + { + "value": "231121", + "label": "嫩江县" + }, + { + "value": "231123", + "label": "逊克县" + }, + { + "value": "231124", + "label": "孙吴县" + }, + { + "value": "231181", + "label": "北安市" + }, + { + "value": "231182", + "label": "五大连池市" + } + ] + }, + { + "value": "231200", + "label": "绥化市", + "children": [ + { + "value": "231202", + "label": "北林区" + }, + { + "value": "231221", + "label": "望奎县" + }, + { + "value": "231222", + "label": "兰西县" + }, + { + "value": "231223", + "label": "青冈县" + }, + { + "value": "231224", + "label": "庆安县" + }, + { + "value": "231225", + "label": "明水县" + }, + { + "value": "231226", + "label": "绥棱县" + }, + { + "value": "231281", + "label": "安达市" + }, + { + "value": "231282", + "label": "肇东市" + }, + { + "value": "231283", + "label": "海伦市" + } + ] + }, + { + "value": "232700", + "label": "大兴安岭地区", + "children": [ + { + "value": "232701", + "label": "漠河市" + }, + { + "value": "232721", + "label": "呼玛县" + }, + { + "value": "232722", + "label": "塔河县" + } + ] + } + ] + }, + { + "value": "310000", + "label": "上海市", + "children": [ + { + "value": "310000", + "label": "上海市", + "children": [ + { + "value": "310101", + "label": "黄浦区" + }, + { + "value": "310104", + "label": "徐汇区" + }, + { + "value": "310105", + "label": "长宁区" + }, + { + "value": "310106", + "label": "静安区" + }, + { + "value": "310107", + "label": "普陀区" + }, + { + "value": "310109", + "label": "虹口区" + }, + { + "value": "310110", + "label": "杨浦区" + }, + { + "value": "310112", + "label": "闵行区" + }, + { + "value": "310113", + "label": "宝山区" + }, + { + "value": "310114", + "label": "嘉定区" + }, + { + "value": "310115", + "label": "浦东新区" + }, + { + "value": "310116", + "label": "金山区" + }, + { + "value": "310117", + "label": "松江区" + }, + { + "value": "310118", + "label": "青浦区" + }, + { + "value": "310120", + "label": "奉贤区" + }, + { + "value": "310151", + "label": "崇明区" + } + ] + } + ] + }, + { + "value": "320000", + "label": "江苏省", + "children": [ + { + "value": "320100", + "label": "南京市", + "children": [ + { + "value": "320102", + "label": "玄武区" + }, + { + "value": "320104", + "label": "秦淮区" + }, + { + "value": "320105", + "label": "建邺区" + }, + { + "value": "320106", + "label": "鼓楼区" + }, + { + "value": "320111", + "label": "浦口区" + }, + { + "value": "320113", + "label": "栖霞区" + }, + { + "value": "320114", + "label": "雨花台区" + }, + { + "value": "320115", + "label": "江宁区" + }, + { + "value": "320116", + "label": "六合区" + }, + { + "value": "320117", + "label": "溧水区" + }, + { + "value": "320118", + "label": "高淳区" + } + ] + }, + { + "value": "320200", + "label": "无锡市", + "children": [ + { + "value": "320205", + "label": "锡山区" + }, + { + "value": "320206", + "label": "惠山区" + }, + { + "value": "320211", + "label": "滨湖区" + }, + { + "value": "320213", + "label": "梁溪区" + }, + { + "value": "320214", + "label": "新吴区" + }, + { + "value": "320281", + "label": "江阴市" + }, + { + "value": "320282", + "label": "宜兴市" + } + ] + }, + { + "value": "320300", + "label": "徐州市", + "children": [ + { + "value": "320302", + "label": "鼓楼区" + }, + { + "value": "320303", + "label": "云龙区" + }, + { + "value": "320305", + "label": "贾汪区" + }, + { + "value": "320311", + "label": "泉山区" + }, + { + "value": "320312", + "label": "铜山区" + }, + { + "value": "320321", + "label": "丰县" + }, + { + "value": "320322", + "label": "沛县" + }, + { + "value": "320324", + "label": "睢宁县" + }, + { + "value": "320381", + "label": "新沂市" + }, + { + "value": "320382", + "label": "邳州市" + } + ] + }, + { + "value": "320400", + "label": "常州市", + "children": [ + { + "value": "320402", + "label": "天宁区" + }, + { + "value": "320404", + "label": "钟楼区" + }, + { + "value": "320411", + "label": "新北区" + }, + { + "value": "320412", + "label": "武进区" + }, + { + "value": "320413", + "label": "金坛区" + }, + { + "value": "320481", + "label": "溧阳市" + } + ] + }, + { + "value": "320500", + "label": "苏州市", + "children": [ + { + "value": "320505", + "label": "虎丘区" + }, + { + "value": "320506", + "label": "吴中区" + }, + { + "value": "320507", + "label": "相城区" + }, + { + "value": "320508", + "label": "姑苏区" + }, + { + "value": "320509", + "label": "吴江区" + }, + { + "value": "320581", + "label": "常熟市" + }, + { + "value": "320582", + "label": "张家港市" + }, + { + "value": "320583", + "label": "昆山市" + }, + { + "value": "320585", + "label": "太仓市" + } + ] + }, + { + "value": "320600", + "label": "南通市", + "children": [ + { + "value": "320602", + "label": "崇川区" + }, + { + "value": "320611", + "label": "港闸区" + }, + { + "value": "320612", + "label": "通州区" + }, + { + "value": "320623", + "label": "如东县" + }, + { + "value": "320681", + "label": "启东市" + }, + { + "value": "320682", + "label": "如皋市" + }, + { + "value": "320684", + "label": "海门市" + }, + { + "value": "320685", + "label": "海安市" + } + ] + }, + { + "value": "320700", + "label": "连云港市", + "children": [ + { + "value": "320703", + "label": "连云区" + }, + { + "value": "320706", + "label": "海州区" + }, + { + "value": "320707", + "label": "赣榆区" + }, + { + "value": "320722", + "label": "东海县" + }, + { + "value": "320723", + "label": "灌云县" + }, + { + "value": "320724", + "label": "灌南县" + } + ] + }, + { + "value": "320800", + "label": "淮安市", + "children": [ + { + "value": "320803", + "label": "淮安区" + }, + { + "value": "320804", + "label": "淮阴区" + }, + { + "value": "320812", + "label": "清江浦区" + }, + { + "value": "320813", + "label": "洪泽区" + }, + { + "value": "320826", + "label": "涟水县" + }, + { + "value": "320830", + "label": "盱眙县" + }, + { + "value": "320831", + "label": "金湖县" + } + ] + }, + { + "value": "320900", + "label": "盐城市", + "children": [ + { + "value": "320902", + "label": "亭湖区" + }, + { + "value": "320903", + "label": "盐都区" + }, + { + "value": "320904", + "label": "大丰区" + }, + { + "value": "320921", + "label": "响水县" + }, + { + "value": "320922", + "label": "滨海县" + }, + { + "value": "320923", + "label": "阜宁县" + }, + { + "value": "320924", + "label": "射阳县" + }, + { + "value": "320925", + "label": "建湖县" + }, + { + "value": "320981", + "label": "东台市" + } + ] + }, + { + "value": "321000", + "label": "扬州市", + "children": [ + { + "value": "321002", + "label": "广陵区" + }, + { + "value": "321003", + "label": "邗江区" + }, + { + "value": "321012", + "label": "江都区" + }, + { + "value": "321023", + "label": "宝应县" + }, + { + "value": "321081", + "label": "仪征市" + }, + { + "value": "321084", + "label": "高邮市" + } + ] + }, + { + "value": "321100", + "label": "镇江市", + "children": [ + { + "value": "321102", + "label": "京口区" + }, + { + "value": "321111", + "label": "润州区" + }, + { + "value": "321112", + "label": "丹徒区" + }, + { + "value": "321181", + "label": "丹阳市" + }, + { + "value": "321182", + "label": "扬中市" + }, + { + "value": "321183", + "label": "句容市" + } + ] + }, + { + "value": "321200", + "label": "泰州市", + "children": [ + { + "value": "321202", + "label": "海陵区" + }, + { + "value": "321203", + "label": "高港区" + }, + { + "value": "321204", + "label": "姜堰区" + }, + { + "value": "321281", + "label": "兴化市" + }, + { + "value": "321282", + "label": "靖江市" + }, + { + "value": "321283", + "label": "泰兴市" + } + ] + }, + { + "value": "321300", + "label": "宿迁市", + "children": [ + { + "value": "321302", + "label": "宿城区" + }, + { + "value": "321311", + "label": "宿豫区" + }, + { + "value": "321322", + "label": "沭阳县" + }, + { + "value": "321323", + "label": "泗阳县" + }, + { + "value": "321324", + "label": "泗洪县" + } + ] + } + ] + }, + { + "value": "330000", + "label": "浙江省", + "children": [ + { + "value": "330100", + "label": "杭州市", + "children": [ + { + "value": "330102", + "label": "上城区" + }, + { + "value": "330103", + "label": "下城区" + }, + { + "value": "330104", + "label": "江干区" + }, + { + "value": "330105", + "label": "拱墅区" + }, + { + "value": "330106", + "label": "西湖区" + }, + { + "value": "330108", + "label": "滨江区" + }, + { + "value": "330109", + "label": "萧山区" + }, + { + "value": "330110", + "label": "余杭区" + }, + { + "value": "330111", + "label": "富阳区" + }, + { + "value": "330112", + "label": "临安区" + }, + { + "value": "330122", + "label": "桐庐县" + }, + { + "value": "330127", + "label": "淳安县" + }, + { + "value": "330182", + "label": "建德市" + } + ] + }, + { + "value": "330200", + "label": "宁波市", + "children": [ + { + "value": "330203", + "label": "海曙区" + }, + { + "value": "330205", + "label": "江北区" + }, + { + "value": "330206", + "label": "北仑区" + }, + { + "value": "330211", + "label": "镇海区" + }, + { + "value": "330212", + "label": "鄞州区" + }, + { + "value": "330213", + "label": "奉化区" + }, + { + "value": "330225", + "label": "象山县" + }, + { + "value": "330226", + "label": "宁海县" + }, + { + "value": "330281", + "label": "余姚市" + }, + { + "value": "330282", + "label": "慈溪市" + } + ] + }, + { + "value": "330300", + "label": "温州市", + "children": [ + { + "value": "330302", + "label": "鹿城区" + }, + { + "value": "330303", + "label": "龙湾区" + }, + { + "value": "330304", + "label": "瓯海区" + }, + { + "value": "330305", + "label": "洞头区" + }, + { + "value": "330324", + "label": "永嘉县" + }, + { + "value": "330326", + "label": "平阳县" + }, + { + "value": "330327", + "label": "苍南县" + }, + { + "value": "330328", + "label": "文成县" + }, + { + "value": "330329", + "label": "泰顺县" + }, + { + "value": "330381", + "label": "瑞安市" + }, + { + "value": "330382", + "label": "乐清市" + } + ] + }, + { + "value": "330400", + "label": "嘉兴市", + "children": [ + { + "value": "330402", + "label": "南湖区" + }, + { + "value": "330411", + "label": "秀洲区" + }, + { + "value": "330421", + "label": "嘉善县" + }, + { + "value": "330424", + "label": "海盐县" + }, + { + "value": "330481", + "label": "海宁市" + }, + { + "value": "330482", + "label": "平湖市" + }, + { + "value": "330483", + "label": "桐乡市" + } + ] + }, + { + "value": "330500", + "label": "湖州市", + "children": [ + { + "value": "330502", + "label": "吴兴区" + }, + { + "value": "330503", + "label": "南浔区" + }, + { + "value": "330521", + "label": "德清县" + }, + { + "value": "330522", + "label": "长兴县" + }, + { + "value": "330523", + "label": "安吉县" + } + ] + }, + { + "value": "330600", + "label": "绍兴市", + "children": [ + { + "value": "330602", + "label": "越城区" + }, + { + "value": "330603", + "label": "柯桥区" + }, + { + "value": "330604", + "label": "上虞区" + }, + { + "value": "330624", + "label": "新昌县" + }, + { + "value": "330681", + "label": "诸暨市" + }, + { + "value": "330683", + "label": "嵊州市" + } + ] + }, + { + "value": "330700", + "label": "金华市", + "children": [ + { + "value": "330702", + "label": "婺城区" + }, + { + "value": "330703", + "label": "金东区" + }, + { + "value": "330723", + "label": "武义县" + }, + { + "value": "330726", + "label": "浦江县" + }, + { + "value": "330727", + "label": "磐安县" + }, + { + "value": "330781", + "label": "兰溪市" + }, + { + "value": "330782", + "label": "义乌市" + }, + { + "value": "330783", + "label": "东阳市" + }, + { + "value": "330784", + "label": "永康市" + } + ] + }, + { + "value": "330800", + "label": "衢州市", + "children": [ + { + "value": "330802", + "label": "柯城区" + }, + { + "value": "330803", + "label": "衢江区" + }, + { + "value": "330822", + "label": "常山县" + }, + { + "value": "330824", + "label": "开化县" + }, + { + "value": "330825", + "label": "龙游县" + }, + { + "value": "330881", + "label": "江山市" + } + ] + }, + { + "value": "330900", + "label": "舟山市", + "children": [ + { + "value": "330902", + "label": "定海区" + }, + { + "value": "330903", + "label": "普陀区" + }, + { + "value": "330921", + "label": "岱山县" + }, + { + "value": "330922", + "label": "嵊泗县" + } + ] + }, + { + "value": "331000", + "label": "台州市", + "children": [ + { + "value": "331002", + "label": "椒江区" + }, + { + "value": "331003", + "label": "黄岩区" + }, + { + "value": "331004", + "label": "路桥区" + }, + { + "value": "331022", + "label": "三门县" + }, + { + "value": "331023", + "label": "天台县" + }, + { + "value": "331024", + "label": "仙居县" + }, + { + "value": "331081", + "label": "温岭市" + }, + { + "value": "331082", + "label": "临海市" + }, + { + "value": "331083", + "label": "玉环市" + } + ] + }, + { + "value": "331100", + "label": "丽水市", + "children": [ + { + "value": "331102", + "label": "莲都区" + }, + { + "value": "331121", + "label": "青田县" + }, + { + "value": "331122", + "label": "缙云县" + }, + { + "value": "331123", + "label": "遂昌县" + }, + { + "value": "331124", + "label": "松阳县" + }, + { + "value": "331125", + "label": "云和县" + }, + { + "value": "331126", + "label": "庆元县" + }, + { + "value": "331127", + "label": "景宁畲族自治县" + }, + { + "value": "331181", + "label": "龙泉市" + } + ] + } + ] + }, + { + "value": "340000", + "label": "安徽省", + "children": [ + { + "value": "340100", + "label": "合肥市", + "children": [ + { + "value": "340102", + "label": "瑶海区" + }, + { + "value": "340103", + "label": "庐阳区" + }, + { + "value": "340104", + "label": "蜀山区" + }, + { + "value": "340111", + "label": "包河区" + }, + { + "value": "340121", + "label": "长丰县" + }, + { + "value": "340122", + "label": "肥东县" + }, + { + "value": "340123", + "label": "肥西县" + }, + { + "value": "340124", + "label": "庐江县" + }, + { + "value": "340181", + "label": "巢湖市" + } + ] + }, + { + "value": "340200", + "label": "芜湖市", + "children": [ + { + "value": "340202", + "label": "镜湖区" + }, + { + "value": "340203", + "label": "弋江区" + }, + { + "value": "340207", + "label": "鸠江区" + }, + { + "value": "340208", + "label": "三山区" + }, + { + "value": "340221", + "label": "芜湖县" + }, + { + "value": "340222", + "label": "繁昌县" + }, + { + "value": "340223", + "label": "南陵县" + }, + { + "value": "340225", + "label": "无为县" + } + ] + }, + { + "value": "340300", + "label": "蚌埠市", + "children": [ + { + "value": "340302", + "label": "龙子湖区" + }, + { + "value": "340303", + "label": "蚌山区" + }, + { + "value": "340304", + "label": "禹会区" + }, + { + "value": "340311", + "label": "淮上区" + }, + { + "value": "340321", + "label": "怀远县" + }, + { + "value": "340322", + "label": "五河县" + }, + { + "value": "340323", + "label": "固镇县" + } + ] + }, + { + "value": "340400", + "label": "淮南市", + "children": [ + { + "value": "340402", + "label": "大通区" + }, + { + "value": "340403", + "label": "田家庵区" + }, + { + "value": "340404", + "label": "谢家集区" + }, + { + "value": "340405", + "label": "八公山区" + }, + { + "value": "340406", + "label": "潘集区" + }, + { + "value": "340421", + "label": "凤台县" + }, + { + "value": "340422", + "label": "寿县" + } + ] + }, + { + "value": "340500", + "label": "马鞍山市", + "children": [ + { + "value": "340503", + "label": "花山区" + }, + { + "value": "340504", + "label": "雨山区" + }, + { + "value": "340506", + "label": "博望区" + }, + { + "value": "340521", + "label": "当涂县" + }, + { + "value": "340522", + "label": "含山县" + }, + { + "value": "340523", + "label": "和县" + } + ] + }, + { + "value": "340600", + "label": "淮北市", + "children": [ + { + "value": "340602", + "label": "杜集区" + }, + { + "value": "340603", + "label": "相山区" + }, + { + "value": "340604", + "label": "烈山区" + }, + { + "value": "340621", + "label": "濉溪县" + } + ] + }, + { + "value": "340700", + "label": "铜陵市", + "children": [ + { + "value": "340705", + "label": "铜官区" + }, + { + "value": "340706", + "label": "义安区" + }, + { + "value": "340711", + "label": "郊区" + }, + { + "value": "340722", + "label": "枞阳县" + } + ] + }, + { + "value": "340800", + "label": "安庆市", + "children": [ + { + "value": "340802", + "label": "迎江区" + }, + { + "value": "340803", + "label": "大观区" + }, + { + "value": "340811", + "label": "宜秀区" + }, + { + "value": "340822", + "label": "怀宁县" + }, + { + "value": "340824", + "label": "潜山县" + }, + { + "value": "340825", + "label": "太湖县" + }, + { + "value": "340826", + "label": "宿松县" + }, + { + "value": "340827", + "label": "望江县" + }, + { + "value": "340828", + "label": "岳西县" + }, + { + "value": "340881", + "label": "桐城市" + } + ] + }, + { + "value": "341000", + "label": "黄山市", + "children": [ + { + "value": "341002", + "label": "屯溪区" + }, + { + "value": "341003", + "label": "黄山区" + }, + { + "value": "341004", + "label": "徽州区" + }, + { + "value": "341021", + "label": "歙县" + }, + { + "value": "341022", + "label": "休宁县" + }, + { + "value": "341023", + "label": "黟县" + }, + { + "value": "341024", + "label": "祁门县" + } + ] + }, + { + "value": "341100", + "label": "滁州市", + "children": [ + { + "value": "341102", + "label": "琅琊区" + }, + { + "value": "341103", + "label": "南谯区" + }, + { + "value": "341122", + "label": "来安县" + }, + { + "value": "341124", + "label": "全椒县" + }, + { + "value": "341125", + "label": "定远县" + }, + { + "value": "341126", + "label": "凤阳县" + }, + { + "value": "341181", + "label": "天长市" + }, + { + "value": "341182", + "label": "明光市" + } + ] + }, + { + "value": "341200", + "label": "阜阳市", + "children": [ + { + "value": "341202", + "label": "颍州区" + }, + { + "value": "341203", + "label": "颍东区" + }, + { + "value": "341204", + "label": "颍泉区" + }, + { + "value": "341221", + "label": "临泉县" + }, + { + "value": "341222", + "label": "太和县" + }, + { + "value": "341225", + "label": "阜南县" + }, + { + "value": "341226", + "label": "颍上县" + }, + { + "value": "341282", + "label": "界首市" + } + ] + }, + { + "value": "341300", + "label": "宿州市", + "children": [ + { + "value": "341302", + "label": "埇桥区" + }, + { + "value": "341321", + "label": "砀山县" + }, + { + "value": "341322", + "label": "萧县" + }, + { + "value": "341323", + "label": "灵璧县" + }, + { + "value": "341324", + "label": "泗县" + } + ] + }, + { + "value": "341500", + "label": "六安市", + "children": [ + { + "value": "341502", + "label": "金安区" + }, + { + "value": "341503", + "label": "裕安区" + }, + { + "value": "341504", + "label": "叶集区" + }, + { + "value": "341522", + "label": "霍邱县" + }, + { + "value": "341523", + "label": "舒城县" + }, + { + "value": "341524", + "label": "金寨县" + }, + { + "value": "341525", + "label": "霍山县" + } + ] + }, + { + "value": "341600", + "label": "亳州市", + "children": [ + { + "value": "341602", + "label": "谯城区" + }, + { + "value": "341621", + "label": "涡阳县" + }, + { + "value": "341622", + "label": "蒙城县" + }, + { + "value": "341623", + "label": "利辛县" + } + ] + }, + { + "value": "341700", + "label": "池州市", + "children": [ + { + "value": "341702", + "label": "贵池区" + }, + { + "value": "341721", + "label": "东至县" + }, + { + "value": "341722", + "label": "石台县" + }, + { + "value": "341723", + "label": "青阳县" + } + ] + }, + { + "value": "341800", + "label": "宣城市", + "children": [ + { + "value": "341802", + "label": "宣州区" + }, + { + "value": "341821", + "label": "郎溪县" + }, + { + "value": "341822", + "label": "广德县" + }, + { + "value": "341823", + "label": "泾县" + }, + { + "value": "341824", + "label": "绩溪县" + }, + { + "value": "341825", + "label": "旌德县" + }, + { + "value": "341881", + "label": "宁国市" + } + ] + } + ] + }, + { + "value": "350000", + "label": "福建省", + "children": [ + { + "value": "350100", + "label": "福州市", + "children": [ + { + "value": "350102", + "label": "鼓楼区" + }, + { + "value": "350103", + "label": "台江区" + }, + { + "value": "350104", + "label": "仓山区" + }, + { + "value": "350105", + "label": "马尾区" + }, + { + "value": "350111", + "label": "晋安区" + }, + { + "value": "350112", + "label": "长乐区" + }, + { + "value": "350121", + "label": "闽侯县" + }, + { + "value": "350122", + "label": "连江县" + }, + { + "value": "350123", + "label": "罗源县" + }, + { + "value": "350124", + "label": "闽清县" + }, + { + "value": "350125", + "label": "永泰县" + }, + { + "value": "350128", + "label": "平潭县" + }, + { + "value": "350181", + "label": "福清市" + } + ] + }, + { + "value": "350200", + "label": "厦门市", + "children": [ + { + "value": "350203", + "label": "思明区" + }, + { + "value": "350205", + "label": "海沧区" + }, + { + "value": "350206", + "label": "湖里区" + }, + { + "value": "350211", + "label": "集美区" + }, + { + "value": "350212", + "label": "同安区" + }, + { + "value": "350213", + "label": "翔安区" + } + ] + }, + { + "value": "350300", + "label": "莆田市", + "children": [ + { + "value": "350302", + "label": "城厢区" + }, + { + "value": "350303", + "label": "涵江区" + }, + { + "value": "350304", + "label": "荔城区" + }, + { + "value": "350305", + "label": "秀屿区" + }, + { + "value": "350322", + "label": "仙游县" + } + ] + }, + { + "value": "350400", + "label": "三明市", + "children": [ + { + "value": "350402", + "label": "梅列区" + }, + { + "value": "350403", + "label": "三元区" + }, + { + "value": "350421", + "label": "明溪县" + }, + { + "value": "350423", + "label": "清流县" + }, + { + "value": "350424", + "label": "宁化县" + }, + { + "value": "350425", + "label": "大田县" + }, + { + "value": "350426", + "label": "尤溪县" + }, + { + "value": "350427", + "label": "沙县" + }, + { + "value": "350428", + "label": "将乐县" + }, + { + "value": "350429", + "label": "泰宁县" + }, + { + "value": "350430", + "label": "建宁县" + }, + { + "value": "350481", + "label": "永安市" + } + ] + }, + { + "value": "350500", + "label": "泉州市", + "children": [ + { + "value": "350502", + "label": "鲤城区" + }, + { + "value": "350503", + "label": "丰泽区" + }, + { + "value": "350504", + "label": "洛江区" + }, + { + "value": "350505", + "label": "泉港区" + }, + { + "value": "350521", + "label": "惠安县" + }, + { + "value": "350524", + "label": "安溪县" + }, + { + "value": "350525", + "label": "永春县" + }, + { + "value": "350526", + "label": "德化县" + }, + { + "value": "350527", + "label": "金门县" + }, + { + "value": "350581", + "label": "石狮市" + }, + { + "value": "350582", + "label": "晋江市" + }, + { + "value": "350583", + "label": "南安市" + } + ] + }, + { + "value": "350600", + "label": "漳州市", + "children": [ + { + "value": "350602", + "label": "芗城区" + }, + { + "value": "350603", + "label": "龙文区" + }, + { + "value": "350622", + "label": "云霄县" + }, + { + "value": "350623", + "label": "漳浦县" + }, + { + "value": "350624", + "label": "诏安县" + }, + { + "value": "350625", + "label": "长泰县" + }, + { + "value": "350626", + "label": "东山县" + }, + { + "value": "350627", + "label": "南靖县" + }, + { + "value": "350628", + "label": "平和县" + }, + { + "value": "350629", + "label": "华安县" + }, + { + "value": "350681", + "label": "龙海市" + } + ] + }, + { + "value": "350700", + "label": "南平市", + "children": [ + { + "value": "350702", + "label": "延平区" + }, + { + "value": "350703", + "label": "建阳区" + }, + { + "value": "350721", + "label": "顺昌县" + }, + { + "value": "350722", + "label": "浦城县" + }, + { + "value": "350723", + "label": "光泽县" + }, + { + "value": "350724", + "label": "松溪县" + }, + { + "value": "350725", + "label": "政和县" + }, + { + "value": "350781", + "label": "邵武市" + }, + { + "value": "350782", + "label": "武夷山市" + }, + { + "value": "350783", + "label": "建瓯市" + } + ] + }, + { + "value": "350800", + "label": "龙岩市", + "children": [ + { + "value": "350802", + "label": "新罗区" + }, + { + "value": "350803", + "label": "永定区" + }, + { + "value": "350821", + "label": "长汀县" + }, + { + "value": "350823", + "label": "上杭县" + }, + { + "value": "350824", + "label": "武平县" + }, + { + "value": "350825", + "label": "连城县" + }, + { + "value": "350881", + "label": "漳平市" + } + ] + }, + { + "value": "350900", + "label": "宁德市", + "children": [ + { + "value": "350902", + "label": "蕉城区" + }, + { + "value": "350921", + "label": "霞浦县" + }, + { + "value": "350922", + "label": "古田县" + }, + { + "value": "350923", + "label": "屏南县" + }, + { + "value": "350924", + "label": "寿宁县" + }, + { + "value": "350925", + "label": "周宁县" + }, + { + "value": "350926", + "label": "柘荣县" + }, + { + "value": "350981", + "label": "福安市" + }, + { + "value": "350982", + "label": "福鼎市" + } + ] + } + ] + }, + { + "value": "360000", + "label": "江西省", + "children": [ + { + "value": "360100", + "label": "南昌市", + "children": [ + { + "value": "360102", + "label": "东湖区" + }, + { + "value": "360103", + "label": "西湖区" + }, + { + "value": "360104", + "label": "青云谱区" + }, + { + "value": "360105", + "label": "湾里区" + }, + { + "value": "360111", + "label": "青山湖区" + }, + { + "value": "360112", + "label": "新建区" + }, + { + "value": "360121", + "label": "南昌县" + }, + { + "value": "360123", + "label": "安义县" + }, + { + "value": "360124", + "label": "进贤县" + } + ] + }, + { + "value": "360200", + "label": "景德镇市", + "children": [ + { + "value": "360202", + "label": "昌江区" + }, + { + "value": "360203", + "label": "珠山区" + }, + { + "value": "360222", + "label": "浮梁县" + }, + { + "value": "360281", + "label": "乐平市" + } + ] + }, + { + "value": "360300", + "label": "萍乡市", + "children": [ + { + "value": "360302", + "label": "安源区" + }, + { + "value": "360313", + "label": "湘东区" + }, + { + "value": "360321", + "label": "莲花县" + }, + { + "value": "360322", + "label": "上栗县" + }, + { + "value": "360323", + "label": "芦溪县" + } + ] + }, + { + "value": "360400", + "label": "九江市", + "children": [ + { + "value": "360402", + "label": "濂溪区" + }, + { + "value": "360403", + "label": "浔阳区" + }, + { + "value": "360404", + "label": "柴桑区" + }, + { + "value": "360423", + "label": "武宁县" + }, + { + "value": "360424", + "label": "修水县" + }, + { + "value": "360425", + "label": "永修县" + }, + { + "value": "360426", + "label": "德安县" + }, + { + "value": "360428", + "label": "都昌县" + }, + { + "value": "360429", + "label": "湖口县" + }, + { + "value": "360430", + "label": "彭泽县" + }, + { + "value": "360481", + "label": "瑞昌市" + }, + { + "value": "360482", + "label": "共青城市" + }, + { + "value": "360483", + "label": "庐山市" + } + ] + }, + { + "value": "360500", + "label": "新余市", + "children": [ + { + "value": "360502", + "label": "渝水区" + }, + { + "value": "360521", + "label": "分宜县" + } + ] + }, + { + "value": "360600", + "label": "鹰潭市", + "children": [ + { + "value": "360602", + "label": "月湖区" + }, + { + "value": "360603", + "label": "余江区" + }, + { + "value": "360681", + "label": "贵溪市" + } + ] + }, + { + "value": "360700", + "label": "赣州市", + "children": [ + { + "value": "360702", + "label": "章贡区" + }, + { + "value": "360703", + "label": "南康区" + }, + { + "value": "360704", + "label": "赣县区" + }, + { + "value": "360722", + "label": "信丰县" + }, + { + "value": "360723", + "label": "大余县" + }, + { + "value": "360724", + "label": "上犹县" + }, + { + "value": "360725", + "label": "崇义县" + }, + { + "value": "360726", + "label": "安远县" + }, + { + "value": "360727", + "label": "龙南县" + }, + { + "value": "360728", + "label": "定南县" + }, + { + "value": "360729", + "label": "全南县" + }, + { + "value": "360730", + "label": "宁都县" + }, + { + "value": "360731", + "label": "于都县" + }, + { + "value": "360732", + "label": "兴国县" + }, + { + "value": "360733", + "label": "会昌县" + }, + { + "value": "360734", + "label": "寻乌县" + }, + { + "value": "360735", + "label": "石城县" + }, + { + "value": "360781", + "label": "瑞金市" + } + ] + }, + { + "value": "360800", + "label": "吉安市", + "children": [ + { + "value": "360802", + "label": "吉州区" + }, + { + "value": "360803", + "label": "青原区" + }, + { + "value": "360821", + "label": "吉安县" + }, + { + "value": "360822", + "label": "吉水县" + }, + { + "value": "360823", + "label": "峡江县" + }, + { + "value": "360824", + "label": "新干县" + }, + { + "value": "360825", + "label": "永丰县" + }, + { + "value": "360826", + "label": "泰和县" + }, + { + "value": "360827", + "label": "遂川县" + }, + { + "value": "360828", + "label": "万安县" + }, + { + "value": "360829", + "label": "安福县" + }, + { + "value": "360830", + "label": "永新县" + }, + { + "value": "360881", + "label": "井冈山市" + } + ] + }, + { + "value": "360900", + "label": "宜春市", + "children": [ + { + "value": "360902", + "label": "袁州区" + }, + { + "value": "360921", + "label": "奉新县" + }, + { + "value": "360922", + "label": "万载县" + }, + { + "value": "360923", + "label": "上高县" + }, + { + "value": "360924", + "label": "宜丰县" + }, + { + "value": "360925", + "label": "靖安县" + }, + { + "value": "360926", + "label": "铜鼓县" + }, + { + "value": "360981", + "label": "丰城市" + }, + { + "value": "360982", + "label": "樟树市" + }, + { + "value": "360983", + "label": "高安市" + } + ] + }, + { + "value": "361000", + "label": "抚州市", + "children": [ + { + "value": "361002", + "label": "临川区" + }, + { + "value": "361003", + "label": "东乡区" + }, + { + "value": "361021", + "label": "南城县" + }, + { + "value": "361022", + "label": "黎川县" + }, + { + "value": "361023", + "label": "南丰县" + }, + { + "value": "361024", + "label": "崇仁县" + }, + { + "value": "361025", + "label": "乐安县" + }, + { + "value": "361026", + "label": "宜黄县" + }, + { + "value": "361027", + "label": "金溪县" + }, + { + "value": "361028", + "label": "资溪县" + }, + { + "value": "361030", + "label": "广昌县" + } + ] + }, + { + "value": "361100", + "label": "上饶市", + "children": [ + { + "value": "361102", + "label": "信州区" + }, + { + "value": "361103", + "label": "广丰区" + }, + { + "value": "361121", + "label": "上饶县" + }, + { + "value": "361123", + "label": "玉山县" + }, + { + "value": "361124", + "label": "铅山县" + }, + { + "value": "361125", + "label": "横峰县" + }, + { + "value": "361126", + "label": "弋阳县" + }, + { + "value": "361127", + "label": "余干县" + }, + { + "value": "361128", + "label": "鄱阳县" + }, + { + "value": "361129", + "label": "万年县" + }, + { + "value": "361130", + "label": "婺源县" + }, + { + "value": "361181", + "label": "德兴市" + } + ] + } + ] + }, + { + "value": "370000", + "label": "山东省", + "children": [ + { + "value": "370100", + "label": "济南市", + "children": [ + { + "value": "370102", + "label": "历下区" + }, + { + "value": "370103", + "label": "市中区" + }, + { + "value": "370104", + "label": "槐荫区" + }, + { + "value": "370105", + "label": "天桥区" + }, + { + "value": "370112", + "label": "历城区" + }, + { + "value": "370113", + "label": "长清区" + }, + { + "value": "370114", + "label": "章丘区" + }, + { + "value": "370124", + "label": "平阴县" + }, + { + "value": "370125", + "label": "济阳县" + }, + { + "value": "370126", + "label": "商河县" + } + ] + }, + { + "value": "370200", + "label": "青岛市", + "children": [ + { + "value": "370202", + "label": "市南区" + }, + { + "value": "370203", + "label": "市北区" + }, + { + "value": "370211", + "label": "黄岛区" + }, + { + "value": "370212", + "label": "崂山区" + }, + { + "value": "370213", + "label": "李沧区" + }, + { + "value": "370214", + "label": "城阳区" + }, + { + "value": "370215", + "label": "即墨区" + }, + { + "value": "370281", + "label": "胶州市" + }, + { + "value": "370283", + "label": "平度市" + }, + { + "value": "370285", + "label": "莱西市" + } + ] + }, + { + "value": "370300", + "label": "淄博市", + "children": [ + { + "value": "370302", + "label": "淄川区" + }, + { + "value": "370303", + "label": "张店区" + }, + { + "value": "370304", + "label": "博山区" + }, + { + "value": "370305", + "label": "临淄区" + }, + { + "value": "370306", + "label": "周村区" + }, + { + "value": "370321", + "label": "桓台县" + }, + { + "value": "370322", + "label": "高青县" + }, + { + "value": "370323", + "label": "沂源县" + } + ] + }, + { + "value": "370400", + "label": "枣庄市", + "children": [ + { + "value": "370402", + "label": "市中区" + }, + { + "value": "370403", + "label": "薛城区" + }, + { + "value": "370404", + "label": "峄城区" + }, + { + "value": "370405", + "label": "台儿庄区" + }, + { + "value": "370406", + "label": "山亭区" + }, + { + "value": "370481", + "label": "滕州市" + } + ] + }, + { + "value": "370500", + "label": "东营市", + "children": [ + { + "value": "370502", + "label": "东营区" + }, + { + "value": "370503", + "label": "河口区" + }, + { + "value": "370505", + "label": "垦利区" + }, + { + "value": "370522", + "label": "利津县" + }, + { + "value": "370523", + "label": "广饶县" + } + ] + }, + { + "value": "370600", + "label": "烟台市", + "children": [ + { + "value": "370602", + "label": "芝罘区" + }, + { + "value": "370611", + "label": "福山区" + }, + { + "value": "370612", + "label": "牟平区" + }, + { + "value": "370613", + "label": "莱山区" + }, + { + "value": "370634", + "label": "长岛县" + }, + { + "value": "370681", + "label": "龙口市" + }, + { + "value": "370682", + "label": "莱阳市" + }, + { + "value": "370683", + "label": "莱州市" + }, + { + "value": "370684", + "label": "蓬莱市" + }, + { + "value": "370685", + "label": "招远市" + }, + { + "value": "370686", + "label": "栖霞市" + }, + { + "value": "370687", + "label": "海阳市" + } + ] + }, + { + "value": "370700", + "label": "潍坊市", + "children": [ + { + "value": "370702", + "label": "潍城区" + }, + { + "value": "370703", + "label": "寒亭区" + }, + { + "value": "370704", + "label": "坊子区" + }, + { + "value": "370705", + "label": "奎文区" + }, + { + "value": "370724", + "label": "临朐县" + }, + { + "value": "370725", + "label": "昌乐县" + }, + { + "value": "370781", + "label": "青州市" + }, + { + "value": "370782", + "label": "诸城市" + }, + { + "value": "370783", + "label": "寿光市" + }, + { + "value": "370784", + "label": "安丘市" + }, + { + "value": "370785", + "label": "高密市" + }, + { + "value": "370786", + "label": "昌邑市" + } + ] + }, + { + "value": "370800", + "label": "济宁市", + "children": [ + { + "value": "370811", + "label": "任城区" + }, + { + "value": "370812", + "label": "兖州区" + }, + { + "value": "370826", + "label": "微山县" + }, + { + "value": "370827", + "label": "鱼台县" + }, + { + "value": "370828", + "label": "金乡县" + }, + { + "value": "370829", + "label": "嘉祥县" + }, + { + "value": "370830", + "label": "汶上县" + }, + { + "value": "370831", + "label": "泗水县" + }, + { + "value": "370832", + "label": "梁山县" + }, + { + "value": "370881", + "label": "曲阜市" + }, + { + "value": "370883", + "label": "邹城市" + } + ] + }, + { + "value": "370900", + "label": "泰安市", + "children": [ + { + "value": "370902", + "label": "泰山区" + }, + { + "value": "370911", + "label": "岱岳区" + }, + { + "value": "370921", + "label": "宁阳县" + }, + { + "value": "370923", + "label": "东平县" + }, + { + "value": "370982", + "label": "新泰市" + }, + { + "value": "370983", + "label": "肥城市" + } + ] + }, + { + "value": "371000", + "label": "威海市", + "children": [ + { + "value": "371002", + "label": "环翠区" + }, + { + "value": "371003", + "label": "文登区" + }, + { + "value": "371082", + "label": "荣成市" + }, + { + "value": "371083", + "label": "乳山市" + } + ] + }, + { + "value": "371100", + "label": "日照市", + "children": [ + { + "value": "371102", + "label": "东港区" + }, + { + "value": "371103", + "label": "岚山区" + }, + { + "value": "371121", + "label": "五莲县" + }, + { + "value": "371122", + "label": "莒县" + } + ] + }, + { + "value": "371200", + "label": "莱芜市", + "children": [ + { + "value": "371202", + "label": "莱城区" + }, + { + "value": "371203", + "label": "钢城区" + } + ] + }, + { + "value": "371300", + "label": "临沂市", + "children": [ + { + "value": "371302", + "label": "兰山区" + }, + { + "value": "371311", + "label": "罗庄区" + }, + { + "value": "371312", + "label": "河东区" + }, + { + "value": "371321", + "label": "沂南县" + }, + { + "value": "371322", + "label": "郯城县" + }, + { + "value": "371323", + "label": "沂水县" + }, + { + "value": "371324", + "label": "兰陵县" + }, + { + "value": "371325", + "label": "费县" + }, + { + "value": "371326", + "label": "平邑县" + }, + { + "value": "371327", + "label": "莒南县" + }, + { + "value": "371328", + "label": "蒙阴县" + }, + { + "value": "371329", + "label": "临沭县" + } + ] + }, + { + "value": "371400", + "label": "德州市", + "children": [ + { + "value": "371402", + "label": "德城区" + }, + { + "value": "371403", + "label": "陵城区" + }, + { + "value": "371422", + "label": "宁津县" + }, + { + "value": "371423", + "label": "庆云县" + }, + { + "value": "371424", + "label": "临邑县" + }, + { + "value": "371425", + "label": "齐河县" + }, + { + "value": "371426", + "label": "平原县" + }, + { + "value": "371427", + "label": "夏津县" + }, + { + "value": "371428", + "label": "武城县" + }, + { + "value": "371481", + "label": "乐陵市" + }, + { + "value": "371482", + "label": "禹城市" + } + ] + }, + { + "value": "371500", + "label": "聊城市", + "children": [ + { + "value": "371502", + "label": "东昌府区" + }, + { + "value": "371521", + "label": "阳谷县" + }, + { + "value": "371522", + "label": "莘县" + }, + { + "value": "371523", + "label": "茌平县" + }, + { + "value": "371524", + "label": "东阿县" + }, + { + "value": "371525", + "label": "冠县" + }, + { + "value": "371526", + "label": "高唐县" + }, + { + "value": "371581", + "label": "临清市" + } + ] + }, + { + "value": "371600", + "label": "滨州市", + "children": [ + { + "value": "371602", + "label": "滨城区" + }, + { + "value": "371603", + "label": "沾化区" + }, + { + "value": "371621", + "label": "惠民县" + }, + { + "value": "371622", + "label": "阳信县" + }, + { + "value": "371623", + "label": "无棣县" + }, + { + "value": "371625", + "label": "博兴县" + }, + { + "value": "371626", + "label": "邹平县" + } + ] + }, + { + "value": "371700", + "label": "菏泽市", + "children": [ + { + "value": "371702", + "label": "牡丹区" + }, + { + "value": "371703", + "label": "定陶区" + }, + { + "value": "371721", + "label": "曹县" + }, + { + "value": "371722", + "label": "单县" + }, + { + "value": "371723", + "label": "成武县" + }, + { + "value": "371724", + "label": "巨野县" + }, + { + "value": "371725", + "label": "郓城县" + }, + { + "value": "371726", + "label": "鄄城县" + }, + { + "value": "371728", + "label": "东明县" + } + ] + } + ] + }, + { + "value": "410000", + "label": "河南省", + "children": [ + { + "value": "410100", + "label": "郑州市", + "children": [ + { + "value": "410102", + "label": "中原区" + }, + { + "value": "410103", + "label": "二七区" + }, + { + "value": "410104", + "label": "管城回族区" + }, + { + "value": "410105", + "label": "金水区" + }, + { + "value": "410106", + "label": "上街区" + }, + { + "value": "410108", + "label": "惠济区" + }, + { + "value": "410122", + "label": "中牟县" + }, + { + "value": "410181", + "label": "巩义市" + }, + { + "value": "410182", + "label": "荥阳市" + }, + { + "value": "410183", + "label": "新密市" + }, + { + "value": "410184", + "label": "新郑市" + }, + { + "value": "410185", + "label": "登封市" + } + ] + }, + { + "value": "410200", + "label": "开封市", + "children": [ + { + "value": "410202", + "label": "龙亭区" + }, + { + "value": "410203", + "label": "顺河回族区" + }, + { + "value": "410204", + "label": "鼓楼区" + }, + { + "value": "410205", + "label": "禹王台区" + }, + { + "value": "410212", + "label": "祥符区" + }, + { + "value": "410221", + "label": "杞县" + }, + { + "value": "410222", + "label": "通许县" + }, + { + "value": "410223", + "label": "尉氏县" + }, + { + "value": "410225", + "label": "兰考县" + } + ] + }, + { + "value": "410300", + "label": "洛阳市", + "children": [ + { + "value": "410302", + "label": "老城区" + }, + { + "value": "410303", + "label": "西工区" + }, + { + "value": "410304", + "label": "瀍河回族区" + }, + { + "value": "410305", + "label": "涧西区" + }, + { + "value": "410306", + "label": "吉利区" + }, + { + "value": "410311", + "label": "洛龙区" + }, + { + "value": "410322", + "label": "孟津县" + }, + { + "value": "410323", + "label": "新安县" + }, + { + "value": "410324", + "label": "栾川县" + }, + { + "value": "410325", + "label": "嵩县" + }, + { + "value": "410326", + "label": "汝阳县" + }, + { + "value": "410327", + "label": "宜阳县" + }, + { + "value": "410328", + "label": "洛宁县" + }, + { + "value": "410329", + "label": "伊川县" + }, + { + "value": "410381", + "label": "偃师市" + } + ] + }, + { + "value": "410400", + "label": "平顶山市", + "children": [ + { + "value": "410402", + "label": "新华区" + }, + { + "value": "410403", + "label": "卫东区" + }, + { + "value": "410404", + "label": "石龙区" + }, + { + "value": "410411", + "label": "湛河区" + }, + { + "value": "410421", + "label": "宝丰县" + }, + { + "value": "410422", + "label": "叶县" + }, + { + "value": "410423", + "label": "鲁山县" + }, + { + "value": "410425", + "label": "郏县" + }, + { + "value": "410481", + "label": "舞钢市" + }, + { + "value": "410482", + "label": "汝州市" + } + ] + }, + { + "value": "410500", + "label": "安阳市", + "children": [ + { + "value": "410502", + "label": "文峰区" + }, + { + "value": "410503", + "label": "北关区" + }, + { + "value": "410505", + "label": "殷都区" + }, + { + "value": "410506", + "label": "龙安区" + }, + { + "value": "410522", + "label": "安阳县" + }, + { + "value": "410523", + "label": "汤阴县" + }, + { + "value": "410526", + "label": "滑县" + }, + { + "value": "410527", + "label": "内黄县" + }, + { + "value": "410581", + "label": "林州市" + } + ] + }, + { + "value": "410600", + "label": "鹤壁市", + "children": [ + { + "value": "410602", + "label": "鹤山区" + }, + { + "value": "410603", + "label": "山城区" + }, + { + "value": "410611", + "label": "淇滨区" + }, + { + "value": "410621", + "label": "浚县" + }, + { + "value": "410622", + "label": "淇县" + } + ] + }, + { + "value": "410700", + "label": "新乡市", + "children": [ + { + "value": "410702", + "label": "红旗区" + }, + { + "value": "410703", + "label": "卫滨区" + }, + { + "value": "410704", + "label": "凤泉区" + }, + { + "value": "410711", + "label": "牧野区" + }, + { + "value": "410721", + "label": "新乡县" + }, + { + "value": "410724", + "label": "获嘉县" + }, + { + "value": "410725", + "label": "原阳县" + }, + { + "value": "410726", + "label": "延津县" + }, + { + "value": "410727", + "label": "封丘县" + }, + { + "value": "410728", + "label": "长垣县" + }, + { + "value": "410781", + "label": "卫辉市" + }, + { + "value": "410782", + "label": "辉县市" + } + ] + }, + { + "value": "410800", + "label": "焦作市", + "children": [ + { + "value": "410802", + "label": "解放区" + }, + { + "value": "410803", + "label": "中站区" + }, + { + "value": "410804", + "label": "马村区" + }, + { + "value": "410811", + "label": "山阳区" + }, + { + "value": "410821", + "label": "修武县" + }, + { + "value": "410822", + "label": "博爱县" + }, + { + "value": "410823", + "label": "武陟县" + }, + { + "value": "410825", + "label": "温县" + }, + { + "value": "410882", + "label": "沁阳市" + }, + { + "value": "410883", + "label": "孟州市" + } + ] + }, + { + "value": "410900", + "label": "濮阳市", + "children": [ + { + "value": "410902", + "label": "华龙区" + }, + { + "value": "410922", + "label": "清丰县" + }, + { + "value": "410923", + "label": "南乐县" + }, + { + "value": "410926", + "label": "范县" + }, + { + "value": "410927", + "label": "台前县" + }, + { + "value": "410928", + "label": "濮阳县" + } + ] + }, + { + "value": "411000", + "label": "许昌市", + "children": [ + { + "value": "411002", + "label": "魏都区" + }, + { + "value": "411003", + "label": "建安区" + }, + { + "value": "411024", + "label": "鄢陵县" + }, + { + "value": "411025", + "label": "襄城县" + }, + { + "value": "411081", + "label": "禹州市" + }, + { + "value": "411082", + "label": "长葛市" + } + ] + }, + { + "value": "411100", + "label": "漯河市", + "children": [ + { + "value": "411102", + "label": "源汇区" + }, + { + "value": "411103", + "label": "郾城区" + }, + { + "value": "411104", + "label": "召陵区" + }, + { + "value": "411121", + "label": "舞阳县" + }, + { + "value": "411122", + "label": "临颍县" + } + ] + }, + { + "value": "411200", + "label": "三门峡市", + "children": [ + { + "value": "411202", + "label": "湖滨区" + }, + { + "value": "411203", + "label": "陕州区" + }, + { + "value": "411221", + "label": "渑池县" + }, + { + "value": "411224", + "label": "卢氏县" + }, + { + "value": "411281", + "label": "义马市" + }, + { + "value": "411282", + "label": "灵宝市" + } + ] + }, + { + "value": "411300", + "label": "南阳市", + "children": [ + { + "value": "411302", + "label": "宛城区" + }, + { + "value": "411303", + "label": "卧龙区" + }, + { + "value": "411321", + "label": "南召县" + }, + { + "value": "411322", + "label": "方城县" + }, + { + "value": "411323", + "label": "西峡县" + }, + { + "value": "411324", + "label": "镇平县" + }, + { + "value": "411325", + "label": "内乡县" + }, + { + "value": "411326", + "label": "淅川县" + }, + { + "value": "411327", + "label": "社旗县" + }, + { + "value": "411328", + "label": "唐河县" + }, + { + "value": "411329", + "label": "新野县" + }, + { + "value": "411330", + "label": "桐柏县" + }, + { + "value": "411381", + "label": "邓州市" + } + ] + }, + { + "value": "411400", + "label": "商丘市", + "children": [ + { + "value": "411402", + "label": "梁园区" + }, + { + "value": "411403", + "label": "睢阳区" + }, + { + "value": "411421", + "label": "民权县" + }, + { + "value": "411422", + "label": "睢县" + }, + { + "value": "411423", + "label": "宁陵县" + }, + { + "value": "411424", + "label": "柘城县" + }, + { + "value": "411425", + "label": "虞城县" + }, + { + "value": "411426", + "label": "夏邑县" + }, + { + "value": "411481", + "label": "永城市" + } + ] + }, + { + "value": "411500", + "label": "信阳市", + "children": [ + { + "value": "411502", + "label": "浉河区" + }, + { + "value": "411503", + "label": "平桥区" + }, + { + "value": "411521", + "label": "罗山县" + }, + { + "value": "411522", + "label": "光山县" + }, + { + "value": "411523", + "label": "新县" + }, + { + "value": "411524", + "label": "商城县" + }, + { + "value": "411525", + "label": "固始县" + }, + { + "value": "411526", + "label": "潢川县" + }, + { + "value": "411527", + "label": "淮滨县" + }, + { + "value": "411528", + "label": "息县" + } + ] + }, + { + "value": "411600", + "label": "周口市", + "children": [ + { + "value": "411602", + "label": "川汇区" + }, + { + "value": "411621", + "label": "扶沟县" + }, + { + "value": "411622", + "label": "西华县" + }, + { + "value": "411623", + "label": "商水县" + }, + { + "value": "411624", + "label": "沈丘县" + }, + { + "value": "411625", + "label": "郸城县" + }, + { + "value": "411626", + "label": "淮阳县" + }, + { + "value": "411627", + "label": "太康县" + }, + { + "value": "411628", + "label": "鹿邑县" + }, + { + "value": "411681", + "label": "项城市" + } + ] + }, + { + "value": "411700", + "label": "驻马店市", + "children": [ + { + "value": "411702", + "label": "驿城区" + }, + { + "value": "411721", + "label": "西平县" + }, + { + "value": "411722", + "label": "上蔡县" + }, + { + "value": "411723", + "label": "平舆县" + }, + { + "value": "411724", + "label": "正阳县" + }, + { + "value": "411725", + "label": "确山县" + }, + { + "value": "411726", + "label": "泌阳县" + }, + { + "value": "411727", + "label": "汝南县" + }, + { + "value": "411728", + "label": "遂平县" + }, + { + "value": "411729", + "label": "新蔡县" + } + ] + } + ] + }, + { + "value": "420000", + "label": "湖北省", + "children": [ + { + "value": "420100", + "label": "武汉市", + "children": [ + { + "value": "420102", + "label": "江岸区" + }, + { + "value": "420103", + "label": "江汉区" + }, + { + "value": "420104", + "label": "硚口区" + }, + { + "value": "420105", + "label": "汉阳区" + }, + { + "value": "420106", + "label": "武昌区" + }, + { + "value": "420107", + "label": "青山区" + }, + { + "value": "420111", + "label": "洪山区" + }, + { + "value": "420112", + "label": "东西湖区" + }, + { + "value": "420113", + "label": "汉南区" + }, + { + "value": "420114", + "label": "蔡甸区" + }, + { + "value": "420115", + "label": "江夏区" + }, + { + "value": "420116", + "label": "黄陂区" + }, + { + "value": "420117", + "label": "新洲区" + } + ] + }, + { + "value": "420200", + "label": "黄石市", + "children": [ + { + "value": "420202", + "label": "黄石港区" + }, + { + "value": "420203", + "label": "西塞山区" + }, + { + "value": "420204", + "label": "下陆区" + }, + { + "value": "420205", + "label": "铁山区" + }, + { + "value": "420222", + "label": "阳新县" + }, + { + "value": "420281", + "label": "大冶市" + } + ] + }, + { + "value": "420300", + "label": "十堰市", + "children": [ + { + "value": "420302", + "label": "茅箭区" + }, + { + "value": "420303", + "label": "张湾区" + }, + { + "value": "420304", + "label": "郧阳区" + }, + { + "value": "420322", + "label": "郧西县" + }, + { + "value": "420323", + "label": "竹山县" + }, + { + "value": "420324", + "label": "竹溪县" + }, + { + "value": "420325", + "label": "房县" + }, + { + "value": "420381", + "label": "丹江口市" + } + ] + }, + { + "value": "420500", + "label": "宜昌市", + "children": [ + { + "value": "420502", + "label": "西陵区" + }, + { + "value": "420503", + "label": "伍家岗区" + }, + { + "value": "420504", + "label": "点军区" + }, + { + "value": "420505", + "label": "猇亭区" + }, + { + "value": "420506", + "label": "夷陵区" + }, + { + "value": "420525", + "label": "远安县" + }, + { + "value": "420526", + "label": "兴山县" + }, + { + "value": "420527", + "label": "秭归县" + }, + { + "value": "420528", + "label": "长阳土家族自治县" + }, + { + "value": "420529", + "label": "五峰土家族自治县" + }, + { + "value": "420581", + "label": "宜都市" + }, + { + "value": "420582", + "label": "当阳市" + }, + { + "value": "420583", + "label": "枝江市" + } + ] + }, + { + "value": "420600", + "label": "襄阳市", + "children": [ + { + "value": "420602", + "label": "襄城区" + }, + { + "value": "420606", + "label": "樊城区" + }, + { + "value": "420607", + "label": "襄州区" + }, + { + "value": "420624", + "label": "南漳县" + }, + { + "value": "420625", + "label": "谷城县" + }, + { + "value": "420626", + "label": "保康县" + }, + { + "value": "420682", + "label": "老河口市" + }, + { + "value": "420683", + "label": "枣阳市" + }, + { + "value": "420684", + "label": "宜城市" + } + ] + }, + { + "value": "420700", + "label": "鄂州市", + "children": [ + { + "value": "420702", + "label": "梁子湖区" + }, + { + "value": "420703", + "label": "华容区" + }, + { + "value": "420704", + "label": "鄂城区" + } + ] + }, + { + "value": "420800", + "label": "荆门市", + "children": [ + { + "value": "420802", + "label": "东宝区" + }, + { + "value": "420804", + "label": "掇刀区" + }, + { + "value": "420822", + "label": "沙洋县" + }, + { + "value": "420881", + "label": "钟祥市" + }, + { + "value": "420882", + "label": "京山市" + } + ] + }, + { + "value": "420900", + "label": "孝感市", + "children": [ + { + "value": "420902", + "label": "孝南区" + }, + { + "value": "420921", + "label": "孝昌县" + }, + { + "value": "420922", + "label": "大悟县" + }, + { + "value": "420923", + "label": "云梦县" + }, + { + "value": "420981", + "label": "应城市" + }, + { + "value": "420982", + "label": "安陆市" + }, + { + "value": "420984", + "label": "汉川市" + } + ] + }, + { + "value": "421000", + "label": "荆州市", + "children": [ + { + "value": "421002", + "label": "沙市区" + }, + { + "value": "421003", + "label": "荆州区" + }, + { + "value": "421022", + "label": "公安县" + }, + { + "value": "421023", + "label": "监利县" + }, + { + "value": "421024", + "label": "江陵县" + }, + { + "value": "421081", + "label": "石首市" + }, + { + "value": "421083", + "label": "洪湖市" + }, + { + "value": "421087", + "label": "松滋市" + } + ] + }, + { + "value": "421100", + "label": "黄冈市", + "children": [ + { + "value": "421102", + "label": "黄州区" + }, + { + "value": "421121", + "label": "团风县" + }, + { + "value": "421122", + "label": "红安县" + }, + { + "value": "421123", + "label": "罗田县" + }, + { + "value": "421124", + "label": "英山县" + }, + { + "value": "421125", + "label": "浠水县" + }, + { + "value": "421126", + "label": "蕲春县" + }, + { + "value": "421127", + "label": "黄梅县" + }, + { + "value": "421181", + "label": "麻城市" + }, + { + "value": "421182", + "label": "武穴市" + } + ] + }, + { + "value": "421200", + "label": "咸宁市", + "children": [ + { + "value": "421202", + "label": "咸安区" + }, + { + "value": "421221", + "label": "嘉鱼县" + }, + { + "value": "421222", + "label": "通城县" + }, + { + "value": "421223", + "label": "崇阳县" + }, + { + "value": "421224", + "label": "通山县" + }, + { + "value": "421281", + "label": "赤壁市" + } + ] + }, + { + "value": "421300", + "label": "随州市", + "children": [ + { + "value": "421303", + "label": "曾都区" + }, + { + "value": "421321", + "label": "随县" + }, + { + "value": "421381", + "label": "广水市" + } + ] + }, + { + "value": "422800", + "label": "恩施土家族苗族自治州", + "children": [ + { + "value": "422801", + "label": "恩施市" + }, + { + "value": "422802", + "label": "利川市" + }, + { + "value": "422822", + "label": "建始县" + }, + { + "value": "422823", + "label": "巴东县" + }, + { + "value": "422825", + "label": "宣恩县" + }, + { + "value": "422826", + "label": "咸丰县" + }, + { + "value": "422827", + "label": "来凤县" + }, + { + "value": "422828", + "label": "鹤峰县" + } + ] + } + ] + }, + { + "value": "430000", + "label": "湖南省", + "children": [ + { + "value": "430100", + "label": "长沙市", + "children": [ + { + "value": "430102", + "label": "芙蓉区" + }, + { + "value": "430103", + "label": "天心区" + }, + { + "value": "430104", + "label": "岳麓区" + }, + { + "value": "430105", + "label": "开福区" + }, + { + "value": "430111", + "label": "雨花区" + }, + { + "value": "430112", + "label": "望城区" + }, + { + "value": "430121", + "label": "长沙县" + }, + { + "value": "430181", + "label": "浏阳市" + }, + { + "value": "430182", + "label": "宁乡市" + } + ] + }, + { + "value": "430200", + "label": "株洲市", + "children": [ + { + "value": "430202", + "label": "荷塘区" + }, + { + "value": "430203", + "label": "芦淞区" + }, + { + "value": "430204", + "label": "石峰区" + }, + { + "value": "430211", + "label": "天元区" + }, + { + "value": "430212", + "label": "渌口区" + }, + { + "value": "430223", + "label": "攸县" + }, + { + "value": "430224", + "label": "茶陵县" + }, + { + "value": "430225", + "label": "炎陵县" + }, + { + "value": "430281", + "label": "醴陵市" + } + ] + }, + { + "value": "430300", + "label": "湘潭市", + "children": [ + { + "value": "430302", + "label": "雨湖区" + }, + { + "value": "430304", + "label": "岳塘区" + }, + { + "value": "430321", + "label": "湘潭县" + }, + { + "value": "430381", + "label": "湘乡市" + }, + { + "value": "430382", + "label": "韶山市" + } + ] + }, + { + "value": "430400", + "label": "衡阳市", + "children": [ + { + "value": "430405", + "label": "珠晖区" + }, + { + "value": "430406", + "label": "雁峰区" + }, + { + "value": "430407", + "label": "石鼓区" + }, + { + "value": "430408", + "label": "蒸湘区" + }, + { + "value": "430412", + "label": "南岳区" + }, + { + "value": "430421", + "label": "衡阳县" + }, + { + "value": "430422", + "label": "衡南县" + }, + { + "value": "430423", + "label": "衡山县" + }, + { + "value": "430424", + "label": "衡东县" + }, + { + "value": "430426", + "label": "祁东县" + }, + { + "value": "430481", + "label": "耒阳市" + }, + { + "value": "430482", + "label": "常宁市" + } + ] + }, + { + "value": "430500", + "label": "邵阳市", + "children": [ + { + "value": "430502", + "label": "双清区" + }, + { + "value": "430503", + "label": "大祥区" + }, + { + "value": "430511", + "label": "北塔区" + }, + { + "value": "430521", + "label": "邵东县" + }, + { + "value": "430522", + "label": "新邵县" + }, + { + "value": "430523", + "label": "邵阳县" + }, + { + "value": "430524", + "label": "隆回县" + }, + { + "value": "430525", + "label": "洞口县" + }, + { + "value": "430527", + "label": "绥宁县" + }, + { + "value": "430528", + "label": "新宁县" + }, + { + "value": "430529", + "label": "城步苗族自治县" + }, + { + "value": "430581", + "label": "武冈市" + } + ] + }, + { + "value": "430600", + "label": "岳阳市", + "children": [ + { + "value": "430602", + "label": "岳阳楼区" + }, + { + "value": "430603", + "label": "云溪区" + }, + { + "value": "430611", + "label": "君山区" + }, + { + "value": "430621", + "label": "岳阳县" + }, + { + "value": "430623", + "label": "华容县" + }, + { + "value": "430624", + "label": "湘阴县" + }, + { + "value": "430626", + "label": "平江县" + }, + { + "value": "430681", + "label": "汨罗市" + }, + { + "value": "430682", + "label": "临湘市" + } + ] + }, + { + "value": "430700", + "label": "常德市", + "children": [ + { + "value": "430702", + "label": "武陵区" + }, + { + "value": "430703", + "label": "鼎城区" + }, + { + "value": "430721", + "label": "安乡县" + }, + { + "value": "430722", + "label": "汉寿县" + }, + { + "value": "430723", + "label": "澧县" + }, + { + "value": "430724", + "label": "临澧县" + }, + { + "value": "430725", + "label": "桃源县" + }, + { + "value": "430726", + "label": "石门县" + }, + { + "value": "430781", + "label": "津市市" + } + ] + }, + { + "value": "430800", + "label": "张家界市", + "children": [ + { + "value": "430802", + "label": "永定区" + }, + { + "value": "430811", + "label": "武陵源区" + }, + { + "value": "430821", + "label": "慈利县" + }, + { + "value": "430822", + "label": "桑植县" + } + ] + }, + { + "value": "430900", + "label": "益阳市", + "children": [ + { + "value": "430902", + "label": "资阳区" + }, + { + "value": "430903", + "label": "赫山区" + }, + { + "value": "430921", + "label": "南县" + }, + { + "value": "430922", + "label": "桃江县" + }, + { + "value": "430923", + "label": "安化县" + }, + { + "value": "430981", + "label": "沅江市" + } + ] + }, + { + "value": "431000", + "label": "郴州市", + "children": [ + { + "value": "431002", + "label": "北湖区" + }, + { + "value": "431003", + "label": "苏仙区" + }, + { + "value": "431021", + "label": "桂阳县" + }, + { + "value": "431022", + "label": "宜章县" + }, + { + "value": "431023", + "label": "永兴县" + }, + { + "value": "431024", + "label": "嘉禾县" + }, + { + "value": "431025", + "label": "临武县" + }, + { + "value": "431026", + "label": "汝城县" + }, + { + "value": "431027", + "label": "桂东县" + }, + { + "value": "431028", + "label": "安仁县" + }, + { + "value": "431081", + "label": "资兴市" + } + ] + }, + { + "value": "431100", + "label": "永州市", + "children": [ + { + "value": "431102", + "label": "零陵区" + }, + { + "value": "431103", + "label": "冷水滩区" + }, + { + "value": "431121", + "label": "祁阳县" + }, + { + "value": "431122", + "label": "东安县" + }, + { + "value": "431123", + "label": "双牌县" + }, + { + "value": "431124", + "label": "道县" + }, + { + "value": "431125", + "label": "江永县" + }, + { + "value": "431126", + "label": "宁远县" + }, + { + "value": "431127", + "label": "蓝山县" + }, + { + "value": "431128", + "label": "新田县" + }, + { + "value": "431129", + "label": "江华瑶族自治县" + } + ] + }, + { + "value": "431200", + "label": "怀化市", + "children": [ + { + "value": "431202", + "label": "鹤城区" + }, + { + "value": "431221", + "label": "中方县" + }, + { + "value": "431222", + "label": "沅陵县" + }, + { + "value": "431223", + "label": "辰溪县" + }, + { + "value": "431224", + "label": "溆浦县" + }, + { + "value": "431225", + "label": "会同县" + }, + { + "value": "431226", + "label": "麻阳苗族自治县" + }, + { + "value": "431227", + "label": "新晃侗族自治县" + }, + { + "value": "431228", + "label": "芷江侗族自治县" + }, + { + "value": "431229", + "label": "靖州苗族侗族自治县" + }, + { + "value": "431230", + "label": "通道侗族自治县" + }, + { + "value": "431281", + "label": "洪江市" + } + ] + }, + { + "value": "431300", + "label": "娄底市", + "children": [ + { + "value": "431302", + "label": "娄星区" + }, + { + "value": "431321", + "label": "双峰县" + }, + { + "value": "431322", + "label": "新化县" + }, + { + "value": "431381", + "label": "冷水江市" + }, + { + "value": "431382", + "label": "涟源市" + } + ] + }, + { + "value": "433100", + "label": "湘西土家族苗族自治州", + "children": [ + { + "value": "433101", + "label": "吉首市" + }, + { + "value": "433122", + "label": "泸溪县" + }, + { + "value": "433123", + "label": "凤凰县" + }, + { + "value": "433124", + "label": "花垣县" + }, + { + "value": "433125", + "label": "保靖县" + }, + { + "value": "433126", + "label": "古丈县" + }, + { + "value": "433127", + "label": "永顺县" + }, + { + "value": "433130", + "label": "龙山县" + } + ] + } + ] + }, + { + "value": "440000", + "label": "广东省", + "children": [ + { + "value": "440100", + "label": "广州市", + "children": [ + { + "value": "440103", + "label": "荔湾区" + }, + { + "value": "440104", + "label": "越秀区" + }, + { + "value": "440105", + "label": "海珠区" + }, + { + "value": "440106", + "label": "天河区" + }, + { + "value": "440111", + "label": "白云区" + }, + { + "value": "440112", + "label": "黄埔区" + }, + { + "value": "440113", + "label": "番禺区" + }, + { + "value": "440114", + "label": "花都区" + }, + { + "value": "440115", + "label": "南沙区" + }, + { + "value": "440117", + "label": "从化区" + }, + { + "value": "440118", + "label": "增城区" + } + ] + }, + { + "value": "440200", + "label": "韶关市", + "children": [ + { + "value": "440203", + "label": "武江区" + }, + { + "value": "440204", + "label": "浈江区" + }, + { + "value": "440205", + "label": "曲江区" + }, + { + "value": "440222", + "label": "始兴县" + }, + { + "value": "440224", + "label": "仁化县" + }, + { + "value": "440229", + "label": "翁源县" + }, + { + "value": "440232", + "label": "乳源瑶族自治县" + }, + { + "value": "440233", + "label": "新丰县" + }, + { + "value": "440281", + "label": "乐昌市" + }, + { + "value": "440282", + "label": "南雄市" + } + ] + }, + { + "value": "440300", + "label": "深圳市", + "children": [ + { + "value": "440303", + "label": "罗湖区" + }, + { + "value": "440304", + "label": "福田区" + }, + { + "value": "440305", + "label": "南山区" + }, + { + "value": "440306", + "label": "宝安区" + }, + { + "value": "440307", + "label": "龙岗区" + }, + { + "value": "440308", + "label": "盐田区" + }, + { + "value": "440309", + "label": "龙华区" + }, + { + "value": "440310", + "label": "坪山区" + }, + { + "value": "440311", + "label": "光明区" + } + ] + }, + { + "value": "440400", + "label": "珠海市", + "children": [ + { + "value": "440402", + "label": "香洲区" + }, + { + "value": "440403", + "label": "斗门区" + }, + { + "value": "440404", + "label": "金湾区" + } + ] + }, + { + "value": "440500", + "label": "汕头市", + "children": [ + { + "value": "440507", + "label": "龙湖区" + }, + { + "value": "440511", + "label": "金平区" + }, + { + "value": "440512", + "label": "濠江区" + }, + { + "value": "440513", + "label": "潮阳区" + }, + { + "value": "440514", + "label": "潮南区" + }, + { + "value": "440515", + "label": "澄海区" + }, + { + "value": "440523", + "label": "南澳县" + } + ] + }, + { + "value": "440600", + "label": "佛山市", + "children": [ + { + "value": "440604", + "label": "禅城区" + }, + { + "value": "440605", + "label": "南海区" + }, + { + "value": "440606", + "label": "顺德区" + }, + { + "value": "440607", + "label": "三水区" + }, + { + "value": "440608", + "label": "高明区" + } + ] + }, + { + "value": "440700", + "label": "江门市", + "children": [ + { + "value": "440703", + "label": "蓬江区" + }, + { + "value": "440704", + "label": "江海区" + }, + { + "value": "440705", + "label": "新会区" + }, + { + "value": "440781", + "label": "台山市" + }, + { + "value": "440783", + "label": "开平市" + }, + { + "value": "440784", + "label": "鹤山市" + }, + { + "value": "440785", + "label": "恩平市" + } + ] + }, + { + "value": "440800", + "label": "湛江市", + "children": [ + { + "value": "440802", + "label": "赤坎区" + }, + { + "value": "440803", + "label": "霞山区" + }, + { + "value": "440804", + "label": "坡头区" + }, + { + "value": "440811", + "label": "麻章区" + }, + { + "value": "440823", + "label": "遂溪县" + }, + { + "value": "440825", + "label": "徐闻县" + }, + { + "value": "440881", + "label": "廉江市" + }, + { + "value": "440882", + "label": "雷州市" + }, + { + "value": "440883", + "label": "吴川市" + } + ] + }, + { + "value": "440900", + "label": "茂名市", + "children": [ + { + "value": "440902", + "label": "茂南区" + }, + { + "value": "440904", + "label": "电白区" + }, + { + "value": "440981", + "label": "高州市" + }, + { + "value": "440982", + "label": "化州市" + }, + { + "value": "440983", + "label": "信宜市" + } + ] + }, + { + "value": "441200", + "label": "肇庆市", + "children": [ + { + "value": "441202", + "label": "端州区" + }, + { + "value": "441203", + "label": "鼎湖区" + }, + { + "value": "441204", + "label": "高要区" + }, + { + "value": "441223", + "label": "广宁县" + }, + { + "value": "441224", + "label": "怀集县" + }, + { + "value": "441225", + "label": "封开县" + }, + { + "value": "441226", + "label": "德庆县" + }, + { + "value": "441284", + "label": "四会市" + } + ] + }, + { + "value": "441300", + "label": "惠州市", + "children": [ + { + "value": "441302", + "label": "惠城区" + }, + { + "value": "441303", + "label": "惠阳区" + }, + { + "value": "441322", + "label": "博罗县" + }, + { + "value": "441323", + "label": "惠东县" + }, + { + "value": "441324", + "label": "龙门县" + } + ] + }, + { + "value": "441400", + "label": "梅州市", + "children": [ + { + "value": "441402", + "label": "梅江区" + }, + { + "value": "441403", + "label": "梅县区" + }, + { + "value": "441422", + "label": "大埔县" + }, + { + "value": "441423", + "label": "丰顺县" + }, + { + "value": "441424", + "label": "五华县" + }, + { + "value": "441426", + "label": "平远县" + }, + { + "value": "441427", + "label": "蕉岭县" + }, + { + "value": "441481", + "label": "兴宁市" + } + ] + }, + { + "value": "441500", + "label": "汕尾市", + "children": [ + { + "value": "441502", + "label": "城区" + }, + { + "value": "441521", + "label": "海丰县" + }, + { + "value": "441523", + "label": "陆河县" + }, + { + "value": "441581", + "label": "陆丰市" + } + ] + }, + { + "value": "441600", + "label": "河源市", + "children": [ + { + "value": "441602", + "label": "源城区" + }, + { + "value": "441621", + "label": "紫金县" + }, + { + "value": "441622", + "label": "龙川县" + }, + { + "value": "441623", + "label": "连平县" + }, + { + "value": "441624", + "label": "和平县" + }, + { + "value": "441625", + "label": "东源县" + } + ] + }, + { + "value": "441700", + "label": "阳江市", + "children": [ + { + "value": "441702", + "label": "江城区" + }, + { + "value": "441704", + "label": "阳东区" + }, + { + "value": "441721", + "label": "阳西县" + }, + { + "value": "441781", + "label": "阳春市" + } + ] + }, + { + "value": "441800", + "label": "清远市", + "children": [ + { + "value": "441802", + "label": "清城区" + }, + { + "value": "441803", + "label": "清新区" + }, + { + "value": "441821", + "label": "佛冈县" + }, + { + "value": "441823", + "label": "阳山县" + }, + { + "value": "441825", + "label": "连山壮族瑶族自治县" + }, + { + "value": "441826", + "label": "连南瑶族自治县" + }, + { + "value": "441881", + "label": "英德市" + }, + { + "value": "441882", + "label": "连州市" + } + ] + }, + { + "value": "441900", + "label": "东莞市", + "children": [] + }, + { + "value": "442000", + "label": "中山市", + "children": [] + }, + { + "value": "445100", + "label": "潮州市", + "children": [ + { + "value": "445102", + "label": "湘桥区" + }, + { + "value": "445103", + "label": "潮安区" + }, + { + "value": "445122", + "label": "饶平县" + } + ] + }, + { + "value": "445200", + "label": "揭阳市", + "children": [ + { + "value": "445202", + "label": "榕城区" + }, + { + "value": "445203", + "label": "揭东区" + }, + { + "value": "445222", + "label": "揭西县" + }, + { + "value": "445224", + "label": "惠来县" + }, + { + "value": "445281", + "label": "普宁市" + } + ] + }, + { + "value": "445300", + "label": "云浮市", + "children": [ + { + "value": "445302", + "label": "云城区" + }, + { + "value": "445303", + "label": "云安区" + }, + { + "value": "445321", + "label": "新兴县" + }, + { + "value": "445322", + "label": "郁南县" + }, + { + "value": "445381", + "label": "罗定市" + } + ] + } + ] + }, + { + "value": "450000", + "label": "广西壮族自治区", + "children": [ + { + "value": "450100", + "label": "南宁市", + "children": [ + { + "value": "450102", + "label": "兴宁区" + }, + { + "value": "450103", + "label": "青秀区" + }, + { + "value": "450105", + "label": "江南区" + }, + { + "value": "450107", + "label": "西乡塘区" + }, + { + "value": "450108", + "label": "良庆区" + }, + { + "value": "450109", + "label": "邕宁区" + }, + { + "value": "450110", + "label": "武鸣区" + }, + { + "value": "450123", + "label": "隆安县" + }, + { + "value": "450124", + "label": "马山县" + }, + { + "value": "450125", + "label": "上林县" + }, + { + "value": "450126", + "label": "宾阳县" + }, + { + "value": "450127", + "label": "横县" + } + ] + }, + { + "value": "450200", + "label": "柳州市", + "children": [ + { + "value": "450202", + "label": "城中区" + }, + { + "value": "450203", + "label": "鱼峰区" + }, + { + "value": "450204", + "label": "柳南区" + }, + { + "value": "450205", + "label": "柳北区" + }, + { + "value": "450206", + "label": "柳江区" + }, + { + "value": "450222", + "label": "柳城县" + }, + { + "value": "450223", + "label": "鹿寨县" + }, + { + "value": "450224", + "label": "融安县" + }, + { + "value": "450225", + "label": "融水苗族自治县" + }, + { + "value": "450226", + "label": "三江侗族自治县" + } + ] + }, + { + "value": "450300", + "label": "桂林市", + "children": [ + { + "value": "450302", + "label": "秀峰区" + }, + { + "value": "450303", + "label": "叠彩区" + }, + { + "value": "450304", + "label": "象山区" + }, + { + "value": "450305", + "label": "七星区" + }, + { + "value": "450311", + "label": "雁山区" + }, + { + "value": "450312", + "label": "临桂区" + }, + { + "value": "450321", + "label": "阳朔县" + }, + { + "value": "450323", + "label": "灵川县" + }, + { + "value": "450324", + "label": "全州县" + }, + { + "value": "450325", + "label": "兴安县" + }, + { + "value": "450326", + "label": "永福县" + }, + { + "value": "450327", + "label": "灌阳县" + }, + { + "value": "450328", + "label": "龙胜各族自治县" + }, + { + "value": "450329", + "label": "资源县" + }, + { + "value": "450330", + "label": "平乐县" + }, + { + "value": "450381", + "label": "荔浦市" + }, + { + "value": "450332", + "label": "恭城瑶族自治县" + } + ] + }, + { + "value": "450400", + "label": "梧州市", + "children": [ + { + "value": "450403", + "label": "万秀区" + }, + { + "value": "450405", + "label": "长洲区" + }, + { + "value": "450406", + "label": "龙圩区" + }, + { + "value": "450421", + "label": "苍梧县" + }, + { + "value": "450422", + "label": "藤县" + }, + { + "value": "450423", + "label": "蒙山县" + }, + { + "value": "450481", + "label": "岑溪市" + } + ] + }, + { + "value": "450500", + "label": "北海市", + "children": [ + { + "value": "450502", + "label": "海城区" + }, + { + "value": "450503", + "label": "银海区" + }, + { + "value": "450512", + "label": "铁山港区" + }, + { + "value": "450521", + "label": "合浦县" + } + ] + }, + { + "value": "450600", + "label": "防城港市", + "children": [ + { + "value": "450602", + "label": "港口区" + }, + { + "value": "450603", + "label": "防城区" + }, + { + "value": "450621", + "label": "上思县" + }, + { + "value": "450681", + "label": "东兴市" + } + ] + }, + { + "value": "450700", + "label": "钦州市", + "children": [ + { + "value": "450702", + "label": "钦南区" + }, + { + "value": "450703", + "label": "钦北区" + }, + { + "value": "450721", + "label": "灵山县" + }, + { + "value": "450722", + "label": "浦北县" + } + ] + }, + { + "value": "450800", + "label": "贵港市", + "children": [ + { + "value": "450802", + "label": "港北区" + }, + { + "value": "450803", + "label": "港南区" + }, + { + "value": "450804", + "label": "覃塘区" + }, + { + "value": "450821", + "label": "平南县" + }, + { + "value": "450881", + "label": "桂平市" + } + ] + }, + { + "value": "450900", + "label": "玉林市", + "children": [ + { + "value": "450902", + "label": "玉州区" + }, + { + "value": "450903", + "label": "福绵区" + }, + { + "value": "450921", + "label": "容县" + }, + { + "value": "450922", + "label": "陆川县" + }, + { + "value": "450923", + "label": "博白县" + }, + { + "value": "450924", + "label": "兴业县" + }, + { + "value": "450981", + "label": "北流市" + } + ] + }, + { + "value": "451000", + "label": "百色市", + "children": [ + { + "value": "451002", + "label": "右江区" + }, + { + "value": "451021", + "label": "田阳县" + }, + { + "value": "451022", + "label": "田东县" + }, + { + "value": "451023", + "label": "平果县" + }, + { + "value": "451024", + "label": "德保县" + }, + { + "value": "451026", + "label": "那坡县" + }, + { + "value": "451027", + "label": "凌云县" + }, + { + "value": "451028", + "label": "乐业县" + }, + { + "value": "451029", + "label": "田林县" + }, + { + "value": "451030", + "label": "西林县" + }, + { + "value": "451031", + "label": "隆林各族自治县" + }, + { + "value": "451081", + "label": "靖西市" + } + ] + }, + { + "value": "451100", + "label": "贺州市", + "children": [ + { + "value": "451102", + "label": "八步区" + }, + { + "value": "451103", + "label": "平桂区" + }, + { + "value": "451121", + "label": "昭平县" + }, + { + "value": "451122", + "label": "钟山县" + }, + { + "value": "451123", + "label": "富川瑶族自治县" + } + ] + }, + { + "value": "451200", + "label": "河池市", + "children": [ + { + "value": "451202", + "label": "金城江区" + }, + { + "value": "451203", + "label": "宜州区" + }, + { + "value": "451221", + "label": "南丹县" + }, + { + "value": "451222", + "label": "天峨县" + }, + { + "value": "451223", + "label": "凤山县" + }, + { + "value": "451224", + "label": "东兰县" + }, + { + "value": "451225", + "label": "罗城仫佬族自治县" + }, + { + "value": "451226", + "label": "环江毛南族自治县" + }, + { + "value": "451227", + "label": "巴马瑶族自治县" + }, + { + "value": "451228", + "label": "都安瑶族自治县" + }, + { + "value": "451229", + "label": "大化瑶族自治县" + } + ] + }, + { + "value": "451300", + "label": "来宾市", + "children": [ + { + "value": "451302", + "label": "兴宾区" + }, + { + "value": "451321", + "label": "忻城县" + }, + { + "value": "451322", + "label": "象州县" + }, + { + "value": "451323", + "label": "武宣县" + }, + { + "value": "451324", + "label": "金秀瑶族自治县" + }, + { + "value": "451381", + "label": "合山市" + } + ] + }, + { + "value": "451400", + "label": "崇左市", + "children": [ + { + "value": "451402", + "label": "江州区" + }, + { + "value": "451421", + "label": "扶绥县" + }, + { + "value": "451422", + "label": "宁明县" + }, + { + "value": "451423", + "label": "龙州县" + }, + { + "value": "451424", + "label": "大新县" + }, + { + "value": "451425", + "label": "天等县" + }, + { + "value": "451481", + "label": "凭祥市" + } + ] + } + ] + }, + { + "value": "460000", + "label": "海南省", + "children": [ + { + "value": "460100", + "label": "海口市", + "children": [ + { + "value": "460105", + "label": "秀英区" + }, + { + "value": "460106", + "label": "龙华区" + }, + { + "value": "460107", + "label": "琼山区" + }, + { + "value": "460108", + "label": "美兰区" + } + ] + }, + { + "value": "460200", + "label": "三亚市", + "children": [ + { + "value": "460202", + "label": "海棠区" + }, + { + "value": "460203", + "label": "吉阳区" + }, + { + "value": "460204", + "label": "天涯区" + }, + { + "value": "460205", + "label": "崖州区" + } + ] + }, + { + "value": "460300", + "label": "三沙市", + "children": [] + }, + { + "value": "460400", + "label": "儋州市", + "children": [] + } + ] + }, + { + "value": "500000", + "label": "重庆市", + "children": [ + { + "value": "500000", + "label": "重庆市", + "children": [ + { + "value": "500101", + "label": "万州区" + }, + { + "value": "500102", + "label": "涪陵区" + }, + { + "value": "500103", + "label": "渝中区" + }, + { + "value": "500104", + "label": "大渡口区" + }, + { + "value": "500105", + "label": "江北区" + }, + { + "value": "500106", + "label": "沙坪坝区" + }, + { + "value": "500107", + "label": "九龙坡区" + }, + { + "value": "500108", + "label": "南岸区" + }, + { + "value": "500109", + "label": "北碚区" + }, + { + "value": "500110", + "label": "綦江区" + }, + { + "value": "500111", + "label": "大足区" + }, + { + "value": "500112", + "label": "渝北区" + }, + { + "value": "500113", + "label": "巴南区" + }, + { + "value": "500114", + "label": "黔江区" + }, + { + "value": "500115", + "label": "长寿区" + }, + { + "value": "500116", + "label": "江津区" + }, + { + "value": "500117", + "label": "合川区" + }, + { + "value": "500118", + "label": "永川区" + }, + { + "value": "500119", + "label": "南川区" + }, + { + "value": "500120", + "label": "璧山区" + }, + { + "value": "500151", + "label": "铜梁区" + }, + { + "value": "500152", + "label": "潼南区" + }, + { + "value": "500153", + "label": "荣昌区" + }, + { + "value": "500154", + "label": "开州区" + }, + { + "value": "500155", + "label": "梁平区" + }, + { + "value": "500156", + "label": "武隆区" + }, + { + "value": "500229", + "label": "城口县" + }, + { + "value": "500230", + "label": "丰都县" + }, + { + "value": "500231", + "label": "垫江县" + }, + { + "value": "500233", + "label": "忠县" + }, + { + "value": "500235", + "label": "云阳县" + }, + { + "value": "500236", + "label": "奉节县" + }, + { + "value": "500237", + "label": "巫山县" + }, + { + "value": "500238", + "label": "巫溪县" + }, + { + "value": "500240", + "label": "石柱土家族自治县" + }, + { + "value": "500241", + "label": "秀山土家族苗族自治县" + }, + { + "value": "500242", + "label": "酉阳土家族苗族自治县" + }, + { + "value": "500243", + "label": "彭水苗族土家族自治县" + } + ] + } + ] + }, + { + "value": "510000", + "label": "四川省", + "children": [ + { + "value": "510100", + "label": "成都市", + "children": [ + { + "value": "510104", + "label": "锦江区" + }, + { + "value": "510105", + "label": "青羊区" + }, + { + "value": "510106", + "label": "金牛区" + }, + { + "value": "510107", + "label": "武侯区" + }, + { + "value": "510108", + "label": "成华区" + }, + { + "value": "510112", + "label": "龙泉驿区" + }, + { + "value": "510113", + "label": "青白江区" + }, + { + "value": "510114", + "label": "新都区" + }, + { + "value": "510115", + "label": "温江区" + }, + { + "value": "510116", + "label": "双流区" + }, + { + "value": "510117", + "label": "郫都区" + }, + { + "value": "510121", + "label": "金堂县" + }, + { + "value": "510129", + "label": "大邑县" + }, + { + "value": "510131", + "label": "蒲江县" + }, + { + "value": "510132", + "label": "新津县" + }, + { + "value": "510181", + "label": "都江堰市" + }, + { + "value": "510182", + "label": "彭州市" + }, + { + "value": "510183", + "label": "邛崃市" + }, + { + "value": "510184", + "label": "崇州市" + }, + { + "value": "510185", + "label": "简阳市" + } + ] + }, + { + "value": "510300", + "label": "自贡市", + "children": [ + { + "value": "510302", + "label": "自流井区" + }, + { + "value": "510303", + "label": "贡井区" + }, + { + "value": "510304", + "label": "大安区" + }, + { + "value": "510311", + "label": "沿滩区" + }, + { + "value": "510321", + "label": "荣县" + }, + { + "value": "510322", + "label": "富顺县" + } + ] + }, + { + "value": "510400", + "label": "攀枝花市", + "children": [ + { + "value": "510402", + "label": "东区" + }, + { + "value": "510403", + "label": "西区" + }, + { + "value": "510411", + "label": "仁和区" + }, + { + "value": "510421", + "label": "米易县" + }, + { + "value": "510422", + "label": "盐边县" + } + ] + }, + { + "value": "510500", + "label": "泸州市", + "children": [ + { + "value": "510502", + "label": "江阳区" + }, + { + "value": "510503", + "label": "纳溪区" + }, + { + "value": "510504", + "label": "龙马潭区" + }, + { + "value": "510521", + "label": "泸县" + }, + { + "value": "510522", + "label": "合江县" + }, + { + "value": "510524", + "label": "叙永县" + }, + { + "value": "510525", + "label": "古蔺县" + } + ] + }, + { + "value": "510600", + "label": "德阳市", + "children": [ + { + "value": "510603", + "label": "旌阳区" + }, + { + "value": "510604", + "label": "罗江区" + }, + { + "value": "510623", + "label": "中江县" + }, + { + "value": "510681", + "label": "广汉市" + }, + { + "value": "510682", + "label": "什邡市" + }, + { + "value": "510683", + "label": "绵竹市" + } + ] + }, + { + "value": "510700", + "label": "绵阳市", + "children": [ + { + "value": "510703", + "label": "涪城区" + }, + { + "value": "510704", + "label": "游仙区" + }, + { + "value": "510705", + "label": "安州区" + }, + { + "value": "510722", + "label": "三台县" + }, + { + "value": "510723", + "label": "盐亭县" + }, + { + "value": "510725", + "label": "梓潼县" + }, + { + "value": "510726", + "label": "北川羌族自治县" + }, + { + "value": "510727", + "label": "平武县" + }, + { + "value": "510781", + "label": "江油市" + } + ] + }, + { + "value": "510800", + "label": "广元市", + "children": [ + { + "value": "510802", + "label": "利州区" + }, + { + "value": "510811", + "label": "昭化区" + }, + { + "value": "510812", + "label": "朝天区" + }, + { + "value": "510821", + "label": "旺苍县" + }, + { + "value": "510822", + "label": "青川县" + }, + { + "value": "510823", + "label": "剑阁县" + }, + { + "value": "510824", + "label": "苍溪县" + } + ] + }, + { + "value": "510900", + "label": "遂宁市", + "children": [ + { + "value": "510903", + "label": "船山区" + }, + { + "value": "510904", + "label": "安居区" + }, + { + "value": "510921", + "label": "蓬溪县" + }, + { + "value": "510922", + "label": "射洪县" + }, + { + "value": "510923", + "label": "大英县" + } + ] + }, + { + "value": "511000", + "label": "内江市", + "children": [ + { + "value": "511002", + "label": "市中区" + }, + { + "value": "511011", + "label": "东兴区" + }, + { + "value": "511024", + "label": "威远县" + }, + { + "value": "511025", + "label": "资中县" + }, + { + "value": "511083", + "label": "隆昌市" + } + ] + }, + { + "value": "511100", + "label": "乐山市", + "children": [ + { + "value": "511102", + "label": "市中区" + }, + { + "value": "511111", + "label": "沙湾区" + }, + { + "value": "511112", + "label": "五通桥区" + }, + { + "value": "511113", + "label": "金口河区" + }, + { + "value": "511123", + "label": "犍为县" + }, + { + "value": "511124", + "label": "井研县" + }, + { + "value": "511126", + "label": "夹江县" + }, + { + "value": "511129", + "label": "沐川县" + }, + { + "value": "511132", + "label": "峨边彝族自治县" + }, + { + "value": "511133", + "label": "马边彝族自治县" + }, + { + "value": "511181", + "label": "峨眉山市" + } + ] + }, + { + "value": "511300", + "label": "南充市", + "children": [ + { + "value": "511302", + "label": "顺庆区" + }, + { + "value": "511303", + "label": "高坪区" + }, + { + "value": "511304", + "label": "嘉陵区" + }, + { + "value": "511321", + "label": "南部县" + }, + { + "value": "511322", + "label": "营山县" + }, + { + "value": "511323", + "label": "蓬安县" + }, + { + "value": "511324", + "label": "仪陇县" + }, + { + "value": "511325", + "label": "西充县" + }, + { + "value": "511381", + "label": "阆中市" + } + ] + }, + { + "value": "511400", + "label": "眉山市", + "children": [ + { + "value": "511402", + "label": "东坡区" + }, + { + "value": "511403", + "label": "彭山区" + }, + { + "value": "511421", + "label": "仁寿县" + }, + { + "value": "511423", + "label": "洪雅县" + }, + { + "value": "511424", + "label": "丹棱县" + }, + { + "value": "511425", + "label": "青神县" + } + ] + }, + { + "value": "511500", + "label": "宜宾市", + "children": [ + { + "value": "511502", + "label": "翠屏区" + }, + { + "value": "511503", + "label": "南溪区" + }, + { + "value": "511521", + "label": "宜宾县" + }, + { + "value": "511523", + "label": "江安县" + }, + { + "value": "511524", + "label": "长宁县" + }, + { + "value": "511525", + "label": "高县" + }, + { + "value": "511526", + "label": "珙县" + }, + { + "value": "511527", + "label": "筠连县" + }, + { + "value": "511528", + "label": "兴文县" + }, + { + "value": "511529", + "label": "屏山县" + } + ] + }, + { + "value": "511600", + "label": "广安市", + "children": [ + { + "value": "511602", + "label": "广安区" + }, + { + "value": "511603", + "label": "前锋区" + }, + { + "value": "511621", + "label": "岳池县" + }, + { + "value": "511622", + "label": "武胜县" + }, + { + "value": "511623", + "label": "邻水县" + }, + { + "value": "511681", + "label": "华蓥市" + } + ] + }, + { + "value": "511700", + "label": "达州市", + "children": [ + { + "value": "511702", + "label": "通川区" + }, + { + "value": "511703", + "label": "达川区" + }, + { + "value": "511722", + "label": "宣汉县" + }, + { + "value": "511723", + "label": "开江县" + }, + { + "value": "511724", + "label": "大竹县" + }, + { + "value": "511725", + "label": "渠县" + }, + { + "value": "511781", + "label": "万源市" + } + ] + }, + { + "value": "511800", + "label": "雅安市", + "children": [ + { + "value": "511802", + "label": "雨城区" + }, + { + "value": "511803", + "label": "名山区" + }, + { + "value": "511822", + "label": "荥经县" + }, + { + "value": "511823", + "label": "汉源县" + }, + { + "value": "511824", + "label": "石棉县" + }, + { + "value": "511825", + "label": "天全县" + }, + { + "value": "511826", + "label": "芦山县" + }, + { + "value": "511827", + "label": "宝兴县" + } + ] + }, + { + "value": "511900", + "label": "巴中市", + "children": [ + { + "value": "511902", + "label": "巴州区" + }, + { + "value": "511903", + "label": "恩阳区" + }, + { + "value": "511921", + "label": "通江县" + }, + { + "value": "511922", + "label": "南江县" + }, + { + "value": "511923", + "label": "平昌县" + } + ] + }, + { + "value": "512000", + "label": "资阳市", + "children": [ + { + "value": "512002", + "label": "雁江区" + }, + { + "value": "512021", + "label": "安岳县" + }, + { + "value": "512022", + "label": "乐至县" + } + ] + }, + { + "value": "513200", + "label": "阿坝藏族羌族自治州", + "children": [ + { + "value": "513201", + "label": "马尔康市" + }, + { + "value": "513221", + "label": "汶川县" + }, + { + "value": "513222", + "label": "理县" + }, + { + "value": "513223", + "label": "茂县" + }, + { + "value": "513224", + "label": "松潘县" + }, + { + "value": "513225", + "label": "九寨沟县" + }, + { + "value": "513226", + "label": "金川县" + }, + { + "value": "513227", + "label": "小金县" + }, + { + "value": "513228", + "label": "黑水县" + }, + { + "value": "513230", + "label": "壤塘县" + }, + { + "value": "513231", + "label": "阿坝县" + }, + { + "value": "513232", + "label": "若尔盖县" + }, + { + "value": "513233", + "label": "红原县" + } + ] + }, + { + "value": "513300", + "label": "甘孜藏族自治州", + "children": [ + { + "value": "513301", + "label": "康定市" + }, + { + "value": "513322", + "label": "泸定县" + }, + { + "value": "513323", + "label": "丹巴县" + }, + { + "value": "513324", + "label": "九龙县" + }, + { + "value": "513325", + "label": "雅江县" + }, + { + "value": "513326", + "label": "道孚县" + }, + { + "value": "513327", + "label": "炉霍县" + }, + { + "value": "513328", + "label": "甘孜县" + }, + { + "value": "513329", + "label": "新龙县" + }, + { + "value": "513330", + "label": "德格县" + }, + { + "value": "513331", + "label": "白玉县" + }, + { + "value": "513332", + "label": "石渠县" + }, + { + "value": "513333", + "label": "色达县" + }, + { + "value": "513334", + "label": "理塘县" + }, + { + "value": "513335", + "label": "巴塘县" + }, + { + "value": "513336", + "label": "乡城县" + }, + { + "value": "513337", + "label": "稻城县" + }, + { + "value": "513338", + "label": "得荣县" + } + ] + }, + { + "value": "513400", + "label": "凉山彝族自治州", + "children": [ + { + "value": "513401", + "label": "西昌市" + }, + { + "value": "513422", + "label": "木里藏族自治县" + }, + { + "value": "513423", + "label": "盐源县" + }, + { + "value": "513424", + "label": "德昌县" + }, + { + "value": "513425", + "label": "会理县" + }, + { + "value": "513426", + "label": "会东县" + }, + { + "value": "513427", + "label": "宁南县" + }, + { + "value": "513428", + "label": "普格县" + }, + { + "value": "513429", + "label": "布拖县" + }, + { + "value": "513430", + "label": "金阳县" + }, + { + "value": "513431", + "label": "昭觉县" + }, + { + "value": "513432", + "label": "喜德县" + }, + { + "value": "513433", + "label": "冕宁县" + }, + { + "value": "513434", + "label": "越西县" + }, + { + "value": "513435", + "label": "甘洛县" + }, + { + "value": "513436", + "label": "美姑县" + }, + { + "value": "513437", + "label": "雷波县" + } + ] + } + ] + }, + { + "value": "520000", + "label": "贵州省", + "children": [ + { + "value": "520100", + "label": "贵阳市", + "children": [ + { + "value": "520102", + "label": "南明区" + }, + { + "value": "520103", + "label": "云岩区" + }, + { + "value": "520111", + "label": "花溪区" + }, + { + "value": "520112", + "label": "乌当区" + }, + { + "value": "520113", + "label": "白云区" + }, + { + "value": "520115", + "label": "观山湖区" + }, + { + "value": "520121", + "label": "开阳县" + }, + { + "value": "520122", + "label": "息烽县" + }, + { + "value": "520123", + "label": "修文县" + }, + { + "value": "520181", + "label": "清镇市" + } + ] + }, + { + "value": "520200", + "label": "六盘水市", + "children": [ + { + "value": "520201", + "label": "钟山区" + }, + { + "value": "520203", + "label": "六枝特区" + }, + { + "value": "520221", + "label": "水城县" + }, + { + "value": "520281", + "label": "盘州市" + } + ] + }, + { + "value": "520300", + "label": "遵义市", + "children": [ + { + "value": "520302", + "label": "红花岗区" + }, + { + "value": "520303", + "label": "汇川区" + }, + { + "value": "520304", + "label": "播州区" + }, + { + "value": "520322", + "label": "桐梓县" + }, + { + "value": "520323", + "label": "绥阳县" + }, + { + "value": "520324", + "label": "正安县" + }, + { + "value": "520325", + "label": "道真仡佬族苗族自治县" + }, + { + "value": "520326", + "label": "务川仡佬族苗族自治县" + }, + { + "value": "520327", + "label": "凤冈县" + }, + { + "value": "520328", + "label": "湄潭县" + }, + { + "value": "520329", + "label": "余庆县" + }, + { + "value": "520330", + "label": "习水县" + }, + { + "value": "520381", + "label": "赤水市" + }, + { + "value": "520382", + "label": "仁怀市" + } + ] + }, + { + "value": "520400", + "label": "安顺市", + "children": [ + { + "value": "520402", + "label": "西秀区" + }, + { + "value": "520403", + "label": "平坝区" + }, + { + "value": "520422", + "label": "普定县" + }, + { + "value": "520423", + "label": "镇宁布依族苗族自治县" + }, + { + "value": "520424", + "label": "关岭布依族苗族自治县" + }, + { + "value": "520425", + "label": "紫云苗族布依族自治县" + } + ] + }, + { + "value": "520500", + "label": "毕节市", + "children": [ + { + "value": "520502", + "label": "七星关区" + }, + { + "value": "520521", + "label": "大方县" + }, + { + "value": "520522", + "label": "黔西县" + }, + { + "value": "520523", + "label": "金沙县" + }, + { + "value": "520524", + "label": "织金县" + }, + { + "value": "520525", + "label": "纳雍县" + }, + { + "value": "520526", + "label": "威宁彝族回族苗族自治县" + }, + { + "value": "520527", + "label": "赫章县" + } + ] + }, + { + "value": "520600", + "label": "铜仁市", + "children": [ + { + "value": "520602", + "label": "碧江区" + }, + { + "value": "520603", + "label": "万山区" + }, + { + "value": "520621", + "label": "江口县" + }, + { + "value": "520622", + "label": "玉屏侗族自治县" + }, + { + "value": "520623", + "label": "石阡县" + }, + { + "value": "520624", + "label": "思南县" + }, + { + "value": "520625", + "label": "印江土家族苗族自治县" + }, + { + "value": "520626", + "label": "德江县" + }, + { + "value": "520627", + "label": "沿河土家族自治县" + }, + { + "value": "520628", + "label": "松桃苗族自治县" + } + ] + }, + { + "value": "522300", + "label": "黔西南布依族苗族自治州", + "children": [ + { + "value": "522301", + "label": "兴义市" + }, + { + "value": "522322", + "label": "兴仁县" + }, + { + "value": "522323", + "label": "普安县" + }, + { + "value": "522324", + "label": "晴隆县" + }, + { + "value": "522325", + "label": "贞丰县" + }, + { + "value": "522326", + "label": "望谟县" + }, + { + "value": "522327", + "label": "册亨县" + }, + { + "value": "522328", + "label": "安龙县" + } + ] + }, + { + "value": "522600", + "label": "黔东南苗族侗族自治州", + "children": [ + { + "value": "522601", + "label": "凯里市" + }, + { + "value": "522622", + "label": "黄平县" + }, + { + "value": "522623", + "label": "施秉县" + }, + { + "value": "522624", + "label": "三穗县" + }, + { + "value": "522625", + "label": "镇远县" + }, + { + "value": "522626", + "label": "岑巩县" + }, + { + "value": "522627", + "label": "天柱县" + }, + { + "value": "522628", + "label": "锦屏县" + }, + { + "value": "522629", + "label": "剑河县" + }, + { + "value": "522630", + "label": "台江县" + }, + { + "value": "522631", + "label": "黎平县" + }, + { + "value": "522632", + "label": "榕江县" + }, + { + "value": "522633", + "label": "从江县" + }, + { + "value": "522634", + "label": "雷山县" + }, + { + "value": "522635", + "label": "麻江县" + }, + { + "value": "522636", + "label": "丹寨县" + } + ] + }, + { + "value": "522700", + "label": "黔南布依族苗族自治州", + "children": [ + { + "value": "522701", + "label": "都匀市" + }, + { + "value": "522702", + "label": "福泉市" + }, + { + "value": "522722", + "label": "荔波县" + }, + { + "value": "522723", + "label": "贵定县" + }, + { + "value": "522725", + "label": "瓮安县" + }, + { + "value": "522726", + "label": "独山县" + }, + { + "value": "522727", + "label": "平塘县" + }, + { + "value": "522728", + "label": "罗甸县" + }, + { + "value": "522729", + "label": "长顺县" + }, + { + "value": "522730", + "label": "龙里县" + }, + { + "value": "522731", + "label": "惠水县" + }, + { + "value": "522732", + "label": "三都水族自治县" + } + ] + } + ] + }, + { + "value": "530000", + "label": "云南省", + "children": [ + { + "value": "530100", + "label": "昆明市", + "children": [ + { + "value": "530102", + "label": "五华区" + }, + { + "value": "530103", + "label": "盘龙区" + }, + { + "value": "530111", + "label": "官渡区" + }, + { + "value": "530112", + "label": "西山区" + }, + { + "value": "530113", + "label": "东川区" + }, + { + "value": "530114", + "label": "呈贡区" + }, + { + "value": "530115", + "label": "晋宁区" + }, + { + "value": "530124", + "label": "富民县" + }, + { + "value": "530125", + "label": "宜良县" + }, + { + "value": "530126", + "label": "石林彝族自治县" + }, + { + "value": "530127", + "label": "嵩明县" + }, + { + "value": "530128", + "label": "禄劝彝族苗族自治县" + }, + { + "value": "530129", + "label": "寻甸回族彝族自治县" + }, + { + "value": "530181", + "label": "安宁市" + } + ] + }, + { + "value": "530300", + "label": "曲靖市", + "children": [ + { + "value": "530302", + "label": "麒麟区" + }, + { + "value": "530303", + "label": "沾益区" + }, + { + "value": "530304", + "label": "马龙区" + }, + { + "value": "530322", + "label": "陆良县" + }, + { + "value": "530323", + "label": "师宗县" + }, + { + "value": "530324", + "label": "罗平县" + }, + { + "value": "530325", + "label": "富源县" + }, + { + "value": "530326", + "label": "会泽县" + }, + { + "value": "530381", + "label": "宣威市" + } + ] + }, + { + "value": "530400", + "label": "玉溪市", + "children": [ + { + "value": "530402", + "label": "红塔区" + }, + { + "value": "530403", + "label": "江川区" + }, + { + "value": "530422", + "label": "澄江县" + }, + { + "value": "530423", + "label": "通海县" + }, + { + "value": "530424", + "label": "华宁县" + }, + { + "value": "530425", + "label": "易门县" + }, + { + "value": "530426", + "label": "峨山彝族自治县" + }, + { + "value": "530427", + "label": "新平彝族傣族自治县" + }, + { + "value": "530428", + "label": "元江哈尼族彝族傣族自治县" + } + ] + }, + { + "value": "530500", + "label": "保山市", + "children": [ + { + "value": "530502", + "label": "隆阳区" + }, + { + "value": "530521", + "label": "施甸县" + }, + { + "value": "530523", + "label": "龙陵县" + }, + { + "value": "530524", + "label": "昌宁县" + }, + { + "value": "530581", + "label": "腾冲市" + } + ] + }, + { + "value": "530600", + "label": "昭通市", + "children": [ + { + "value": "530602", + "label": "昭阳区" + }, + { + "value": "530621", + "label": "鲁甸县" + }, + { + "value": "530622", + "label": "巧家县" + }, + { + "value": "530623", + "label": "盐津县" + }, + { + "value": "530624", + "label": "大关县" + }, + { + "value": "530625", + "label": "永善县" + }, + { + "value": "530626", + "label": "绥江县" + }, + { + "value": "530627", + "label": "镇雄县" + }, + { + "value": "530628", + "label": "彝良县" + }, + { + "value": "530629", + "label": "威信县" + }, + { + "value": "530681", + "label": "水富市" + } + ] + }, + { + "value": "530700", + "label": "丽江市", + "children": [ + { + "value": "530702", + "label": "古城区" + }, + { + "value": "530721", + "label": "玉龙纳西族自治县" + }, + { + "value": "530722", + "label": "永胜县" + }, + { + "value": "530723", + "label": "华坪县" + }, + { + "value": "530724", + "label": "宁蒗彝族自治县" + } + ] + }, + { + "value": "530800", + "label": "普洱市", + "children": [ + { + "value": "530802", + "label": "思茅区" + }, + { + "value": "530821", + "label": "宁洱哈尼族彝族自治县" + }, + { + "value": "530822", + "label": "墨江哈尼族自治县" + }, + { + "value": "530823", + "label": "景东彝族自治县" + }, + { + "value": "530824", + "label": "景谷傣族彝族自治县" + }, + { + "value": "530825", + "label": "镇沅彝族哈尼族拉祜族自治县" + }, + { + "value": "530826", + "label": "江城哈尼族彝族自治县" + }, + { + "value": "530827", + "label": "孟连傣族拉祜族佤族自治县" + }, + { + "value": "530828", + "label": "澜沧拉祜族自治县" + }, + { + "value": "530829", + "label": "西盟佤族自治县" + } + ] + }, + { + "value": "530900", + "label": "临沧市", + "children": [ + { + "value": "530902", + "label": "临翔区" + }, + { + "value": "530921", + "label": "凤庆县" + }, + { + "value": "530922", + "label": "云县" + }, + { + "value": "530923", + "label": "永德县" + }, + { + "value": "530924", + "label": "镇康县" + }, + { + "value": "530925", + "label": "双江拉祜族佤族布朗族傣族自治县" + }, + { + "value": "530926", + "label": "耿马傣族佤族自治县" + }, + { + "value": "530927", + "label": "沧源佤族自治县" + } + ] + }, + { + "value": "532300", + "label": "楚雄彝族自治州", + "children": [ + { + "value": "532301", + "label": "楚雄市" + }, + { + "value": "532322", + "label": "双柏县" + }, + { + "value": "532323", + "label": "牟定县" + }, + { + "value": "532324", + "label": "南华县" + }, + { + "value": "532325", + "label": "姚安县" + }, + { + "value": "532326", + "label": "大姚县" + }, + { + "value": "532327", + "label": "永仁县" + }, + { + "value": "532328", + "label": "元谋县" + }, + { + "value": "532329", + "label": "武定县" + }, + { + "value": "532331", + "label": "禄丰县" + } + ] + }, + { + "value": "532500", + "label": "红河哈尼族彝族自治州", + "children": [ + { + "value": "532501", + "label": "个旧市" + }, + { + "value": "532502", + "label": "开远市" + }, + { + "value": "532503", + "label": "蒙自市" + }, + { + "value": "532504", + "label": "弥勒市" + }, + { + "value": "532523", + "label": "屏边苗族自治县" + }, + { + "value": "532524", + "label": "建水县" + }, + { + "value": "532525", + "label": "石屏县" + }, + { + "value": "532527", + "label": "泸西县" + }, + { + "value": "532528", + "label": "元阳县" + }, + { + "value": "532529", + "label": "红河县" + }, + { + "value": "532530", + "label": "金平苗族瑶族傣族自治县" + }, + { + "value": "532531", + "label": "绿春县" + }, + { + "value": "532532", + "label": "河口瑶族自治县" + } + ] + }, + { + "value": "532600", + "label": "文山壮族苗族自治州", + "children": [ + { + "value": "532601", + "label": "文山市" + }, + { + "value": "532622", + "label": "砚山县" + }, + { + "value": "532623", + "label": "西畴县" + }, + { + "value": "532624", + "label": "麻栗坡县" + }, + { + "value": "532625", + "label": "马关县" + }, + { + "value": "532626", + "label": "丘北县" + }, + { + "value": "532627", + "label": "广南县" + }, + { + "value": "532628", + "label": "富宁县" + } + ] + }, + { + "value": "532800", + "label": "西双版纳傣族自治州", + "children": [ + { + "value": "532801", + "label": "景洪市" + }, + { + "value": "532822", + "label": "勐海县" + }, + { + "value": "532823", + "label": "勐腊县" + } + ] + }, + { + "value": "532900", + "label": "大理白族自治州", + "children": [ + { + "value": "532901", + "label": "大理市" + }, + { + "value": "532922", + "label": "漾濞彝族自治县" + }, + { + "value": "532923", + "label": "祥云县" + }, + { + "value": "532924", + "label": "宾川县" + }, + { + "value": "532925", + "label": "弥渡县" + }, + { + "value": "532926", + "label": "南涧彝族自治县" + }, + { + "value": "532927", + "label": "巍山彝族回族自治县" + }, + { + "value": "532928", + "label": "永平县" + }, + { + "value": "532929", + "label": "云龙县" + }, + { + "value": "532930", + "label": "洱源县" + }, + { + "value": "532931", + "label": "剑川县" + }, + { + "value": "532932", + "label": "鹤庆县" + } + ] + }, + { + "value": "533100", + "label": "德宏傣族景颇族自治州", + "children": [ + { + "value": "533102", + "label": "瑞丽市" + }, + { + "value": "533103", + "label": "芒市" + }, + { + "value": "533122", + "label": "梁河县" + }, + { + "value": "533123", + "label": "盈江县" + }, + { + "value": "533124", + "label": "陇川县" + } + ] + }, + { + "value": "533300", + "label": "怒江傈僳族自治州", + "children": [ + { + "value": "533301", + "label": "泸水市" + }, + { + "value": "533323", + "label": "福贡县" + }, + { + "value": "533324", + "label": "贡山独龙族怒族自治县" + }, + { + "value": "533325", + "label": "兰坪白族普米族自治县" + } + ] + }, + { + "value": "533400", + "label": "迪庆藏族自治州", + "children": [ + { + "value": "533401", + "label": "香格里拉市" + }, + { + "value": "533422", + "label": "德钦县" + }, + { + "value": "533423", + "label": "维西傈僳族自治县" + } + ] + } + ] + }, + { + "value": "540000", + "label": "西藏自治区", + "children": [ + { + "value": "540100", + "label": "拉萨市", + "children": [ + { + "value": "540102", + "label": "城关区" + }, + { + "value": "540103", + "label": "堆龙德庆区" + }, + { + "value": "540104", + "label": "达孜区" + }, + { + "value": "540121", + "label": "林周县" + }, + { + "value": "540122", + "label": "当雄县" + }, + { + "value": "540123", + "label": "尼木县" + }, + { + "value": "540124", + "label": "曲水县" + }, + { + "value": "540127", + "label": "墨竹工卡县" + } + ] + }, + { + "value": "540200", + "label": "日喀则市", + "children": [ + { + "value": "540202", + "label": "桑珠孜区" + }, + { + "value": "540221", + "label": "南木林县" + }, + { + "value": "540222", + "label": "江孜县" + }, + { + "value": "540223", + "label": "定日县" + }, + { + "value": "540224", + "label": "萨迦县" + }, + { + "value": "540225", + "label": "拉孜县" + }, + { + "value": "540226", + "label": "昂仁县" + }, + { + "value": "540227", + "label": "谢通门县" + }, + { + "value": "540228", + "label": "白朗县" + }, + { + "value": "540229", + "label": "仁布县" + }, + { + "value": "540230", + "label": "康马县" + }, + { + "value": "540231", + "label": "定结县" + }, + { + "value": "540232", + "label": "仲巴县" + }, + { + "value": "540233", + "label": "亚东县" + }, + { + "value": "540234", + "label": "吉隆县" + }, + { + "value": "540235", + "label": "聂拉木县" + }, + { + "value": "540236", + "label": "萨嘎县" + }, + { + "value": "540237", + "label": "岗巴县" + } + ] + }, + { + "value": "540300", + "label": "昌都市", + "children": [ + { + "value": "540302", + "label": "卡若区" + }, + { + "value": "540321", + "label": "江达县" + }, + { + "value": "540322", + "label": "贡觉县" + }, + { + "value": "540323", + "label": "类乌齐县" + }, + { + "value": "540324", + "label": "丁青县" + }, + { + "value": "540325", + "label": "察雅县" + }, + { + "value": "540326", + "label": "八宿县" + }, + { + "value": "540327", + "label": "左贡县" + }, + { + "value": "540328", + "label": "芒康县" + }, + { + "value": "540329", + "label": "洛隆县" + }, + { + "value": "540330", + "label": "边坝县" + } + ] + }, + { + "value": "540400", + "label": "林芝市", + "children": [ + { + "value": "540402", + "label": "巴宜区" + }, + { + "value": "540421", + "label": "工布江达县" + }, + { + "value": "540422", + "label": "米林县" + }, + { + "value": "540423", + "label": "墨脱县" + }, + { + "value": "540424", + "label": "波密县" + }, + { + "value": "540425", + "label": "察隅县" + }, + { + "value": "540426", + "label": "朗县" + } + ] + }, + { + "value": "540500", + "label": "山南市", + "children": [ + { + "value": "540502", + "label": "乃东区" + }, + { + "value": "540521", + "label": "扎囊县" + }, + { + "value": "540522", + "label": "贡嘎县" + }, + { + "value": "540523", + "label": "桑日县" + }, + { + "value": "540524", + "label": "琼结县" + }, + { + "value": "540525", + "label": "曲松县" + }, + { + "value": "540526", + "label": "措美县" + }, + { + "value": "540527", + "label": "洛扎县" + }, + { + "value": "540528", + "label": "加查县" + }, + { + "value": "540529", + "label": "隆子县" + }, + { + "value": "540530", + "label": "错那县" + }, + { + "value": "540531", + "label": "浪卡子县" + } + ] + }, + { + "value": "540600", + "label": "那曲市", + "children": [ + { + "value": "540602", + "label": "色尼区" + }, + { + "value": "540621", + "label": "嘉黎县" + }, + { + "value": "540622", + "label": "比如县" + }, + { + "value": "540623", + "label": "聂荣县" + }, + { + "value": "540624", + "label": "安多县" + }, + { + "value": "540625", + "label": "申扎县" + }, + { + "value": "540626", + "label": "索县" + }, + { + "value": "540627", + "label": "班戈县" + }, + { + "value": "540628", + "label": "巴青县" + }, + { + "value": "540629", + "label": "尼玛县" + }, + { + "value": "540630", + "label": "双湖县" + } + ] + }, + { + "value": "542500", + "label": "阿里地区", + "children": [ + { + "value": "542521", + "label": "普兰县" + }, + { + "value": "542522", + "label": "札达县" + }, + { + "value": "542523", + "label": "噶尔县" + }, + { + "value": "542524", + "label": "日土县" + }, + { + "value": "542525", + "label": "革吉县" + }, + { + "value": "542526", + "label": "改则县" + }, + { + "value": "542527", + "label": "措勤县" + } + ] + } + ] + }, + { + "value": "610000", + "label": "陕西省", + "children": [ + { + "value": "610100", + "label": "西安市", + "children": [ + { + "value": "610102", + "label": "新城区" + }, + { + "value": "610103", + "label": "碑林区" + }, + { + "value": "610104", + "label": "莲湖区" + }, + { + "value": "610111", + "label": "灞桥区" + }, + { + "value": "610112", + "label": "未央区" + }, + { + "value": "610113", + "label": "雁塔区" + }, + { + "value": "610114", + "label": "阎良区" + }, + { + "value": "610115", + "label": "临潼区" + }, + { + "value": "610116", + "label": "长安区" + }, + { + "value": "610117", + "label": "高陵区" + }, + { + "value": "610118", + "label": "鄠邑区" + }, + { + "value": "610122", + "label": "蓝田县" + }, + { + "value": "610124", + "label": "周至县" + } + ] + }, + { + "value": "610200", + "label": "铜川市", + "children": [ + { + "value": "610202", + "label": "王益区" + }, + { + "value": "610203", + "label": "印台区" + }, + { + "value": "610204", + "label": "耀州区" + }, + { + "value": "610222", + "label": "宜君县" + } + ] + }, + { + "value": "610300", + "label": "宝鸡市", + "children": [ + { + "value": "610302", + "label": "渭滨区" + }, + { + "value": "610303", + "label": "金台区" + }, + { + "value": "610304", + "label": "陈仓区" + }, + { + "value": "610322", + "label": "凤翔县" + }, + { + "value": "610323", + "label": "岐山县" + }, + { + "value": "610324", + "label": "扶风县" + }, + { + "value": "610326", + "label": "眉县" + }, + { + "value": "610327", + "label": "陇县" + }, + { + "value": "610328", + "label": "千阳县" + }, + { + "value": "610329", + "label": "麟游县" + }, + { + "value": "610330", + "label": "凤县" + }, + { + "value": "610331", + "label": "太白县" + } + ] + }, + { + "value": "610400", + "label": "咸阳市", + "children": [ + { + "value": "610402", + "label": "秦都区" + }, + { + "value": "610403", + "label": "杨陵区" + }, + { + "value": "610404", + "label": "渭城区" + }, + { + "value": "610422", + "label": "三原县" + }, + { + "value": "610423", + "label": "泾阳县" + }, + { + "value": "610424", + "label": "乾县" + }, + { + "value": "610425", + "label": "礼泉县" + }, + { + "value": "610426", + "label": "永寿县" + }, + { + "value": "610428", + "label": "长武县" + }, + { + "value": "610429", + "label": "旬邑县" + }, + { + "value": "610430", + "label": "淳化县" + }, + { + "value": "610431", + "label": "武功县" + }, + { + "value": "610481", + "label": "兴平市" + }, + { + "value": "610482", + "label": "彬州市" + } + ] + }, + { + "value": "610500", + "label": "渭南市", + "children": [ + { + "value": "610502", + "label": "临渭区" + }, + { + "value": "610503", + "label": "华州区" + }, + { + "value": "610522", + "label": "潼关县" + }, + { + "value": "610523", + "label": "大荔县" + }, + { + "value": "610524", + "label": "合阳县" + }, + { + "value": "610525", + "label": "澄城县" + }, + { + "value": "610526", + "label": "蒲城县" + }, + { + "value": "610527", + "label": "白水县" + }, + { + "value": "610528", + "label": "富平县" + }, + { + "value": "610581", + "label": "韩城市" + }, + { + "value": "610582", + "label": "华阴市" + } + ] + }, + { + "value": "610600", + "label": "延安市", + "children": [ + { + "value": "610602", + "label": "宝塔区" + }, + { + "value": "610603", + "label": "安塞区" + }, + { + "value": "610621", + "label": "延长县" + }, + { + "value": "610622", + "label": "延川县" + }, + { + "value": "610623", + "label": "子长县" + }, + { + "value": "610625", + "label": "志丹县" + }, + { + "value": "610626", + "label": "吴起县" + }, + { + "value": "610627", + "label": "甘泉县" + }, + { + "value": "610628", + "label": "富县" + }, + { + "value": "610629", + "label": "洛川县" + }, + { + "value": "610630", + "label": "宜川县" + }, + { + "value": "610631", + "label": "黄龙县" + }, + { + "value": "610632", + "label": "黄陵县" + } + ] + }, + { + "value": "610700", + "label": "汉中市", + "children": [ + { + "value": "610702", + "label": "汉台区" + }, + { + "value": "610703", + "label": "南郑区" + }, + { + "value": "610722", + "label": "城固县" + }, + { + "value": "610723", + "label": "洋县" + }, + { + "value": "610724", + "label": "西乡县" + }, + { + "value": "610725", + "label": "勉县" + }, + { + "value": "610726", + "label": "宁强县" + }, + { + "value": "610727", + "label": "略阳县" + }, + { + "value": "610728", + "label": "镇巴县" + }, + { + "value": "610729", + "label": "留坝县" + }, + { + "value": "610730", + "label": "佛坪县" + } + ] + }, + { + "value": "610800", + "label": "榆林市", + "children": [ + { + "value": "610802", + "label": "榆阳区" + }, + { + "value": "610803", + "label": "横山区" + }, + { + "value": "610822", + "label": "府谷县" + }, + { + "value": "610824", + "label": "靖边县" + }, + { + "value": "610825", + "label": "定边县" + }, + { + "value": "610826", + "label": "绥德县" + }, + { + "value": "610827", + "label": "米脂县" + }, + { + "value": "610828", + "label": "佳县" + }, + { + "value": "610829", + "label": "吴堡县" + }, + { + "value": "610830", + "label": "清涧县" + }, + { + "value": "610831", + "label": "子洲县" + }, + { + "value": "610881", + "label": "神木市" + } + ] + }, + { + "value": "610900", + "label": "安康市", + "children": [ + { + "value": "610902", + "label": "汉滨区" + }, + { + "value": "610921", + "label": "汉阴县" + }, + { + "value": "610922", + "label": "石泉县" + }, + { + "value": "610923", + "label": "宁陕县" + }, + { + "value": "610924", + "label": "紫阳县" + }, + { + "value": "610925", + "label": "岚皋县" + }, + { + "value": "610926", + "label": "平利县" + }, + { + "value": "610927", + "label": "镇坪县" + }, + { + "value": "610928", + "label": "旬阳县" + }, + { + "value": "610929", + "label": "白河县" + } + ] + }, + { + "value": "611000", + "label": "商洛市", + "children": [ + { + "value": "611002", + "label": "商州区" + }, + { + "value": "611021", + "label": "洛南县" + }, + { + "value": "611022", + "label": "丹凤县" + }, + { + "value": "611023", + "label": "商南县" + }, + { + "value": "611024", + "label": "山阳县" + }, + { + "value": "611025", + "label": "镇安县" + }, + { + "value": "611026", + "label": "柞水县" + } + ] + } + ] + }, + { + "value": "620000", + "label": "甘肃省", + "children": [ + { + "value": "620100", + "label": "兰州市", + "children": [ + { + "value": "620102", + "label": "城关区" + }, + { + "value": "620103", + "label": "七里河区" + }, + { + "value": "620104", + "label": "西固区" + }, + { + "value": "620105", + "label": "安宁区" + }, + { + "value": "620111", + "label": "红古区" + }, + { + "value": "620121", + "label": "永登县" + }, + { + "value": "620122", + "label": "皋兰县" + }, + { + "value": "620123", + "label": "榆中县" + } + ] + }, + { + "value": "620200", + "label": "嘉峪关市", + "children": [] + }, + { + "value": "620300", + "label": "金昌市", + "children": [ + { + "value": "620302", + "label": "金川区" + }, + { + "value": "620321", + "label": "永昌县" + } + ] + }, + { + "value": "620400", + "label": "白银市", + "children": [ + { + "value": "620402", + "label": "白银区" + }, + { + "value": "620403", + "label": "平川区" + }, + { + "value": "620421", + "label": "靖远县" + }, + { + "value": "620422", + "label": "会宁县" + }, + { + "value": "620423", + "label": "景泰县" + } + ] + }, + { + "value": "620500", + "label": "天水市", + "children": [ + { + "value": "620502", + "label": "秦州区" + }, + { + "value": "620503", + "label": "麦积区" + }, + { + "value": "620521", + "label": "清水县" + }, + { + "value": "620522", + "label": "秦安县" + }, + { + "value": "620523", + "label": "甘谷县" + }, + { + "value": "620524", + "label": "武山县" + }, + { + "value": "620525", + "label": "张家川回族自治县" + } + ] + }, + { + "value": "620600", + "label": "武威市", + "children": [ + { + "value": "620602", + "label": "凉州区" + }, + { + "value": "620621", + "label": "民勤县" + }, + { + "value": "620622", + "label": "古浪县" + }, + { + "value": "620623", + "label": "天祝藏族自治县" + } + ] + }, + { + "value": "620700", + "label": "张掖市", + "children": [ + { + "value": "620702", + "label": "甘州区" + }, + { + "value": "620721", + "label": "肃南裕固族自治县" + }, + { + "value": "620722", + "label": "民乐县" + }, + { + "value": "620723", + "label": "临泽县" + }, + { + "value": "620724", + "label": "高台县" + }, + { + "value": "620725", + "label": "山丹县" + } + ] + }, + { + "value": "620800", + "label": "平凉市", + "children": [ + { + "value": "620802", + "label": "崆峒区" + }, + { + "value": "620821", + "label": "泾川县" + }, + { + "value": "620822", + "label": "灵台县" + }, + { + "value": "620823", + "label": "崇信县" + }, + { + "value": "620825", + "label": "庄浪县" + }, + { + "value": "620826", + "label": "静宁县" + }, + { + "value": "620881", + "label": "华亭市" + } + ] + }, + { + "value": "620900", + "label": "酒泉市", + "children": [ + { + "value": "620902", + "label": "肃州区" + }, + { + "value": "620921", + "label": "金塔县" + }, + { + "value": "620922", + "label": "瓜州县" + }, + { + "value": "620923", + "label": "肃北蒙古族自治县" + }, + { + "value": "620924", + "label": "阿克塞哈萨克族自治县" + }, + { + "value": "620981", + "label": "玉门市" + }, + { + "value": "620982", + "label": "敦煌市" + } + ] + }, + { + "value": "621000", + "label": "庆阳市", + "children": [ + { + "value": "621002", + "label": "西峰区" + }, + { + "value": "621021", + "label": "庆城县" + }, + { + "value": "621022", + "label": "环县" + }, + { + "value": "621023", + "label": "华池县" + }, + { + "value": "621024", + "label": "合水县" + }, + { + "value": "621025", + "label": "正宁县" + }, + { + "value": "621026", + "label": "宁县" + }, + { + "value": "621027", + "label": "镇原县" + } + ] + }, + { + "value": "621100", + "label": "定西市", + "children": [ + { + "value": "621102", + "label": "安定区" + }, + { + "value": "621121", + "label": "通渭县" + }, + { + "value": "621122", + "label": "陇西县" + }, + { + "value": "621123", + "label": "渭源县" + }, + { + "value": "621124", + "label": "临洮县" + }, + { + "value": "621125", + "label": "漳县" + }, + { + "value": "621126", + "label": "岷县" + } + ] + }, + { + "value": "621200", + "label": "陇南市", + "children": [ + { + "value": "621202", + "label": "武都区" + }, + { + "value": "621221", + "label": "成县" + }, + { + "value": "621222", + "label": "文县" + }, + { + "value": "621223", + "label": "宕昌县" + }, + { + "value": "621224", + "label": "康县" + }, + { + "value": "621225", + "label": "西和县" + }, + { + "value": "621226", + "label": "礼县" + }, + { + "value": "621227", + "label": "徽县" + }, + { + "value": "621228", + "label": "两当县" + } + ] + }, + { + "value": "622900", + "label": "临夏回族自治州", + "children": [ + { + "value": "622901", + "label": "临夏市" + }, + { + "value": "622921", + "label": "临夏县" + }, + { + "value": "622922", + "label": "康乐县" + }, + { + "value": "622923", + "label": "永靖县" + }, + { + "value": "622924", + "label": "广河县" + }, + { + "value": "622925", + "label": "和政县" + }, + { + "value": "622926", + "label": "东乡族自治县" + }, + { + "value": "622927", + "label": "积石山保安族东乡族撒拉族自治县" + } + ] + }, + { + "value": "623000", + "label": "甘南藏族自治州", + "children": [ + { + "value": "623001", + "label": "合作市" + }, + { + "value": "623021", + "label": "临潭县" + }, + { + "value": "623022", + "label": "卓尼县" + }, + { + "value": "623023", + "label": "舟曲县" + }, + { + "value": "623024", + "label": "迭部县" + }, + { + "value": "623025", + "label": "玛曲县" + }, + { + "value": "623026", + "label": "碌曲县" + }, + { + "value": "623027", + "label": "夏河县" + } + ] + } + ] + }, + { + "value": "630000", + "label": "青海省", + "children": [ + { + "value": "630100", + "label": "西宁市", + "children": [ + { + "value": "630102", + "label": "城东区" + }, + { + "value": "630103", + "label": "城中区" + }, + { + "value": "630104", + "label": "城西区" + }, + { + "value": "630105", + "label": "城北区" + }, + { + "value": "630121", + "label": "大通回族土族自治县" + }, + { + "value": "630122", + "label": "湟中县" + }, + { + "value": "630123", + "label": "湟源县" + } + ] + }, + { + "value": "630200", + "label": "海东市", + "children": [ + { + "value": "630202", + "label": "乐都区" + }, + { + "value": "630203", + "label": "平安区" + }, + { + "value": "630222", + "label": "民和回族土族自治县" + }, + { + "value": "630223", + "label": "互助土族自治县" + }, + { + "value": "630224", + "label": "化隆回族自治县" + }, + { + "value": "630225", + "label": "循化撒拉族自治县" + } + ] + }, + { + "value": "632200", + "label": "海北藏族自治州", + "children": [ + { + "value": "632221", + "label": "门源回族自治县" + }, + { + "value": "632222", + "label": "祁连县" + }, + { + "value": "632223", + "label": "海晏县" + }, + { + "value": "632224", + "label": "刚察县" + } + ] + }, + { + "value": "632300", + "label": "黄南藏族自治州", + "children": [ + { + "value": "632321", + "label": "同仁县" + }, + { + "value": "632322", + "label": "尖扎县" + }, + { + "value": "632323", + "label": "泽库县" + }, + { + "value": "632324", + "label": "河南蒙古族自治县" + } + ] + }, + { + "value": "632500", + "label": "海南藏族自治州", + "children": [ + { + "value": "632521", + "label": "共和县" + }, + { + "value": "632522", + "label": "同德县" + }, + { + "value": "632523", + "label": "贵德县" + }, + { + "value": "632524", + "label": "兴海县" + }, + { + "value": "632525", + "label": "贵南县" + } + ] + }, + { + "value": "632600", + "label": "果洛藏族自治州", + "children": [ + { + "value": "632621", + "label": "玛沁县" + }, + { + "value": "632622", + "label": "班玛县" + }, + { + "value": "632623", + "label": "甘德县" + }, + { + "value": "632624", + "label": "达日县" + }, + { + "value": "632625", + "label": "久治县" + }, + { + "value": "632626", + "label": "玛多县" + } + ] + }, + { + "value": "632700", + "label": "玉树藏族自治州", + "children": [ + { + "value": "632701", + "label": "玉树市" + }, + { + "value": "632722", + "label": "杂多县" + }, + { + "value": "632723", + "label": "称多县" + }, + { + "value": "632724", + "label": "治多县" + }, + { + "value": "632725", + "label": "囊谦县" + }, + { + "value": "632726", + "label": "曲麻莱县" + } + ] + }, + { + "value": "632800", + "label": "海西蒙古族藏族自治州", + "children": [ + { + "value": "632801", + "label": "格尔木市" + }, + { + "value": "632802", + "label": "德令哈市" + }, + { + "value": "632803", + "label": "茫崖市" + }, + { + "value": "632821", + "label": "乌兰县" + }, + { + "value": "632822", + "label": "都兰县" + }, + { + "value": "632823", + "label": "天峻县" + } + ] + } + ] + }, + { + "value": "640000", + "label": "宁夏回族自治区", + "children": [ + { + "value": "640100", + "label": "银川市", + "children": [ + { + "value": "640104", + "label": "兴庆区" + }, + { + "value": "640105", + "label": "西夏区" + }, + { + "value": "640106", + "label": "金凤区" + }, + { + "value": "640121", + "label": "永宁县" + }, + { + "value": "640122", + "label": "贺兰县" + }, + { + "value": "640181", + "label": "灵武市" + } + ] + }, + { + "value": "640200", + "label": "石嘴山市", + "children": [ + { + "value": "640202", + "label": "大武口区" + }, + { + "value": "640205", + "label": "惠农区" + }, + { + "value": "640221", + "label": "平罗县" + } + ] + }, + { + "value": "640300", + "label": "吴忠市", + "children": [ + { + "value": "640302", + "label": "利通区" + }, + { + "value": "640303", + "label": "红寺堡区" + }, + { + "value": "640323", + "label": "盐池县" + }, + { + "value": "640324", + "label": "同心县" + }, + { + "value": "640381", + "label": "青铜峡市" + } + ] + }, + { + "value": "640400", + "label": "固原市", + "children": [ + { + "value": "640402", + "label": "原州区" + }, + { + "value": "640422", + "label": "西吉县" + }, + { + "value": "640423", + "label": "隆德县" + }, + { + "value": "640424", + "label": "泾源县" + }, + { + "value": "640425", + "label": "彭阳县" + } + ] + }, + { + "value": "640500", + "label": "中卫市", + "children": [ + { + "value": "640502", + "label": "沙坡头区" + }, + { + "value": "640521", + "label": "中宁县" + }, + { + "value": "640522", + "label": "海原县" + } + ] + } + ] + }, + { + "value": "650000", + "label": "新疆维吾尔自治区", + "children": [ + { + "value": "650100", + "label": "乌鲁木齐市", + "children": [ + { + "value": "650102", + "label": "天山区" + }, + { + "value": "650103", + "label": "沙依巴克区" + }, + { + "value": "650104", + "label": "新市区" + }, + { + "value": "650105", + "label": "水磨沟区" + }, + { + "value": "650106", + "label": "头屯河区" + }, + { + "value": "650107", + "label": "达坂城区" + }, + { + "value": "650109", + "label": "米东区" + }, + { + "value": "650121", + "label": "乌鲁木齐县" + } + ] + }, + { + "value": "650200", + "label": "克拉玛依市", + "children": [ + { + "value": "650202", + "label": "独山子区" + }, + { + "value": "650203", + "label": "克拉玛依区" + }, + { + "value": "650204", + "label": "白碱滩区" + }, + { + "value": "650205", + "label": "乌尔禾区" + } + ] + }, + { + "value": "650400", + "label": "吐鲁番市", + "children": [ + { + "value": "650402", + "label": "高昌区" + }, + { + "value": "650421", + "label": "鄯善县" + }, + { + "value": "650422", + "label": "托克逊县" + } + ] + }, + { + "value": "650500", + "label": "哈密市", + "children": [ + { + "value": "650502", + "label": "伊州区" + }, + { + "value": "650521", + "label": "巴里坤哈萨克自治县" + }, + { + "value": "650522", + "label": "伊吾县" + } + ] + }, + { + "value": "652300", + "label": "昌吉回族自治州", + "children": [ + { + "value": "652301", + "label": "昌吉市" + }, + { + "value": "652302", + "label": "阜康市" + }, + { + "value": "652323", + "label": "呼图壁县" + }, + { + "value": "652324", + "label": "玛纳斯县" + }, + { + "value": "652325", + "label": "奇台县" + }, + { + "value": "652327", + "label": "吉木萨尔县" + }, + { + "value": "652328", + "label": "木垒哈萨克自治县" + } + ] + }, + { + "value": "652700", + "label": "博尔塔拉蒙古自治州", + "children": [ + { + "value": "652701", + "label": "博乐市" + }, + { + "value": "652702", + "label": "阿拉山口市" + }, + { + "value": "652722", + "label": "精河县" + }, + { + "value": "652723", + "label": "温泉县" + } + ] + }, + { + "value": "652800", + "label": "巴音郭楞蒙古自治州", + "children": [ + { + "value": "652801", + "label": "库尔勒市" + }, + { + "value": "652822", + "label": "轮台县" + }, + { + "value": "652823", + "label": "尉犁县" + }, + { + "value": "652824", + "label": "若羌县" + }, + { + "value": "652825", + "label": "且末县" + }, + { + "value": "652826", + "label": "焉耆回族自治县" + }, + { + "value": "652827", + "label": "和静县" + }, + { + "value": "652828", + "label": "和硕县" + }, + { + "value": "652829", + "label": "博湖县" + } + ] + }, + { + "value": "652900", + "label": "阿克苏地区", + "children": [ + { + "value": "652901", + "label": "阿克苏市" + }, + { + "value": "652922", + "label": "温宿县" + }, + { + "value": "652923", + "label": "库车县" + }, + { + "value": "652924", + "label": "沙雅县" + }, + { + "value": "652925", + "label": "新和县" + }, + { + "value": "652926", + "label": "拜城县" + }, + { + "value": "652927", + "label": "乌什县" + }, + { + "value": "652928", + "label": "阿瓦提县" + }, + { + "value": "652929", + "label": "柯坪县" + } + ] + }, + { + "value": "653000", + "label": "克孜勒苏柯尔克孜自治州", + "children": [ + { + "value": "653001", + "label": "阿图什市" + }, + { + "value": "653022", + "label": "阿克陶县" + }, + { + "value": "653023", + "label": "阿合奇县" + }, + { + "value": "653024", + "label": "乌恰县" + } + ] + }, + { + "value": "653100", + "label": "喀什地区", + "children": [ + { + "value": "653101", + "label": "喀什市" + }, + { + "value": "653121", + "label": "疏附县" + }, + { + "value": "653122", + "label": "疏勒县" + }, + { + "value": "653123", + "label": "英吉沙县" + }, + { + "value": "653124", + "label": "泽普县" + }, + { + "value": "653125", + "label": "莎车县" + }, + { + "value": "653126", + "label": "叶城县" + }, + { + "value": "653127", + "label": "麦盖提县" + }, + { + "value": "653128", + "label": "岳普湖县" + }, + { + "value": "653129", + "label": "伽师县" + }, + { + "value": "653130", + "label": "巴楚县" + }, + { + "value": "653131", + "label": "塔什库尔干塔吉克自治县" + } + ] + }, + { + "value": "653200", + "label": "和田地区", + "children": [ + { + "value": "653201", + "label": "和田市" + }, + { + "value": "653221", + "label": "和田县" + }, + { + "value": "653222", + "label": "墨玉县" + }, + { + "value": "653223", + "label": "皮山县" + }, + { + "value": "653224", + "label": "洛浦县" + }, + { + "value": "653225", + "label": "策勒县" + }, + { + "value": "653226", + "label": "于田县" + }, + { + "value": "653227", + "label": "民丰县" + } + ] + }, + { + "value": "654000", + "label": "伊犁哈萨克自治州", + "children": [ + { + "value": "654002", + "label": "伊宁市" + }, + { + "value": "654003", + "label": "奎屯市" + }, + { + "value": "654004", + "label": "霍尔果斯市" + }, + { + "value": "654021", + "label": "伊宁县" + }, + { + "value": "654022", + "label": "察布查尔锡伯自治县" + }, + { + "value": "654023", + "label": "霍城县" + }, + { + "value": "654024", + "label": "巩留县" + }, + { + "value": "654025", + "label": "新源县" + }, + { + "value": "654026", + "label": "昭苏县" + }, + { + "value": "654027", + "label": "特克斯县" + }, + { + "value": "654028", + "label": "尼勒克县" + } + ] + }, + { + "value": "654200", + "label": "塔城地区", + "children": [ + { + "value": "654201", + "label": "塔城市" + }, + { + "value": "654202", + "label": "乌苏市" + }, + { + "value": "654221", + "label": "额敏县" + }, + { + "value": "654223", + "label": "沙湾县" + }, + { + "value": "654224", + "label": "托里县" + }, + { + "value": "654225", + "label": "裕民县" + }, + { + "value": "654226", + "label": "和布克赛尔蒙古自治县" + } + ] + }, + { + "value": "654300", + "label": "阿勒泰地区", + "children": [ + { + "value": "654301", + "label": "阿勒泰市" + }, + { + "value": "654321", + "label": "布尔津县" + }, + { + "value": "654322", + "label": "富蕴县" + }, + { + "value": "654323", + "label": "福海县" + }, + { + "value": "654324", + "label": "哈巴河县" + }, + { + "value": "654325", + "label": "青河县" + }, + { + "value": "654326", + "label": "吉木乃县" + } + ] + } + ] + }, + { + "value": "710000", + "label": "台湾省", + "children": [ + { + "value": "710000", + "label": "台湾省", + "children": [ + { + "value": "710000", + "label": "台湾省" + } + ] + } + ] + }, + { + "value": "810000", + "label": "香港特别行政区", + "children": [ + { + "value": "810000", + "label": "香港特别行政区", + "children": [ + { + "value": "810000", + "label": "香港特别行政区" + } + ] + } + ] + }, + { + "value": "820000", + "label": "澳门特别行政区", + "children": [ + { + "value": "820000", + "label": "澳门特别行政区", + "children": [ + { + "value": "820000", + "label": "澳门特别行政区" + } + ] + } + ] + } +] \ No newline at end of file diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/demo/mock/json/getCntrNoCountInfo.json b/jeecg-boot/src/main/java/org/jeecg/modules/demo/mock/json/getCntrNoCountInfo.json new file mode 100644 index 0000000..1a927b7 --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/demo/mock/json/getCntrNoCountInfo.json @@ -0,0 +1,27 @@ +{ + "success": true, + "message": "查询成功", + "code": null, + "result": [{ + "resultIndex": 0, + "yearcount": null, + "year": 0, + "month": null, + "monthcount": null, + "classifyname": "证明类", + "cntrnocount": 4, + "cabinetname": null, + "cabinetcocunt": 0 + }, { + "resultIndex": 0, + "yearcount": null, + "year": 0, + "month": null, + "monthcount": null, + "classifyname": "产权类", + "cntrnocount": 9, + "cabinetname": null, + "cabinetcocunt": 0 + }], + "timestamp": 1554285003594 +} \ No newline at end of file diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/demo/mock/json/graphreport_chart.json b/jeecg-boot/src/main/java/org/jeecg/modules/demo/mock/json/graphreport_chart.json new file mode 100644 index 0000000..5432e14 --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/demo/mock/json/graphreport_chart.json @@ -0,0 +1,50 @@ +{ + "status": 200, + "success": true, + "message": "ok", + "result": { + "data": [ + { + "id": 0, + "x": "1", + "y": 889 + }, + { + "id": 1, + "x": "2", + "y": 341 + }, + { + "id": 2, + "x": "3", + "y": 1028 + }, + { + "id": 3, + "x": "4", + "y": 1168 + }, + { + "id": 4, + "x": "5", + "y": 653 + }, + { + "id": 5, + "x": "6", + "y": 863 + }, + { + "id": 6, + "x": "7", + "y": 421 + }, + { + "id": 7, + "x": "8", + "y": 1320 + } + ] + }, + "timestamp": 1554950583837 +} \ No newline at end of file diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/demo/mock/json/sysdatalog.json b/jeecg-boot/src/main/java/org/jeecg/modules/demo/mock/json/sysdatalog.json new file mode 100644 index 0000000..b127324 --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/demo/mock/json/sysdatalog.json @@ -0,0 +1,12 @@ +{ + "mobilePhone":"1872222222", + "officePhone":"1222222", + "email":"", + "createDate":"Jun 23, 2016 12:00:00 PM", + "sex":"1", + "depId":"402880e447e99cf10147e9a03b320003", + "userName":"9001", + "status":"1", + "content":"111", + "id":"4028ef81550c1a7901550c1cd6e70001" +} \ No newline at end of file diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/demo/mock/json/task_process.json b/jeecg-boot/src/main/java/org/jeecg/modules/demo/mock/json/task_process.json new file mode 100644 index 0000000..b986c8c --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/demo/mock/json/task_process.json @@ -0,0 +1,55 @@ +{ + "success": true, + "message": "操作成功!", + "code": 0, + "result": { + "records": [ + { + "taskId": "48701", + "name": "start", + "taskBeginTime": "2019-03-07 09:33:04", + "taskEndTime": "2019-03-08 04:03:01", + "principal": "测试体验账号", + "result": "已完成" + }, + { + "taskId": "48702", + "name": "部门领导审批", + "taskBeginTime": "2019-03-07 09:33:04", + "taskEndTime": "2019-03-08 04:03:01", + "principal": "测试体验账号", + "result": "已完成" + }, + { + "taskId": "48703", + "name": "调整申请", + "taskBeginTime": "2019-03-07 09:33:04", + "taskEndTime": "2019-03-08 04:03:01", + "principal": "测试体验账号", + "result": "已完成" + }, + { + "taskId": "48704", + "name": "人事审批", + "taskBeginTime": "2019-03-07 09:33:04", + "taskEndTime": "2019-03-08 04:03:01", + "principal": "测试体验账号", + "result": "已完成" + }, + { + "taskId": "48705", + "name": "end", + "taskBeginTime": "2019-03-07 09:33:04", + "taskEndTime": "2019-03-08 04:03:01", + "principal": "测试体验账号", + "result": "已完成" + } + ], + "total": 0, + "size": 10, + "current": 1, + "searchCount": true, + "pages": 0 + }, + "timestamp": 1551922394641 +} \ No newline at end of file diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/demo/mock/json/user_info.json b/jeecg-boot/src/main/java/org/jeecg/modules/demo/mock/json/user_info.json new file mode 100644 index 0000000..3123c58 --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/demo/mock/json/user_info.json @@ -0,0 +1,407 @@ +{ + "message": "", + "result": { + "id": "4291d7da9005377ec9aec4a71ea837f", + "name": "天野远子", + "username": "admin", + "password": "", + "avatar": "/avatar2.jpg", + "status": 1, + "telephone": "", + "lastLoginIp": "27.154.74.117", + "lastLoginTime": 1534837621348, + "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": "dashboard", + "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": "exception", + "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": "result", + "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": "profile", + "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": "table", + "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": "form", + "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 + } + ] + } + }, + "status": 200, + "timestamp": 1534844188679 +} \ 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 deleted file mode 100644 index acbab15..0000000 --- a/jeecg-boot/src/main/java/org/jeecg/modules/demo/test/controller/AutoController.java +++ /dev/null @@ -1,42 +0,0 @@ -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 index 0360bf7..1441ce0 100644 --- 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 @@ -1,24 +1,30 @@ package org.jeecg.modules.demo.test.controller; +import java.io.IOException; 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 java.util.Map; import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; import org.jeecg.common.api.vo.Result; import org.jeecg.common.aspect.annotation.AutoLog; +import org.jeecg.common.system.query.QueryGenerator; 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.jeecgframework.poi.excel.ExcelImportUtil; +import org.jeecgframework.poi.excel.def.NormalExcelConstants; +import org.jeecgframework.poi.excel.entity.ExportParams; +import org.jeecgframework.poi.excel.entity.ImportParams; +import org.jeecgframework.poi.excel.view.JeecgEntityExcelView; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; @@ -27,14 +33,19 @@ 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.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.multipart.MultipartHttpServletRequest; import org.springframework.web.servlet.ModelAndView; import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; 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; @@ -71,7 +82,7 @@ public class JeecgDemoController { 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; + /*QueryWrapper<JeecgDemo> queryWrapper = null; //================================================================================ //高级组合查询 try { @@ -106,7 +117,10 @@ public class JeecgDemoController { } else { queryWrapper.orderByDesc(oConvertUtils.camelToUnderline(column)); } - } + }*/ + + QueryWrapper<JeecgDemo> queryWrapper = QueryGenerator.initQueryWrapper(jeecgDemo, req.getParameterMap()); + Page<JeecgDemo> page = new Page<JeecgDemo>(pageNo, pageSize); IPage<JeecgDemo> pageList = jeecgDemoService.page(page, queryWrapper); // log.info("查询当前页:" + pageList.getCurrent()); @@ -224,6 +238,78 @@ public class JeecgDemoController { } + /** + * 导出excel + * @param request + * @param response + */ + @RequestMapping(value = "/exportXls") + public ModelAndView exportXls(HttpServletRequest request, HttpServletResponse response) { + // Step.1 组装查询条件 + QueryWrapper<JeecgDemo> queryWrapper = null; + try { + String paramsStr = request.getParameter("paramsStr"); + if (oConvertUtils.isNotEmpty(paramsStr)) { + String deString = URLDecoder.decode(paramsStr, "UTF-8"); + JeecgDemo jeecgDemo = JSON.parseObject(deString, JeecgDemo.class); + queryWrapper = QueryGenerator.initQueryWrapper(jeecgDemo, request.getParameterMap()); + log.info(paramsStr); + log.info(jeecgDemo.toString()); + } + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + + //Step.2 AutoPoi 导出Excel + ModelAndView mv = new ModelAndView(new JeecgEntityExcelView()); + List<JeecgDemo> pageList = jeecgDemoService.list(queryWrapper); + //导出文件名称 + mv.addObject(NormalExcelConstants.FILE_NAME,"Excel导出文件名字"); + //注解对象Class + mv.addObject(NormalExcelConstants.CLASS,JeecgDemo.class); + //自定义表格参数 + mv.addObject(NormalExcelConstants.PARAMS,new ExportParams("自定义导出Excel模板内容标题","导出人:Jeecg","导出信息")); + //导出数据列表 + mv.addObject(NormalExcelConstants.DATA_LIST,pageList); + return mv; + } + + /** + * 通过excel导入数据 + * @param request + * @param response + * @return + */ + @RequestMapping(value = "/importExcel", method = RequestMethod.POST) + public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) { + MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request; + Map<String, MultipartFile> fileMap = multipartRequest.getFileMap(); + for (Map.Entry<String, MultipartFile> entity : fileMap.entrySet()) { + MultipartFile file = entity.getValue();// 获取上传文件对象 + ImportParams params = new ImportParams(); + params.setTitleRows(2); + params.setHeadRows(1); + params.setNeedSave(true); + try { + List<JeecgDemo> listJeecgDemos = ExcelImportUtil.importExcel(file.getInputStream(), JeecgDemo.class, params); + for (JeecgDemo jeecgDemoExcel : listJeecgDemos) { + jeecgDemoService.save(jeecgDemoExcel); + } + return Result.ok("文件导入成功!数据行数:" + listJeecgDemos.size()); + } catch (Exception e) { + log.error(e.getMessage()); + return Result.error("文件导入失败!"); + } finally { + try { + file.getInputStream().close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + return Result.ok("文件导入失败!"); + } + // ================================================================================================================ /** * redis操作 -- set @@ -292,5 +378,15 @@ public class JeecgDemoController { } // ================================================================================================================ + + + // ==========================================动态表单 JSON接收测试===========================================// + @PostMapping(value = "/testOnlineAdd") + public Result<JeecgDemo> testOnlineAdd(@RequestBody JSONObject json) { + Result<JeecgDemo> result = new Result<JeecgDemo>(); + log.info(json.toJSONString()); + result.success("添加成功!"); + return result; + } } 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 index 841f34d..4db3c54 100644 --- 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 @@ -6,7 +6,7 @@ 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.common.system.query.QueryGenerator; import org.jeecg.modules.demo.test.entity.JeecgOrderCustomer; import org.jeecg.modules.demo.test.entity.JeecgOrderMain; import org.jeecg.modules.demo.test.entity.JeecgOrderTicket; @@ -14,6 +14,7 @@ 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.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; @@ -41,364 +42,385 @@ import lombok.extern.slf4j.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("删除成功!"); + @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 = QueryGenerator.initQueryWrapper(jeecgOrderMain, req.getParameterMap()); + Page<JeecgOrderMain> page = new Page<JeecgOrderMain>(pageNo, pageSize); + 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 { + JeecgOrderMain jeecgOrderMain = new JeecgOrderMain(); + BeanUtils.copyProperties(jeecgOrderMainPage, jeecgOrderMain); + jeecgOrderMainService.save(jeecgOrderMain); + 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 = new JeecgOrderMain(); + BeanUtils.copyProperties(jeecgOrderMainPage, jeecgOrderMain); + JeecgOrderMain jeecgOrderMainEntity = jeecgOrderMainService.getById(jeecgOrderMain.getId()); + if (jeecgOrderMainEntity == null) { + result.error500("未找到对应实体"); + } else { + jeecgOrderMainService.updateById(jeecgOrderMain); + 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 mainId + * @return + */ + @GetMapping(value = "/listOrderCustomerByMainId") + public Result<List<JeecgOrderCustomer>> queryOrderCustomerListByMainId(@RequestParam(name = "mainId", required = false) String mainId) { + Result<List<JeecgOrderCustomer>> result = new Result<List<JeecgOrderCustomer>>(); + List<JeecgOrderCustomer> jeecgOrderCustomerList = null; + if (mainId != null) { + jeecgOrderCustomerList = jeecgOrderCustomerService.selectCustomersByMainId(mainId); + result.setResult(jeecgOrderCustomerList); + result.setSuccess(true); + return result; + } else { + return null; } - 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); + } + + /** + * 通过id查询 + * + * @param mainId + * @return + */ + @GetMapping(value = "/listOrderTicketByMainId") + public Result<List<JeecgOrderTicket>> queryOrderTicketListByMainId(@RequestParam(name = "mainId", required = false) String mainId) { + Result<List<JeecgOrderTicket>> result = new Result<List<JeecgOrderTicket>>(); + List<JeecgOrderTicket> jeecgOrderTicketList = null; + if (mainId != null) { + jeecgOrderTicketList = jeecgOrderTicketService.selectTicketsByMainId(mainId); + result.setResult(jeecgOrderTicketList); + result.setSuccess(true); + return result; + } else { + return null; } - 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; - } + /** + * 添加 + * + * @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 + + /** + * 添加 + * + * @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 index 725ec15..1782b24 100644 --- 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 @@ -1,10 +1,17 @@ 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.List; +import java.util.Map; import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + import org.jeecg.common.api.vo.Result; +import org.jeecg.common.system.query.QueryGenerator; import org.jeecg.common.util.oConvertUtils; import org.jeecg.modules.demo.test.entity.JeecgOrderCustomer; import org.jeecg.modules.demo.test.entity.JeecgOrderMain; @@ -13,6 +20,12 @@ 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.jeecgframework.poi.excel.ExcelImportUtil; +import org.jeecgframework.poi.excel.def.NormalExcelConstants; +import org.jeecgframework.poi.excel.entity.ExportParams; +import org.jeecgframework.poi.excel.entity.ImportParams; +import org.jeecgframework.poi.excel.view.JeecgEntityExcelView; +import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; @@ -20,18 +33,25 @@ 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.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.multipart.MultipartHttpServletRequest; +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 lombok.extern.slf4j.Slf4j; - /** +/** * @Title: Controller - * @Description: 订单 - * @author: jeecg-boot - * @date: 2019-02-15 + * @Description: 订单 + * @author: jeecg-boot + * @date: 2019-02-15 * @version: V1.0 */ @RestController @@ -44,9 +64,10 @@ public class JeecgOrderMainController { private IJeecgOrderCustomerService jeecgOrderCustomerService; @Autowired private IJeecgOrderTicketService jeecgOrderTicketService; - + /** - * 分页列表查询 + * 分页列表查询 + * * @param jeecgOrderMain * @param pageNo * @param pageSize @@ -54,35 +75,23 @@ public class JeecgOrderMainController { * @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) { + 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)); - } - } + QueryWrapper<JeecgOrderMain> queryWrapper = QueryGenerator.initQueryWrapper(jeecgOrderMain, req.getParameterMap()); + Page<JeecgOrderMain> page = new Page<JeecgOrderMain>(pageNo, pageSize); IPage<JeecgOrderMain> pageList = jeecgOrderMainService.page(page, queryWrapper); - //log.debug("查询当前页:"+pageList.getCurrent()); - //log.debug("查询当前页数量:"+pageList.getSize()); - //log.debug("查询结果数量:"+pageList.getRecords().size()); - //log.debug("数据总数:"+pageList.getTotal()); + // 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 */ @@ -90,7 +99,9 @@ public class JeecgOrderMainController { public Result<JeecgOrderMain> add(@RequestBody JeecgOrderMainPage jeecgOrderMainPage) { Result<JeecgOrderMain> result = new Result<JeecgOrderMain>(); try { - jeecgOrderMainService.saveMain(jeecgOrderMainPage.getJeecgOrderMain(), jeecgOrderMainPage.getJeecgOrderCustomerList(), jeecgOrderMainPage.getJeecgOrderTicketList());; + JeecgOrderMain jeecgOrderMain = new JeecgOrderMain(); + BeanUtils.copyProperties(jeecgOrderMainPage, jeecgOrderMain); + jeecgOrderMainService.saveMain(jeecgOrderMain, jeecgOrderMainPage.getJeecgOrderCustomerList(), jeecgOrderMainPage.getJeecgOrderTicketList()); result.success("添加成功!"); } catch (Exception e) { e.printStackTrace(); @@ -99,102 +110,109 @@ public class JeecgOrderMainController { } 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 jeecgOrderMain = new JeecgOrderMain(); + BeanUtils.copyProperties(jeecgOrderMainPage, jeecgOrderMain); JeecgOrderMain jeecgOrderMainEntity = jeecgOrderMainService.getById(jeecgOrderMain.getId()); - if(jeecgOrderMainEntity==null) { + if (jeecgOrderMainEntity == null) { result.error500("未找到对应实体"); - }else { + } else { jeecgOrderMainService.updateMain(jeecgOrderMain, jeecgOrderMainPage.getJeecgOrderCustomerList(), jeecgOrderMainPage.getJeecgOrderTicketList()); result.success("修改成功!"); } - + return result; } - + /** - * 通过id删除 + * 通过id删除 + * * @param id * @return */ @DeleteMapping(value = "/delete") - public Result<JeecgOrderMain> delete(@RequestParam(name="id",required=true) String id) { + 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) { + if (jeecgOrderMain == null) { result.error500("未找到对应实体"); - }else { + } 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) { + public Result<JeecgOrderMain> deleteBatch(@RequestParam(name = "ids", required = true) String ids) { Result<JeecgOrderMain> result = new Result<JeecgOrderMain>(); - if(ids==null || "".equals(ids.trim())) { + if (ids == null || "".equals(ids.trim())) { result.error500("参数不识别!"); - }else { - this.jeecgOrderMainService.removeByIds(Arrays.asList(ids.split(","))); + } else { + this.jeecgOrderMainService.delBatchMain(Arrays.asList(ids.split(","))); result.success("删除成功!"); } return result; } - + /** - * 通过id查询 + * 通过id查询 + * * @param id * @return */ @GetMapping(value = "/queryById") - public Result<JeecgOrderMain> queryById(@RequestParam(name="id",required=true) String id) { + 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) { + if (jeecgOrderMain == null) { result.error500("未找到对应实体"); - }else { + } else { result.setResult(jeecgOrderMain); result.setSuccess(true); } return result; } - + /** - * 通过id查询 + * 通过id查询 + * * @param id * @return */ @GetMapping(value = "/queryOrderCustomerListByMainId") - public Result<List<JeecgOrderCustomer>> queryOrderCustomerListByMainId(@RequestParam(name="id",required=true) String id) { + 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查询 + * 通过id查询 + * * @param id * @return */ @GetMapping(value = "/queryOrderTicketListByMainId") - public Result<List<JeecgOrderTicket>> queryOrderTicketListByMainId(@RequestParam(name="id",required=true) String id) { + 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); @@ -202,4 +220,94 @@ public class JeecgOrderMainController { return result; } + /** + * 导出excel + * + * @param request + * @param response + */ + @RequestMapping(value = "/exportXls") + public ModelAndView exportXls(HttpServletRequest request, HttpServletResponse response) { + // Step.1 组装查询条件 + QueryWrapper<JeecgOrderMain> queryWrapper = null; + try { + String paramsStr = request.getParameter("paramsStr"); + if (oConvertUtils.isNotEmpty(paramsStr)) { + String deString = URLDecoder.decode(paramsStr, "UTF-8"); + JeecgOrderMain jeecgOrderMain = JSON.parseObject(deString, JeecgOrderMain.class); + queryWrapper = QueryGenerator.initQueryWrapper(jeecgOrderMain, request.getParameterMap()); + log.info(paramsStr); + log.info(jeecgOrderMain.toString()); + } + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + + //Step.2 AutoPoi 导出Excel + ModelAndView mv = new ModelAndView(new JeecgEntityExcelView()); + List<JeecgOrderMainPage> pageList = new ArrayList<JeecgOrderMainPage>(); + + List<JeecgOrderMain> jeecgOrderMainList = jeecgOrderMainService.list(queryWrapper); + for (JeecgOrderMain orderMain : jeecgOrderMainList) { + JeecgOrderMainPage vo = new JeecgOrderMainPage(); + BeanUtils.copyProperties(orderMain, vo); + // 查询机票 + List<JeecgOrderTicket> jeecgOrderTicketList = jeecgOrderTicketService.selectTicketsByMainId(orderMain.getId()); + vo.setJeecgOrderTicketList(jeecgOrderTicketList); + // 查询客户 + List<JeecgOrderCustomer> jeecgOrderCustomerList = jeecgOrderCustomerService.selectCustomersByMainId(orderMain.getId()); + vo.setJeecgOrderCustomerList(jeecgOrderCustomerList); + pageList.add(vo); + } + + // 导出文件名称 + mv.addObject(NormalExcelConstants.FILE_NAME, "一对多导出文件名字"); + // 注解对象Class + mv.addObject(NormalExcelConstants.CLASS, JeecgOrderMainPage.class); + // 自定义表格参数 + mv.addObject(NormalExcelConstants.PARAMS, new ExportParams("自定义导出Excel内容标题", "导出人:Jeecg", "自定义Sheet名字")); + // 导出数据列表 + mv.addObject(NormalExcelConstants.DATA_LIST, pageList); + return mv; + } + + /** + * 通过excel导入数据 + * + * @param request + * @param + * @return + */ + @RequestMapping(value = "/importExcel", method = RequestMethod.POST) + public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) { + MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request; + Map<String, MultipartFile> fileMap = multipartRequest.getFileMap(); + for (Map.Entry<String, MultipartFile> entity : fileMap.entrySet()) { + MultipartFile file = entity.getValue();// 获取上传文件对象 + ImportParams params = new ImportParams(); + params.setTitleRows(2); + params.setHeadRows(2); + params.setNeedSave(true); + try { + List<JeecgOrderMainPage> list = ExcelImportUtil.importExcel(file.getInputStream(), JeecgOrderMainPage.class, params); + for (JeecgOrderMainPage page : list) { + JeecgOrderMain po = new JeecgOrderMain(); + BeanUtils.copyProperties(page, po); + jeecgOrderMainService.saveMain(po, page.getJeecgOrderCustomerList(), page.getJeecgOrderTicketList()); + } + return Result.ok("文件导入成功!"); + } catch (Exception e) { + log.error(e.toString()); + return Result.ok("文件导入失败!"); + } finally { + try { + file.getInputStream().close(); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + return Result.ok("文件导入失败!"); + } + } 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 index 0cb2d41..21d1d0a 100644 --- 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 @@ -7,6 +7,8 @@ import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; import com.fasterxml.jackson.annotation.JsonFormat; + +import org.jeecgframework.poi.excel.annotation.Excel; import org.springframework.format.annotation.DateTimeFormat; /** @@ -24,26 +26,35 @@ public class JeecgDemo implements Serializable { @TableId(type = IdType.UUID) private java.lang.String id; /** 姓名 */ + @Excel(name="姓名",width=25) private java.lang.String name; /** 关键词 */ + @Excel(name="关键词",width=15) private java.lang.String keyWord; /** 打卡时间 */ @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @Excel(name="打卡时间",width=20,format="yyyy-MM-dd HH:mm:ss") private java.util.Date punchTime; /** 工资 */ + @Excel(name="工资",width=15) private java.math.BigDecimal salaryMoney; /** 奖金 */ + @Excel(name="奖金",width=15) private java.lang.Double bonusMoney; /** 性别 {男:1,女:2} */ + @Excel(name = "性别", width = 15, dicCode = "sex") private java.lang.String sex; /** 年龄 */ + @Excel(name="年龄",width=15) private java.lang.Integer age; /** 生日 */ @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd") @DateTimeFormat(pattern = "yyyy-MM-dd") + @Excel(name="生日",format="yyyy-MM-dd") private java.util.Date birthday; /** 邮箱 */ + @Excel(name="邮箱",width=30) private java.lang.String email; /** 个人简介 */ private java.lang.String content; 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 index 4493db0..7feef84 100644 --- 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 @@ -1,12 +1,13 @@ 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.jeecgframework.poi.excel.annotation.Excel; import org.springframework.format.annotation.DateTimeFormat; /** @@ -24,14 +25,17 @@ public class JeecgOrderCustomer implements Serializable { @TableId(type = IdType.UUID) private java.lang.String id; /**客户名*/ + @Excel(name="客户名字",width=15) private java.lang.String name; /**性别*/ private java.lang.String sex; /**身份证号码*/ + @Excel(name="身份证号码",width=15) private java.lang.String idcard; /**身份证扫描件*/ private java.lang.String idcardPic; /**电话1*/ + @Excel(name="电话",width=15) private java.lang.String telphone; /**外键*/ private java.lang.String orderId; 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 index 9aec8df..a1aa318 100644 --- 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 @@ -1,12 +1,12 @@ 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.jeecgframework.poi.excel.annotation.Excel; import org.springframework.format.annotation.DateTimeFormat; /** @@ -24,10 +24,12 @@ public class JeecgOrderTicket implements Serializable { @TableId(type = IdType.UUID) private java.lang.String id; /**航班号*/ + @Excel(name="航班号",width=15) private java.lang.String ticketCode; /**航班时间*/ @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd") @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + @Excel(name="航班时间",width=15,format = "yyyy-MM-dd") private java.util.Date tickectDate; /**外键*/ private java.lang.String orderId; 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 index 0a1ad74..cc4e5e8 100644 --- 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 @@ -26,6 +26,7 @@ public class JeecgDemoServiceImpl extends ServiceImpl<JeecgDemoMapper, JeecgDemo * 事务控制在service层面 * 加上注解:@Transactional,声明的方法就是一个独立的事务(有异常DB操作全部回滚) */ + @Override @Transactional public void testTran() { JeecgDemo pp = new JeecgDemo(); @@ -51,9 +52,11 @@ public class JeecgDemoServiceImpl extends ServiceImpl<JeecgDemoMapper, JeecgDemo /** * 缓存注解测试: redis */ + @Override @Cacheable(cacheNames="jeecgDemo", key="#id") public JeecgDemo getByIdCacheable(String id) { JeecgDemo t = jeecgDemoMapper.selectById(id); + System.err.println("---未读缓存,读取数据库---"); System.err.println(t); return t; } 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 index c301d7c..e8a43ee 100644 --- 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 @@ -26,46 +26,54 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @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); - } - } + @Autowired + private JeecgOrderMainMapper jeecgOrderMainMapper; + @Autowired + private JeecgOrderCustomerMapper jeecgOrderCustomerMapper; + @Autowired + private JeecgOrderTicketMapper jeecgOrderTicketMapper; - @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 saveMain(JeecgOrderMain jeecgOrderMain, List<JeecgOrderCustomer> jeecgOrderCustomerList, List<JeecgOrderTicket> jeecgOrderTicketList) { + jeecgOrderMainMapper.insert(jeecgOrderMain); + if (jeecgOrderCustomerList != null) { + for (JeecgOrderCustomer entity : jeecgOrderCustomerList) { + entity.setOrderId(jeecgOrderMain.getId()); + jeecgOrderCustomerMapper.insert(entity); + } + } + if (jeecgOrderTicketList != null) { + 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.子表数据重新插入 + if (jeecgOrderCustomerList != null) { + for (JeecgOrderCustomer entity : jeecgOrderCustomerList) { + entity.setOrderId(jeecgOrderMain.getId()); + jeecgOrderCustomerMapper.insert(entity); + } + } + if (jeecgOrderTicketList != null) { + for (JeecgOrderTicket entity : jeecgOrderTicketList) { + entity.setOrderId(jeecgOrderMain.getId()); + jeecgOrderTicketMapper.insert(entity); + } + } + } @Override @Transactional 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 index 0a6bf62..eb309ed 100644 --- 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 @@ -1,16 +1,44 @@ 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 org.jeecgframework.poi.excel.annotation.Excel; +import org.jeecgframework.poi.excel.annotation.ExcelCollection; + import lombok.Data; @Data public class JeecgOrderMainPage { - private JeecgOrderMain jeecgOrderMain; + /**主键*/ + private java.lang.String id; + /**订单号*/ + @Excel(name="订单号",width=15) + private java.lang.String orderCode; + /**订单类型*/ + private java.lang.String ctype; + /**订单日期*/ + @Excel(name="订单日期",width=15,format = "yyyy-MM-dd") + private java.util.Date orderDate; + /**订单金额*/ + @Excel(name="订单金额",width=15) + private java.lang.Double orderMoney; + /**订单备注*/ + private java.lang.String content; + /**创建人*/ + private java.lang.String createBy; + /**创建时间*/ + private java.util.Date createTime; + /**修改人*/ + private java.lang.String updateBy; + /**修改时间*/ + private java.util.Date updateTime; + + @ExcelCollection(name="客户") private List<JeecgOrderCustomer> jeecgOrderCustomerList; + @ExcelCollection(name="机票") private List<JeecgOrderTicket> jeecgOrderTicketList; } diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/message/controller/SysMessageController.java b/jeecg-boot/src/main/java/org/jeecg/modules/message/controller/SysMessageController.java new file mode 100644 index 0000000..5942cb0 --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/message/controller/SysMessageController.java @@ -0,0 +1,237 @@ +package org.jeecg.modules.message.controller; + +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.net.URLDecoder; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import org.jeecg.common.api.vo.Result; +import org.jeecg.common.system.query.QueryGenerator; +import org.jeecg.common.util.oConvertUtils; +import org.jeecg.modules.message.entity.SysMessage; +import org.jeecg.modules.message.service.ISysMessageService; + +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; + +import org.jeecgframework.poi.excel.ExcelImportUtil; +import org.jeecgframework.poi.excel.def.NormalExcelConstants; +import org.jeecgframework.poi.excel.entity.ExportParams; +import org.jeecgframework.poi.excel.entity.ImportParams; +import org.jeecgframework.poi.excel.view.JeecgEntityExcelView; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.multipart.MultipartHttpServletRequest; +import org.springframework.web.servlet.ModelAndView; +import com.alibaba.fastjson.JSON; + + /** + * @Title: Controller + * @Description: 消息 + * @author: jeecg-boot + * @date: 2019-04-09 + * @version: V1.0 + */ +@RestController +@RequestMapping("/message/sysMessage") +@Slf4j +public class SysMessageController { + @Autowired + private ISysMessageService sysMessageService; + + /** + * 分页列表查询 + * @param sysMessage + * @param pageNo + * @param pageSize + * @param req + * @return + */ + @GetMapping(value = "/list") + public Result<IPage<SysMessage>> queryPageList(SysMessage sysMessage, + @RequestParam(name="pageNo", defaultValue="1") Integer pageNo, + @RequestParam(name="pageSize", defaultValue="10") Integer pageSize, + HttpServletRequest req) { + Result<IPage<SysMessage>> result = new Result<IPage<SysMessage>>(); + QueryWrapper<SysMessage> queryWrapper = QueryGenerator.initQueryWrapper(sysMessage, req.getParameterMap()); + Page<SysMessage> page = new Page<SysMessage>(pageNo, pageSize); + IPage<SysMessage> pageList = sysMessageService.page(page, queryWrapper); + result.setSuccess(true); + result.setResult(pageList); + return result; + } + + /** + * 添加 + * @param sysMessage + * @return + */ + @PostMapping(value = "/add") + public Result<SysMessage> add(@RequestBody SysMessage sysMessage) { + Result<SysMessage> result = new Result<SysMessage>(); + try { + sysMessageService.save(sysMessage); + result.success("添加成功!"); + } catch (Exception e) { + e.printStackTrace(); + log.info(e.getMessage()); + result.error500("操作失败"); + } + return result; + } + + /** + * 编辑 + * @param sysMessage + * @return + */ + @PutMapping(value = "/edit") + public Result<SysMessage> edit(@RequestBody SysMessage sysMessage) { + Result<SysMessage> result = new Result<SysMessage>(); + SysMessage sysMessageEntity = sysMessageService.getById(sysMessage.getId()); + if(sysMessageEntity==null) { + result.error500("未找到对应实体"); + }else { + boolean ok = sysMessageService.updateById(sysMessage); + //TODO 返回false说明什么? + if(ok) { + result.success("修改成功!"); + } + } + + return result; + } + + /** + * 通过id删除 + * @param id + * @return + */ + @DeleteMapping(value = "/delete") + public Result<SysMessage> delete(@RequestParam(name="id",required=true) String id) { + Result<SysMessage> result = new Result<SysMessage>(); + SysMessage sysMessage = sysMessageService.getById(id); + if(sysMessage==null) { + result.error500("未找到对应实体"); + }else { + boolean ok = sysMessageService.removeById(id); + if(ok) { + result.success("删除成功!"); + } + } + + return result; + } + + /** + * 批量删除 + * @param ids + * @return + */ + @DeleteMapping(value = "/deleteBatch") + public Result<SysMessage> deleteBatch(@RequestParam(name="ids",required=true) String ids) { + Result<SysMessage> result = new Result<SysMessage>(); + if(ids==null || "".equals(ids.trim())) { + result.error500("参数不识别!"); + }else { + this.sysMessageService.removeByIds(Arrays.asList(ids.split(","))); + result.success("删除成功!"); + } + return result; + } + + /** + * 通过id查询 + * @param id + * @return + */ + @GetMapping(value = "/queryById") + public Result<SysMessage> queryById(@RequestParam(name="id",required=true) String id) { + Result<SysMessage> result = new Result<SysMessage>(); + SysMessage sysMessage = sysMessageService.getById(id); + if(sysMessage==null) { + result.error500("未找到对应实体"); + }else { + result.setResult(sysMessage); + result.setSuccess(true); + } + return result; + } + + /** + * 导出excel + * + * @param request + * @param response + */ + @RequestMapping(value = "/exportXls") + public ModelAndView exportXls(HttpServletRequest request, HttpServletResponse response) { + // Step.1 组装查询条件 + QueryWrapper<SysMessage> queryWrapper = null; + try { + String paramsStr = request.getParameter("paramsStr"); + if (oConvertUtils.isNotEmpty(paramsStr)) { + String deString = URLDecoder.decode(paramsStr, "UTF-8"); + SysMessage sysMessage = JSON.parseObject(deString, SysMessage.class); + queryWrapper = QueryGenerator.initQueryWrapper(sysMessage, request.getParameterMap()); + } + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + + //Step.2 AutoPoi 导出Excel + ModelAndView mv = new ModelAndView(new JeecgEntityExcelView()); + List<SysMessage> pageList = sysMessageService.list(queryWrapper); + //导出文件名称 + mv.addObject(NormalExcelConstants.FILE_NAME, "消息列表"); + mv.addObject(NormalExcelConstants.CLASS, SysMessage.class); + mv.addObject(NormalExcelConstants.PARAMS, new ExportParams("消息列表数据", "导出人:Jeecg", "导出信息")); + mv.addObject(NormalExcelConstants.DATA_LIST, pageList); + return mv; + } + + /** + * 通过excel导入数据 + * + * @param request + * @param response + * @return + */ + @RequestMapping(value = "/importExcel", method = RequestMethod.POST) + public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) { + MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request; + Map<String, MultipartFile> fileMap = multipartRequest.getFileMap(); + for (Map.Entry<String, MultipartFile> entity : fileMap.entrySet()) { + MultipartFile file = entity.getValue();// 获取上传文件对象 + ImportParams params = new ImportParams(); + params.setTitleRows(2); + params.setHeadRows(1); + params.setNeedSave(true); + try { + List<SysMessage> listSysMessages = ExcelImportUtil.importExcel(file.getInputStream(), SysMessage.class, params); + for (SysMessage sysMessageExcel : listSysMessages) { + sysMessageService.save(sysMessageExcel); + } + return Result.ok("文件导入成功!数据行数:" + listSysMessages.size()); + } catch (Exception e) { + log.error(e.getMessage()); + return Result.error("文件导入失败!"); + } finally { + try { + file.getInputStream().close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + return Result.ok("文件导入失败!"); + } + +} diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/message/controller/SysMessageTemplateController.java b/jeecg-boot/src/main/java/org/jeecg/modules/message/controller/SysMessageTemplateController.java new file mode 100644 index 0000000..e09df7b --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/message/controller/SysMessageTemplateController.java @@ -0,0 +1,267 @@ +package org.jeecg.modules.message.controller; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.net.URLDecoder; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import org.jeecg.common.api.vo.Result; +import org.jeecg.common.system.query.QueryGenerator; +import org.jeecg.common.util.oConvertUtils; +import org.jeecg.modules.message.entity.MsgParams; +import org.jeecg.modules.message.entity.SysMessage; +import org.jeecg.modules.message.entity.SysMessageTemplate; +import org.jeecg.modules.message.service.ISysMessageService; +import org.jeecg.modules.message.service.ISysMessageTemplateService; +import org.jeecg.modules.message.util.PushMsgUtil; + +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; + +import org.jeecgframework.poi.excel.ExcelImportUtil; +import org.jeecgframework.poi.excel.def.NormalExcelConstants; +import org.jeecgframework.poi.excel.entity.ExportParams; +import org.jeecgframework.poi.excel.entity.ImportParams; +import org.jeecgframework.poi.excel.view.JeecgEntityExcelView; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.multipart.MultipartHttpServletRequest; +import org.springframework.web.servlet.ModelAndView; +import com.alibaba.fastjson.JSON; + + /** + * @Title: Controller + * @Description: 消息模板 + * @author: jeecg-boot + * @date: 2019-04-09 + * @version: V1.0 + */ +@RestController +@RequestMapping("/message/sysMessageTemplate") +@Slf4j +public class SysMessageTemplateController { + @Autowired + private ISysMessageTemplateService sysMessageTemplateService; + @Autowired + private ISysMessageService sysMessageService; + @Autowired + private PushMsgUtil pushMsgUtil; + + /** + * 分页列表查询 + * @param sysMessageTemplate + * @param pageNo + * @param pageSize + * @param req + * @return + */ + @GetMapping(value = "/list") + public Result<IPage<SysMessageTemplate>> queryPageList(SysMessageTemplate sysMessageTemplate, + @RequestParam(name="pageNo", defaultValue="1") Integer pageNo, + @RequestParam(name="pageSize", defaultValue="10") Integer pageSize, + HttpServletRequest req) { + Result<IPage<SysMessageTemplate>> result = new Result<IPage<SysMessageTemplate>>(); + QueryWrapper<SysMessageTemplate> queryWrapper = QueryGenerator.initQueryWrapper(sysMessageTemplate, req.getParameterMap()); + Page<SysMessageTemplate> page = new Page<SysMessageTemplate>(pageNo, pageSize); + IPage<SysMessageTemplate> pageList = sysMessageTemplateService.page(page, queryWrapper); + result.setSuccess(true); + result.setResult(pageList); + return result; + } + + /** + * 添加 + * @param sysMessageTemplate + * @return + */ + @PostMapping(value = "/add") + public Result<SysMessageTemplate> add(@RequestBody SysMessageTemplate sysMessageTemplate) { + Result<SysMessageTemplate> result = new Result<SysMessageTemplate>(); + try { + sysMessageTemplateService.save(sysMessageTemplate); + result.success("添加成功!"); + } catch (Exception e) { + e.printStackTrace(); + log.info(e.getMessage()); + result.error500("操作失败"); + } + return result; + } + + /** + * 编辑 + * @param sysMessageTemplate + * @return + */ + @PutMapping(value = "/edit") + public Result<SysMessageTemplate> edit(@RequestBody SysMessageTemplate sysMessageTemplate) { + Result<SysMessageTemplate> result = new Result<SysMessageTemplate>(); + SysMessageTemplate sysMessageTemplateEntity = sysMessageTemplateService.getById(sysMessageTemplate.getId()); + if(sysMessageTemplateEntity==null) { + result.error500("未找到对应实体"); + }else { + boolean ok = sysMessageTemplateService.updateById(sysMessageTemplate); + //TODO 返回false说明什么? + if(ok) { + result.success("修改成功!"); + } + } + + return result; + } + + /** + * 通过id删除 + * @param id + * @return + */ + @DeleteMapping(value = "/delete") + public Result<SysMessageTemplate> delete(@RequestParam(name="id",required=true) String id) { + Result<SysMessageTemplate> result = new Result<SysMessageTemplate>(); + SysMessageTemplate sysMessageTemplate = sysMessageTemplateService.getById(id); + if(sysMessageTemplate==null) { + result.error500("未找到对应实体"); + }else { + boolean ok = sysMessageTemplateService.removeById(id); + if(ok) { + result.success("删除成功!"); + } + } + + return result; + } + + /** + * 批量删除 + * @param ids + * @return + */ + @DeleteMapping(value = "/deleteBatch") + public Result<SysMessageTemplate> deleteBatch(@RequestParam(name="ids",required=true) String ids) { + Result<SysMessageTemplate> result = new Result<SysMessageTemplate>(); + if(ids==null || "".equals(ids.trim())) { + result.error500("参数不识别!"); + }else { + this.sysMessageTemplateService.removeByIds(Arrays.asList(ids.split(","))); + result.success("删除成功!"); + } + return result; + } + + /** + * 通过id查询 + * @param id + * @return + */ + @GetMapping(value = "/queryById") + public Result<SysMessageTemplate> queryById(@RequestParam(name="id",required=true) String id) { + Result<SysMessageTemplate> result = new Result<SysMessageTemplate>(); + SysMessageTemplate sysMessageTemplate = sysMessageTemplateService.getById(id); + if(sysMessageTemplate==null) { + result.error500("未找到对应实体"); + }else { + result.setResult(sysMessageTemplate); + result.setSuccess(true); + } + return result; + } + + /** + * 导出excel + * + * @param request + * @param response + */ + @RequestMapping(value = "/exportXls") + public ModelAndView exportXls(HttpServletRequest request, HttpServletResponse response) { + // Step.1 组装查询条件 + QueryWrapper<SysMessageTemplate> queryWrapper = null; + try { + String paramsStr = request.getParameter("paramsStr"); + if (oConvertUtils.isNotEmpty(paramsStr)) { + String deString = URLDecoder.decode(paramsStr, "UTF-8"); + SysMessageTemplate sysMessageTemplate = JSON.parseObject(deString, SysMessageTemplate.class); + queryWrapper = QueryGenerator.initQueryWrapper(sysMessageTemplate, request.getParameterMap()); + } + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + + //Step.2 AutoPoi 导出Excel + ModelAndView mv = new ModelAndView(new JeecgEntityExcelView()); + List<SysMessageTemplate> pageList = sysMessageTemplateService.list(queryWrapper); + //导出文件名称 + mv.addObject(NormalExcelConstants.FILE_NAME, "消息模板列表"); + mv.addObject(NormalExcelConstants.CLASS, SysMessageTemplate.class); + mv.addObject(NormalExcelConstants.PARAMS, new ExportParams("消息模板列表数据", "导出人:Jeecg", "导出信息")); + mv.addObject(NormalExcelConstants.DATA_LIST, pageList); + return mv; + } + + /** + * 通过excel导入数据 + * + * @param request + * @param response + * @return + */ + @RequestMapping(value = "/importExcel", method = RequestMethod.POST) + public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) { + MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request; + Map<String, MultipartFile> fileMap = multipartRequest.getFileMap(); + for (Map.Entry<String, MultipartFile> entity : fileMap.entrySet()) { + MultipartFile file = entity.getValue();// 获取上传文件对象 + ImportParams params = new ImportParams(); + params.setTitleRows(2); + params.setHeadRows(1); + params.setNeedSave(true); + try { + List<SysMessageTemplate> listSysMessageTemplates = ExcelImportUtil.importExcel(file.getInputStream(), SysMessageTemplate.class, params); + for (SysMessageTemplate sysMessageTemplateExcel : listSysMessageTemplates) { + sysMessageTemplateService.save(sysMessageTemplateExcel); + } + return Result.ok("文件导入成功!数据行数:" + listSysMessageTemplates.size()); + } catch (Exception e) { + log.error(e.getMessage()); + return Result.error("文件导入失败!"); + } finally { + try { + file.getInputStream().close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + return Result.ok("文件导入失败!"); + } + + /** + * 发送消息 + */ + @PostMapping(value = "/sendMsg") + public Result<SysMessageTemplate> sendMessage(@RequestBody MsgParams msgParams) { + Result<SysMessageTemplate> result = new Result<SysMessageTemplate>(); + Map<String, String> map = null; + try { + map = (Map<String, String>) JSON.parse(msgParams.getTestData()); + } catch (Exception e) { + result.error500("解析Json出错!"); + return result; + } + boolean is_sendSuccess = pushMsgUtil.sendMessage(msgParams.getMsgType(), msgParams.getTemplateCode(), map, + msgParams.getReceiver()); + if (is_sendSuccess) + result.success("发送消息任务添加成功!"); + else + result.error500("发送消息任务添加失败!"); + return result; + } +} diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/message/entity/MsgParams.java b/jeecg-boot/src/main/java/org/jeecg/modules/message/entity/MsgParams.java new file mode 100644 index 0000000..a640742 --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/message/entity/MsgParams.java @@ -0,0 +1,23 @@ +package org.jeecg.modules.message.entity; + +import java.io.Serializable; + +import lombok.Data; + +/** + * 发送消息实体 + */ +@Data +public class MsgParams implements Serializable { + + private static final long serialVersionUID = 1L; + /*消息类型*/ + private String msgType; + /*消息接收方*/ + private String receiver; + /*消息模板码*/ + private String templateCode; + /*测试数据*/ + private String testData; + +} diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/message/entity/SysMessage.java b/jeecg-boot/src/main/java/org/jeecg/modules/message/entity/SysMessage.java new file mode 100644 index 0000000..3115172 --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/message/entity/SysMessage.java @@ -0,0 +1,75 @@ +package org.jeecg.modules.message.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; +import org.jeecgframework.poi.excel.annotation.Excel; + +/** + * @Description: 消息 + * @author: jeecg-boot + * @date: 2019-04-09 + * @version: V1.0 + */ +@Data +@TableName("sys_sms") +public class SysMessage implements Serializable { + private static final long serialVersionUID = 1L; + + /**创建人登录名称*/ + @Excel(name = "创建人登录名称", width = 15) + private java.lang.String createBy; + /**创建日期*/ + @Excel(name = "创建日期", width = 20, format = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + private java.util.Date createTime; + /**推送内容*/ + @Excel(name = "推送内容", width = 15) + private java.lang.Object esContent; + /**推送所需参数Json格式*/ + @Excel(name = "推送所需参数Json格式", width = 15) + private java.lang.String esParam; + /**接收人*/ + @Excel(name = "接收人", width = 15) + private java.lang.String esReceiver; + /**推送失败原因*/ + @Excel(name = "推送失败原因", width = 15) + private java.lang.String esResult; + /**发送次数*/ + @Excel(name = "发送次数", width = 15) + private java.lang.Integer esSendNum; + /**推送状态 0未推送 1推送成功 2推送失败*/ + @Excel(name = "推送状态 0未推送 1推送成功 2推送失败", width = 15) + private java.lang.String esSendStatus; + /**推送时间*/ + @Excel(name = "推送时间", width = 20, format = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + private java.util.Date esSendTime; + /**消息标题*/ + @Excel(name = "消息标题", width = 15) + private java.lang.String esTitle; + /**推送方式:1短信 2邮件 3微信*/ + @Excel(name = "推送方式:1短信 2邮件 3微信", width = 15) + private java.lang.String esType; + /**ID*/ + @TableId(type = IdType.UUID) + private java.lang.String id; + /**备注*/ + @Excel(name = "备注", width = 15) + private java.lang.String remark; + /**更新人登录名称*/ + @Excel(name = "更新人登录名称", width = 15) + private java.lang.String updateBy; + /**更新日期*/ + @Excel(name = "更新日期", width = 20, format = "yyyy-MM-dd HH:mm:ss") + @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/message/entity/SysMessageTemplate.java b/jeecg-boot/src/main/java/org/jeecg/modules/message/entity/SysMessageTemplate.java new file mode 100644 index 0000000..7f29ee5 --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/message/entity/SysMessageTemplate.java @@ -0,0 +1,58 @@ +package org.jeecg.modules.message.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; +import org.jeecgframework.poi.excel.annotation.Excel; + +/** + * @Description: 消息模板 + * @author: jeecg-boot + * @date: 2019-04-09 + * @version: V1.0 + */ +@Data +@TableName("sys_sms_template") +public class SysMessageTemplate implements Serializable { + private static final long serialVersionUID = 1L; + + /**主键*/ + @TableId(type = IdType.UUID) + private java.lang.String id; + /**模板CODE*/ + @Excel(name = "模板CODE", width = 15) + private java.lang.String templateCode; + /**模板内容*/ + @Excel(name = "模板内容", width = 15) + private java.lang.String templateContent; + /**模板标题*/ + @Excel(name = "模板标题", width = 15) + private java.lang.String templateName; + /**模板测试json*/ + @Excel(name = "模板测试json", width = 15) + private java.lang.String templateTestJson; + /**模板类型*/ + @Excel(name = "模板类型", width = 15) + private java.lang.String templateType; + /**创建人登录名称*/ + @Excel(name = "创建人登录名称", width = 15) + private java.lang.String createBy; + /**创建日期*/ + @Excel(name = "创建日期", width = 20, format = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + private java.util.Date createTime; + /**更新人登录名称*/ + @Excel(name = "更新人登录名称", width = 15) + private java.lang.String updateBy; + /**更新日期*/ + @Excel(name = "更新日期", width = 20, format = "yyyy-MM-dd HH:mm:ss") + @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/message/handle/ISendMsgHandle.java b/jeecg-boot/src/main/java/org/jeecg/modules/message/handle/ISendMsgHandle.java new file mode 100644 index 0000000..87a2e18 --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/message/handle/ISendMsgHandle.java @@ -0,0 +1,6 @@ +package org.jeecg.modules.message.handle; + +public interface ISendMsgHandle { + + void SendMsg(String es_receiver, String es_title, String es_content); +} diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/message/handle/enums/SendMsgStatusEnum.java b/jeecg-boot/src/main/java/org/jeecg/modules/message/handle/enums/SendMsgStatusEnum.java new file mode 100644 index 0000000..5b062b1 --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/message/handle/enums/SendMsgStatusEnum.java @@ -0,0 +1,25 @@ +package org.jeecg.modules.message.handle.enums; + +/** + * 推送状态枚举 + */ +public enum SendMsgStatusEnum { + +//推送状态 0未推送 1推送成功 2推送失败 + WAIT("0"), SUCCESS("1"), FAIL("2"); + + private String code; + + private SendMsgStatusEnum(String code) { + this.code = code; + } + + public String getCode() { + return code; + } + + public void setStatusCode(String code) { + this.code = code; + } + +} \ No newline at end of file diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/message/handle/enums/SendMsgTypeEnum.java b/jeecg-boot/src/main/java/org/jeecg/modules/message/handle/enums/SendMsgTypeEnum.java new file mode 100644 index 0000000..bf86d5f --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/message/handle/enums/SendMsgTypeEnum.java @@ -0,0 +1,51 @@ +package org.jeecg.modules.message.handle.enums; + +import org.jeecg.common.util.oConvertUtils; + +/** + * 发送消息类型枚举 + */ +public enum SendMsgTypeEnum { + +//推送方式:1短信 2邮件 3微信 + SMS("1", "org.jeecg.modules.message.handle.impl.SmsSendMsgHandle"), + EMAIL("2", "org.jeecg.modules.message.handle.impl.EmailSendMsgHandle"), + WX("3","org.jeecg.modules.message.handle.impl.WxSendMsgHandle"); + + private String type; + + private String implClass; + + private SendMsgTypeEnum(String type, String implClass) { + this.type = type; + this.implClass = implClass; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getImplClass() { + return implClass; + } + + public void setImplClass(String implClass) { + this.implClass = implClass; + } + + public static SendMsgTypeEnum getByType(String type) { + if (oConvertUtils.isEmpty(type)) { + return null; + } + for (SendMsgTypeEnum val : values()) { + if (val.getType().equals(type)) { + return val; + } + } + return null; + } +} diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/message/handle/impl/EmailSendMsgHandle.java b/jeecg-boot/src/main/java/org/jeecg/modules/message/handle/impl/EmailSendMsgHandle.java new file mode 100644 index 0000000..6d5b5fd --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/message/handle/impl/EmailSendMsgHandle.java @@ -0,0 +1,22 @@ +package org.jeecg.modules.message.handle.impl; + +import org.jeecg.common.util.SpringContextUtils; +import org.jeecg.modules.message.handle.ISendMsgHandle; +import org.springframework.mail.SimpleMailMessage; +import org.springframework.mail.javamail.JavaMailSender; + +public class EmailSendMsgHandle implements ISendMsgHandle { + + @Override + public void SendMsg(String es_receiver, String es_title, String es_content) { + JavaMailSender mailSender = (JavaMailSender) SpringContextUtils.getBean("mailSender"); + SimpleMailMessage message = new SimpleMailMessage(); + // 设置发送方邮箱地址 + message.setFrom("2897976540@qq.com"); + message.setTo(es_receiver); + message.setSubject(es_title); + message.setText(es_content); + mailSender.send(message); + + } +} diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/message/handle/impl/SmsSendMsgHandle.java b/jeecg-boot/src/main/java/org/jeecg/modules/message/handle/impl/SmsSendMsgHandle.java new file mode 100644 index 0000000..a85266f --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/message/handle/impl/SmsSendMsgHandle.java @@ -0,0 +1,13 @@ +package org.jeecg.modules.message.handle.impl; + +import org.jeecg.modules.message.handle.ISendMsgHandle; + +public class SmsSendMsgHandle implements ISendMsgHandle { + + @Override + public void SendMsg(String es_receiver, String es_title, String es_content) { + // TODO Auto-generated method stub + System.out.println("发短信"); + } + +} diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/message/handle/impl/WxSendMsgHandle.java b/jeecg-boot/src/main/java/org/jeecg/modules/message/handle/impl/WxSendMsgHandle.java new file mode 100644 index 0000000..a6601cd --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/message/handle/impl/WxSendMsgHandle.java @@ -0,0 +1,13 @@ +package org.jeecg.modules.message.handle.impl; + +import org.jeecg.modules.message.handle.ISendMsgHandle; + +public class WxSendMsgHandle implements ISendMsgHandle { + + @Override + public void SendMsg(String es_receiver, String es_title, String es_content) { + // TODO Auto-generated method stub + System.out.println("发微信消息模板"); + } + +} diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/message/job/SendMsgJob.java b/jeecg-boot/src/main/java/org/jeecg/modules/message/job/SendMsgJob.java new file mode 100644 index 0000000..7ae76cb --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/message/job/SendMsgJob.java @@ -0,0 +1,72 @@ +package org.jeecg.modules.message.job; + +import java.util.List; + +import org.jeecg.common.util.DateUtils; +import org.jeecg.modules.message.entity.SysMessage; +import org.jeecg.modules.message.handle.ISendMsgHandle; +import org.jeecg.modules.message.handle.enums.SendMsgStatusEnum; +import org.jeecg.modules.message.handle.enums.SendMsgTypeEnum; +import org.jeecg.modules.message.service.ISysMessageService; +import org.quartz.Job; +import org.quartz.JobExecutionContext; +import org.quartz.JobExecutionException; +import org.springframework.beans.factory.annotation.Autowired; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; + +import lombok.extern.slf4j.Slf4j; + +/** + * 发送消息任务 + */ + +@Slf4j +public class SendMsgJob implements Job { + + @Autowired + private ISysMessageService sysMessageService; + + @Override + public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException { + + log.info(String.format(" Jeecg-Boot 发送消息任务 SendMsgJob ! 时间:" + DateUtils.getTimestamp())); + + // 1.读取消息中心数据,只查询未发送的和发送失败不超过次数的 + QueryWrapper<SysMessage> queryWrapper = new QueryWrapper<SysMessage>(); + queryWrapper.eq("es_send_status", SendMsgStatusEnum.WAIT.getCode()) + .or(i -> i.eq("es_send_status", SendMsgStatusEnum.FAIL.getCode()).lt("es_send_num", 6)); + List<SysMessage> sysMessages = sysMessageService.list(queryWrapper); + System.out.println(sysMessages); + // 2.根据不同的类型走不通的发送实现类 + for (SysMessage sysMessage : sysMessages) { + ISendMsgHandle sendMsgHandle = null; + try { + if (sysMessage.getEsType().equals(SendMsgTypeEnum.EMAIL.getType())) { + sendMsgHandle = (ISendMsgHandle) Class.forName(SendMsgTypeEnum.EMAIL.getImplClass()).newInstance(); + } else if (sysMessage.getEsType().equals(SendMsgTypeEnum.SMS.getType())) { + sendMsgHandle = (ISendMsgHandle) Class.forName(SendMsgTypeEnum.SMS.getImplClass()).newInstance(); + } else if (sysMessage.getEsType().equals(SendMsgTypeEnum.WX.getType())) { + sendMsgHandle = (ISendMsgHandle) Class.forName(SendMsgTypeEnum.WX.getImplClass()).newInstance(); + } + } catch (Exception e) { + e.printStackTrace(); + } + Integer sendNum = sysMessage.getEsSendNum(); + try { + sendMsgHandle.SendMsg(sysMessage.getEsReceiver(), sysMessage.getEsTitle(), + sysMessage.getEsContent().toString()); + // 发送消息成功 + sysMessage.setEsSendStatus(SendMsgStatusEnum.SUCCESS.getCode()); + } catch (Exception e) { + // 发送消息出现异常 + sysMessage.setEsSendStatus(SendMsgStatusEnum.FAIL.getCode()); + } + sysMessage.setEsSendNum(++sendNum); + // 发送结果回写到数据库 + sysMessageService.updateById(sysMessage); + } + + } + +} diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/message/mapper/SysMessageMapper.java b/jeecg-boot/src/main/java/org/jeecg/modules/message/mapper/SysMessageMapper.java new file mode 100644 index 0000000..1e19b58 --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/message/mapper/SysMessageMapper.java @@ -0,0 +1,17 @@ +package org.jeecg.modules.message.mapper; + +import java.util.List; + +import org.apache.ibatis.annotations.Param; +import org.jeecg.modules.message.entity.SysMessage; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + * @Description: 消息 + * @author: jeecg-boot + * @date: 2019-04-09 + * @version: V1.0 + */ +public interface SysMessageMapper extends BaseMapper<SysMessage> { + +} diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/message/mapper/SysMessageTemplateMapper.java b/jeecg-boot/src/main/java/org/jeecg/modules/message/mapper/SysMessageTemplateMapper.java new file mode 100644 index 0000000..27fd3b4 --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/message/mapper/SysMessageTemplateMapper.java @@ -0,0 +1,18 @@ +package org.jeecg.modules.message.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Select; +import org.jeecg.modules.message.entity.SysMessageTemplate; + +import java.util.List; + +/** + * @Description: 消息模板 + * @author: jeecg-boot + * @date: 2019-04-09 + * @version: V1.0 + */ +public interface SysMessageTemplateMapper extends BaseMapper<SysMessageTemplate> { + @Select("SELECT * FROM SYS_SMS_TEMPLATE WHERE TEMPLATE_CODE = #{code}") + List<SysMessageTemplate> selectByCode(String code); +} diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/message/mapper/xml/SysMessageMapper.xml b/jeecg-boot/src/main/java/org/jeecg/modules/message/mapper/xml/SysMessageMapper.xml new file mode 100644 index 0000000..a07a19a --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/message/mapper/xml/SysMessageMapper.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.message.mapper.SysMessageMapper"> + +</mapper> \ No newline at end of file diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/message/mapper/xml/SysMessageTemplateMapper.xml b/jeecg-boot/src/main/java/org/jeecg/modules/message/mapper/xml/SysMessageTemplateMapper.xml new file mode 100644 index 0000000..e3a0006 --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/message/mapper/xml/SysMessageTemplateMapper.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.message.mapper.SysMessageTemplateMapper"> + +</mapper> \ No newline at end of file diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/message/service/ISysMessageService.java b/jeecg-boot/src/main/java/org/jeecg/modules/message/service/ISysMessageService.java new file mode 100644 index 0000000..89dfd3b --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/message/service/ISysMessageService.java @@ -0,0 +1,14 @@ +package org.jeecg.modules.message.service; + +import org.jeecg.modules.message.entity.SysMessage; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + * @Description: 消息 + * @author: jeecg-boot + * @date: 2019-04-09 + * @version: V1.0 + */ +public interface ISysMessageService extends IService<SysMessage> { + +} diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/message/service/ISysMessageTemplateService.java b/jeecg-boot/src/main/java/org/jeecg/modules/message/service/ISysMessageTemplateService.java new file mode 100644 index 0000000..1440691 --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/message/service/ISysMessageTemplateService.java @@ -0,0 +1,16 @@ +package org.jeecg.modules.message.service; + +import org.jeecg.modules.message.entity.SysMessageTemplate; +import com.baomidou.mybatisplus.extension.service.IService; + +import java.util.List; + +/** + * @Description: 消息模板 + * @author: jeecg-boot + * @date: 2019-04-09 + * @version: V1.0 + */ +public interface ISysMessageTemplateService extends IService<SysMessageTemplate> { + List<SysMessageTemplate> selectByCode(String code); +} diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/message/service/impl/SysMessageServiceImpl.java b/jeecg-boot/src/main/java/org/jeecg/modules/message/service/impl/SysMessageServiceImpl.java new file mode 100644 index 0000000..ca7a0ad --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/message/service/impl/SysMessageServiceImpl.java @@ -0,0 +1,19 @@ +package org.jeecg.modules.message.service.impl; + +import org.jeecg.modules.message.entity.SysMessage; +import org.jeecg.modules.message.mapper.SysMessageMapper; +import org.jeecg.modules.message.service.ISysMessageService; +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; + +/** + * @Description: 消息 + * @author: jeecg-boot + * @date: 2019-04-09 + * @version: V1.0 + */ +@Service +public class SysMessageServiceImpl extends ServiceImpl<SysMessageMapper, SysMessage> implements ISysMessageService { + +} diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/message/service/impl/SysMessageTemplateServiceImpl.java b/jeecg-boot/src/main/java/org/jeecg/modules/message/service/impl/SysMessageTemplateServiceImpl.java new file mode 100644 index 0000000..0cf1f29 --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/message/service/impl/SysMessageTemplateServiceImpl.java @@ -0,0 +1,29 @@ +package org.jeecg.modules.message.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.jeecg.modules.message.entity.SysMessageTemplate; +import org.jeecg.modules.message.mapper.SysMessageTemplateMapper; +import org.jeecg.modules.message.service.ISysMessageTemplateService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * @Description: 消息模板 + * @author: jeecg-boot + * @date: 2019-04-09 + * @version: V1.0 + */ +@Service +public class SysMessageTemplateServiceImpl extends ServiceImpl<SysMessageTemplateMapper, SysMessageTemplate> implements ISysMessageTemplateService { + + @Autowired + private SysMessageTemplateMapper sysMessageTemplateMapper; + + + @Override + public List<SysMessageTemplate> selectByCode(String code) { + return sysMessageTemplateMapper.selectByCode(code); + } +} diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/message/util/PushMsgUtil.java b/jeecg-boot/src/main/java/org/jeecg/modules/message/util/PushMsgUtil.java new file mode 100644 index 0000000..e907992 --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/message/util/PushMsgUtil.java @@ -0,0 +1,63 @@ +package org.jeecg.modules.message.util; + +import org.jeecg.modules.message.entity.SysMessage; +import org.jeecg.modules.message.entity.SysMessageTemplate; +import org.jeecg.modules.message.handle.enums.SendMsgStatusEnum; +import org.jeecg.modules.message.service.ISysMessageService; +import org.jeecg.modules.message.service.ISysMessageTemplateService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import com.alibaba.fastjson.JSONObject; + +import java.util.Date; +import java.util.List; +import java.util.Map; + +/** + * 消息生成工具 + */ + +@Component +public class PushMsgUtil { + + @Autowired + private ISysMessageService sysMessageService; + + @Autowired + private ISysMessageTemplateService sysMessageTemplateService; + + /** + * @param msgType 消息类型 1短信 2邮件 3微信 + * @param templateCode 消息模板码 + * @param map 消息参数 + * @param sentTo 接收消息方 + */ + public boolean sendMessage(String msgType, String templateCode, Map<String, String> map, String sentTo) { + List<SysMessageTemplate> sysSmsTemplates = sysMessageTemplateService.selectByCode(templateCode); + SysMessage sysMessage = new SysMessage(); + if (sysSmsTemplates.size() > 0) { + SysMessageTemplate sysSmsTemplate = sysSmsTemplates.get(0); + sysMessage.setEsType(msgType); + sysMessage.setEsReceiver(sentTo); + //模板标题 + String title = sysSmsTemplate.getTemplateName(); + //模板内容 + String content = sysSmsTemplate.getTemplateContent(); + for (Map.Entry<String, String> entry : map.entrySet()) { + String str = "${" + entry.getKey() + "}"; + title = title.replace(str, entry.getValue()); + content = content.replace(str, entry.getValue()); + } + sysMessage.setEsTitle(title); + sysMessage.setEsContent(content); + sysMessage.setEsParam(JSONObject.toJSONString(map)); + sysMessage.setEsSendTime(new Date()); + sysMessage.setEsSendStatus(SendMsgStatusEnum.WAIT.getCode()); + sysMessage.setEsSendNum(0); + if(sysMessageService.save(sysMessage)) + return true; + } + return false; + } +} diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/monitor/controller/RedisController.java b/jeecg-boot/src/main/java/org/jeecg/modules/monitor/controller/RedisController.java new file mode 100644 index 0000000..bb9cc9c --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/monitor/controller/RedisController.java @@ -0,0 +1,46 @@ +package org.jeecg.modules.monitor.controller; + +import java.util.List; +import java.util.Map; + +import org.jeecg.common.api.vo.Result; +import org.jeecg.modules.monitor.domain.RedisInfo; +import org.jeecg.modules.monitor.service.RedisService; +import org.jeecg.modules.system.controller.LoginController; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import lombok.extern.slf4j.Slf4j; + +@RestController +@RequestMapping("redis") +@Slf4j +public class RedisController { + + @Autowired + private RedisService redisService; + + /** + * Redis详细信息 + * @return + * @throws Exception + */ + @GetMapping("info") + public Result<?> getRedisInfo() throws Exception { + List<RedisInfo> infoList = this.redisService.getRedisInfo(); + log.info(infoList.toString()); + return Result.ok(infoList); + } + + @GetMapping("keysSize") + public Map<String, Object> getKeysSize() throws Exception { + return redisService.getKeysSize(); + } + + @GetMapping("memoryInfo") + public Map<String, Object> getMemoryInfo() throws Exception { + return redisService.getMemoryInfo(); + } +} diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/monitor/domain/RedisInfo.java b/jeecg-boot/src/main/java/org/jeecg/modules/monitor/domain/RedisInfo.java new file mode 100644 index 0000000..e605f9a --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/monitor/domain/RedisInfo.java @@ -0,0 +1,137 @@ +package org.jeecg.modules.monitor.domain; + +import java.util.HashMap; +import java.util.Map; + +public class RedisInfo { + + private static Map<String, String> map = new HashMap<>(); + + static { + map.put("redis_version", "Redis 服务器版本"); + map.put("redis_git_sha1", "Git SHA1"); + map.put("redis_git_dirty", "Git dirty flag"); + map.put("os", "Redis 服务器的宿主操作系统"); + map.put("arch_bits", " 架构(32 或 64 位)"); + map.put("multiplexing_api", "Redis 所使用的事件处理机制"); + map.put("gcc_version", "编译 Redis 时所使用的 GCC 版本"); + map.put("process_id", "服务器进程的 PID"); + map.put("run_id", "Redis 服务器的随机标识符(用于 Sentinel 和集群)"); + map.put("tcp_port", "TCP/IP 监听端口"); + map.put("uptime_in_seconds", "自 Redis 服务器启动以来,经过的秒数"); + map.put("uptime_in_days", "自 Redis 服务器启动以来,经过的天数"); + map.put("lru_clock", " 以分钟为单位进行自增的时钟,用于 LRU 管理"); + map.put("connected_clients", "已连接客户端的数量(不包括通过从属服务器连接的客户端)"); + map.put("client_longest_output_list", "当前连接的客户端当中,最长的输出列表"); + map.put("client_longest_input_buf", "当前连接的客户端当中,最大输入缓存"); + map.put("blocked_clients", "正在等待阻塞命令(BLPOP、BRPOP、BRPOPLPUSH)的客户端的数量"); + map.put("used_memory", "由 Redis 分配器分配的内存总量,以字节(byte)为单位"); + map.put("used_memory_human", "以人类可读的格式返回 Redis 分配的内存总量"); + map.put("used_memory_rss", "从操作系统的角度,返回 Redis 已分配的内存总量(俗称常驻集大小)。这个值和 top 、 ps 等命令的输出一致"); + map.put("used_memory_peak", " Redis 的内存消耗峰值(以字节为单位)"); + map.put("used_memory_peak_human", "以人类可读的格式返回 Redis 的内存消耗峰值"); + map.put("used_memory_lua", "Lua 引擎所使用的内存大小(以字节为单位)"); + map.put("mem_fragmentation_ratio", "sed_memory_rss 和 used_memory 之间的比率"); + map.put("mem_allocator", "在编译时指定的, Redis 所使用的内存分配器。可以是 libc 、 jemalloc 或者 tcmalloc"); + + map.put("redis_build_id", "redis_build_id"); + map.put("redis_mode", "运行模式,单机(standalone)或者集群(cluster)"); + map.put("atomicvar_api", "atomicvar_api"); + map.put("hz", "redis内部调度(进行关闭timeout的客户端,删除过期key等等)频率,程序规定serverCron每秒运行10次。"); + map.put("executable", "server脚本目录"); + map.put("config_file", "配置文件目录"); + map.put("client_biggest_input_buf", "当前连接的客户端当中,最大输入缓存,用client list命令观察qbuf和qbuf-free两个字段最大值"); + map.put("used_memory_rss_human", "以人类可读的方式返回 Redis 已分配的内存总量"); + map.put("used_memory_peak_perc", "内存使用率峰值"); + map.put("total_system_memory", "系统总内存"); + map.put("total_system_memory_human", "以人类可读的方式返回系统总内存"); + map.put("used_memory_lua_human", "以人类可读的方式返回Lua 引擎所使用的内存大小"); + map.put("maxmemory", "最大内存限制,0表示无限制"); + map.put("maxmemory_human", "以人类可读的方式返回最大限制内存"); + map.put("maxmemory_policy", "超过内存限制后的处理策略"); + map.put("loading", "服务器是否正在载入持久化文件"); + map.put("rdb_changes_since_last_save", "离最近一次成功生成rdb文件,写入命令的个数,即有多少个写入命令没有持久化"); + map.put("rdb_bgsave_in_progress", "服务器是否正在创建rdb文件"); + map.put("rdb_last_save_time", "离最近一次成功创建rdb文件的时间戳。当前时间戳 - rdb_last_save_time=多少秒未成功生成rdb文件"); + map.put("rdb_last_bgsave_status", "最近一次rdb持久化是否成功"); + map.put("rdb_last_bgsave_time_sec", "最近一次成功生成rdb文件耗时秒数"); + map.put("rdb_current_bgsave_time_sec", "如果服务器正在创建rdb文件,那么这个域记录的就是当前的创建操作已经耗费的秒数"); + map.put("aof_enabled", "是否开启了aof"); + map.put("aof_rewrite_in_progress", "标识aof的rewrite操作是否在进行中"); + map.put("aof_rewrite_scheduled", "rewrite任务计划,当客户端发送bgrewriteaof指令,如果当前rewrite子进程正在执行,那么将客户端请求的bgrewriteaof变为计划任务,待aof子进程结束后执行rewrite "); + + map.put("aof_last_rewrite_time_sec", "最近一次aof rewrite耗费的时长"); + map.put("aof_current_rewrite_time_sec", "如果rewrite操作正在进行,则记录所使用的时间,单位秒"); + map.put("aof_last_bgrewrite_status", "上次bgrewrite aof操作的状态"); + map.put("aof_last_write_status", "上次aof写入状态"); + + map.put("total_commands_processed", "redis处理的命令数"); + map.put("total_connections_received", "新创建连接个数,如果新创建连接过多,过度地创建和销毁连接对性能有影响,说明短连接严重或连接池使用有问题,需调研代码的连接设置"); + map.put("instantaneous_ops_per_sec", "redis当前的qps,redis内部较实时的每秒执行的命令数"); + map.put("total_net_input_bytes", "redis网络入口流量字节数"); + map.put("total_net_output_bytes", "redis网络出口流量字节数"); + + map.put("instantaneous_input_kbps", "redis网络入口kps"); + map.put("instantaneous_output_kbps", "redis网络出口kps"); + map.put("rejected_connections", "拒绝的连接个数,redis连接个数达到maxclients限制,拒绝新连接的个数"); + map.put("sync_full", "主从完全同步成功次数"); + + map.put("sync_partial_ok", "主从部分同步成功次数"); + map.put("sync_partial_err", "主从部分同步失败次数"); + map.put("expired_keys", "运行以来过期的key的数量"); + map.put("evicted_keys", "运行以来剔除(超过了maxmemory后)的key的数量"); + map.put("keyspace_hits", "命中次数"); + map.put("keyspace_misses", "没命中次数"); + map.put("pubsub_channels", "当前使用中的频道数量"); + map.put("pubsub_patterns", "当前使用的模式的数量"); + map.put("latest_fork_usec", "最近一次fork操作阻塞redis进程的耗时数,单位微秒"); + map.put("role", "实例的角色,是master or slave"); + map.put("connected_slaves", "连接的slave实例个数"); + map.put("master_repl_offset", "主从同步偏移量,此值如果和上面的offset相同说明主从一致没延迟"); + map.put("repl_backlog_active", "复制积压缓冲区是否开启"); + map.put("repl_backlog_size", "复制积压缓冲大小"); + map.put("repl_backlog_first_byte_offset", "复制缓冲区里偏移量的大小"); + map.put("repl_backlog_histlen", "此值等于 master_repl_offset - repl_backlog_first_byte_offset,该值不会超过repl_backlog_size的大小"); + map.put("used_cpu_sys", "将所有redis主进程在核心态所占用的CPU时求和累计起来"); + map.put("used_cpu_user", "将所有redis主进程在用户态所占用的CPU时求和累计起来"); + map.put("used_cpu_sys_children", "将后台进程在核心态所占用的CPU时求和累计起来"); + map.put("used_cpu_user_children", "将后台进程在用户态所占用的CPU时求和累计起来"); + map.put("cluster_enabled", "实例是否启用集群模式"); + map.put("db0", "db0的key的数量,以及带有生存期的key的数,平均存活时间"); + + } + + private String key; + private String value; + private String description; + + public String getKey() { + return key; + } + + public void setKey(String key) { + this.key = key; + this.description = map.get(this.key); + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + @Override + public String toString() { + return "RedisInfo{" + "key='" + key + '\'' + ", value='" + value + '\'' + ", desctiption='" + description + '\'' + '}'; + } +} diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/monitor/exception/RedisConnectException.java b/jeecg-boot/src/main/java/org/jeecg/modules/monitor/exception/RedisConnectException.java new file mode 100644 index 0000000..0391c2a --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/monitor/exception/RedisConnectException.java @@ -0,0 +1,13 @@ +package org.jeecg.modules.monitor.exception; + +/** + * Redis 连接异常 + */ +public class RedisConnectException extends Exception { + + private static final long serialVersionUID = 1639374111871115063L; + + public RedisConnectException(String message) { + super(message); + } +} diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/monitor/service/RedisService.java b/jeecg-boot/src/main/java/org/jeecg/modules/monitor/service/RedisService.java new file mode 100644 index 0000000..756e80a --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/monitor/service/RedisService.java @@ -0,0 +1,33 @@ +package org.jeecg.modules.monitor.service; + +import java.util.List; +import java.util.Map; +import java.util.Set; + +import org.jeecg.modules.monitor.domain.RedisInfo; +import org.jeecg.modules.monitor.exception.RedisConnectException; + +public interface RedisService { + + /** + * 获取 redis 的详细信息 + * + * @return List + */ + List<RedisInfo> getRedisInfo() throws RedisConnectException; + + /** + * 获取 redis key 数量 + * + * @return Map + */ + Map<String, Object> getKeysSize() throws RedisConnectException; + + /** + * 获取 redis 内存信息 + * + * @return Map + */ + Map<String, Object> getMemoryInfo() throws RedisConnectException; + +} diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/monitor/service/impl/RedisServiceImpl.java b/jeecg-boot/src/main/java/org/jeecg/modules/monitor/service/impl/RedisServiceImpl.java new file mode 100644 index 0000000..9fc764d --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/monitor/service/impl/RedisServiceImpl.java @@ -0,0 +1,75 @@ +package org.jeecg.modules.monitor.service.impl; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Properties; + +import javax.annotation.Resource; + +import org.jeecg.common.util.oConvertUtils; +import org.jeecg.modules.monitor.domain.RedisInfo; +import org.jeecg.modules.monitor.exception.RedisConnectException; +import org.jeecg.modules.monitor.service.RedisService; +import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.stereotype.Service; + +import lombok.extern.slf4j.Slf4j; + +/** + * Redis 监控信息获取 + * + * @author MrBird + */ +@Service("redisService") +@Slf4j +public class RedisServiceImpl implements RedisService { + + @Resource + private RedisConnectionFactory redisConnectionFactory; + + /** + * Redis详细信息 + */ + @Override + public List<RedisInfo> getRedisInfo() throws RedisConnectException { + Properties info = redisConnectionFactory.getConnection().info(); + List<RedisInfo> infoList = new ArrayList<>(); + RedisInfo redisInfo = null; + for (Map.Entry<Object, Object> entry : info.entrySet()) { + redisInfo = new RedisInfo(); + redisInfo.setKey(oConvertUtils.getString(entry.getKey())); + redisInfo.setValue(oConvertUtils.getString(entry.getValue())); + infoList.add(redisInfo); + } + return infoList; + } + + @Override + public Map<String, Object> getKeysSize() throws RedisConnectException { + Long dbSize = redisConnectionFactory.getConnection().dbSize(); + Map<String, Object> map = new HashMap<>(); + map.put("create_time", System.currentTimeMillis()); + map.put("dbSize", dbSize); + + log.info("--getKeysSize--: " + map.toString()); + return map; + } + + @Override + public Map<String, Object> getMemoryInfo() throws RedisConnectException { + Map<String, Object> map = null; + Properties info = redisConnectionFactory.getConnection().info(); + for (Map.Entry<Object, Object> entry : info.entrySet()) { + String key = oConvertUtils.getString(entry.getKey()); + if ("used_memory".equals(key)) { + map = new HashMap<>(); + map.put("used_memory", entry.getValue()); + map.put("create_time", System.currentTimeMillis()); + } + } + log.info("--getMemoryInfo--: " + map.toString()); + return map; + } +} diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/ngalain/aop/LogRecordAspect.java b/jeecg-boot/src/main/java/org/jeecg/modules/ngalain/aop/LogRecordAspect.java new file mode 100644 index 0000000..ceb0476 --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/ngalain/aop/LogRecordAspect.java @@ -0,0 +1,46 @@ +package org.jeecg.modules.ngalain.aop; + +import javax.servlet.http.HttpServletRequest; + +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.springframework.context.annotation.Configuration; +import org.springframework.web.context.request.RequestAttributes; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory;; + + +// 暂时注释掉,提高系统性能 +//@Aspect //定义一个切面 +//@Configuration +public class LogRecordAspect { +private static final Logger logger = LoggerFactory.getLogger(LogRecordAspect.class); + + // 定义切点Pointcut + @Pointcut("execution(public * org.jeecg.modules.*.*.*Controller.*(..))") + public void excudeService() { + } + + @Around("excudeService()") + public Object doAround(ProceedingJoinPoint pjp) throws Throwable { + RequestAttributes ra = RequestContextHolder.getRequestAttributes(); + ServletRequestAttributes sra = (ServletRequestAttributes) ra; + HttpServletRequest request = sra.getRequest(); + + String url = request.getRequestURL().toString(); + String method = request.getMethod(); + String uri = request.getRequestURI(); + String queryString = request.getQueryString(); + logger.info("请求开始, 各个参数, url: {}, method: {}, uri: {}, params: {}", url, method, uri, queryString); + + // result的值就是被拦截方法的返回值 + Object result = pjp.proceed(); + + logger.info("请求结束,controller的返回值是 " + result); + return result; + } +} \ No newline at end of file diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/ngalain/controller/NgAlainController.java b/jeecg-boot/src/main/java/org/jeecg/modules/ngalain/controller/NgAlainController.java new file mode 100644 index 0000000..93b99ba --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/ngalain/controller/NgAlainController.java @@ -0,0 +1,85 @@ +package org.jeecg.modules.ngalain.controller; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.extern.slf4j.Slf4j; +import org.apache.shiro.SecurityUtils; +import org.jeecg.common.api.vo.Result; +import org.jeecg.common.util.oConvertUtils; +import org.jeecg.modules.ngalain.service.NgAlainService; +import org.jeecg.modules.system.entity.SysDict; +import org.jeecg.modules.system.entity.SysUser; +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.*; + +import javax.servlet.http.HttpServletRequest; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +@Slf4j +@RestController +@RequestMapping("/sys/ng-alain") +public class NgAlainController { + @Autowired + private NgAlainService ngAlainService; + @Autowired + private ISysDictService sysDictService; + + @RequestMapping(value = "/getAppData") + @ResponseBody + public JSONObject getAppData(HttpServletRequest request) throws Exception { + String token=request.getHeader("X-Access-Token"); + JSONObject j = new JSONObject(); + SysUser user = (SysUser) SecurityUtils.getSubject().getPrincipal(); + JSONObject userObjcet = new JSONObject(); + userObjcet.put("name", user.getUsername()); + userObjcet.put("avatar", user.getAvatar()); + userObjcet.put("email", user.getEmail()); + userObjcet.put("token", token); + j.put("user", userObjcet); + j.put("menu",ngAlainService.getMenu(user.getUsername())); + JSONObject app = new JSONObject(); + app.put("name", "jeecg-boot-angular"); + app.put("description", "jeecg+ng-alain整合版本"); + j.put("app", app); + return j; + } + + @RequestMapping(value = "/getDictItems/{dictCode}", method = RequestMethod.GET) + public Object getDictItems(@PathVariable String dictCode) { + log.info(" dictCode : "+ dictCode); + Result<List<Map<String,Object>>> result = new Result<List<Map<String,Object>>>(); + List<Map<String,Object>> ls = null; + try { + ls = sysDictService.queryDictItemsByCode(dictCode); + result.setSuccess(true); + result.setResult(ls); + } catch (Exception e) { + log.info(e.getMessage()); + result.error500("操作失败"); + return result; + } + List<JSONObject> dictlist=new ArrayList<>(); + for (Map<String, Object> l : ls) { + JSONObject dict=new JSONObject(); + try { + dict.put("value",Integer.parseInt((String)l.get("value"))); + } catch (NumberFormatException e) { + dict.put("value",l.get("value")); + } + dict.put("label",l.get("text")); + dictlist.add(dict); + } + return dictlist; + } + @RequestMapping(value = "/getDictItemsByTable/{table}/{key}/{value}", method = RequestMethod.GET) + public Object getDictItemsByTable(@PathVariable String table,@PathVariable String key,@PathVariable String value) { + return this.ngAlainService.getDictByTable(table,key,value); + } +} diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/ngalain/mapper/NgAlainMapper.java b/jeecg-boot/src/main/java/org/jeecg/modules/ngalain/mapper/NgAlainMapper.java new file mode 100644 index 0000000..2a10fea --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/ngalain/mapper/NgAlainMapper.java @@ -0,0 +1,12 @@ +package org.jeecg.modules.ngalain.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +public interface NgAlainMapper extends BaseMapper { + public List<Map<String,String>> getDictByTable(@Param("table") String table, @Param("key") String key, @Param("value") String value); + +} diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/ngalain/mapper/xml/NgAlainMapper.xml b/jeecg-boot/src/main/java/org/jeecg/modules/ngalain/mapper/xml/NgAlainMapper.xml new file mode 100644 index 0000000..affc851 --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/ngalain/mapper/xml/NgAlainMapper.xml @@ -0,0 +1,7 @@ +<?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.ngalain.mapper.NgAlainMapper"> + <select id="getDictByTable" parameterType="String" resultType="java.util.HashMap"> + select ${key} as 'label',${value} as 'value' from ${table} + </select> +</mapper> \ No newline at end of file diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/ngalain/service/NgAlainService.java b/jeecg-boot/src/main/java/org/jeecg/modules/ngalain/service/NgAlainService.java new file mode 100644 index 0000000..dd450cd --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/ngalain/service/NgAlainService.java @@ -0,0 +1,12 @@ +package org.jeecg.modules.ngalain.service; + +import com.alibaba.fastjson.JSONArray; + +import java.util.List; +import java.util.Map; + +public interface NgAlainService { + public JSONArray getMenu(String id) throws Exception; + public JSONArray getJeecgMenu(String id) throws Exception; + public List<Map<String, String>> getDictByTable(String table, String key, String value); +} diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/ngalain/service/impl/NgAlainServiceImpl.java b/jeecg-boot/src/main/java/org/jeecg/modules/ngalain/service/impl/NgAlainServiceImpl.java new file mode 100644 index 0000000..1a4f98d --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/ngalain/service/impl/NgAlainServiceImpl.java @@ -0,0 +1,182 @@ +package org.jeecg.modules.ngalain.service.impl; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import org.jeecg.common.util.MD5Util; +import org.jeecg.common.util.oConvertUtils; +import org.jeecg.modules.ngalain.mapper.NgAlainMapper; +import org.jeecg.modules.ngalain.service.NgAlainService; +import org.jeecg.modules.system.entity.SysPermission; +import org.jeecg.modules.system.service.ISysPermissionService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Base64; +import java.util.List; +import java.util.Map; + +@Service("ngAlainService") +@Transactional +public class NgAlainServiceImpl implements NgAlainService { + @Autowired + private ISysPermissionService sysPermissionService; + @Autowired + private NgAlainMapper mapper; + @Override + public JSONArray getMenu(String id) throws Exception { + return getJeecgMenu(id); + } + @Override + public JSONArray getJeecgMenu(String id) throws Exception { + List<SysPermission> metaList = sysPermissionService.queryByUser(id); + JSONArray jsonArray = new JSONArray(); + getPermissionJsonArray(jsonArray, metaList, null); + JSONArray menulist= parseNgAlain(jsonArray); + JSONObject jeecgMenu = new JSONObject(); + jeecgMenu.put("text", "jeecg菜单"); + jeecgMenu.put("group",true); + jeecgMenu.put("children", menulist); + JSONArray jeecgMenuList=new JSONArray(); + jeecgMenuList.add(jeecgMenu); + return jeecgMenuList; + } + + @Override + public List<Map<String, String>> getDictByTable(String table, String key, String value) { + return this.mapper.getDictByTable(table,key,value); + } + + private JSONArray parseNgAlain(JSONArray jsonArray) { + JSONArray menulist=new JSONArray(); + for (Object object : jsonArray) { + JSONObject jsonObject= (JSONObject) object; + String path= (String) jsonObject.get("path"); + JSONObject meta= (JSONObject) jsonObject.get("meta"); + JSONObject menu=new JSONObject(); + menu.put("text",meta.get("title")); + menu.put("reuse",true); + if (jsonObject.get("children")!=null){ + JSONArray child= parseNgAlain((JSONArray) jsonObject.get("children")); + menu.put("children",child); + JSONObject icon=new JSONObject(); + icon.put("type", "icon"); + icon.put("value", "appstore"); + menu.put("icon",icon); + }else { + menu.put("link",path); + } + menulist.add(menu); + } + return menulist; + } + + /** + * 获取菜单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.isLeaf()) { + 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.isLeaf()) { + 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://"))) { + String url= new String(Base64.getUrlEncoder().encode(permission.getUrl().getBytes())); + json.put("path", "/sys/link/" +url.replaceAll("=","")); + }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/online/cgreport/controller/OnlCgreportAPI.java b/jeecg-boot/src/main/java/org/jeecg/modules/online/cgreport/controller/OnlCgreportAPI.java new file mode 100644 index 0000000..0945063 --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/online/cgreport/controller/OnlCgreportAPI.java @@ -0,0 +1,253 @@ +package org.jeecg.modules.online.cgreport.controller; + +import java.io.OutputStream; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.poi.ss.usermodel.Workbook; +import org.jeecg.common.api.vo.Result; +import org.jeecg.common.exception.JeecgBootException; +import org.jeecg.common.util.oConvertUtils; +import org.jeecg.modules.online.cgreport.def.CgReportConstant; +import org.jeecg.modules.online.cgreport.entity.OnlCgreportHead; +import org.jeecg.modules.online.cgreport.entity.OnlCgreportItem; +import org.jeecg.modules.online.cgreport.service.IOnlCgreportHeadService; +import org.jeecg.modules.online.cgreport.service.IOnlCgreportItemService; +import org.jeecg.modules.online.cgreport.util.BrowserUtils; +import org.jeecg.modules.online.cgreport.util.CgReportQueryParamUtil; +import org.jeecg.modules.online.cgreport.util.SqlUtil; +import org.jeecg.modules.system.service.ISysDictService; +import org.jeecgframework.poi.excel.ExcelExportUtil; +import org.jeecgframework.poi.excel.entity.ExportParams; +import org.jeecgframework.poi.excel.entity.params.ExcelExportEntity; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; + +import lombok.extern.slf4j.Slf4j; + +/** + * @Title: Controller + * @Description: 在线报表配置 + * @author: jeecg-boot + * @date: 2019-03-08 + * @version: V1.0 + */ +@Slf4j +@RestController +@RequestMapping("/online/cgreport/api") +public class OnlCgreportAPI { + + @Autowired + private IOnlCgreportHeadService onlCgreportHeadService; + @Autowired + private IOnlCgreportItemService onlCgreportItemService; + @Autowired + private ISysDictService sysDictService; + + /** + * 通过 head code 获取 所有的 item,并生成 columns 所需的 json + * + * @param code + * head code + * @return + * @throws Exception + */ + @GetMapping(value = "/getColumns/{code}") + public Result<?> getColumns(@PathVariable("code") String code) { + + QueryWrapper<OnlCgreportItem> queryWrapper = new QueryWrapper<OnlCgreportItem>(); + queryWrapper.eq("cgrhead_id", code); + queryWrapper.eq("is_show", 1); + queryWrapper.orderByAsc("order_num"); + + List<OnlCgreportItem> list = onlCgreportItemService.list(queryWrapper); + + List<Map<String, String>> array = new ArrayList<Map<String, String>>(); + for (OnlCgreportItem item : list) { + Map<String, String> column = new HashMap<String, String>(3); + column.put("title", item.getFieldTxt()); + column.put("dataIndex", item.getFieldName()); + column.put("align", "center"); + column.put("sorter", "true"); + + array.add(column); + } + + Map<String, Object> result = new HashMap<String, Object>(1); + result.put("columns", array); + + return Result.ok(result); + } + + /** + * 通过 head code 获取 sql语句,并执行该语句返回查询数据 + * + * @param code + * @return + */ + @GetMapping(value = "/getData/{code}") + public Result<?> getData(@PathVariable("code") String code,HttpServletRequest request) { + OnlCgreportHead head = onlCgreportHeadService.getById(code); + if (head == null) { + return Result.error("实体不存在"); + } + String sql = head.getCgrSql(); + try { + Map<String,Object> params = SqlUtil.getParameterMap(request); + Map<String, Object> reslutMap = onlCgreportHeadService.executeSelectSql(sql,params); + return Result.ok(reslutMap); + } catch (Exception e) { + e.printStackTrace(); + return Result.error("SQL执行失败:" + e.getMessage()); + } + + } + + + /** + * 获取查询条件 + */ + @GetMapping(value = "/getQueryInfo/{code}") + public Result<?> getQueryInfo(@PathVariable("code") String cgrheadId) { + try { + List<Map<String,String>> list = onlCgreportItemService.getAutoListQueryInfo(cgrheadId); + return Result.ok(list); + } catch (Exception e) { + e.printStackTrace(); + log.info("OnlCgformApiController.getQueryInfo()发生异常:" + e.getMessage()); + return Result.error("查询失败"); + } + } + + + /** + * 将报表导出为excel + * @param request + * @param response + */ + @RequestMapping(value = "/exportXls/{reportId}") + public void exportXls(@PathVariable("reportId") String reportId,HttpServletRequest request,HttpServletResponse response) { + //step.1 设置,获取配置信息 + String codedFileName = "报表"; + String sheetName="导出信息"; + if (oConvertUtils.isNotEmpty(reportId)) { + Map<String, Object> cgReportMap = null; + try{ + cgReportMap = onlCgreportHeadService.queryCgReportConfig(reportId); + }catch (Exception e) { + throw new JeecgBootException("动态报表配置不存在!"); + } + List<Map<String,Object>> fieldList = (List<Map<String, Object>>) cgReportMap.get(CgReportConstant.ITEMS); + Map<String, Object> configM = (Map<String, Object>) cgReportMap.get(CgReportConstant.MAIN); + codedFileName = configM.get("name")+codedFileName; + String querySql = (String) configM.get(CgReportConstant.CONFIG_SQL); + List<Map<String,Object>> items = (List<Map<String, Object>>) cgReportMap.get(CgReportConstant.ITEMS); + List<String> paramList = (List<String>) cgReportMap.get(CgReportConstant.PARAMS); + //页面参数查询字段(占位符的条件语句) + Map<String, Object> pageSearchFields = new LinkedHashMap<String,Object>(); + //step.2 装载查询条件 + Map<String,Object> paramData = new HashMap<String, Object>(); + if(paramList!=null&¶mList.size()>0){ + for(String param :paramList){ + String value = request.getParameter(param); + value = value==null?"":value; + querySql = querySql.replace("'${"+param+"}'", ":"+param); + querySql = querySql.replace("${"+param+"}", ":"+param); + paramData.put(param, value); + } + } + for(Map<String,Object> item:items){ + String isQuery = item.get(CgReportConstant.ITEM_ISQUERY).toString(); + if(CgReportConstant.BOOL_TRUE.equalsIgnoreCase(isQuery)){ + CgReportQueryParamUtil.loadQueryParams(request, item, pageSearchFields,paramData); + } + } + //step.3 进行查询返回结果 + String dbKey=(String)configM.get("db_source"); + List<Map<?, ?>> result=null; + if(oConvertUtils.isNotEmpty(dbKey)){ + if(paramData!=null&¶mData.size()>0){ + //TODO 动态数据源功能未实现 + //result= DynamicDBUtil.findListByHash(dbKey,SqlUtil.getFullSql(querySql,pageSearchFields),(HashMap<String, Object>)paramData); + }else{ + //result= DynamicDBUtil.findList(dbKey, SqlUtil.getFullSql(querySql,pageSearchFields)); + } + }else{ + result= onlCgreportHeadService.queryByCgReportSql(querySql, pageSearchFields,paramData, -1, -1); + } + + // Step.4 组装AutoPoi所需参数 + List<ExcelExportEntity> entityList = new ArrayList<ExcelExportEntity>(); + for (int i = 0; i < fieldList.size(); i++) { + // 过滤不展示的字段 + if ("1".equals(oConvertUtils.getString(fieldList.get(i).get("is_show")))) { + ExcelExportEntity expEntity = new ExcelExportEntity(fieldList.get(i).get("field_txt").toString(), fieldList.get(i).get("field_name"), 15); + + //1. 字典值设置 + Object dictCode = fieldList.get(i).get("dict_code"); + if (oConvertUtils.isNotEmpty(dictCode)) { + List<String> dictReplaces = new ArrayList<String>(); + List<Map<String, Object>> dictList = sysDictService.queryDictItemsByCode(dictCode.toString()); + for (Map<String, Object> d : dictList) { + dictReplaces.add(d.get("text") + "_" + d.get("value")); + } + //男_1, 女_2 + expEntity.setReplace(dictReplaces.toArray(new String[dictReplaces.size()])); + } + //2. 取值表达式(男_1, 女_2) + //TODO oracle下大小写兼容问题 + Object replace_val = fieldList.get(i).get("replace_val"); + if(oConvertUtils.isNotEmpty(replace_val)) { + expEntity.setReplace(replace_val.toString().split(",")); + } + entityList.add(expEntity); + } + } + + //--------------------------------------------------------------------------------------------------------------------- + response.setContentType("application/vnd.ms-excel"); + OutputStream fOut = null; + try { + + // step.4 根据浏览器进行转码,使其支持中文文件名 + String browse = BrowserUtils.checkBrowse(request); + if ("MSIE".equalsIgnoreCase(browse.substring(0, 4))) { + response.setHeader("content-disposition", "attachment;filename=" + java.net.URLEncoder.encode(codedFileName, "UTF-8") + ".xls"); + } else { + String newtitle = new String(codedFileName.getBytes("UTF-8"), "ISO8859-1"); + response.setHeader("content-disposition", "attachment;filename=" + newtitle + ".xls"); + } + // step.5 产生工作簿对象 + //HSSFWorkbook workbook = cgReportExcelService.exportExcel(codedFileName, fieldList, result); + Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams(null,sheetName), entityList, result); + fOut = response.getOutputStream(); + workbook.write(fOut); + } catch (Exception e) { + + } finally { + try { + fOut.flush(); + fOut.close(); + } catch (Exception e) { + + } + } + //--------------------------------------------------------------------------------------------------------------------- + + } else { + throw new JeecgBootException("参数错误"); + } + } + +} diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/online/cgreport/controller/OnlCgreportHeadController.java b/jeecg-boot/src/main/java/org/jeecg/modules/online/cgreport/controller/OnlCgreportHeadController.java new file mode 100644 index 0000000..5346592 --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/online/cgreport/controller/OnlCgreportHeadController.java @@ -0,0 +1,269 @@ +package org.jeecg.modules.online.cgreport.controller; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.UUID; + +import javax.servlet.http.HttpServletRequest; + +import org.jeecg.common.api.vo.Result; +import org.jeecg.common.system.query.QueryGenerator; +import org.jeecg.common.util.oConvertUtils; +import org.jeecg.modules.online.cgreport.entity.OnlCgreportHead; +import org.jeecg.modules.online.cgreport.entity.OnlCgreportItem; +import org.jeecg.modules.online.cgreport.entity.OnlCgreportParam; +import org.jeecg.modules.online.cgreport.model.OnlCgreportModel; +import org.jeecg.modules.online.cgreport.service.IOnlCgreportHeadService; +import org.jeecg.modules.online.cgreport.service.IOnlCgreportItemService; +import org.jeecg.modules.online.cgreport.service.IOnlCgreportParamService; +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-03-08 + * @version: V1.0 + */ +@RestController +@RequestMapping("/online/cgreport/head") +@Slf4j +public class OnlCgreportHeadController { + + @Autowired + private IOnlCgreportHeadService onlCgreportHeadService; + @Autowired + private IOnlCgreportParamService onlCgreportParamService; + @Autowired + private IOnlCgreportItemService onlCgreportItemService; + + /** + * sql解析获取字段和参数 + * + * @return + */ + @GetMapping(value = "/parseSql") + public Result<?> parseSql(@RequestParam(name = "sql", required = true) String sql) { + Map<String, Object> resultJson = new HashMap<String, Object>(); + //返回SQL解析字段 + List<OnlCgreportItem> onlCgreportItemList = new ArrayList<OnlCgreportItem>(); + //返回SQL解析参数 + List<OnlCgreportParam> onlCgreportParamList = new ArrayList<OnlCgreportParam>(); + List<String> fields = null; + List<String> params = null; + String dbKey = null; + try { + fields = onlCgreportHeadService.getSqlFields(sql, dbKey); + params = onlCgreportHeadService.getSqlParams(sql); + + int i = 1; + for(String f:fields) { + OnlCgreportItem t = new OnlCgreportItem(); + t.setFieldName(f); + t.setFieldTxt(f); + t.setIsShow(1); + t.setOrderNum(i); + t.setId(i+"_"+System.currentTimeMillis()); + t.setFieldType("String"); + onlCgreportItemList.add(t); + i++; + } + + for(String p:params) { + OnlCgreportParam param = new OnlCgreportParam(); + param.setParamName(p); + param.setParamTxt(p); + onlCgreportParamList.add(param); + } + resultJson.put("fields", onlCgreportItemList); + resultJson.put("params", onlCgreportParamList); + } catch (Exception e) { + e.printStackTrace(); + String msg = "解析失败!<br><br>失败原因:"; + int i = e.getMessage().indexOf("Connection refused: connect"); + if (i != -1) {// 非链接异常 + msg += "数据源连接失败."; + } else { + msg += "SQL语法错误."; + } + Result.error(msg); + } + return Result.ok(resultJson); + } + + /** + * 分页列表查询 + * + * @param onlCgreportHead + * @param pageNo + * @param pageSize + * @param req + * @return + */ + @GetMapping(value = "/list") + public Result<IPage<OnlCgreportHead>> queryPageList(OnlCgreportHead onlCgreportHead, @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo, @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize, HttpServletRequest req) { + Result<IPage<OnlCgreportHead>> result = new Result<IPage<OnlCgreportHead>>(); + QueryWrapper<OnlCgreportHead> queryWrapper = QueryGenerator.initQueryWrapper(onlCgreportHead, req.getParameterMap()); + Page<OnlCgreportHead> page = new Page<OnlCgreportHead>(pageNo, pageSize); + IPage<OnlCgreportHead> pageList = onlCgreportHeadService.page(page, queryWrapper); + result.setSuccess(true); + result.setResult(pageList); + return result; + } + + /** + * 添加 + * + * @param onlCgreportHead + * @return + */ + @PostMapping(value = "/add") + public Result<?> add(@RequestBody OnlCgreportModel values) { + Result<OnlCgreportHead> result = new Result<OnlCgreportHead>(); + try { + String uuid = UUID.randomUUID().toString().replace("-", ""); + + OnlCgreportHead head = values.getHead(); + List<OnlCgreportParam> params = values.getParams(); + List<OnlCgreportItem> items = values.getItems(); + + head.setId(uuid); + for (OnlCgreportParam param : params) { + param.setId(null); + param.setCgrheadId(uuid); + } + for (OnlCgreportItem item : items) { + item.setId(null); + item.setCgrheadId(uuid); + } + + onlCgreportHeadService.save(head); + onlCgreportParamService.saveBatch(params); + onlCgreportItemService.saveBatch(items); + + result.success("添加成功!"); + } catch (Exception e) { + e.printStackTrace(); + log.info(e.getMessage()); + result.error500("操作失败"); + } + return result; + } + + /** + * 编辑保存全部操作 + */ + @PutMapping(value = "/editAll") + public Result<?> editAll(@RequestBody OnlCgreportModel values) { + + try { + return onlCgreportHeadService.editAll(values); + + } catch (Exception e) { + e.printStackTrace(); + log.info(e.getMessage()); + return Result.error("操作失败"); + } + + } + + /** + * 编辑 + * + * @param onlCgreportHead + * @return + */ + @PutMapping(value = "/edit") + public Result<OnlCgreportHead> edit(@RequestBody OnlCgreportHead onlCgreportHead) { + Result<OnlCgreportHead> result = new Result<OnlCgreportHead>(); + OnlCgreportHead onlCgreportHeadEntity = onlCgreportHeadService.getById(onlCgreportHead.getId()); + if (onlCgreportHeadEntity == null) { + result.error500("未找到对应实体"); + } else { + boolean ok = onlCgreportHeadService.updateById(onlCgreportHead); + // TODO 返回false说明什么? + if (ok) { + result.success("修改成功!"); + } + } + + return result; + } + + /** + * 通过id删除 + * + * @param id + * @return + */ + @DeleteMapping(value = "/delete") + public Result<OnlCgreportHead> delete(@RequestParam(name = "id", required = true) String id) { + Result<OnlCgreportHead> result = new Result<OnlCgreportHead>(); + OnlCgreportHead onlCgreportHead = onlCgreportHeadService.getById(id); + if (onlCgreportHead == null) { + result.error500("未找到对应实体"); + } else { + boolean ok = onlCgreportHeadService.removeById(id); + if (ok) { + result.success("删除成功!"); + } + } + + return result; + } + + /** + * 批量删除 + * + * @param ids + * @return + */ + @DeleteMapping(value = "/deleteBatch") + public Result<OnlCgreportHead> deleteBatch(@RequestParam(name = "ids", required = true) String ids) { + Result<OnlCgreportHead> result = new Result<OnlCgreportHead>(); + if (ids == null || "".equals(ids.trim())) { + result.error500("参数不识别!"); + } else { + this.onlCgreportHeadService.removeByIds(Arrays.asList(ids.split(","))); + result.success("删除成功!"); + } + return result; + } + + /** + * 通过id查询 + * + * @param id + * @return + */ + @GetMapping(value = "/queryById") + public Result<OnlCgreportHead> queryById(@RequestParam(name = "id", required = true) String id) { + Result<OnlCgreportHead> result = new Result<OnlCgreportHead>(); + OnlCgreportHead onlCgreportHead = onlCgreportHeadService.getById(id); + if (onlCgreportHead == null) { + result.error500("未找到对应实体"); + } else { + result.setResult(onlCgreportHead); + result.setSuccess(true); + } + return result; + } + +} diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/online/cgreport/controller/OnlCgreportItemController.java b/jeecg-boot/src/main/java/org/jeecg/modules/online/cgreport/controller/OnlCgreportItemController.java new file mode 100644 index 0000000..701f5e2 --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/online/cgreport/controller/OnlCgreportItemController.java @@ -0,0 +1,183 @@ +package org.jeecg.modules.online.cgreport.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.system.query.QueryGenerator; +import org.jeecg.common.util.oConvertUtils; +import org.jeecg.modules.online.cgreport.entity.OnlCgreportItem; +import org.jeecg.modules.online.cgreport.service.IOnlCgreportItemService; +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-03-08 + * @version: V1.0 + */ +@RestController +@RequestMapping("/online/cgreport/item") +@Slf4j +public class OnlCgreportItemController { + + @Autowired + private IOnlCgreportItemService onlCgreportItemService; + + /** + * 根据 headId 查询出 所有的 item + */ + @GetMapping(value = "/listByHeadId") + public Result<?> queryPageListByHeadId(String headId) { + + QueryWrapper<OnlCgreportItem> queryWrapper = new QueryWrapper<OnlCgreportItem>(); + queryWrapper.eq("cgrhead_id", headId); + queryWrapper.orderByAsc("order_num"); + List<OnlCgreportItem> list = onlCgreportItemService.list(queryWrapper); + + Result<List<OnlCgreportItem>> result = new Result<List<OnlCgreportItem>>(); + result.setSuccess(true); + result.setResult(list); + return result; + } + + /** + * 分页列表查询 + * + * @param onlCgreportItem + * @param pageNo + * @param pageSize + * @param req + * @return + */ + @GetMapping(value = "/list") + public Result<IPage<OnlCgreportItem>> queryPageList(OnlCgreportItem onlCgreportItem, @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo, @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize, HttpServletRequest req) { + Result<IPage<OnlCgreportItem>> result = new Result<IPage<OnlCgreportItem>>(); + QueryWrapper<OnlCgreportItem> queryWrapper = QueryGenerator.initQueryWrapper(onlCgreportItem, req.getParameterMap()); + Page<OnlCgreportItem> page = new Page<OnlCgreportItem>(pageNo, pageSize); + IPage<OnlCgreportItem> pageList = onlCgreportItemService.page(page, queryWrapper); + result.setSuccess(true); + result.setResult(pageList); + return result; + } + + /** + * 添加 + * + * @param onlCgreportItem + * @return + */ + @PostMapping(value = "/add") + public Result<OnlCgreportItem> add(@RequestBody OnlCgreportItem onlCgreportItem) { + Result<OnlCgreportItem> result = new Result<OnlCgreportItem>(); + try { + onlCgreportItemService.save(onlCgreportItem); + result.success("添加成功!"); + } catch (Exception e) { + e.printStackTrace(); + log.info(e.getMessage()); + result.error500("操作失败"); + } + return result; + } + + /** + * 编辑 + * + * @param onlCgreportItem + * @return + */ + @PutMapping(value = "/edit") + public Result<OnlCgreportItem> edit(@RequestBody OnlCgreportItem onlCgreportItem) { + Result<OnlCgreportItem> result = new Result<OnlCgreportItem>(); + OnlCgreportItem onlCgreportItemEntity = onlCgreportItemService.getById(onlCgreportItem.getId()); + if (onlCgreportItemEntity == null) { + result.error500("未找到对应实体"); + } else { + boolean ok = onlCgreportItemService.updateById(onlCgreportItem); + // TODO 返回false说明什么? + if (ok) { + result.success("修改成功!"); + } + } + + return result; + } + + /** + * 通过id删除 + * + * @param id + * @return + */ + @DeleteMapping(value = "/delete") + public Result<OnlCgreportItem> delete(@RequestParam(name = "id", required = true) String id) { + Result<OnlCgreportItem> result = new Result<OnlCgreportItem>(); + OnlCgreportItem onlCgreportItem = onlCgreportItemService.getById(id); + if (onlCgreportItem == null) { + result.error500("未找到对应实体"); + } else { + boolean ok = onlCgreportItemService.removeById(id); + if (ok) { + result.success("删除成功!"); + } + } + + return result; + } + + /** + * 批量删除 + * + * @param ids + * @return + */ + @DeleteMapping(value = "/deleteBatch") + public Result<OnlCgreportItem> deleteBatch(@RequestParam(name = "ids", required = true) String ids) { + Result<OnlCgreportItem> result = new Result<OnlCgreportItem>(); + if (ids == null || "".equals(ids.trim())) { + result.error500("参数不识别!"); + } else { + this.onlCgreportItemService.removeByIds(Arrays.asList(ids.split(","))); + result.success("删除成功!"); + } + return result; + } + + /** + * 通过id查询 + * + * @param id + * @return + */ + @GetMapping(value = "/queryById") + public Result<OnlCgreportItem> queryById(@RequestParam(name = "id", required = true) String id) { + Result<OnlCgreportItem> result = new Result<OnlCgreportItem>(); + OnlCgreportItem onlCgreportItem = onlCgreportItemService.getById(id); + if (onlCgreportItem == null) { + result.error500("未找到对应实体"); + } else { + result.setResult(onlCgreportItem); + result.setSuccess(true); + } + return result; + } + +} diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/online/cgreport/controller/OnlCgreportParamController.java b/jeecg-boot/src/main/java/org/jeecg/modules/online/cgreport/controller/OnlCgreportParamController.java new file mode 100644 index 0000000..5ac2708 --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/online/cgreport/controller/OnlCgreportParamController.java @@ -0,0 +1,183 @@ +package org.jeecg.modules.online.cgreport.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.system.query.QueryGenerator; +import org.jeecg.common.util.oConvertUtils; +import org.jeecg.modules.online.cgreport.entity.OnlCgreportParam; +import org.jeecg.modules.online.cgreport.service.IOnlCgreportParamService; +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-03-08 + * @version: V1.0 + */ +@RestController +@RequestMapping("/online/cgreport/param") +@Slf4j +public class OnlCgreportParamController { + + @Autowired + private IOnlCgreportParamService onlCgreportParamService; + + /** + * 根据 headId 查询出 所有的 param + */ + @GetMapping(value = "/listByHeadId") + public Result<?> queryPageListByHeadId(String headId) { + + QueryWrapper<OnlCgreportParam> queryWrapper = new QueryWrapper<OnlCgreportParam>(); + queryWrapper.eq("cgrhead_id", headId); + queryWrapper.orderByAsc("order_num"); + List<OnlCgreportParam> list = onlCgreportParamService.list(queryWrapper); + + Result<List<OnlCgreportParam>> result = new Result<List<OnlCgreportParam>>(); + result.setSuccess(true); + result.setResult(list); + return result; + } + + /** + * 分页列表查询 + * + * @param onlCgreportParam + * @param pageNo + * @param pageSize + * @param req + * @return + */ + @GetMapping(value = "/list") + public Result<IPage<OnlCgreportParam>> queryPageList(OnlCgreportParam onlCgreportParam, @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo, @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize, HttpServletRequest req) { + Result<IPage<OnlCgreportParam>> result = new Result<IPage<OnlCgreportParam>>(); + QueryWrapper<OnlCgreportParam> queryWrapper = QueryGenerator.initQueryWrapper(onlCgreportParam, req.getParameterMap()); + Page<OnlCgreportParam> page = new Page<OnlCgreportParam>(pageNo, pageSize); + IPage<OnlCgreportParam> pageList = onlCgreportParamService.page(page, queryWrapper); + result.setSuccess(true); + result.setResult(pageList); + return result; + } + + /** + * 添加 + * + * @param onlCgreportParam + * @return + */ + @PostMapping(value = "/add") + public Result<OnlCgreportParam> add(@RequestBody OnlCgreportParam onlCgreportParam) { + Result<OnlCgreportParam> result = new Result<OnlCgreportParam>(); + try { + onlCgreportParamService.save(onlCgreportParam); + result.success("添加成功!"); + } catch (Exception e) { + e.printStackTrace(); + log.info(e.getMessage()); + result.error500("操作失败"); + } + return result; + } + + /** + * 编辑 + * + * @param onlCgreportParam + * @return + */ + @PutMapping(value = "/edit") + public Result<OnlCgreportParam> edit(@RequestBody OnlCgreportParam onlCgreportParam) { + Result<OnlCgreportParam> result = new Result<OnlCgreportParam>(); + OnlCgreportParam onlCgreportParamEntity = onlCgreportParamService.getById(onlCgreportParam.getId()); + if (onlCgreportParamEntity == null) { + result.error500("未找到对应实体"); + } else { + boolean ok = onlCgreportParamService.updateById(onlCgreportParam); + // TODO 返回false说明什么? + if (ok) { + result.success("修改成功!"); + } + } + + return result; + } + + /** + * 通过id删除 + * + * @param id + * @return + */ + @DeleteMapping(value = "/delete") + public Result<OnlCgreportParam> delete(@RequestParam(name = "id", required = true) String id) { + Result<OnlCgreportParam> result = new Result<OnlCgreportParam>(); + OnlCgreportParam onlCgreportParam = onlCgreportParamService.getById(id); + if (onlCgreportParam == null) { + result.error500("未找到对应实体"); + } else { + boolean ok = onlCgreportParamService.removeById(id); + if (ok) { + result.success("删除成功!"); + } + } + + return result; + } + + /** + * 批量删除 + * + * @param ids + * @return + */ + @DeleteMapping(value = "/deleteBatch") + public Result<OnlCgreportParam> deleteBatch(@RequestParam(name = "ids", required = true) String ids) { + Result<OnlCgreportParam> result = new Result<OnlCgreportParam>(); + if (ids == null || "".equals(ids.trim())) { + result.error500("参数不识别!"); + } else { + this.onlCgreportParamService.removeByIds(Arrays.asList(ids.split(","))); + result.success("删除成功!"); + } + return result; + } + + /** + * 通过id查询 + * + * @param id + * @return + */ + @GetMapping(value = "/queryById") + public Result<OnlCgreportParam> queryById(@RequestParam(name = "id", required = true) String id) { + Result<OnlCgreportParam> result = new Result<OnlCgreportParam>(); + OnlCgreportParam onlCgreportParam = onlCgreportParamService.getById(id); + if (onlCgreportParam == null) { + result.error500("未找到对应实体"); + } else { + result.setResult(onlCgreportParam); + result.setSuccess(true); + } + return result; + } + +} diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/online/cgreport/def/CgReportConstant.java b/jeecg-boot/src/main/java/org/jeecg/modules/online/cgreport/def/CgReportConstant.java new file mode 100644 index 0000000..6ad22e7 --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/online/cgreport/def/CgReportConstant.java @@ -0,0 +1,70 @@ +package org.jeecg.modules.online.cgreport.def; +/** + * + * @Title:CgReportConstant + * @description:动态报表常量类 + * @author 赵俊夫 + * @date Jul 30, 2013 9:16:18 AM + * @version V1.0 + */ +public class CgReportConstant { + /** 抬头配置 */ + public static final String MAIN= "main"; + /** 明细配置*/ + public static final String ITEMS= "items"; + /** 动态报表参数*/ + public static final String PARAMS= "params"; + /** 配置的id*/ + public static final String CONFIG_ID="config_id"; + /** 配置的名称*/ + public static final String CONFIG_NAME="config_name"; + /** 字段列表*/ + public static final String CONFIG_FIELDLIST = "config_fieldList"; + /** 查询字段*/ + public static final String CONFIG_QUERYLIST ="config_queryList"; + /** 动态报表参数*/ + public static final String CONFIG_PARAMS ="config_params"; + /**字典数据*/ + public static final String FIELD_DICTLIST = "field_dictlist"; + /**系统字典表*/ + public static final String SYS_DIC="t_s_type"; + /**系统字典分组表*/ + public static final String SYS_DICGROUP="t_s_typegroup"; + /** 抬头配置-查询SQL*/ + public static final String CONFIG_SQL= "cgreport_sql"; + /** 字典编码*/ + public static final String ITEM_DICCODE= "dict_code"; + /** 取值表达式*/ + public static final String ITEM_REPLACE = "replace_value"; + /** 明细配置-字段名*/ + public static final String ITEM_FIELDNAME = "field_name"; + /** 明细配置-是否查询*/ + public static final String ITEM_ISQUERY = "search_flag"; + /** 明细配置-字段类型*/ + public static final String ITEM_FIELDTYPE = "field_type"; + /** 明细配置-查询模式*/ + public static final String ITEM_QUERYMODE = "search_mode"; + /**逻辑true*/ + public static final String BOOL_TRUE= "Y"; + /**逻辑false*/ + public static final String BOOL_FALSE= "N"; + /**查询操作=*/ + public static final String OP_EQ = " = "; + /**查询操作>=*/ + public static final String OP_RQ = " >= "; + /**查询操作<=*/ + public static final String OP_LQ = " <= "; + /**查询操作like*/ + public static final String OP_LIKE = " LIKE "; + /**显示模式Date*/ + public static final String TYPE_DATE = "Date"; + /**显示模式String*/ + public static final String TYPE_STRING = "String"; + /**显示模式Integer*/ + public static final String TYPE_INTEGER = "Integer"; + /**显示模式Double*/ + public static final String TYPE_DOUBLE = "Double"; + + /** iframe */ + public static final String CONFIG_IFRAME = "config_iframe"; +} diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/online/cgreport/entity/OnlCgreportHead.java b/jeecg-boot/src/main/java/org/jeecg/modules/online/cgreport/entity/OnlCgreportHead.java new file mode 100644 index 0000000..fb9e36c --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/online/cgreport/entity/OnlCgreportHead.java @@ -0,0 +1,57 @@ +package org.jeecg.modules.online.cgreport.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-03-08 + * @version: V1.0 + */ +@Data +@TableName("onl_cgreport_head") +public class OnlCgreportHead implements Serializable { + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.UUID) + private java.lang.String id; + /** 报表编码 */ + private java.lang.String code; + /** 报表名字 */ + private java.lang.String name; + /** 报表SQL */ + private java.lang.String cgrSql; + /** 返回值字段 */ + private java.lang.String returnValField; + /** 返回文本字段 */ + private java.lang.String returnTxtField; + /** 返回类型,单选或多选 */ + private java.lang.String returnType; + /** 动态数据源 */ + private java.lang.String dbSource; + /** 描述 */ + private java.lang.String content; + /** 修改时间 */ + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private java.util.Date updateTime; + /** 修改人id */ + 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 createTime; + /** 创建人id */ + private java.lang.String createBy; + +} diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/online/cgreport/entity/OnlCgreportItem.java b/jeecg-boot/src/main/java/org/jeecg/modules/online/cgreport/entity/OnlCgreportItem.java new file mode 100644 index 0000000..1a05aef --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/online/cgreport/entity/OnlCgreportItem.java @@ -0,0 +1,66 @@ +package org.jeecg.modules.online.cgreport.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-03-08 + * @version: V1.0 + */ +@Data +@TableName("onl_cgreport_item") +public class OnlCgreportItem implements Serializable { + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.UUID) + private java.lang.String id; + /** 报表ID */ + private java.lang.String cgrheadId; + /** 字段名字 */ + private java.lang.String fieldName; + /** 字段文本 */ + private java.lang.String fieldTxt; + /** fieldWidth */ + private java.lang.Integer fieldWidth; + /** 字段类型 */ + private java.lang.String fieldType; + /** 查询模式 */ + private java.lang.String searchMode; + /** 是否排序 0否,1是 */ + private java.lang.Integer isOrder; + /** 是否查询 0否,1是 */ + private java.lang.Integer isSearch; + /** 字典CODE */ + private java.lang.String dictCode; + /** 字段跳转URL */ + private java.lang.String fieldHref; + /** 是否显示 0否,1显示 */ + private java.lang.Integer isShow; + /** 排序 */ + private java.lang.Integer orderNum; + /** 取值表达式 */ + private java.lang.String replaceVal; + /** 创建人 */ + 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/online/cgreport/entity/OnlCgreportParam.java b/jeecg-boot/src/main/java/org/jeecg/modules/online/cgreport/entity/OnlCgreportParam.java new file mode 100644 index 0000000..49ef38a --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/online/cgreport/entity/OnlCgreportParam.java @@ -0,0 +1,50 @@ +package org.jeecg.modules.online.cgreport.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-03-08 + * @version: V1.0 + */ +@Data +@TableName("onl_cgreport_param") +public class OnlCgreportParam implements Serializable { + private static final long serialVersionUID = 1L; + + /** id */ + @TableId(type = IdType.UUID) + private java.lang.String id; + /** 动态报表ID */ + private java.lang.String cgrheadId; + /** 参数字段 */ + private java.lang.String paramName; + /** 参数文本 */ + private java.lang.String paramTxt; + /** 参数默认值 */ + private java.lang.String paramValue; + /** 排序 */ + private java.lang.Integer orderNum; + /** 创建人登录名称 */ + 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/online/cgreport/mapper/OnlCgreportHeadMapper.java b/jeecg-boot/src/main/java/org/jeecg/modules/online/cgreport/mapper/OnlCgreportHeadMapper.java new file mode 100644 index 0000000..325dc29 --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/online/cgreport/mapper/OnlCgreportHeadMapper.java @@ -0,0 +1,52 @@ +package org.jeecg.modules.online.cgreport.mapper; + +import java.util.List; +import java.util.Map; + +import org.jeecg.modules.online.cgreport.entity.OnlCgreportHead; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + * @Description: 在线报表配置 + * @author: jeecg-boot + * @date: 2019-03-08 + * @version: V1.0 + */ +public interface OnlCgreportHeadMapper extends BaseMapper<OnlCgreportHead> { + + /** + * 执行查询SQL语句 + * + * @param sql + * @return + */ + List<Map<?, ?>> executeSelete(String sql); + + /** + * 动态sql查询数据量 + * @param sql + * @return + */ + Long queryCountBySql(String sql); + + /** + * 通过reportId获取报表主配置信息 + * @param reportId + * @return + */ + Map<String, Object> queryCgReportMainConfig(String reportId); + /** + * 通过reportId获取报表字段信息 + * @param reportCode + * @return + */ + List<Map<String, Object>> queryCgReportItems(String reportId); + /** + * 通过reportId获取报参数信息 + * @param reportId + * @return + */ + List<String> queryCgReportParams(String reportId); + +} diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/online/cgreport/mapper/OnlCgreportItemMapper.java b/jeecg-boot/src/main/java/org/jeecg/modules/online/cgreport/mapper/OnlCgreportItemMapper.java new file mode 100644 index 0000000..e611274 --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/online/cgreport/mapper/OnlCgreportItemMapper.java @@ -0,0 +1,15 @@ +package org.jeecg.modules.online.cgreport.mapper; + +import org.jeecg.modules.online.cgreport.entity.OnlCgreportItem; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + * @Description: 在线报表配置 + * @author: jeecg-boot + * @date: 2019-03-08 + * @version: V1.0 + */ +public interface OnlCgreportItemMapper extends BaseMapper<OnlCgreportItem> { + +} diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/online/cgreport/mapper/OnlCgreportParamMapper.java b/jeecg-boot/src/main/java/org/jeecg/modules/online/cgreport/mapper/OnlCgreportParamMapper.java new file mode 100644 index 0000000..d8caf9a --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/online/cgreport/mapper/OnlCgreportParamMapper.java @@ -0,0 +1,15 @@ +package org.jeecg.modules.online.cgreport.mapper; + +import org.jeecg.modules.online.cgreport.entity.OnlCgreportParam; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + * @Description: 在线报表配置 + * @author: jeecg-boot + * @date: 2019-03-08 + * @version: V1.0 + */ +public interface OnlCgreportParamMapper extends BaseMapper<OnlCgreportParam> { + +} diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/online/cgreport/mapper/xml/OnlCgreportHeadMapper.xml b/jeecg-boot/src/main/java/org/jeecg/modules/online/cgreport/mapper/xml/OnlCgreportHeadMapper.xml new file mode 100644 index 0000000..1737d6c --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/online/cgreport/mapper/xml/OnlCgreportHeadMapper.xml @@ -0,0 +1,58 @@ +<?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.online.cgreport.mapper.OnlCgreportHeadMapper"> + + <!-- 执行select sql语句 --> + <select id="executeSelete" resultType="map" parameterType="java.lang.String"> + ${_parameter} + </select> + + <!-- 执行select count语句 --> + <select id="queryCountBySql" parameterType="java.lang.String" resultType="java.lang.Long"> + ${_parameter} + </select> + + <!-- 执行select sql语句 --> + <select id="findForListMap" resultType="map" parameterType="map"> + ${_parameter} + </select> + + <!-- 查询报表配置主信息 --> + <select id="queryCgReportMainConfig" resultType="map" parameterType="java.lang.String"> + select + ch.id as id, + ch.code as code, + ch.name as name, + ch.cgr_sql as cgreport_sql, + ch.content as content, + ch.db_source, + ch.return_type + from onl_cgreport_head ch + where ch.id =#{reportId,jdbcType=VARCHAR} + </select> + + <!-- 查询报表配置字段信息 --> + <select id="queryCgReportItems" resultType="map" parameterType="java.lang.String"> + select + ci.id as id, + ci.field_name as field_name, + ci.field_txt as field_txt, + ci.field_href as field_href, + ci.is_show as is_show, + ci.field_type as field_type, + ci.replace_val as replace_value, + ci.dict_code as dict_code, + ci.is_search as search_flag, + ci.search_mode as search_mode, + ci.cgrhead_id as cgreport_head_id + from onl_cgreport_item ci + where ci.cgrhead_id = #{cgrheadId,jdbcType=VARCHAR} + order by ci.order_num asc + </select> + + <!-- 查询报表配置参数信息 --> + <select id="queryCgReportParams" resultType="map" parameterType="java.lang.String"> + select * from onl_cgreport_param where cgrhead_id = #{cgrheadId,jdbcType=VARCHAR} + </select> + +</mapper> \ No newline at end of file diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/online/cgreport/mapper/xml/OnlCgreportItemMapper.xml b/jeecg-boot/src/main/java/org/jeecg/modules/online/cgreport/mapper/xml/OnlCgreportItemMapper.xml new file mode 100644 index 0000000..1148da9 --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/online/cgreport/mapper/xml/OnlCgreportItemMapper.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.online.cgreport.mapper.OnlCgreportItemMapper"> + +</mapper> \ No newline at end of file diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/online/cgreport/mapper/xml/OnlCgreportParamMapper.xml b/jeecg-boot/src/main/java/org/jeecg/modules/online/cgreport/mapper/xml/OnlCgreportParamMapper.xml new file mode 100644 index 0000000..e95d928 --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/online/cgreport/mapper/xml/OnlCgreportParamMapper.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.online.cgreport.mapper.OnlCgreportParamMapper"> + +</mapper> \ No newline at end of file diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/online/cgreport/model/OnlCgreportModel.java b/jeecg-boot/src/main/java/org/jeecg/modules/online/cgreport/model/OnlCgreportModel.java new file mode 100644 index 0000000..151a535 --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/online/cgreport/model/OnlCgreportModel.java @@ -0,0 +1,79 @@ +package org.jeecg.modules.online.cgreport.model; + +import java.util.Arrays; +import java.util.List; + +import org.jeecg.modules.online.cgreport.entity.OnlCgreportHead; +import org.jeecg.modules.online.cgreport.entity.OnlCgreportItem; +import org.jeecg.modules.online.cgreport.entity.OnlCgreportParam; + +/** + * @Description: 用于接收修改或新增报表信息的model + * @author: sunjianlei + * @date: 2019-03-11 + * @version: V1.0 + */ +public class OnlCgreportModel { + + private OnlCgreportHead head; + + private List<OnlCgreportParam> params; + private String deleteParamIds; + + private List<OnlCgreportItem> items; + private String deleteItemIds; + + public OnlCgreportHead getHead() { + return head; + } + + public void setHead(OnlCgreportHead head) { + this.head = head; + } + + public List<OnlCgreportParam> getParams() { + return params; + } + + public void setParams(List<OnlCgreportParam> params) { + this.params = params; + } + + public List<OnlCgreportItem> getItems() { + return items; + } + + public void setItems(List<OnlCgreportItem> items) { + this.items = items; + } + + public String getDeleteParamIds() { + return deleteParamIds; + } + + public List<String> getDeleteParamIdList() { + return Arrays.asList(deleteParamIds.split(",")); + } + + public void setDeleteParamIds(String deleteParamIds) { + this.deleteParamIds = deleteParamIds; + } + + public String getDeleteItemIds() { + return deleteItemIds; + } + + public List<String> getDeleteItemIdList() { + return Arrays.asList(deleteItemIds.split(",")); + } + + public void setDeleteItemIds(String deleteItemIds) { + this.deleteItemIds = deleteItemIds; + } + + @Override + public String toString() { + return "OnlCgreportModel [head=" + head + ", params=" + params + ", deleteParamIds=" + deleteParamIds + ", items=" + items + ", deleteItemIds=" + deleteItemIds + "]"; + } + +} diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/online/cgreport/service/CgReportExcelServiceI.java b/jeecg-boot/src/main/java/org/jeecg/modules/online/cgreport/service/CgReportExcelServiceI.java new file mode 100644 index 0000000..f48c016 --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/online/cgreport/service/CgReportExcelServiceI.java @@ -0,0 +1,24 @@ +package org.jeecg.modules.online.cgreport.service; + + +import java.util.Collection; +import org.apache.poi.hssf.usermodel.HSSFWorkbook; + +/** + * + * @Title:CgReportExcelServiceI + * @description:动态报表excel导出 + * @author scott + * @date 2019-03-21 + * @version V1.0 + */ +public interface CgReportExcelServiceI{ + /** + * + * @param title 标题 + * @param titleSet 报表头 + * @param dataSet 报表内容 + * @return + */ + public HSSFWorkbook exportExcel(String title, Collection<?> titleSet,Collection<?> dataSet); +} diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/online/cgreport/service/IOnlCgreportHeadService.java b/jeecg-boot/src/main/java/org/jeecg/modules/online/cgreport/service/IOnlCgreportHeadService.java new file mode 100644 index 0000000..73fe21f --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/online/cgreport/service/IOnlCgreportHeadService.java @@ -0,0 +1,51 @@ +package org.jeecg.modules.online.cgreport.service; + +import java.util.List; +import java.util.Map; + +import org.jeecg.common.api.vo.Result; +import org.jeecg.modules.online.cgreport.entity.OnlCgreportHead; +import org.jeecg.modules.online.cgreport.model.OnlCgreportModel; + +import com.baomidou.mybatisplus.extension.service.IService; + +/** + * @Description: 在线报表配置 + * @author: jeecg-boot + * @date: 2019-03-08 + * @version: V1.0 + */ +public interface IOnlCgreportHeadService extends IService<OnlCgreportHead> { + + /** + * 修改全部项,包括新增、修改、删除 + * + * @param values + * @return + */ + Result<?> editAll(OnlCgreportModel values); + + /** + * 执行SQL语句 + * + * @param sql + * @return + */ + Map<String, Object> executeSelectSql(String sql,Map<String,Object> params); + + /** + * 动态数据源: 获取SQL解析的字段 + */ + public List<String> getSqlFields(String sql,String dbKey); + + + /** + * 解析SQL参数 + */ + public List<String> getSqlParams(String sql); + + Map<String, Object> queryCgReportConfig(String reportCode); + + public List<Map<?, ?>> queryByCgReportSql(String sql, Map params,Map paramData,int page, int rows); + +} diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/online/cgreport/service/IOnlCgreportItemService.java b/jeecg-boot/src/main/java/org/jeecg/modules/online/cgreport/service/IOnlCgreportItemService.java new file mode 100644 index 0000000..669744b --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/online/cgreport/service/IOnlCgreportItemService.java @@ -0,0 +1,20 @@ +package org.jeecg.modules.online.cgreport.service; + +import java.util.List; +import java.util.Map; + +import org.jeecg.modules.online.cgreport.entity.OnlCgreportItem; + +import com.baomidou.mybatisplus.extension.service.IService; + +/** + * @Description: 在线报表配置 + * @author: jeecg-boot + * @date: 2019-03-08 + * @version: V1.0 + */ +public interface IOnlCgreportItemService extends IService<OnlCgreportItem> { + + List<Map<String, String>> getAutoListQueryInfo(String cgrheadId); + +} diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/online/cgreport/service/IOnlCgreportParamService.java b/jeecg-boot/src/main/java/org/jeecg/modules/online/cgreport/service/IOnlCgreportParamService.java new file mode 100644 index 0000000..f84d130 --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/online/cgreport/service/IOnlCgreportParamService.java @@ -0,0 +1,15 @@ +package org.jeecg.modules.online.cgreport.service; + +import org.jeecg.modules.online.cgreport.entity.OnlCgreportParam; + +import com.baomidou.mybatisplus.extension.service.IService; + +/** + * @Description: 在线报表配置 + * @author: jeecg-boot + * @date: 2019-03-08 + * @version: V1.0 + */ +public interface IOnlCgreportParamService extends IService<OnlCgreportParam> { + +} diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/online/cgreport/service/impl/CgReportExcelServiceImpl.java b/jeecg-boot/src/main/java/org/jeecg/modules/online/cgreport/service/impl/CgReportExcelServiceImpl.java new file mode 100644 index 0000000..3e3a1a5 --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/online/cgreport/service/impl/CgReportExcelServiceImpl.java @@ -0,0 +1,144 @@ +package org.jeecg.modules.online.cgreport.service.impl; + +import java.util.Collection; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import org.apache.poi.hssf.usermodel.HSSFCellStyle; +import org.apache.poi.hssf.usermodel.HSSFRichTextString; +import org.apache.poi.hssf.usermodel.HSSFWorkbook; +import org.apache.poi.hssf.util.HSSFColor; +import org.apache.poi.ss.usermodel.Cell; +import org.apache.poi.ss.usermodel.CellStyle; +import org.apache.poi.ss.usermodel.RichTextString; +import org.apache.poi.ss.usermodel.Row; +import org.apache.poi.ss.usermodel.Sheet; +import org.jeecg.modules.online.cgreport.service.CgReportExcelServiceI; +import org.springframework.stereotype.Service; + +/** + * @Description: Excel导出工具类 + * @author: scott + * @date: 2019-03-21 + * @version: V1.0 + */ +@Service(value = "cgReportExcelService") +public class CgReportExcelServiceImpl implements CgReportExcelServiceI { + + @Override + public HSSFWorkbook exportExcel(String title, Collection<?> titleSet, Collection<?> dataSet) { + // 声明一个工作薄 + HSSFWorkbook workbook = null; + try { + // 首先检查数据看是否是正确的 + if (titleSet == null || titleSet.size() == 0) { + throw new Exception("读取表头失败!"); + } + if (title == null) { + title = ""; + } + // 声明一个工作薄 + workbook = new HSSFWorkbook(); + // 生成一个表格 + Sheet sheet = workbook.createSheet(title); + int rindex = 0; + int cindex = 0; + // 产生表格标题行 + Row row = sheet.createRow(rindex); + row.setHeight((short) 450); + CellStyle titleStyle = getTitleStyle(workbook); +// Iterator itTitle = titleSet.iterator(); + List<Map> titleList = (List<Map>) titleSet; + Iterator itData = dataSet.iterator(); + // 遍历标题行 + for (Map titleM : titleList) { + String titleContent = (String) titleM.get("field_txt"); + Cell cell = row.createCell(cindex); + RichTextString text = new HSSFRichTextString(titleContent); + cell.setCellValue(text); + cell.setCellStyle(titleStyle); + cindex++; + } + HSSFCellStyle bodyStyle = getOneStyle(workbook); + // 遍历内容 + while (itData.hasNext()) { + cindex = 0; + rindex++; + row = sheet.createRow(rindex); + Map dataM = (Map) itData.next();// 获取每一行的内容 + for (Map titleM : titleList) { + String field = (String) titleM.get("field_name"); + String content = dataM.get(field) == null ? "" : dataM.get(field).toString(); + Cell cell = row.createCell(cindex); + RichTextString text = new HSSFRichTextString(content); + cell.setCellStyle(bodyStyle); + cell.setCellValue(text); + cindex++; + } + } + for (int i = 0; i < titleList.size(); i++) { + sheet.autoSizeColumn(i); + } + + } catch (Exception e) { + e.printStackTrace(); + } + return workbook; + } + + /** + * exce表头单元格样式处理 + * + * @param workbook + * @return + */ + private HSSFCellStyle getTitleStyle(HSSFWorkbook workbook) { + // 产生Excel表头 + HSSFCellStyle titleStyle = workbook.createCellStyle(); + titleStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN); // 左边框 + titleStyle.setBorderRight(HSSFCellStyle.BORDER_THIN); // 右边框 + titleStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN); // 底边框 + titleStyle.setBorderTop(HSSFCellStyle.BORDER_THIN); // 顶边框 + titleStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER); + titleStyle.setFillForegroundColor(HSSFColor.GREY_25_PERCENT.index); // 填充的背景颜色 + titleStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND); // 填充图案 + + return titleStyle; + } + + // 生成多少行的带有比边框的空行 + private void setBlankRows(int rows, int columns, HSSFWorkbook workbook) { + // 得到第一页 + Sheet sheet = workbook.getSheetAt(0); + // 样式 + CellStyle cellStyle = getOneStyle(workbook); + for (int i = 1; i <= rows; i++) { + Row row = sheet.createRow(i); + for (int j = 0; j < columns; j++) { + row.createCell(j).setCellStyle(cellStyle); + } + } + } + + private HSSFCellStyle getTwoStyle(HSSFWorkbook workbook) { + // 产生Excel表头 + HSSFCellStyle style = workbook.createCellStyle(); + style.setBorderLeft((short) 1); // 左边框 + style.setBorderRight((short) 1); // 右边框 + style.setBorderBottom((short) 1); + style.setBorderTop((short) 1); + style.setFillForegroundColor(HSSFColor.LIGHT_TURQUOISE.index); // 填充的背景颜色 + style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND); // 填充图案 + return style; + } + + private HSSFCellStyle getOneStyle(HSSFWorkbook workbook) { + // 产生Excel表头 + HSSFCellStyle style = workbook.createCellStyle(); + style.setBorderLeft((short) 1); // 左边框 + style.setBorderRight((short) 1); // 右边框 + style.setBorderBottom((short) 1); + style.setBorderTop((short) 1); + return style; + } +} \ No newline at end of file diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/online/cgreport/service/impl/OnlCgreportHeadServiceImpl.java b/jeecg-boot/src/main/java/org/jeecg/modules/online/cgreport/service/impl/OnlCgreportHeadServiceImpl.java new file mode 100644 index 0000000..99b59d6 --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/online/cgreport/service/impl/OnlCgreportHeadServiceImpl.java @@ -0,0 +1,242 @@ +package org.jeecg.modules.online.cgreport.service.impl; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import org.apache.commons.lang.StringUtils; +import org.jeecg.common.api.vo.Result; +import org.jeecg.common.exception.JeecgBootException; +import org.jeecg.common.util.oConvertUtils; +import org.jeecg.modules.online.cgreport.def.CgReportConstant; +import org.jeecg.modules.online.cgreport.entity.OnlCgreportHead; +import org.jeecg.modules.online.cgreport.entity.OnlCgreportItem; +import org.jeecg.modules.online.cgreport.entity.OnlCgreportParam; +import org.jeecg.modules.online.cgreport.mapper.OnlCgreportHeadMapper; +import org.jeecg.modules.online.cgreport.model.OnlCgreportModel; +import org.jeecg.modules.online.cgreport.service.IOnlCgreportHeadService; +import org.jeecg.modules.online.cgreport.service.IOnlCgreportItemService; +import org.jeecg.modules.online.cgreport.service.IOnlCgreportParamService; +import org.jeecg.modules.online.cgreport.util.SqlUtil; +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-03-08 + * @version: V1.0 + */ +@Service +public class OnlCgreportHeadServiceImpl extends ServiceImpl<OnlCgreportHeadMapper, OnlCgreportHead> implements IOnlCgreportHeadService { + + @Autowired + private IOnlCgreportParamService onlCgreportParamService; + @Autowired + private IOnlCgreportItemService onlCgreportItemService; + + @Autowired + OnlCgreportHeadMapper mapper; + + /** + * 执行 select sql语句 + * + * @param sql + */ + @Override + public Map<String, Object> executeSelectSql(String sql,Map<String,Object> params) { + Map<String, Object> result = new HashMap<>(); + + //1、分页查询逻辑 + Integer pageSize = oConvertUtils.getInt(params.get("pageSize"),10); + Integer pageNo = oConvertUtils.getInt(params.get("pageNo"),1); + String pagesql = SqlUtil.jeecgCreatePageSql(sql,null,pageNo,pageSize); + + //2、排序逻辑 + //TODO + + //TODO 页面查询条件未实现 + String countSql = SqlUtil.getCountSql(sql, null); + Long cl = mapper.queryCountBySql(countSql); + + result.put("total", cl); + result.put("records", mapper.executeSelete(pagesql)); + return result; + } + + /** 修改全部项,包括新增、修改、删除 */ + @Override + @Transactional(rollbackFor = Exception.class) + public Result<?> editAll(OnlCgreportModel values) { + OnlCgreportHead head = values.getHead(); + + OnlCgreportHead onlCgreportHeadEntity = super.getById(head.getId()); + if (onlCgreportHeadEntity == null) { + return Result.error("未找到对应实体"); + } + + super.updateById(head); + + List<OnlCgreportParam> params = values.getParams(); + List<OnlCgreportItem> items = values.getItems(); + + // 将param分类成 添加和修改 两个列表 + List<OnlCgreportParam> addParam = new ArrayList<OnlCgreportParam>(); + List<OnlCgreportParam> editParam = new ArrayList<OnlCgreportParam>(); + for (OnlCgreportParam param : params) { + String id = String.valueOf(param.getId()); + + if (id.length() == 32) { + // 修改项 + editParam.add(param); + + } else { + // 新增项 + param.setId(null); + param.setCgrheadId(head.getId()); + addParam.add(param); + } + } + onlCgreportParamService.saveBatch(addParam); + + // 使用 updateBatchById 会报错,原因未知,具体错误: + // updateBatch Parameter 'param1' not found. Available parameters are + // [et] + + for (OnlCgreportParam edit : editParam) { + onlCgreportParamService.updateById(edit); + } + + // 将item分类 + List<OnlCgreportItem> addItem = new ArrayList<OnlCgreportItem>(); + List<OnlCgreportItem> editItem = new ArrayList<OnlCgreportItem>(); + for (OnlCgreportItem item : items) { + String id = String.valueOf(item.getId()); + + if (id.length() == 32) { + // 修改项 + editItem.add(item); + + } else { + // 新增项 + item.setId(null); + item.setCgrheadId(head.getId()); + addItem.add(item); + } + } + onlCgreportItemService.saveBatch(addItem); + + for (OnlCgreportItem edit : editItem) { + onlCgreportItemService.updateById(edit); + } + + // 删除项 + onlCgreportParamService.removeByIds(values.getDeleteParamIdList()); + onlCgreportItemService.removeByIds(values.getDeleteItemIdList()); + + return Result.ok("全部修改成功"); + + } + + + /** + * 动态数据源: 获取SQL解析的字段 + */ + @Override + public List<String> getSqlFields(String sql,String dbKey){ + List<String> fields = null; + sql = SqlUtil.getSql(sql); + if(StringUtils.isNotBlank(dbKey)){ + fields = this.parseSql(sql,dbKey); + }else{ + fields = this.parseSql(sql,null); + } + return fields; + } + + + /** + * 解析SQL参数 + */ + @Override + public List<String> getSqlParams(String sql) { + if(oConvertUtils.isEmpty(sql)){ + return null; + } + List<String> params = new ArrayList<String>(); + String regex = "\\$\\{\\w+\\}"; + + Pattern p = Pattern.compile(regex); + Matcher m = p.matcher(sql); + while(m.find()){ + String whereParam = m.group(); + params.add(whereParam.substring(whereParam.indexOf("{")+1,whereParam.indexOf("}"))); + } + return params; + } + + /** + * 未实现动态数据源的逻辑 + * @param sql + * @param dbKey + * @return + */ + private List<String> parseSql(String sql,String dbKey) { + if(oConvertUtils.isEmpty(sql)){ + return null; + } + //封装分页SQL + int page = 1; + int rows = 1; + String pagesql = SqlUtil.jeecgCreatePageSql(sql,null,page,rows); + List<Map<?, ?>> result = mapper.executeSelete(pagesql); + if(result.size()<1){ + throw new JeecgBootException("该报表sql没有数据"); + } + Set fieldsSet= result.get(0).keySet(); + List<String> fileds = new ArrayList<String>(fieldsSet); + return fileds; + } + + + @Override + public Map<String, Object> queryCgReportConfig(String reportId) { + Map<String,Object> cgReportM = new HashMap<String, Object>(0); + Map<String,Object> mainM = mapper.queryCgReportMainConfig(reportId); + List<Map<String,Object>> itemsM = mapper.queryCgReportItems(reportId); + List<String> params = mapper.queryCgReportParams(reportId); + cgReportM.put(CgReportConstant.MAIN, mainM); + cgReportM.put(CgReportConstant.ITEMS, itemsM); + cgReportM.put(CgReportConstant.PARAMS, params); + return cgReportM; + } + + /** + * 分页查询报表数据 + */ + @Override + public List<Map<?, ?>> queryByCgReportSql(String sql, Map params,Map paramData, + int page, int rows) { + String querySql = SqlUtil.getFullSql(sql,params); + List<Map<?, ?>> result = null; + if(paramData!=null&¶mData.size()==0){ + paramData = null; + } + if(page==-1 && rows==-1){ + //TODO 根据sql,paramData,转换成真正的SQL + result = mapper.executeSelete(querySql); + }else{ + //TODO 根据sql,paramData,转换成真正的SQL + String pagesql = SqlUtil.jeecgCreatePageSql(sql,paramData,page,rows); + result = mapper.executeSelete(pagesql); + } + return result; + } +} diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/online/cgreport/service/impl/OnlCgreportItemServiceImpl.java b/jeecg-boot/src/main/java/org/jeecg/modules/online/cgreport/service/impl/OnlCgreportItemServiceImpl.java new file mode 100644 index 0000000..5fa1e55 --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/online/cgreport/service/impl/OnlCgreportItemServiceImpl.java @@ -0,0 +1,50 @@ +package org.jeecg.modules.online.cgreport.service.impl; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.jeecg.modules.online.cgreport.entity.OnlCgreportItem; +import org.jeecg.modules.online.cgreport.mapper.OnlCgreportItemMapper; +import org.jeecg.modules.online.cgreport.service.IOnlCgreportItemService; +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; + +/** + * @Description: 在线报表配置 + * @author: jeecg-boot + * @date: 2019-03-08 + * @version: V1.0 + */ +@Service +public class OnlCgreportItemServiceImpl extends ServiceImpl<OnlCgreportItemMapper, OnlCgreportItem> implements IOnlCgreportItemService { + + /** + * 获取online报表查询条件 + */ + @Override + public List<Map<String, String>> getAutoListQueryInfo(String cgrheadId) { + LambdaQueryWrapper<OnlCgreportItem> query = new LambdaQueryWrapper<OnlCgreportItem>(); + query.eq(OnlCgreportItem::getCgrheadId, cgrheadId); + query.eq(OnlCgreportItem::getIsSearch,1); + List<OnlCgreportItem> fieldList = this.list(query); + List<Map<String, String>> list = new ArrayList<>(); + int i=0; + for (OnlCgreportItem item : fieldList) { + Map<String,String> map = new HashMap<>(); + map.put("label",item.getFieldTxt()); + map.put("view",item.getFieldType()); + map.put("mode",item.getSearchMode()); + map.put("field",item.getFieldName()); + if((++i)>2) { + map.put("hidden","1"); + } + list.add(map); + } + return list; + } + +} diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/online/cgreport/service/impl/OnlCgreportParamServiceImpl.java b/jeecg-boot/src/main/java/org/jeecg/modules/online/cgreport/service/impl/OnlCgreportParamServiceImpl.java new file mode 100644 index 0000000..da13b37 --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/online/cgreport/service/impl/OnlCgreportParamServiceImpl.java @@ -0,0 +1,19 @@ +package org.jeecg.modules.online.cgreport.service.impl; + +import org.jeecg.modules.online.cgreport.entity.OnlCgreportParam; +import org.jeecg.modules.online.cgreport.mapper.OnlCgreportParamMapper; +import org.jeecg.modules.online.cgreport.service.IOnlCgreportParamService; +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; + +/** + * @Description: 在线报表配置 + * @author: jeecg-boot + * @date: 2019-03-08 + * @version: V1.0 + */ +@Service +public class OnlCgreportParamServiceImpl extends ServiceImpl<OnlCgreportParamMapper, OnlCgreportParam> implements IOnlCgreportParamService { + +} diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/online/cgreport/util/BrowserType.java b/jeecg-boot/src/main/java/org/jeecg/modules/online/cgreport/util/BrowserType.java new file mode 100644 index 0000000..fb17062 --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/online/cgreport/util/BrowserType.java @@ -0,0 +1,10 @@ +package org.jeecg.modules.online.cgreport.util; + +/** + * + * @author 张代浩 + * + */ +public enum BrowserType { + IE11,IE10,IE9,IE8,IE7,IE6,Firefox,Safari,Chrome,Opera,Camino,Gecko +} diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/online/cgreport/util/BrowserUtils.java b/jeecg-boot/src/main/java/org/jeecg/modules/online/cgreport/util/BrowserUtils.java new file mode 100644 index 0000000..ab8d640 --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/online/cgreport/util/BrowserUtils.java @@ -0,0 +1,194 @@ +package org.jeecg.modules.online.cgreport.util; + +import java.util.HashMap; +import java.util.Map; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import javax.servlet.http.HttpServletRequest; + +/** + * + * @author 张代浩 + * + */ +public class BrowserUtils { + + // 判断是否是IE + public static boolean isIE(HttpServletRequest request) { + return (request.getHeader("USER-AGENT").toLowerCase().indexOf("msie") > 0 || request + .getHeader("USER-AGENT").toLowerCase().indexOf("rv:11.0") > 0) ? true + : false; + } + + /** + * 获取IE版本 + * + * @param request + * @return + */ + public static Double getIEversion(HttpServletRequest request) { + Double version = 0.0; + if (getBrowserType(request, IE11)) { + version = 11.0; + } else if (getBrowserType(request, IE10)) { + version = 10.0; + } else if (getBrowserType(request, IE9)) { + version = 9.0; + } else if (getBrowserType(request, IE8)) { + version = 8.0; + } else if (getBrowserType(request, IE7)) { + version = 7.0; + } else if (getBrowserType(request, IE6)) { + version = 6.0; + } + return version; + } + + /** + * 获取浏览器类型 + * + * @param request + * @return + */ + public static BrowserType getBrowserType(HttpServletRequest request) { + BrowserType browserType = null; + if (getBrowserType(request, IE11)) { + browserType = BrowserType.IE11; + } + if (getBrowserType(request, IE10)) { + browserType = BrowserType.IE10; + } + if (getBrowserType(request, IE9)) { + browserType = BrowserType.IE9; + } + if (getBrowserType(request, IE8)) { + browserType = BrowserType.IE8; + } + if (getBrowserType(request, IE7)) { + browserType = BrowserType.IE7; + } + if (getBrowserType(request, IE6)) { + browserType = BrowserType.IE6; + } + if (getBrowserType(request, FIREFOX)) { + browserType = BrowserType.Firefox; + } + if (getBrowserType(request, SAFARI)) { + browserType = BrowserType.Safari; + } + if (getBrowserType(request, CHROME)) { + browserType = BrowserType.Chrome; + } + if (getBrowserType(request, OPERA)) { + browserType = BrowserType.Opera; + } + if (getBrowserType(request, "Camino")) { + browserType = BrowserType.Camino; + } + return browserType; + } + + private static boolean getBrowserType(HttpServletRequest request, + String brosertype) { + return request.getHeader("USER-AGENT").toLowerCase() + .indexOf(brosertype) > 0 ? true : false; + } + + private final static String IE11 = "rv:11.0"; + private final static String IE10 = "MSIE 10.0"; + private final static String IE9 = "MSIE 9.0"; + private final static String IE8 = "MSIE 8.0"; + private final static String IE7 = "MSIE 7.0"; + private final static String IE6 = "MSIE 6.0"; + private final static String MAXTHON = "Maxthon"; + private final static String QQ = "QQBrowser"; + private final static String GREEN = "GreenBrowser"; + private final static String SE360 = "360SE"; + private final static String FIREFOX = "Firefox"; + private final static String OPERA = "Opera"; + private final static String CHROME = "Chrome"; + private final static String SAFARI = "Safari"; + private final static String OTHER = "其它"; + + public static String checkBrowse(HttpServletRequest request) { + String userAgent = request.getHeader("USER-AGENT"); + if (regex(OPERA, userAgent)) { + return OPERA; + } + if (regex(CHROME, userAgent)) { + return CHROME; + } + if (regex(FIREFOX, userAgent)) { + return FIREFOX; + } + if (regex(SAFARI, userAgent)) { + return SAFARI; + } + if (regex(SE360, userAgent)) { + return SE360; + } + if (regex(GREEN, userAgent)) { + return GREEN; + } + if (regex(QQ, userAgent)) { + return QQ; + } + if (regex(MAXTHON, userAgent)) { + return MAXTHON; + } + if (regex(IE11, userAgent)) { + return IE11; + } + if (regex(IE10, userAgent)) { + return IE10; + } + if (regex(IE9, userAgent)) { + return IE9; + } + if (regex(IE8, userAgent)) { + return IE8; + } + if (regex(IE7, userAgent)) { + return IE7; + } + if (regex(IE6, userAgent)) { + return IE6; + } + return OTHER; + } + + public static boolean regex(String regex, String str) { + Pattern p = Pattern.compile(regex, Pattern.MULTILINE); + Matcher m = p.matcher(str); + return m.find(); + } + + + private static Map<String, String> langMap = new HashMap<String, String>(); + private final static String ZH = "zh"; + private final static String ZH_CN = "zh-cn"; + + private final static String EN = "en"; + private final static String EN_US = "en"; + + + static + { + langMap.put(ZH, ZH_CN); + langMap.put(EN, EN_US); + } + + public static String getBrowserLanguage(HttpServletRequest request) { + + String browserLang = request.getLocale().getLanguage(); + String browserLangCode = (String)langMap.get(browserLang); + + if(browserLangCode == null) + { + browserLangCode = EN_US; + } + return browserLangCode; + } + +} diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/online/cgreport/util/CgReportQueryParamUtil.java b/jeecg-boot/src/main/java/org/jeecg/modules/online/cgreport/util/CgReportQueryParamUtil.java new file mode 100644 index 0000000..88cd976 --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/online/cgreport/util/CgReportQueryParamUtil.java @@ -0,0 +1,178 @@ +package org.jeecg.modules.online.cgreport.util; + +import java.io.UnsupportedEncodingException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import javax.servlet.http.HttpServletRequest; +import org.jeecg.common.util.DateUtils; +import org.jeecg.common.util.oConvertUtils; +import org.jeecg.modules.online.cgreport.def.CgReportConstant; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; + +/** + * + * @Title:QueryParamUtil + * @description:动态报表查询条件处理工具 + * @author 赵俊夫 + * @date Jul 5, 2013 10:22:31 PM + * @version V1.0 + */ +public class CgReportQueryParamUtil{ + + /** + * 组装查询参数 + * @param request 请求(查询值从此处取) + * @param item 动态报表字段配置 + * @param pageSearchFields 页面参数查询字段(占位符的条件语句) + * @param paramData 占位符对应的数据 + */ + public static void loadQueryParams(HttpServletRequest request, Map<String,Object> item, Map<String,Object> pageSearchFields,Map<String,Object> paramData) { + String filedName = (String) item.get(CgReportConstant.ITEM_FIELDNAME); + String queryMode = (String) item.get(CgReportConstant.ITEM_QUERYMODE); + String filedType = (String) item.get(CgReportConstant.ITEM_FIELDTYPE); + if("single".equals(queryMode)){ + //单条件组装方式 + String value =request.getParameter(filedName.toLowerCase()); + try { + if(oConvertUtils.isEmpty(value)){ + return; + } + String uri = request.getQueryString(); + if(uri.contains(filedName+"=")){ + String contiansChinesevalue = new String(value.getBytes("ISO-8859-1"), "UTF-8"); + value = contiansChinesevalue; + } + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + return; + } + if(oConvertUtils.isNotEmpty(value)){ + if(value.contains("*")){ + //模糊查询 + value = value.replaceAll("\\*", "%"); + pageSearchFields.put(filedName, CgReportConstant.OP_LIKE+":"+filedName); + }else{ + pageSearchFields.put(filedName, CgReportConstant.OP_EQ+":"+filedName); + } + } + paramData.put(filedName, covertData(filedType,value,true)); + }else if("group".equals(queryMode)){ + //范围查询组装 + String begin = request.getParameter(filedName.toLowerCase()+"_begin"); + String end = request.getParameter(filedName.toLowerCase()+"_end"); + if(oConvertUtils.isNotEmpty(begin)){ + String re = CgReportConstant.OP_RQ+":"+filedName+"_begin"; + pageSearchFields.put(filedName, re); + paramData.put(filedName+"_begin", covertData(filedType,begin,true)); + } + if(oConvertUtils.isNotEmpty(end)){ + String re = CgReportConstant.OP_LQ+":"+filedName+"_end"; + pageSearchFields.put(new String(filedName), re); + paramData.put(filedName+"_end", covertData(filedType,end,false)); + } + } + } + + private static Object covertData(String fieldType,String value,boolean isBegin){ + Object obj = null; + if(oConvertUtils.isNotEmpty(value)){ + if(CgReportConstant.TYPE_STRING.equalsIgnoreCase(fieldType)){ + obj = value; + }else if(CgReportConstant.TYPE_DATE.equalsIgnoreCase(fieldType)){ + if (value.length() == 19) { + } else if (value.length() == 10) { + if(isBegin){ + value +=" 00:00:00"; + }else{ + value +=" 23:59:59"; + } + } + SimpleDateFormat datetimeFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + obj = DateUtils.str2Date(value, datetimeFormat); + }else if(CgReportConstant.TYPE_DOUBLE.equalsIgnoreCase(fieldType)){ + obj = value; + }else if(CgReportConstant.TYPE_INTEGER.equalsIgnoreCase(fieldType)){ + obj = value; + }else{ + obj = value; + } + } + return obj; + } + + /** + * 将结果集转化为列表json格式 + * @param result 结果集 + * @param size 总大小 + * @return 处理好的json格式 + */ + public static String getJson(List<Map<String, Object>> result,Long size){ + JSONObject main = new JSONObject(); + JSONArray rows = new JSONArray(); + main.put("total",size ); + if(result!=null){ + for(Map m:result){ + JSONObject item = new JSONObject(); + Iterator it =m.keySet().iterator(); + while(it.hasNext()){ + String key = (String) it.next(); + String value =String.valueOf(m.get(key)); + key = key.toLowerCase(); + if(key.contains("time")||key.contains("date")){ + value = datatimeFormat(value); + } + item.put(key,value ); + } + rows.add(item); + } + } + main.put("rows", rows); + return main.toString(); + } + + /** + * 将结果集转化为列表json格式(不含分页信息) + * @param result 结果集 + * @param size 总大小 + * @return 处理好的json格式 + */ + public static String getJson(List<Map<String, Object>> result){ + JSONArray rows = new JSONArray(); + for(Map m:result){ + JSONObject item = new JSONObject(); + Iterator it =m.keySet().iterator(); + while(it.hasNext()){ + String key = (String) it.next(); + String value =String.valueOf(m.get(key)); + key = key.toLowerCase(); + if(key.contains("time")||key.contains("date")){ + value = datatimeFormat(value); + } + item.put(key,value ); + } + rows.add(item); + } + return rows.toString(); + } + + /** + * 将毫秒数去掉 + * @param datetime + * @return + */ + public static String datatimeFormat(String datetime){ + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.S"); + SimpleDateFormat dateFormatTo = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Date d = null; + try{ + d = dateFormat.parse(datetime); + return dateFormatTo.format(d); + }catch (Exception e) { + return datetime; + } + } +} diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/online/cgreport/util/SqlUtil.java b/jeecg-boot/src/main/java/org/jeecg/modules/online/cgreport/util/SqlUtil.java new file mode 100644 index 0000000..3c5ff95 --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/online/cgreport/util/SqlUtil.java @@ -0,0 +1,260 @@ +package org.jeecg.modules.online.cgreport.util; + +import java.text.MessageFormat; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import javax.servlet.http.HttpServletRequest; + +import org.jeecg.common.util.oConvertUtils; + +/** + * @Description: 根据不同的数据库,动态生成分页SQL + * @author scott + * @date 2019-03-20 + */ +public class SqlUtil { + + public static final String DATABSE_TYPE_MYSQL ="mysql"; + public static final String DATABSE_TYPE_POSTGRE ="postgresql"; + public static final String DATABSE_TYPE_ORACLE ="oracle"; + public static final String DATABSE_TYPE_SQLSERVER ="sqlserver"; + + /** + * 分页SQL + */ + public static final String MYSQL_SQL = "select * from ( {0}) sel_tab00 limit {1},{2}"; //mysql + public static final String POSTGRE_SQL = "select * from ( {0}) sel_tab00 limit {2} offset {1}";//postgresql + public static final String ORACLE_SQL = "select * from (select row_.*,rownum rownum_ from ({0}) row_ where rownum <= {1}) where rownum_>{2}"; //oracle + public static final String SQLSERVER_SQL = "select * from ( select row_number() over(order by tempColumn) tempRowNumber, * from (select top {1} tempColumn = 0, {0}) t ) tt where tempRowNumber > {2}"; //sqlserver + + /** + * 获取所有表的SQL + */ + public static final String MYSQL_ALLTABLES_SQL = "select distinct table_name from information_schema.columns where table_schema = {0}"; + public static final String POSTGRE__ALLTABLES_SQL = "SELECT distinct c.relname AS table_name FROM pg_class c"; + public static final String ORACLE__ALLTABLES_SQL = "select distinct colstable.table_name as table_name from user_tab_cols colstable"; + public static final String SQLSERVER__ALLTABLES_SQL= "select distinct c.name as table_name from sys.objects c"; + + /** + * 获取指定表的所有列名 + */ + public static final String MYSQL_ALLCOLUMNS_SQL = "select column_name from information_schema.columns where table_name = {0} and table_schema = {1}"; + public static final String POSTGRE_ALLCOLUMNS_SQL = "select table_name from information_schema.columns where table_name = {0}"; + public static final String ORACLE_ALLCOLUMNS_SQL = "select column_name from all_tab_columns where table_name ={0}"; + public static final String SQLSERVER_ALLCOLUMNS_SQL = "select name from syscolumns where id={0}"; + /** + * 获取全sql + * @param sql + * @param params + * @return + */ + //TODO 规则要改 + public static String getFullSql(String sql,Map params){ + StringBuilder sqlB = new StringBuilder(); + sqlB.append("SELECT t.* FROM ( "); + sqlB.append(sql+" "); + sqlB.append(") t "); + if (params!=null&¶ms.size() >= 1) { + sqlB.append("WHERE 1=1 "); + Iterator it = params.keySet().iterator(); + while (it.hasNext()) { + String key = String.valueOf(it.next()); + String value = String.valueOf(params.get(key)); + if (oConvertUtils.isNotEmpty(value)) { + sqlB.append(" AND "); + sqlB.append(" " + key + value ); + } + } + } + return sqlB.toString(); + } + + /** + * 获取求数量sql + * @param sql + * @param params + * @return + */ + public static String getCountSql(String sql, Map params) { + String querySql = getFullSql(sql,params); + //若要兼容数据库,SQL中取别名一律用大写 + querySql = "SELECT COUNT(*) COUNT FROM ("+querySql+") t2"; + return querySql; + } + + /** + * 生成分页查询sql + * @param sql + * @param page + * @param rows + * @return + */ + public static String jeecgCreatePageSql(String sql,Map params, int page, int rows){ + //TODO 数据库链接URL,需要动态获取 + String dbTypeUrl = "jdbc:mysql://127.0.0.1:3306/jeecg-boot?characterEncoding=UTF-8&useUnicode=true&useSSL=false"; + int beginNum = (page - 1) * rows; + String[] sqlParam = new String[3]; + sqlParam[0] = sql; + sqlParam[1] = beginNum+""; + sqlParam[2] = rows+""; + if(dbTypeUrl.indexOf(DATABSE_TYPE_MYSQL)!=-1){ + sql = MessageFormat.format(MYSQL_SQL, sqlParam); + }else if(dbTypeUrl.indexOf(DATABSE_TYPE_POSTGRE)!=-1){ + sql = MessageFormat.format(POSTGRE_SQL, sqlParam); + }else { + int beginIndex = (page-1)*rows; + int endIndex = beginIndex+rows; + sqlParam[2] = Integer.toString(beginIndex); + sqlParam[1] = Integer.toString(endIndex); + if(dbTypeUrl.indexOf(DATABSE_TYPE_ORACLE)!=-1) { + sql = MessageFormat.format(ORACLE_SQL, sqlParam); + } else if(dbTypeUrl.indexOf(DATABSE_TYPE_SQLSERVER)!=-1) { + sqlParam[0] = sql.substring(getAfterSelectInsertPoint(sql)); + sql = MessageFormat.format(SQLSERVER_SQL, sqlParam); + } + } + return sql; + } + + /** + * 生成分页查询sql + * @param sql + * @param page + * @param rows + * @return + */ + @SuppressWarnings("rawtypes") + public static String jeecgCreatePageSql(String dbTypeUrl,String dbKey,String sql,Map params, int page, int rows){ + sql = getFullSql(sql,params); + int beginNum = (page - 1) * rows; + String[] sqlParam = new String[3]; + sqlParam[0] = sql; + sqlParam[1] = beginNum+""; + sqlParam[2] = rows+""; + //TODO 动态数据源,获取数据库类型 + String databaseType = ""; + if(DATABSE_TYPE_MYSQL.equalsIgnoreCase(databaseType)){ + sql = MessageFormat.format(MYSQL_SQL, sqlParam); + }else if(DATABSE_TYPE_POSTGRE.equalsIgnoreCase(databaseType)){ + sql = MessageFormat.format(POSTGRE_SQL, sqlParam); + }else { + int beginIndex = (page-1)*rows; + int endIndex = beginIndex+rows; + sqlParam[2] = Integer.toString(beginIndex); + sqlParam[1] = Integer.toString(endIndex); + if(DATABSE_TYPE_ORACLE.equalsIgnoreCase(databaseType)) { + sql = MessageFormat.format(ORACLE_SQL, sqlParam); + } else if(DATABSE_TYPE_SQLSERVER.equalsIgnoreCase(databaseType)) { + sqlParam[0] = sql.substring(getAfterSelectInsertPoint(sql)); + sql = MessageFormat.format(SQLSERVER_SQL, sqlParam); + } + } + return sql; + } + + private static int getAfterSelectInsertPoint(String sql) { + int selectIndex = sql.toLowerCase().indexOf("select"); + int selectDistinctIndex = sql.toLowerCase().indexOf("select distinct"); + return selectIndex + (selectDistinctIndex == selectIndex ? 15 : 6); + } + + //add-begin--Author:luobaoli Date:20150620 for:增加各个数据库获取表的SQL和获取指定表列的SQL + public static String getAllTableSql(String dbType,String ... param){ + if(oConvertUtils.isNotEmpty(dbType)){ + if(DATABSE_TYPE_MYSQL.equals(dbType)){ + return MessageFormat.format(MYSQL_ALLTABLES_SQL, param); + }else if(DATABSE_TYPE_ORACLE.equals(dbType)){ + return ORACLE__ALLTABLES_SQL; + }else if(DATABSE_TYPE_POSTGRE.equals(dbType)){ + return POSTGRE__ALLTABLES_SQL; + }else if(DATABSE_TYPE_SQLSERVER.equals(dbType)){ + return SQLSERVER__ALLTABLES_SQL; + } + } + return null; + } + + public static String getAllCloumnSql(String dbType,String ... param){ + if(oConvertUtils.isNotEmpty(dbType)){ + if(DATABSE_TYPE_MYSQL.equals(dbType)){ + return MessageFormat.format(MYSQL_ALLCOLUMNS_SQL, param); + }else if(DATABSE_TYPE_ORACLE.equals(dbType)){ + return MessageFormat.format(ORACLE_ALLCOLUMNS_SQL, param); + }else if(DATABSE_TYPE_POSTGRE.equals(dbType)){ + return MessageFormat.format(POSTGRE_ALLCOLUMNS_SQL, param); + }else if(DATABSE_TYPE_SQLSERVER.equals(dbType)){ + return MessageFormat.format(SQLSERVER_ALLCOLUMNS_SQL, param); + } + } + return null; + } + + /** + * 【转换${}规则为万能SQL,方便SQL执行解析】 + * @param sql + * @return + */ + public static String getSql(String sql){ + String regex = "\\$\\{\\w+\\}"; + Pattern p = Pattern.compile(regex); + Matcher m = p.matcher(sql); + while(m.find()){ + String whereParam = m.group(); + //System.out.println(whereParam); + sql = sql.replace(whereParam, "'' or 1=1 or 1=''"); + sql = sql.replace("'''", "''"); + //System.out.println(sql); + } + //兼容图表 + regex = "\\{\\w+\\}"; + p = Pattern.compile(regex); + m = p.matcher(sql); + while(m.find()){ + String whereParam = m.group(); + //System.out.println(whereParam); + sql = sql.replace(whereParam, " 1=1 "); + //System.out.println(sql); + } + return sql; + } + + /** + * 获取页面查询参数 + * @param request + * @return + */ + public static Map<String, Object> getParameterMap(HttpServletRequest request) { + // 参数Map + Map<?, ?> properties = request.getParameterMap(); + // 返回值Map + Map<String, Object> returnMap = new HashMap<String, Object>(); + Iterator<?> entries = properties.entrySet().iterator(); + + Map.Entry<String, Object> entry; + String name = ""; + String value = ""; + Object valueObj =null; + while (entries.hasNext()) { + entry = (Map.Entry<String, Object>) entries.next(); + name = (String) entry.getKey(); + valueObj = entry.getValue(); + if ("_t".equals(name) || null == valueObj) { + value = ""; + } else if (valueObj instanceof String[]) { + String[] values = (String[]) valueObj; + for (int i = 0; i < values.length; i++) { + value = values[i] + ","; + } + value = value.substring(0, value.length() - 1); + } else { + value = valueObj.toString(); + } + returnMap.put(name, value); + } + return returnMap; + } +} 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 index 3c2753d..ba4d9c9 100644 --- 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 @@ -1,15 +1,29 @@ package org.jeecg.modules.quartz.controller; +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.net.URLDecoder; import java.util.Arrays; import java.util.List; +import java.util.Map; import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import com.alibaba.fastjson.JSON; import org.jeecg.common.api.vo.Result; import org.jeecg.common.constant.CommonConstant; import org.jeecg.common.exception.JeecgBootException; +import org.jeecg.common.system.query.QueryGenerator; import org.jeecg.common.util.oConvertUtils; import org.jeecg.modules.quartz.entity.QuartzJob; import org.jeecg.modules.quartz.service.IQuartzJobService; +import org.jeecg.modules.system.entity.SysUser; +import org.jeecgframework.poi.excel.ExcelImportUtil; +import org.jeecgframework.poi.excel.def.NormalExcelConstants; +import org.jeecgframework.poi.excel.entity.ExportParams; +import org.jeecgframework.poi.excel.entity.ImportParams; +import org.jeecgframework.poi.excel.view.JeecgEntityExcelView; import org.quartz.CronScheduleBuilder; import org.quartz.CronTrigger; import org.quartz.Job; @@ -33,6 +47,9 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; +import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.multipart.MultipartHttpServletRequest; +import org.springframework.web.servlet.ModelAndView; /** * @Title: Controller @@ -63,23 +80,9 @@ public class QuartzJobController { 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); + QueryWrapper<QuartzJob> queryWrapper = QueryGenerator.initQueryWrapper(quartzJob, req.getParameterMap()); 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; @@ -294,4 +297,70 @@ public class QuartzJobController { return (Job) class1.newInstance(); } + /** + * 导出excel + * @param request + * @param response + */ + @RequestMapping(value = "/exportXls") + public ModelAndView exportXls(HttpServletRequest request, HttpServletResponse response) { + // Step.1 组装查询条件 + QueryWrapper<QuartzJob> queryWrapper = null; + try { + String paramsStr = request.getParameter("paramsStr"); + if (oConvertUtils.isNotEmpty(paramsStr)) { + String deString = URLDecoder.decode(paramsStr, "UTF-8"); + QuartzJob quartzJob = JSON.parseObject(deString, QuartzJob.class); + queryWrapper = QueryGenerator.initQueryWrapper(quartzJob, request.getParameterMap()); + } + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + + //Step.2 AutoPoi 导出Excel + ModelAndView mv = new ModelAndView(new JeecgEntityExcelView()); + List<QuartzJob> pageList = quartzJobService.list(queryWrapper); + //导出文件名称 + mv.addObject(NormalExcelConstants.FILE_NAME,"定时任务列表"); + mv.addObject(NormalExcelConstants.CLASS,QuartzJob.class); + mv.addObject(NormalExcelConstants.PARAMS,new ExportParams("定时任务列表数据","导出人:Jeecg","导出信息")); + mv.addObject(NormalExcelConstants.DATA_LIST,pageList); + return mv; + } + + /** + * 通过excel导入数据 + * @param request + * @param response + * @return + */ + @RequestMapping(value = "/importExcel", method = RequestMethod.POST) + public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) { + MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request; + Map<String, MultipartFile> fileMap = multipartRequest.getFileMap(); + for (Map.Entry<String, MultipartFile> entity : fileMap.entrySet()) { + MultipartFile file = entity.getValue();// 获取上传文件对象 + ImportParams params = new ImportParams(); + params.setTitleRows(2); + params.setHeadRows(1); + params.setNeedSave(true); + try { + List<QuartzJob> listQuartzJobs = ExcelImportUtil.importExcel(file.getInputStream(), QuartzJob.class, params); + for (QuartzJob quartzJobExcel : listQuartzJobs) { + quartzJobService.save(quartzJobExcel); + } + return Result.ok("文件导入成功!数据行数:" + listQuartzJobs.size()); + } catch (Exception e) { + log.error(e.getMessage()); + return Result.error("文件导入失败!"); + } finally { + try { + file.getInputStream().close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + return Result.ok("文件导入失败!"); + } } 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 index b7f68dc..320a3fe 100644 --- 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 @@ -2,6 +2,7 @@ package org.jeecg.modules.quartz.entity; import java.io.Serializable; +import org.jeecgframework.poi.excel.annotation.Excel; import org.springframework.format.annotation.DateTimeFormat; import com.baomidou.mybatisplus.annotation.IdType; @@ -40,13 +41,18 @@ public class QuartzJob implements Serializable { @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") private java.util.Date updateTime; /**任务类名*/ + @Excel(name="任务类名",width=40) private java.lang.String jobClassName; /**cron表达式*/ + @Excel(name="cron表达式",width=30) private java.lang.String cronExpression; /**参数*/ + @Excel(name="参数",width=15) private java.lang.String parameter; /**描述*/ + @Excel(name="描述",width=40) private java.lang.String description; /**状态 0正常 -1停止*/ + @Excel(name="状态",width=15) private java.lang.Integer status; } 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 index 7bc807a..72b4e57 100644 --- 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 @@ -80,7 +80,7 @@ public class MyRealm extends AuthorizingRealm { roles = sysUserService.getRole(username); stringRedisTemplate.opsForValue().set(CommonConstant.PREFIX_USER_ROLE + username, JSON.toJSONString(roles)); } - //设置超时时间 + //设置超时时间(1小时) stringRedisTemplate.expire(CommonConstant.PREFIX_USER_ROLE + username, CommonConstant.TOKEN_EXPIRE_TIME, TimeUnit.SECONDS); /** @@ -151,13 +151,15 @@ public class MyRealm extends AuthorizingRealm { /** - * JWTToken刷新生命周期 1、登录成功后将用户的JWT生成的Token作为k、v存储到cache缓存里面(这时候k、v值一样) + * JWTToken刷新生命周期 (解决用户一直在线操作,提供Token失效问题) + * 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使用 + * 参考方案:https://blog.csdn.net/qq394829044/article/details/82763936 * * @param userName * @param passWord 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 index bde4470..98641b0 100644 --- 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 @@ -5,10 +5,18 @@ import com.auth0.jwt.JWTVerifier; import com.auth0.jwt.algorithms.Algorithm; import com.auth0.jwt.exceptions.JWTDecodeException; import com.auth0.jwt.interfaces.DecodedJWT; +import com.google.common.base.Joiner; + import java.util.Date; import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpSession; + +import org.jeecg.common.constant.DataBaseConstant; import org.jeecg.common.exception.JeecgBootException; +import org.jeecg.common.util.SpringContextUtils; import org.jeecg.common.util.oConvertUtils; +import org.jeecg.modules.system.model.SysUserCacheInfo; +import org.jeecg.modules.system.util.JeecgDataAutorUtils; /** * @author Scott @@ -84,4 +92,88 @@ public class JwtUtil { } return username; } + + /** + * 从session中获取变量 + * @param key + * @return + */ + public static String getSessionData(String key) { + //${myVar}% + //得到${} 后面的值 + String moshi = ""; + if(key.indexOf("}")!=-1){ + moshi = key.substring(key.indexOf("}")+1); + } + String returnValue = null; + if (key.contains("#{")) { + key = key.substring(2,key.indexOf("}")); + } + if (oConvertUtils.isNotEmpty(key)) { + HttpSession session = SpringContextUtils.getHttpServletRequest().getSession(); + returnValue = (String) session.getAttribute(key); + } + //结果加上${} 后面的值 + if(returnValue!=null){returnValue = returnValue + moshi;} + return returnValue; + } + + /** + * 从当前用户中获取变量 + * @param key + * @param user + * @return + */ + public static String getUserSystemData(String key,SysUserCacheInfo user) { + if(user==null) { + user = JeecgDataAutorUtils.loadUserInfo(); + } + //#{sys_user_code}% + String moshi = ""; + if(key.indexOf("}")!=-1){ + moshi = key.substring(key.indexOf("}")+1); + } + String returnValue = null; + //针对特殊标示处理#{sysOrgCode},判断替换 + if (key.contains("#{")) { + key = key.substring(2,key.indexOf("}")); + } else { + key = key; + } + //替换为系统登录用户帐号 + if (key.equals(DataBaseConstant.SYS_USER_CODE)|| key.equals(DataBaseConstant.SYS_USER_CODE_TABLE)) { + returnValue = user.getSysUserCode(); + } + //替换为系统登录用户真实名字 + if (key.equals(DataBaseConstant.SYS_USER_NAME)|| key.equals(DataBaseConstant.SYS_USER_NAME_TABLE)) { + returnValue = user.getSysUserName(); + } + + //替换为系统登录用户的公司编码 + if (key.equals(DataBaseConstant.SYS_COMPANY_CODE)|| key.equals(DataBaseConstant.SYS_COMPANY_CODE_TABLE)) { + returnValue = user.getCompanyCode(); + } + //替换为系统用户登录所使用的机构编码 + if (key.equals(DataBaseConstant.SYS_ORG_CODE)|| key.equals(DataBaseConstant.SYS_ORG_CODE_TABLE)) { + if(user.isOneDepart()) { + returnValue = user.getSysOrgCode().get(0); + }else { + returnValue = Joiner.on(",").join(user.getSysOrgCode()); + } + } + //替换为当前系统时间(年月日) + if (key.equals(DataBaseConstant.SYS_DATE)|| key.equals(DataBaseConstant.SYS_DATE_TABLE)) { + returnValue = user.getSysDate(); + } + //替换为当前系统时间(年月日时分秒) + if (key.equals(DataBaseConstant.SYS_TIME)|| key.equals(DataBaseConstant.SYS_TIME_TABLE)) { + returnValue = user.getSysTime(); + } + //流程状态默认值(默认未发起) + if (key.equals(DataBaseConstant.BPM_STATUS_TABLE)|| key.equals(DataBaseConstant.BPM_STATUS_TABLE)) { + returnValue = "1"; + } + if(returnValue!=null){returnValue = returnValue + moshi;} + return returnValue; + } } diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/system/controller/DuplicateCheckController.java b/jeecg-boot/src/main/java/org/jeecg/modules/system/controller/DuplicateCheckController.java new file mode 100644 index 0000000..6009415 --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/system/controller/DuplicateCheckController.java @@ -0,0 +1,59 @@ +package org.jeecg.modules.system.controller; + +import javax.servlet.http.HttpServletRequest; + +import org.apache.commons.lang.StringUtils; +import org.jeecg.common.api.vo.Result; +import org.jeecg.modules.system.mapper.SysDictMapper; +import org.jeecg.modules.system.model.DuplicateCheckVo; +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.RestController; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; + +/** + * @Title: DuplicateCheckAction + * @Description: 重复校验工具 + * @author 张代浩 + * @date 2019-03-25 + * @version V1.0 + */ +@Slf4j +@RestController +@RequestMapping("/sys/duplicate") +public class DuplicateCheckController { + + @Autowired + SysDictMapper sysDictMapper; + + /** + * 校验数据是否在系统中是否存在 + * + * @return + */ + @RequestMapping(value = "/check", method = RequestMethod.GET) + @ApiOperation("重复校验接口") + public Result<Object> doDuplicateCheck(DuplicateCheckVo duplicateCheckVo, HttpServletRequest request) { + Long num = null; + + log.info("----duplicate check------:"+ duplicateCheckVo.toString()); + if (StringUtils.isNotBlank(duplicateCheckVo.getDataId())) { + // [2].编辑页面校验 + num = sysDictMapper.duplicateCheckCountSql(duplicateCheckVo); + } else { + // [1].添加页面校验 + num = sysDictMapper.duplicateCheckCountSqlNoDataId(duplicateCheckVo); + } + + if (num == null || num == 0) { + // 该值可用 + return Result.ok("该值可用!"); + } else { + // 该值不可用 + log.info("该值不可用,系统中已存在!"); + return Result.error("该值不可用,系统中已存在!"); + } + } +} 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 deleted file mode 100644 index 62c0be0..0000000 --- a/jeecg-boot/src/main/java/org/jeecg/modules/system/controller/FindsDepartsChildrenUtil.java +++ /dev/null @@ -1,103 +0,0 @@ -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 index 7d53484..3720272 100644 --- 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 @@ -1,11 +1,17 @@ package org.jeecg.modules.system.controller; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.shiro.SecurityUtils; +import org.apache.shiro.subject.Subject; 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.shiro.vo.DefContants; import org.jeecg.modules.system.entity.SysUser; import org.jeecg.modules.system.model.SysLoginModel; import org.jeecg.modules.system.service.ISysLogService; @@ -15,10 +21,12 @@ 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.RequestParam; import org.springframework.web.bind.annotation.RestController; import com.alibaba.fastjson.JSONObject; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; /** * @author scott @@ -27,6 +35,7 @@ import io.swagger.annotations.ApiOperation; @RestController @RequestMapping("/sys") @Api("用户登录") +@Slf4j public class LoginController { @Autowired private ISysUserService sysUserService; @@ -74,6 +83,28 @@ public class LoginController { } /** + * 退出登录 + * @param username + * @return + */ + @RequestMapping(value = "/logout") + public Result<Object> logout(HttpServletRequest request,HttpServletResponse response) { + //用户退出逻辑 + Subject subject = SecurityUtils.getSubject(); + SysUser sysUser = (SysUser)subject.getPrincipal(); + sysBaseAPI.addLog("用户名: "+sysUser.getRealname()+",退出成功!", CommonConstant.LOG_TYPE_1, null); + log.info(" 用户名: "+sysUser.getRealname()+",退出成功! "); + subject.logout(); + + String token = request.getHeader(DefContants.X_ACCESS_TOKEN); + //清空用户Token缓存 + redisUtil.del(CommonConstant.PREFIX_USER_TOKEN + token); + //清空用户角色缓存 + redisUtil.del(CommonConstant.PREFIX_USER_ROLE + sysUser.getUsername()); + return Result.ok("退出登录成功!"); + } + + /** * 获取访问量 * @return */ 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 index 45c201e..be35ae3 100644 --- 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 @@ -1,17 +1,31 @@ package org.jeecg.modules.system.controller; +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.net.URLDecoder; import java.util.Arrays; import java.util.Date; import java.util.List; +import java.util.Map; import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import com.alibaba.fastjson.JSON; import org.jeecg.common.api.vo.Result; import org.jeecg.common.constant.CommonConstant; import org.jeecg.common.constant.CommonSendStatus; +import org.jeecg.common.system.query.QueryGenerator; 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.entity.SysUser; import org.jeecg.modules.system.service.ISysAnnouncementService; +import org.jeecgframework.poi.excel.ExcelImportUtil; +import org.jeecgframework.poi.excel.def.NormalExcelConstants; +import org.jeecgframework.poi.excel.entity.ExportParams; +import org.jeecgframework.poi.excel.entity.ImportParams; +import org.jeecgframework.poi.excel.view.JeecgEntityExcelView; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; @@ -22,12 +36,15 @@ 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; +import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.multipart.MultipartHttpServletRequest; +import org.springframework.web.servlet.ModelAndView; - /** +/** * @Title: Controller * @Description: 系统通告表 * @author: jeecg-boot - * @date: 2019-01-02 + * @date: 2019-01-02 * @version: V1.0 */ @RestController @@ -36,7 +53,7 @@ import lombok.extern.slf4j.Slf4j; public class SysAnnouncementController { @Autowired private ISysAnnouncementService sysAnnouncementService; - + /** * 分页列表查询 * @param sysAnnouncement @@ -52,28 +69,14 @@ public class SysAnnouncementController { 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)); - } - } + QueryWrapper<SysAnnouncement> queryWrapper = QueryGenerator.initQueryWrapper(sysAnnouncement, req.getParameterMap()); + Page<SysAnnouncement> page = new Page<SysAnnouncement>(pageNo, pageSize); 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 @@ -94,14 +97,14 @@ public class SysAnnouncementController { } return result; } - + /** * 编辑 * @param sysAnnouncement * @return */ @RequestMapping(value = "/edit", method = RequestMethod.PUT) - public Result<SysAnnouncement> eidt(@RequestBody SysAnnouncement sysAnnouncement) { + public Result<SysAnnouncement> edit(@RequestBody SysAnnouncement sysAnnouncement) { Result<SysAnnouncement> result = new Result<SysAnnouncement>(); SysAnnouncement sysAnnouncementEntity = sysAnnouncementService.getById(sysAnnouncement.getId()); if(sysAnnouncementEntity==null) { @@ -113,10 +116,10 @@ public class SysAnnouncementController { result.success("修改成功!"); } } - + return result; } - + /** * 通过id删除 * @param id @@ -135,10 +138,10 @@ public class SysAnnouncementController { result.success("删除成功!"); } } - + return result; } - + /** * 批量删除 * @param ids @@ -160,7 +163,7 @@ public class SysAnnouncementController { } return result; } - + /** * 通过id查询 * @param id @@ -178,7 +181,7 @@ public class SysAnnouncementController { } return result; } - + /** * 更新发布操作 * @param id @@ -200,10 +203,10 @@ public class SysAnnouncementController { result.success("该系统通知发布成功"); } } - + return result; } - + /** * 更新撤销操作 * @param id @@ -223,8 +226,79 @@ public class SysAnnouncementController { result.success("该系统通知撤销成功"); } } - + return result; } + /** + * 导出excel + * + * @param request + * @param response + */ + @RequestMapping(value = "/exportXls") + public ModelAndView exportXls(HttpServletRequest request, HttpServletResponse response) { + // Step.1 组装查询条件 + QueryWrapper<SysAnnouncement> queryWrapper = null; + try { + String paramsStr = request.getParameter("paramsStr"); + if (oConvertUtils.isNotEmpty(paramsStr)) { + String deString = URLDecoder.decode(paramsStr, "UTF-8"); + SysAnnouncement sysAnnouncement = JSON.parseObject(deString, SysAnnouncement.class); + queryWrapper = QueryGenerator.initQueryWrapper(sysAnnouncement, request.getParameterMap()); + } + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + + //Step.2 AutoPoi 导出Excel + ModelAndView mv = new ModelAndView(new JeecgEntityExcelView()); + List<SysAnnouncement> pageList = sysAnnouncementService.list(queryWrapper); + //导出文件名称 + mv.addObject(NormalExcelConstants.FILE_NAME, "系统通告列表"); + mv.addObject(NormalExcelConstants.CLASS, SysAnnouncement.class); + mv.addObject(NormalExcelConstants.PARAMS, new ExportParams("系统通告列表数据", "导出人:Jeecg", "导出信息")); + mv.addObject(NormalExcelConstants.DATA_LIST, pageList); + return mv; + } + + /** + * 通过excel导入数据 + * + * @param request + * @param response + * @return + */ + @RequestMapping(value = "/importExcel", method = RequestMethod.POST) + public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) { + MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request; + Map<String, MultipartFile> fileMap = multipartRequest.getFileMap(); + for (Map.Entry<String, MultipartFile> entity : fileMap.entrySet()) { + MultipartFile file = entity.getValue();// 获取上传文件对象 + ImportParams params = new ImportParams(); + params.setTitleRows(2); + params.setHeadRows(1); + params.setNeedSave(true); + try { + List<SysAnnouncement> listSysAnnouncements = ExcelImportUtil.importExcel(file.getInputStream(), SysAnnouncement.class, params); + for (SysAnnouncement sysAnnouncementExcel : listSysAnnouncements) { + if(sysAnnouncementExcel.getDelFlag()==null){ + sysAnnouncementExcel.setDelFlag("0"); + } + sysAnnouncementService.save(sysAnnouncementExcel); + } + return Result.ok("文件导入成功!数据行数:" + listSysAnnouncements.size()); + } catch (Exception e) { + log.error(e.getMessage()); + return Result.error("文件导入失败!"); + } finally { + try { + file.getInputStream().close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + return Result.ok("文件导入失败!"); + } } diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/system/controller/SysDataLogController.java b/jeecg-boot/src/main/java/org/jeecg/modules/system/controller/SysDataLogController.java new file mode 100644 index 0000000..3d31a4d --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/system/controller/SysDataLogController.java @@ -0,0 +1,94 @@ +package org.jeecg.modules.system.controller; + +import java.util.ArrayList; +import java.util.List; + +import javax.servlet.http.HttpServletRequest; + +import org.jeecg.common.api.vo.Result; +import org.jeecg.common.system.query.QueryGenerator; +import org.jeecg.common.util.oConvertUtils; +import org.jeecg.modules.system.entity.SysDataLog; +import org.jeecg.modules.system.service.ISysDataLogService; +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; + +@RestController +@RequestMapping("/sys/dataLog") +@Slf4j +public class SysDataLogController { + @Autowired + private ISysDataLogService service; + + @RequestMapping(value = "/list", method = RequestMethod.GET) + public Result<IPage<SysDataLog>> queryPageList(SysDataLog dataLog,@RequestParam(name="pageNo", defaultValue="1") Integer pageNo, + @RequestParam(name="pageSize", defaultValue="10") Integer pageSize,HttpServletRequest req) { + Result<IPage<SysDataLog>> result = new Result<IPage<SysDataLog>>(); + QueryWrapper<SysDataLog> queryWrapper = QueryGenerator.initQueryWrapper(dataLog, req.getParameterMap()); + Page<SysDataLog> page = new Page<SysDataLog>(pageNo, pageSize); + IPage<SysDataLog> pageList = service.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 req + * @return + */ + @RequestMapping(value = "/queryCompareList", method = RequestMethod.GET) + public Result<List<SysDataLog>> queryCompareList(HttpServletRequest req) { + Result<List<SysDataLog>> result = new Result<>(); + String dataId1 = req.getParameter("dataId1"); + String dataId2 = req.getParameter("dataId2"); + List<String> idList = new ArrayList<String>(); + idList.add(dataId1); + idList.add(dataId2); + try { + List<SysDataLog> list = (List<SysDataLog>) service.listByIds(idList); + result.setResult(list); + result.setSuccess(true); + } catch (Exception e) { + e.printStackTrace(); + } + return result; + } + + /** + * 查询版本信息 + * @param req + * @return + */ + @RequestMapping(value = "/queryDataVerList", method = RequestMethod.GET) + public Result<List<SysDataLog>> queryDataVerList(HttpServletRequest req) { + Result<List<SysDataLog>> result = new Result<>(); + String dataTable = req.getParameter("dataTable"); + String dataId = req.getParameter("dataId"); + QueryWrapper<SysDataLog> queryWrapper = new QueryWrapper<SysDataLog>(); + queryWrapper.eq("data_table", dataTable); + queryWrapper.eq("data_id", dataId); + List<SysDataLog> list = service.list(queryWrapper); + if(list==null||list.size()<=0) { + result.error500("未找到版本信息"); + }else { + result.setResult(list); + result.setSuccess(true); + } + 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 index 31f3a22..2cb0a36 100644 --- 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 @@ -9,6 +9,7 @@ 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.jeecg.modules.system.util.FindsDepartsChildrenUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -56,7 +57,7 @@ public class SysDepartController { * @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); @@ -79,8 +80,8 @@ public class SysDepartController { * @return */ @RequestMapping(value = "/edit", method = RequestMethod.PUT) - @RequiresRoles({"admin"}) - public Result<SysDepart> eidt(@RequestBody SysDepart sysDepart, HttpServletRequest request) { + + public Result<SysDepart> edit(@RequestBody SysDepart sysDepart, HttpServletRequest request) { String username = JwtUtil.getUserNameByToken(request); sysDepart.setUpdateBy(username); @@ -104,7 +105,7 @@ public class SysDepartController { * @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>(); @@ -112,7 +113,7 @@ public class SysDepartController { if(sysDepart==null) { result.error500("未找到对应实体"); }else { - boolean ok = sysDepartService.removeById(id); + boolean ok = sysDepartService.delete(id); if(ok) { result.success("删除成功!"); } @@ -128,7 +129,7 @@ public class SysDepartController { * @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>(); @@ -146,13 +147,19 @@ public class SysDepartController { * * @return */ - @RequestMapping(value = "/queryIdTree", method = RequestMethod.GET) public Result<List<DepartIdModel>> queryIdTree() { Result<List<DepartIdModel>> result = new Result<List<DepartIdModel>>(); + List<DepartIdModel> idList; try { - List<DepartIdModel> idList = FindsDepartsChildrenUtil.wrapDepartIdModel(); + idList = FindsDepartsChildrenUtil.wrapDepartIdModel(); + if(idList != null && idList.size() > 0) { result.setResult(idList); result.setSuccess(true); + }else { + sysDepartService.queryTreeList(); + idList = FindsDepartsChildrenUtil.wrapDepartIdModel(); + result.setResult(idList); result.setSuccess(true); + } return result; } catch(Exception e) { e.printStackTrace(); result.setSuccess(false); 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 index 704639c..66b8d6b 100644 --- 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 @@ -1,19 +1,38 @@ package org.jeecg.modules.system.controller; +import java.io.UnsupportedEncodingException; +import java.net.URLDecoder; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Map; import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import com.alibaba.fastjson.JSON; import org.jeecg.common.api.vo.Result; +import org.jeecg.common.system.query.QueryGenerator; 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.vo.JeecgOrderMainPage; import org.jeecg.modules.system.entity.SysDict; +import org.jeecg.modules.system.entity.SysDictItem; import org.jeecg.modules.system.model.SysDictTree; +import org.jeecg.modules.system.service.ISysDictItemService; import org.jeecg.modules.system.service.ISysDictService; +import org.jeecg.modules.system.vo.SysDictPage; +import org.jeecgframework.poi.excel.ExcelImportUtil; +import org.jeecgframework.poi.excel.def.NormalExcelConstants; +import org.jeecgframework.poi.excel.entity.ExportParams; +import org.jeecgframework.poi.excel.entity.ImportParams; +import org.jeecgframework.poi.excel.view.JeecgEntityExcelView; +import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.annotation.CacheEvict; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; @@ -27,6 +46,9 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import lombok.extern.slf4j.Slf4j; +import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.multipart.MultipartHttpServletRequest; +import org.springframework.web.servlet.ModelAndView; /** * <p> @@ -40,27 +62,19 @@ import lombok.extern.slf4j.Slf4j; @RequestMapping("/sys/dict") @Slf4j public class SysDictController { - + @Autowired private ISysDictService sysDictService; - + + @Autowired + private ISysDictItemService sysDictItemService; + @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)); - } - } - //创建时间/创建人的赋值 + QueryWrapper<SysDict> queryWrapper = QueryGenerator.initQueryWrapper(sysDict, req.getParameterMap()); + Page<SysDict> page = new Page<SysDict>(pageNo, pageSize); IPage<SysDict> pageList = sysDictService.page(page, queryWrapper); log.info("查询当前页:"+pageList.getCurrent()); log.info("查询当前页数量:"+pageList.getSize()); @@ -70,7 +84,7 @@ public class SysDictController { result.setResult(pageList); return result; } - + /** * @功能:获取树形字典数据 * @param sysDict @@ -101,30 +115,44 @@ public class SysDictController { result.setResult(treeList); return result; } - + /** * 获取字典数据 - * @param dictCode + * @param dictCode 字典code + * @param dictCode 表名,文本字段,code字段 | 举例:sys_user,realname,id * @return */ @RequestMapping(value = "/getDictItems/{dictCode}", method = RequestMethod.GET) - public Result<List<Map<String, String>>> getDictItems(@PathVariable String dictCode) { + public Result<List<Map<String, Object>>> 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; + Result<List<Map<String,Object>>> result = new Result<List<Map<String,Object>>>(); + List<Map<String,Object>> ls = null; try { - ls = sysDictService.queryDictItemsByCode(dictCode); + if(dictCode.indexOf(",")!=-1) { + //关联表字典(举例:sys_user,realname,id) + String[] params = dictCode.split(","); + if(params.length!=3) { + result.error500("字典Code格式不正确!"); + return result; + } + ls = sysDictService.queryTableDictItemsByCode(params[0],params[1],params[2]); + }else { + //字典表 + ls = sysDictService.queryDictItemsByCode(dictCode); + } + result.setSuccess(true); result.setResult(ls); + log.info(result.toString()); } catch (Exception e) { log.info(e.getMessage()); result.error500("操作失败"); return result; } - + return result; } - + /** * 获取字典数据 * @param dictCode @@ -146,7 +174,7 @@ public class SysDictController { } return result; } - + /** * @功能:新增 * @param sysDict @@ -166,7 +194,7 @@ public class SysDictController { } return result; } - + /** * @功能:编辑 * @param sysDict @@ -188,13 +216,14 @@ public class SysDictController { } return result; } - + /** * @功能:删除 * @param id * @return */ @RequestMapping(value = "/delete", method = RequestMethod.DELETE) + @CacheEvict(value="dictCache", allEntries=true) public Result<SysDict> delete(@RequestParam(name="id",required=true) String id) { Result<SysDict> result = new Result<SysDict>(); SysDict sysDict = sysDictService.getById(id); @@ -209,13 +238,14 @@ public class SysDictController { } return result; } - + /** * @功能:批量删除 * @param ids * @return */ @RequestMapping(value = "/deleteBatch", method = RequestMethod.DELETE) + @CacheEvict(value="dictCache", allEntries=true) public Result<SysDict> deleteBatch(@RequestParam(name="ids",required=true) String ids) { Result<SysDict> result = new Result<SysDict>(); if(ids==null || "".equals(ids.trim())) { @@ -231,4 +261,95 @@ public class SysDictController { } return result; } + + /** + * 导出excel + * + * @param request + * @param response + */ + @RequestMapping(value = "/exportXls") + public ModelAndView exportXls(HttpServletRequest request, HttpServletResponse response) { + // Step.1 组装查询条件 + QueryWrapper<SysDict> queryWrapper = null; + try { + String paramsStr = request.getParameter("paramsStr"); + if (oConvertUtils.isNotEmpty(paramsStr)) { + String deString = URLDecoder.decode(paramsStr, "UTF-8"); + SysDict sysDict = JSON.parseObject(deString, SysDict.class); + queryWrapper = QueryGenerator.initQueryWrapper(sysDict, request.getParameterMap()); + log.info(paramsStr); + log.info(sysDict.toString()); + } + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + + //Step.2 AutoPoi 导出Excel + ModelAndView mv = new ModelAndView(new JeecgEntityExcelView()); + List<SysDictPage> pageList = new ArrayList<SysDictPage>(); + + List<SysDict> sysDictList = sysDictService.list(queryWrapper); + for (SysDict dictMain : sysDictList) { + SysDictPage vo = new SysDictPage(); + BeanUtils.copyProperties(dictMain, vo); + // 查询机票 + List<SysDictItem> sysDictItemList = sysDictItemService.selectItemsByMainId(dictMain.getId()); + vo.setSysDictItemList(sysDictItemList); + pageList.add(vo); + } + + // 导出文件名称 + mv.addObject(NormalExcelConstants.FILE_NAME, "数据字典"); + // 注解对象Class + mv.addObject(NormalExcelConstants.CLASS, SysDictPage.class); + // 自定义表格参数 + mv.addObject(NormalExcelConstants.PARAMS, new ExportParams("数据字典列表", "导出人:Jeecg", "数据字典")); + // 导出数据列表 + mv.addObject(NormalExcelConstants.DATA_LIST, pageList); + return mv; + } + + /** + * 通过excel导入数据 + * + * @param request + * @param + * @return + */ + @RequestMapping(value = "/importExcel", method = RequestMethod.POST) + public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) { + MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request; + Map<String, MultipartFile> fileMap = multipartRequest.getFileMap(); + for (Map.Entry<String, MultipartFile> entity : fileMap.entrySet()) { + MultipartFile file = entity.getValue();// 获取上传文件对象 + ImportParams params = new ImportParams(); + params.setTitleRows(2); + params.setHeadRows(2); + params.setNeedSave(true); + try { + List<SysDictPage> list = ExcelImportUtil.importExcel(file.getInputStream(), SysDictPage.class, params); + for (SysDictPage page : list) { + SysDict po = new SysDict(); + BeanUtils.copyProperties(page, po); + if(page.getDelFlag()==null){ + po.setDelFlag(1); + } + sysDictService.saveMain(po, page.getSysDictItemList()); + } + return Result.ok("文件导入成功!"); + } catch (Exception e) { + log.error(e.toString()); + return Result.ok("文件导入失败!"); + } finally { + try { + file.getInputStream().close(); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + return Result.ok("文件导入失败!"); + } + } 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 index 754497c..e7584d6 100644 --- 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 @@ -7,10 +7,12 @@ import java.util.Date; import javax.servlet.http.HttpServletRequest; import org.jeecg.common.api.vo.Result; +import org.jeecg.common.system.query.QueryGenerator; 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.cache.annotation.CacheEvict; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; @@ -51,29 +53,10 @@ public class SysDictItemController { 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 一个强大的功能,前端传一个字段字符串,后台只返回这些字符串对应的字段 - //创建时间/创建人的赋值 + QueryWrapper<SysDictItem> queryWrapper = QueryGenerator.initQueryWrapper(sysDictItem, req.getParameterMap()); + queryWrapper.orderByAsc("sort_order"); + Page<SysDictItem> page = new Page<SysDictItem>(pageNo, pageSize); 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; @@ -85,6 +68,7 @@ public class SysDictItemController { * @return */ @RequestMapping(value = "/add", method = RequestMethod.POST) + @CacheEvict(value="dictCache", allEntries=true) public Result<SysDictItem> add(@RequestBody SysDictItem sysDictItem) { Result<SysDictItem> result = new Result<SysDictItem>(); try { @@ -105,6 +89,7 @@ public class SysDictItemController { * @return */ @RequestMapping(value = "/edit", method = RequestMethod.PUT) + @CacheEvict(value="dictCache", allEntries=true) public Result<SysDictItem> edit(@RequestBody SysDictItem sysDictItem) { Result<SysDictItem> result = new Result<SysDictItem>(); SysDictItem sysdict = sysDictItemService.getById(sysDictItem.getId()); @@ -127,6 +112,7 @@ public class SysDictItemController { * @return */ @RequestMapping(value = "/delete", method = RequestMethod.DELETE) + @CacheEvict(value="dictCache", allEntries=true) public Result<SysDictItem> delete(@RequestParam(name="id",required=true) String id) { Result<SysDictItem> result = new Result<SysDictItem>(); SysDictItem joinSystem = sysDictItemService.getById(id); @@ -147,6 +133,7 @@ public class SysDictItemController { * @return */ @RequestMapping(value = "/deleteBatch", method = RequestMethod.DELETE) + @CacheEvict(value="dictCache", allEntries=true) public Result<SysDictItem> deleteBatch(@RequestParam(name="ids",required=true) String ids) { Result<SysDictItem> result = new Result<SysDictItem>(); if(ids==null || "".equals(ids.trim())) { 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 index b3c152e..e4347f6 100644 --- 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 @@ -6,6 +6,7 @@ import java.util.Arrays; import javax.servlet.http.HttpServletRequest; import org.jeecg.common.api.vo.Result; +import org.jeecg.common.system.query.QueryGenerator; import org.jeecg.common.util.oConvertUtils; import org.jeecg.modules.system.entity.SysLog; import org.jeecg.modules.system.entity.SysRole; @@ -50,25 +51,8 @@ public class SysLogController { 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)); - } - } + QueryWrapper<SysLog> queryWrapper = QueryGenerator.initQueryWrapper(syslog, req.getParameterMap()); + Page<SysLog> page = new Page<SysLog>(pageNo, pageSize); //日志关键词 String keyWord = req.getParameter("keyWord"); if(oConvertUtils.isNotEmpty(keyWord)) { 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 index e7ca64c..3c8372c 100644 --- 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 @@ -2,6 +2,8 @@ package org.jeecg.modules.system.controller; import java.util.ArrayList; + +import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -14,11 +16,14 @@ 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.SysPermissionDataRule; 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.ISysPermissionDataRuleService; import org.jeecg.modules.system.service.ISysPermissionService; import org.jeecg.modules.system.service.ISysRolePermissionService; +import org.jeecg.modules.system.util.PermissionDataUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; @@ -52,6 +57,9 @@ public class SysPermissionController { @Autowired private ISysRolePermissionService sysRolePermissionService; + @Autowired + private ISysPermissionDataRuleService sysPermissionDataRuleService; + /** * 加载数据节点 @@ -59,7 +67,6 @@ public class SysPermissionController { */ @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>(); @@ -78,7 +85,7 @@ public class SysPermissionController { /** - * 查询用户的权限 + * 查询用户拥有的菜单权限和按钮权限(根据用户账号) * @return */ @RequestMapping(value = "/queryByUser", method = RequestMethod.GET) @@ -102,10 +109,11 @@ public class SysPermissionController { @RequestMapping(value = "/add", method = RequestMethod.POST) - @RequiresRoles({"admin"}) + public Result<SysPermission> add(@RequestBody SysPermission permission) { Result<SysPermission> result = new Result<SysPermission>(); try { + permission = PermissionDataUtil.intelligentProcessData(permission); sysPermissionService.addPermission(permission); result.success("添加成功!"); } catch (Exception e) { @@ -117,10 +125,11 @@ public class SysPermissionController { } @RequestMapping(value = "/edit", method = {RequestMethod.PUT,RequestMethod.POST}) - @RequiresRoles({"admin"}) - public Result<SysPermission> eidt(@RequestBody SysPermission permission) { + + public Result<SysPermission> edit(@RequestBody SysPermission permission) { Result<SysPermission> result = new Result<>(); try { + permission = PermissionDataUtil.intelligentProcessData(permission); sysPermissionService.editPermission(permission); result.success("修改成功!"); } catch (Exception e) { @@ -132,11 +141,12 @@ public class SysPermissionController { } @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); + sysPermissionService.deletePermRuleByPermId(id); result.success("删除成功!"); } catch (Exception e) { e.printStackTrace(); @@ -147,7 +157,7 @@ public class SysPermissionController { @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 { @@ -182,8 +192,6 @@ public class SysPermissionController { for(SysPermission sysPer : list) { ids.add(sysPer.getId()); } - - System.out.println(list.size()); List<TreeModel> treeList = new ArrayList<>(); getTreeModelList(treeList, list, null); @@ -243,6 +251,7 @@ public class SysPermissionController { * @return */ @RequestMapping(value = "/saveRolePermission", method = RequestMethod.POST) + public Result<String> saveRolePermission(@RequestBody JSONObject json) { Result<String> result = new Result<>(); try { @@ -264,12 +273,12 @@ public class SysPermissionController { SysPermissionTree tree = new SysPermissionTree(permission); if(temp==null && oConvertUtils.isEmpty(tempPid)) { treeList.add(tree); - if(tree.getIsLeaf()==0) { + if(!tree.getIsLeaf()) { getTreeList(treeList, metaList, tree); } }else if(temp!=null && tempPid!=null && tempPid.equals(temp.getId())){ temp.getChildren().add(tree); - if(tree.getIsLeaf()==0) { + if(!tree.getIsLeaf()) { getTreeList(treeList, metaList, tree); } } @@ -283,12 +292,12 @@ public class SysPermissionController { TreeModel tree = new TreeModel(permission); if(temp==null && oConvertUtils.isEmpty(tempPid)) { treeList.add(tree); - if(permission.getIsLeaf()==0) { + if(!tree.getIsLeaf()) { getTreeModelList(treeList, metaList, tree); } }else if(temp!=null && tempPid!=null && tempPid.equals(temp.getKey())){ temp.getChildren().add(tree); - if(permission.getIsLeaf()==0) { + if(!tree.getIsLeaf()) { getTreeModelList(treeList, metaList, tree); } } @@ -310,11 +319,12 @@ public class SysPermissionController { JSONObject json = getPermissionJsonObject(permission); if(parentJson==null && oConvertUtils.isEmpty(tempPid)) { jsonArray.add(json); - if(permission.getIsLeaf()==0) { + if(!permission.isLeaf()) { getPermissionJsonArray(jsonArray, metaList, json); } }else if(parentJson!=null && oConvertUtils.isNotEmpty(tempPid) && tempPid.equals(parentJson.getString("id"))){ - if(permission.getMenuType()==0) { + //类型( 0:一级菜单 1:子菜单 2:按钮 ) + if(permission.getMenuType()==2) { JSONObject metaJson = parentJson.getJSONObject("meta"); if(metaJson.containsKey("permissionList")) { metaJson.getJSONArray("permissionList").add(json); @@ -323,8 +333,8 @@ public class SysPermissionController { permissionList.add(json); metaJson.put("permissionList", permissionList); } - - }else if(permission.getMenuType()==1) { + //类型( 0:一级菜单 1:子菜单 2:按钮 ) + }else if(permission.getMenuType()==1|| permission.getMenuType()==0) { if(parentJson.containsKey("children")) { parentJson.getJSONArray("children").add(json); }else { @@ -333,7 +343,7 @@ public class SysPermissionController { parentJson.put("children", children); } - if(permission.getIsLeaf()==0) { + if(!permission.isLeaf()) { getPermissionJsonArray(jsonArray, metaList, json); } } @@ -351,14 +361,24 @@ public class SysPermissionController { 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://"))) { + if(permission.isRoute()) { + json.put("route", "1");//表示生成路由 + }else { + json.put("route", "0");//表示不生成路由 + } + + if(isWWWHttpUrl(permission.getUrl())) { 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(oConvertUtils.isNotEmpty(permission.getComponentName())) { + json.put("name", permission.getComponentName()); + }else { + json.put("name", urlToRouteName(permission.getUrl())); + } //是否隐藏路由,默认都是显示的 if(permission.isHidden()) { @@ -370,15 +390,21 @@ public class SysPermissionController { } json.put("component", permission.getComponent()); JSONObject meta = new JSONObject(); + //默认所有的菜单都加路由缓存,提高系统性能 + meta.put("keepAlive", "true"); meta.put("title", permission.getName()); if(oConvertUtils.isEmpty(permission.getParentId())) { //一级菜单跳转地址 json.put("redirect",permission.getRedirect()); - meta.put("icon", oConvertUtils.getString(permission.getIcon(), "")); + if(oConvertUtils.isNotEmpty(permission.getIcon())) { + meta.put("icon", permission.getIcon()); + } }else { - meta.put("icon", oConvertUtils.getString(permission.getIcon(), "")); + if(oConvertUtils.isNotEmpty(permission.getIcon())) { + meta.put("icon", permission.getIcon()); + } } - if(permission.getUrl()!=null&&(permission.getUrl().startsWith("http://")||permission.getUrl().startsWith("https://"))) { + if(isWWWHttpUrl(permission.getUrl())) { meta.put("url", permission.getUrl()); } json.put("meta", meta); @@ -388,6 +414,20 @@ public class SysPermissionController { } /** + * 判断是否外网URL 例如: http://localhost:8080/jeecg-boot/swagger-ui.html#/ + * 支持特殊格式: {{ window._CONFIG['domianURL'] }}/druid/ + * {{ JS代码片段 }},前台解析会自动执行JS代码片段 + * + * @return + */ + private boolean isWWWHttpUrl(String url) { + if (url != null && (url.startsWith("http://") || url.startsWith("https://") || url.startsWith("{{"))) { + return true; + } + return false; + } + + /** * 通过URL生成路由name(去掉URL前缀斜杠,替换内容中的斜杠‘/’为-) * 举例: URL = /isystem/role * RouteName = isystem-role @@ -399,10 +439,104 @@ public class SysPermissionController { url = url.substring(1); } url = url.replace("/", "-"); + + //特殊标记 + url = url.replace(":", "@"); return url; }else { return null; } } -} \ No newline at end of file + /** + * 根据菜单id来获取其对应的权限数据 + * + * @param sysPermissionDataRule + * @return + */ + @RequestMapping(value = "/getPermRuleListByPermId", method = RequestMethod.GET) + public Result<List<SysPermissionDataRule>> getPermRuleListByPermId(SysPermissionDataRule sysPermissionDataRule) { + List<SysPermissionDataRule> permRuleList = sysPermissionDataRuleService.getPermRuleListByPermId(sysPermissionDataRule.getPermissionId()); + Result<List<SysPermissionDataRule>> result = new Result<>(); + result.setSuccess(true); + result.setResult(permRuleList); + return result; + } + + /** + * 添加菜单权限数据 + * + * @param sysPermissionDataRule + * @return + */ + @RequestMapping(value = "/addPermissionRule", method = RequestMethod.POST) + public Result<SysPermissionDataRule> addPermissionRule(@RequestBody SysPermissionDataRule sysPermissionDataRule) { + Result<SysPermissionDataRule> result = new Result<SysPermissionDataRule>(); + try { + sysPermissionDataRule.setCreateTime(new Date()); + sysPermissionDataRuleService.save(sysPermissionDataRule); + result.success("添加成功!"); + } catch (Exception e) { + e.printStackTrace(); + log.info(e.getMessage()); + result.error500("操作失败"); + } + return result; + } + + @RequestMapping(value = "/editPermissionRule", method = { RequestMethod.PUT, RequestMethod.POST }) + public Result<SysPermissionDataRule> editPermissionRule(@RequestBody SysPermissionDataRule sysPermissionDataRule) { + Result<SysPermissionDataRule> result = new Result<SysPermissionDataRule>(); + try { + sysPermissionDataRuleService.saveOrUpdate(sysPermissionDataRule); + result.success("更新成功!"); + } catch (Exception e) { + e.printStackTrace(); + log.info(e.getMessage()); + result.error500("操作失败"); + } + return result; + } + + /** + * 删除菜单权限数据 + * + * @param sysPermissionDataRule + * @return + */ + @RequestMapping(value = "/deletePermissionRule", method = RequestMethod.DELETE) + public Result<SysPermissionDataRule> deletePermissionRule(@RequestParam(name = "id", required = true) String id) { + Result<SysPermissionDataRule> result = new Result<SysPermissionDataRule>(); + try { + sysPermissionDataRuleService.removeById(id); + result.success("删除成功!"); + } catch (Exception e) { + e.printStackTrace(); + log.info(e.getMessage()); + result.error500("操作失败"); + } + return result; + } + + /** + * 查询菜单权限数据 + * + * @param sysPermissionDataRule + * @return + */ + @RequestMapping(value = "/queryPermissionRule", method = RequestMethod.GET) + public Result<List<SysPermissionDataRule>> queryPermissionRule(SysPermissionDataRule sysPermissionDataRule) { + Result<List<SysPermissionDataRule>> result = new Result<>(); + try { + List<SysPermissionDataRule> permRuleList = sysPermissionDataRuleService.queryPermissionRule(sysPermissionDataRule); + result.setResult(permRuleList); + result.success("查询成功!"); + } catch (Exception e) { + e.printStackTrace(); + log.info(e.getMessage()); + result.error500("操作失败"); + } + return result; + } + +} 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 index 21e1798..0c5be6f 100644 --- 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 @@ -1,25 +1,57 @@ package org.jeecg.modules.system.controller; +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.net.URLDecoder; +import java.util.ArrayList; import java.util.Arrays; import java.util.Date; +import java.util.HashMap; import java.util.List; +import java.util.Map; + import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; import org.apache.shiro.authz.annotation.RequiresRoles; import org.jeecg.common.api.vo.Result; +import org.jeecg.common.system.query.QueryGenerator; import org.jeecg.common.util.oConvertUtils; +import org.jeecg.modules.system.entity.SysPermission; +import org.jeecg.modules.system.entity.SysPermissionDataRule; import org.jeecg.modules.system.entity.SysRole; +import org.jeecg.modules.system.entity.SysRolePermission; +import org.jeecg.modules.system.model.TreeModel; +import org.jeecg.modules.system.service.ISysPermissionDataRuleService; +import org.jeecg.modules.system.service.ISysPermissionService; +import org.jeecg.modules.system.service.ISysRolePermissionService; import org.jeecg.modules.system.service.ISysRoleService; +import org.jeecgframework.poi.excel.ExcelImportUtil; +import org.jeecgframework.poi.excel.def.NormalExcelConstants; +import org.jeecgframework.poi.excel.entity.ExportParams; +import org.jeecgframework.poi.excel.entity.ImportParams; +import org.jeecgframework.poi.excel.view.JeecgEntityExcelView; import org.springframework.beans.factory.annotation.Autowired; +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.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 org.springframework.web.multipart.MultipartFile; +import org.springframework.web.multipart.MultipartHttpServletRequest; +import org.springframework.web.servlet.ModelAndView; + +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.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; + import lombok.extern.slf4j.Slf4j; /** @@ -36,6 +68,15 @@ import lombok.extern.slf4j.Slf4j; public class SysRoleController { @Autowired private ISysRoleService sysRoleService; + + @Autowired + private ISysPermissionDataRuleService sysPermissionDataRuleService; + + @Autowired + private ISysRolePermissionService sysRolePermissionService; + + @Autowired + private ISysPermissionService sysPermissionService; /** * 分页列表查询 @@ -51,27 +92,9 @@ public class SysRoleController { @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 一个强大的功能,前端传一个字段字符串,后台只返回这些字符串对应的字段 - //创建时间/创建人的赋值 + QueryWrapper<SysRole> queryWrapper = QueryGenerator.initQueryWrapper(role, req.getParameterMap()); + Page<SysRole> page = new Page<SysRole>(pageNo, pageSize); 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; @@ -103,8 +126,8 @@ public class SysRoleController { * @return */ @RequestMapping(value = "/edit", method = RequestMethod.PUT) - @RequiresRoles({"admin"}) - public Result<SysRole> eidt(@RequestBody SysRole role) { + + public Result<SysRole> edit(@RequestBody SysRole role) { Result<SysRole> result = new Result<SysRole>(); SysRole sysrole = sysRoleService.getById(role.getId()); if(sysrole==null) { @@ -127,7 +150,7 @@ public class SysRoleController { * @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); @@ -149,7 +172,7 @@ public class SysRoleController { * @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())) { @@ -229,5 +252,187 @@ public class SysRoleController { result.setSuccess(true); return result; } + + /** + * 导出excel + * @param request + * @param response + */ + @RequestMapping(value = "/exportXls") + public ModelAndView exportXls(HttpServletRequest request, HttpServletResponse response) { + // Step.1 组装查询条件 + QueryWrapper<SysRole> queryWrapper = null; + try { + String paramsStr = request.getParameter("paramsStr"); + if (oConvertUtils.isNotEmpty(paramsStr)) { + String deString = URLDecoder.decode(paramsStr, "UTF-8"); + SysRole sysRole = JSON.parseObject(deString, SysRole.class); + queryWrapper = QueryGenerator.initQueryWrapper(sysRole, request.getParameterMap()); + } + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + + //Step.2 AutoPoi 导出Excel + ModelAndView mv = new ModelAndView(new JeecgEntityExcelView()); + List<SysRole> pageList = sysRoleService.list(queryWrapper); + //导出文件名称 + mv.addObject(NormalExcelConstants.FILE_NAME,"角色列表"); + mv.addObject(NormalExcelConstants.CLASS,SysRole.class); + mv.addObject(NormalExcelConstants.PARAMS,new ExportParams("角色列表数据","导出人:Jeecg","导出信息")); + mv.addObject(NormalExcelConstants.DATA_LIST,pageList); + return mv; + } + + /** + * 通过excel导入数据 + * @param request + * @param response + * @return + */ + @RequestMapping(value = "/importExcel", method = RequestMethod.POST) + public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) { + MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request; + Map<String, MultipartFile> fileMap = multipartRequest.getFileMap(); + for (Map.Entry<String, MultipartFile> entity : fileMap.entrySet()) { + MultipartFile file = entity.getValue();// 获取上传文件对象 + ImportParams params = new ImportParams(); + params.setTitleRows(2); + params.setHeadRows(1); + params.setNeedSave(true); + try { + List<SysRole> listSysRoles = ExcelImportUtil.importExcel(file.getInputStream(), SysRole.class, params); + for (SysRole sysRoleExcel : listSysRoles) { + sysRoleService.save(sysRoleExcel); + } + return Result.ok("文件导入成功!数据行数:" + listSysRoles.size()); + } catch (Exception e) { + log.error(e.getMessage()); + return Result.error("文件导入失败!"); + } finally { + try { + file.getInputStream().close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + return Result.ok("文件导入失败!"); + } + + /** + * 查询数据规则数据 + */ + @GetMapping(value = "/datarule/{permissionId}/{roleId}") + public Result<?> loadDatarule(@PathVariable("permissionId") String permissionId,@PathVariable("roleId") String roleId) { + List<SysPermissionDataRule> list = sysPermissionDataRuleService.getPermRuleListByPermId(permissionId); + if(list==null || list.size()==0) { + return Result.error("未找到权限配置信息"); + }else { + Map<String,Object> map = new HashMap<>(); + map.put("datarule", list); + LambdaQueryWrapper<SysRolePermission> query = new LambdaQueryWrapper<SysRolePermission>() + .eq(SysRolePermission::getPermissionId, permissionId) + .eq(SysRolePermission::getRoleId,roleId); + SysRolePermission sysRolePermission = sysRolePermissionService.getOne(query); + if(sysRolePermission==null) { + //return Result.error("未找到角色菜单配置信息"); + }else { + String drChecked = sysRolePermission.getDataRuleIds(); + if(oConvertUtils.isNotEmpty(drChecked)) { + map.put("drChecked", drChecked.endsWith(",")?drChecked.substring(0, drChecked.length()-1):drChecked); + } + } + return Result.ok(map); + //TODO 以后按钮权限的查询也走这个请求 无非在map中多加两个key + } + } + + /** + * 保存数据规则至角色菜单关联表 + */ + @PostMapping(value = "/datarule") + public Result<?> saveDatarule(@RequestBody JSONObject jsonObject) { + try { + String permissionId = jsonObject.getString("permissionId"); + String roleId = jsonObject.getString("roleId"); + String dataRuleIds = jsonObject.getString("dataRuleIds"); + log.info("保存数据规则>>"+"菜单ID:"+permissionId+"角色ID:"+ roleId+"数据权限ID:"+dataRuleIds); + LambdaQueryWrapper<SysRolePermission> query = new LambdaQueryWrapper<SysRolePermission>() + .eq(SysRolePermission::getPermissionId, permissionId) + .eq(SysRolePermission::getRoleId,roleId); + SysRolePermission sysRolePermission = sysRolePermissionService.getOne(query); + if(sysRolePermission==null) { + return Result.error("请先保存角色菜单权限!"); + }else { + sysRolePermission.setDataRuleIds(dataRuleIds); + this.sysRolePermissionService.updateById(sysRolePermission); + } + } catch (Exception e) { + e.printStackTrace(); + log.info("SysRoleController.saveDatarule()发生异常:" + e.getMessage()); + return Result.error("保存失败"); + } + return Result.ok("保存成功!"); + } + + + /** + * 用户角色授权功能,查询菜单权限树 + * @param request + * @return + */ + @RequestMapping(value = "/queryTreeList", method = RequestMethod.GET) + public Result<Map<String,Object>> queryTreeList(HttpServletRequest request) { + 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) { + //查询菜单数据规则配置如果有数据 则需要在前端显示一个小图标 + int dtCount = sysPermissionDataRuleService.count(new LambdaQueryWrapper<SysPermissionDataRule>().eq(SysPermissionDataRule::getPermissionId, sysPer.getId())); + if(dtCount>0) { + sysPer.setIcon("1"); + }else { + sysPer.setIcon(null); + } + ids.add(sysPer.getId()); + } + 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; + } + + private void getTreeModelList(List<TreeModel> treeList,List<SysPermission> metaList,TreeModel temp) { + for (SysPermission permission : metaList) { + String tempPid = permission.getParentId(); + TreeModel tree = new TreeModel(permission.getId(), tempPid, permission.getName(),permission.getIcon(), permission.isLeaf()); + if(temp==null && oConvertUtils.isEmpty(tempPid)) { + treeList.add(tree); + if(!tree.getIsLeaf()) { + getTreeModelList(treeList, metaList, tree); + } + }else if(temp!=null && tempPid!=null && tempPid.equals(temp.getKey())){ + temp.getChildren().add(tree); + if(!tree.getIsLeaf()) { + getTreeModelList(treeList, metaList, tree); + } + } + + } + } + } 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 index 98738c9..541094c 100644 --- 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 @@ -1,21 +1,38 @@ package org.jeecg.modules.system.controller; +import java.io.IOException; +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 java.util.Map; +import java.util.UUID; import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; import org.apache.shiro.authz.annotation.RequiresRoles; import org.jeecg.common.api.vo.Result; +import org.jeecg.common.system.query.QueryGenerator; import org.jeecg.common.util.PasswordUtil; import org.jeecg.common.util.oConvertUtils; +import org.jeecg.modules.system.entity.SysRole; import org.jeecg.modules.system.entity.SysUser; +import org.jeecg.modules.system.entity.SysUserDepart; import org.jeecg.modules.system.entity.SysUserRole; +import org.jeecg.modules.system.model.DepartIdModel; +import org.jeecg.modules.system.model.SysUserDepartsVO; +import org.jeecg.modules.system.service.ISysUserDepartService; import org.jeecg.modules.system.service.ISysUserRoleService; import org.jeecg.modules.system.service.ISysUserService; +import org.jeecgframework.poi.excel.ExcelImportUtil; +import org.jeecgframework.poi.excel.def.NormalExcelConstants; +import org.jeecgframework.poi.excel.entity.ExportParams; +import org.jeecgframework.poi.excel.entity.ImportParams; +import org.jeecgframework.poi.excel.view.JeecgEntityExcelView; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; @@ -32,6 +49,9 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import lombok.extern.slf4j.Slf4j; +import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.multipart.MultipartHttpServletRequest; +import org.springframework.web.servlet.ModelAndView; /** * <p> @@ -45,42 +65,33 @@ import lombok.extern.slf4j.Slf4j; @RestController @RequestMapping("/sys/user") public class SysUserController { - + @Autowired private ISysUserService sysUserService; - + @Autowired private ISysUserRoleService sysUserRoleService; + @Autowired + private ISysUserDepartService sysUserDepartService; + + @Autowired + private ISysUserRoleService userRoleService; + @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 一个强大的功能,前端传一个字段字符串,后台只返回这些字符串对应的字段 - //创建时间/创建人的赋值 + QueryWrapper<SysUser> queryWrapper = QueryGenerator.initQueryWrapper(user, req.getParameterMap()); + Page<SysUser> page = new Page<SysUser>(pageNo, pageSize); 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"); @@ -102,10 +113,10 @@ public class SysUserController { } return result; } - + @RequestMapping(value = "/edit", method = RequestMethod.PUT) - @RequiresRoles({"admin"}) - public Result<SysUser> eidt(@RequestBody JSONObject jsonObject) { + + public Result<SysUser> edit(@RequestBody JSONObject jsonObject) { Result<SysUser> result = new Result<SysUser>(); try { SysUser sysUser = sysUserService.getById(jsonObject.getString("id")); @@ -127,41 +138,62 @@ public class SysUserController { } 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>(); + // 定义SysUserDepart实体类的数据库查询LambdaQueryWrapper + LambdaQueryWrapper<SysUserDepart> query = new LambdaQueryWrapper<SysUserDepart>(); SysUser sysUser = sysUserService.getById(id); if(sysUser==null) { result.error500("未找到对应实体"); }else { + // 当某个用户被删除时,删除其ID下对应的部门数据 + query.eq(SysUserDepart::getUserId, id); boolean ok = sysUserService.removeById(id); + sysUserDepartService.remove(query); 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) { + // 定义SysUserDepart实体类的数据库查询对象LambdaQueryWrapper + LambdaQueryWrapper<SysUserDepart> query = new LambdaQueryWrapper<SysUserDepart>(); + String[] idArry = ids.split(","); Result<SysUser> result = new Result<SysUser>(); if(ids==null || "".equals(ids.trim())) { result.error500("参数不识别!"); }else { this.sysUserService.removeByIds(Arrays.asList(ids.split(","))); + // 当批量删除时,删除在SysUserDepart中对应的所有部门数据 + for(String id : idArry) { + query.eq(SysUserDepart::getUserId, id); + this.sysUserDepartService.remove(query); + } result.success("删除成功!"); } return result; } + + /** + * 冻结&解冻用户 + * @param jsonObject + * @return + */ - @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) { + @RequestMapping(value = "/frozenBatch", method = RequestMethod.PUT) + public Result<SysUser> frozenBatch(@RequestBody JSONObject jsonObject) { Result<SysUser> result = new Result<SysUser>(); try { + String ids = jsonObject.getString("ids"); + String status = jsonObject.getString("status"); String[] arr = ids.split(","); for (String id : arr) { if(oConvertUtils.isNotEmpty(id)) { @@ -175,109 +207,306 @@ public class SysUserController { } 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; - } + } + + @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 sysUser + * @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) + + 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; + } + + /** + * 查询指定用户和部门关联的数据 + * + * @param userId + * @return + */ + @RequestMapping(value = "/userDepartList", method = RequestMethod.GET) + public Result<List<DepartIdModel>> getUserDepartsList(@RequestParam(name = "userId", required = true) String userId) { + Result<List<DepartIdModel>> result = new Result<>(); + try { + List<DepartIdModel> depIdModelList = this.sysUserDepartService.queryDepartIdsOfUser(userId); + if (depIdModelList != null || depIdModelList.size() > 0) { + result.setSuccess(true); + result.setMessage("查找成功"); + result.setResult(depIdModelList); + } else { + result.setSuccess(false); + result.setMessage("查找失败"); + } + return result; + } catch (Exception e) { + e.fillInStackTrace(); + result.setSuccess(false); + result.setMessage("查找过程中出现了异常: " + e.getMessage()); + return result; + } + + } + + /** + * 给指定用户添加对应的部门 + * + * @param sysUserDepartsVO + * @return + */ + @RequestMapping(value = "/addUDepartIds", method = RequestMethod.POST) + public Result<String> addSysUseWithrDepart(@RequestBody SysUserDepartsVO sysUserDepartsVO) { + boolean ok = this.sysUserDepartService.addSysUseWithrDepart(sysUserDepartsVO); + Result<String> result = new Result<String>(); + try { + if (ok) { + result.setMessage("添加成功!"); + result.setSuccess(true); + } else { + throw new Exception("添加失败!"); + } + return result; + } catch (Exception e) { + e.fillInStackTrace(); + result.setSuccess(true); + result.setMessage("添加数据的过程中出现市场了: " + e.getMessage()); + return result; + } + + } + + /** + * 根据用户id编辑对应的部门信息 + * + * @param sysUserDepartsVO + * @return + */ + @RequestMapping(value = "/editUDepartIds", method = RequestMethod.PUT) + public Result<String> editSysUserWithDepart(@RequestBody SysUserDepartsVO sysUserDepartsVO) { + Result<String> result = new Result<String>(); + boolean ok = sysUserDepartService.editSysUserWithDepart(sysUserDepartsVO); + if (ok) { + result.setMessage("更新成功!"); + result.setSuccess(true); + return result; + } + result.setMessage("更新失败!"); + result.setSuccess(false); + return result; + } + + /** + * 生成在添加用户情况下没有主键的问题,返回给前端,根据该id绑定部门数据 + * + * @return + */ + @RequestMapping(value = "/generateUserId", method = RequestMethod.GET) + public Result<String> generateUserId() { + Result<String> result = new Result<>(); + System.out.println("我执行了,生成用户ID=============================="); + String userId = UUID.randomUUID().toString().replace("-", ""); + result.setSuccess(true); + result.setResult(userId); + return result; + } + + /** + * 根据部门id查询用户信息 + * + * @param id + * @return + */ + @RequestMapping(value = "/queryUserByDepId", method = RequestMethod.GET) + public Result<List<SysUser>> queryUserByDepId(@RequestParam(name = "id", required = true) String id) { + Result<List<SysUser>> result = new Result<>(); + List<SysUser> userList = sysUserDepartService.queryUserByDepId(id); + try { + result.setSuccess(true); + result.setResult(userList); + return result; + } catch (Exception e) { + e.fillInStackTrace(); + result.setSuccess(false); + return result; + } + } + + /** + * 查询所有用户所对应的角色信息 + * + * @return + */ + @RequestMapping(value = "/queryUserRoleMap", method = RequestMethod.GET) + public Result<Map<String, String>> queryUserRole() { + Result<Map<String, String>> result = new Result<>(); + Map<String, String> map = userRoleService.queryUserRole(); + result.setResult(map); + result.setSuccess(true); + return result; + } + + /** + * 导出excel + * + * @param request + * @param response + */ + @RequestMapping(value = "/exportXls") + public ModelAndView exportXls(HttpServletRequest request, HttpServletResponse response) { + // Step.1 组装查询条件 + QueryWrapper<SysUser> queryWrapper = null; + try { + String paramsStr = request.getParameter("paramsStr"); + if (oConvertUtils.isNotEmpty(paramsStr)) { + String deString = URLDecoder.decode(paramsStr, "UTF-8"); + SysUser sysUser = JSON.parseObject(deString, SysUser.class); + queryWrapper = QueryGenerator.initQueryWrapper(sysUser, request.getParameterMap()); + } + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + + //Step.2 AutoPoi 导出Excel + ModelAndView mv = new ModelAndView(new JeecgEntityExcelView()); + List<SysUser> pageList = sysUserService.list(queryWrapper); + //导出文件名称 + mv.addObject(NormalExcelConstants.FILE_NAME, "用户列表"); + mv.addObject(NormalExcelConstants.CLASS, SysUser.class); + mv.addObject(NormalExcelConstants.PARAMS, new ExportParams("用户列表数据", "导出人:Jeecg", "导出信息")); + mv.addObject(NormalExcelConstants.DATA_LIST, pageList); + return mv; + } + /** + * 通过excel导入数据 + * + * @param request + * @param response + * @return + */ + @RequestMapping(value = "/importExcel", method = RequestMethod.POST) + public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) { + MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request; + Map<String, MultipartFile> fileMap = multipartRequest.getFileMap(); + for (Map.Entry<String, MultipartFile> entity : fileMap.entrySet()) { + MultipartFile file = entity.getValue();// 获取上传文件对象 + ImportParams params = new ImportParams(); + params.setTitleRows(2); + params.setHeadRows(1); + params.setNeedSave(true); + try { + List<SysUser> listSysUsers = ExcelImportUtil.importExcel(file.getInputStream(), SysUser.class, params); + for (SysUser sysUserExcel : listSysUsers) { + if (sysUserExcel.getPassword() == null) { + // 密码默认为“123456” + sysUserExcel.setPassword("123456"); + } + sysUserService.save(sysUserExcel); + } + return Result.ok("文件导入成功!数据行数:" + listSysUsers.size()); + } catch (Exception e) { + log.error(e.getMessage()); + return Result.error("文件导入失败!"); + } finally { + try { + file.getInputStream().close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + return Result.ok("文件导入失败!"); + } } 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 index 2869733..f907623 100644 --- 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 @@ -2,11 +2,14 @@ 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.jeecg.common.aspect.annotation.Dict; +import org.jeecgframework.poi.excel.annotation.Excel; import org.springframework.format.annotation.DateTimeFormat; /** @@ -19,52 +22,99 @@ import org.springframework.format.annotation.DateTimeFormat; @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; + + /** + * id + */ + @TableId(type = IdType.UUID) + private java.lang.String id; + /** + * 标题 + */ + @Excel(name = "标题", width = 15) + private java.lang.String titile; + /** + * 内容 + */ + @Excel(name = "内容", width = 30) + private java.lang.Object msgContent; + /** + * 开始时间 + */ + @Excel(name = "开始时间", width = 15, format = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private java.util.Date startTime; + /** + * 结束时间 + */ + @Excel(name = "结束时间", width = 15, format = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private java.util.Date endTime; + /** + * 发布人 + */ + @Excel(name = "发布人", width = 15) + private java.lang.String sender; + /** + * 优先级(L低,M中,H高) + */ + @Excel(name = "优先级", width = 15) + @Dict(dicCode = "priority") + private java.lang.String priority; + /** + * 通告对象类型(USER:指定用户,ALL:全体用户) + */ + @Excel(name = "通告对象类型", width = 15) + @Dict(dicCode = "msg_type") + private java.lang.String msgType; + /** + * 发布状态(0未发布,1已发布,2已撤销) + */ + @Excel(name = "发布状态", width = 15) + @Dict(dicCode = "send_status") + private java.lang.String sendStatus; + /** + * 发布时间 + */ + @Excel(name = "发布时间", width = 15, format = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private java.util.Date sendTime; + /** + * 撤销时间 + */ + @Excel(name = "撤销时间", width = 15, format = "yyyy-MM-dd HH:mm:ss") + @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/SysDataLog.java b/jeecg-boot/src/main/java/org/jeecg/modules/system/entity/SysDataLog.java new file mode 100644 index 0000000..eec47b5 --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/system/entity/SysDataLog.java @@ -0,0 +1,36 @@ +package org.jeecg.modules.system.entity; + +import java.io.Serializable; +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; + +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +public class SysDataLog implements Serializable { + private static final long serialVersionUID = 1L; + + @TableId(type = IdType.UUID) + private String id; //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; //更新人登录名称 + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + private Date updateTime; //更新日期 + private String dataTable; //表名 + private String dataId; //数据ID + private String dataContent; //数据内容 + private String dataVersion; //版本号 +} 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 index 88e8881..f007f07 100644 --- 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 @@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonFormat; import lombok.Data; +import org.jeecg.common.aspect.annotation.Dict; import org.jeecg.modules.system.model.SysDepartTreeModel; import org.springframework.format.annotation.DateTimeFormat; @@ -54,8 +55,11 @@ public class SysDepart implements Serializable { /**备注*/ private String memo; /**状态(1启用,0不启用)*/ + @Dict(dicCode = "depart_status") private String status; + /**删除状态(0,正常,1已删除)*/ + @Dict(dicCode = "del_flag") private String delFlag; /**创建人*/ private String createBy; @@ -75,9 +79,15 @@ public class SysDepart implements Serializable { */ @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; + 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) && 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 index 7adcae1..86d4491 100644 --- 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 @@ -32,6 +32,14 @@ public class SysDict implements Serializable { private String id; /** + * [预留字段,暂时无用] + * 字典类型,0 string,1 number类型,2 boolean + * 前端js对stirng类型和number类型 boolean 类型敏感,需要区分。在select 标签匹配的时候会用到 + * 默认为string类型 + */ + private Integer type; + + /** * 字典名称 */ private String dictName; 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 index ee2f2e1..c0778f9 100644 --- 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 @@ -10,10 +10,12 @@ import com.baomidou.mybatisplus.annotation.TableId; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; +import org.jeecg.common.aspect.annotation.Dict; +import org.jeecgframework.poi.excel.annotation.Excel; /** * <p> - * + * * </p> * * @author zhangweijian @@ -31,7 +33,7 @@ public class SysDictItem implements Serializable { */ @TableId(type = IdType.UUID) private String id; - + /** * 字典id */ @@ -40,26 +42,32 @@ public class SysDictItem implements Serializable { /** * 字典项文本 */ + @Excel(name = "字典项文本", width = 20) private String itemText; /** * 字典项值 */ + @Excel(name = "字典项值", width = 30) private String itemValue; /** * 描述 */ + @Excel(name = "描述", width = 40) private String description; /** * 排序 */ - private BigDecimal sortOrder; + @Excel(name = "排序", width = 15,type=4) + private Integer sortOrder; + /** * 状态(1启用 0不启用) */ + @Dict(dicCode = "dict_item_status") private Integer status; private String createBy; 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 index 8ac2a50..29387ae 100644 --- 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 @@ -1,6 +1,8 @@ package org.jeecg.modules.system.entity; import java.util.Date; + +import org.jeecg.common.aspect.annotation.Dict; import org.springframework.format.annotation.DateTimeFormat; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; @@ -98,6 +100,7 @@ public class SysLog implements Serializable { /** * 日志类型(1登录日志,2操作日志) */ + @Dict(dicCode = "log_type") private Integer logType; /** 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 index 5688ded..2dfb1b0 100644 --- 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 @@ -3,10 +3,12 @@ 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.TableField; import com.baomidou.mybatisplus.annotation.TableId; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; +import org.jeecg.common.aspect.annotation.Dict; /** * <p> @@ -53,6 +55,11 @@ public class SysPermission implements Serializable { * 组件 */ private String component; + + /** + * 组件名字 + */ + private String componentName; /** * 路径 @@ -71,12 +78,20 @@ public class SysPermission implements Serializable { /** * 类型(0:一级菜单;1:子菜单 ;2:按钮权限) */ + @Dict(dicCode = "menu_type") private Integer menuType; /** - * 是否叶子节点: 1:是 0:不是 + * 是否叶子节点: 1:是 0:不是 + */ + @TableField(value="is_leaf") + private boolean leaf; + + /** + * 是否路由菜单: 0:不是 1:是(默认值1) */ - private Integer isLeaf; + @TableField(value="is_route") + private boolean route; /** * 描述 diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/system/entity/SysPermissionDataRule.java b/jeecg-boot/src/main/java/org/jeecg/modules/system/entity/SysPermissionDataRule.java new file mode 100644 index 0000000..d85a7eb --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/system/entity/SysPermissionDataRule.java @@ -0,0 +1,78 @@ +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 huangzhilin + * @since 2019-03-29 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +public class SysPermissionDataRule implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * id + */ + @TableId(type = IdType.UUID) + private String id; + + /** + * 对应的菜单id + */ + private String permissionId; + + /** + * 规则名称 + */ + private String ruleName; + + /** + * 字段 + */ + private String ruleColumn; + + /** + * 条件 + */ + private String ruleConditions; + + /** + * 规则值 + */ + private String ruleValue; + + /** + * 创建时间 + */ + private Date createTime; + + /** + * 创建人 + */ + private String createBy; + + /** + * 修改时间 + */ + private Date updateTime; + + /** + * 修改人 + */ + private String updateBy; +} 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 index 5933454..5b5f181 100644 --- 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 @@ -4,6 +4,7 @@ import java.io.Serializable; import java.time.LocalDateTime; import java.util.Date; +import org.jeecgframework.poi.excel.annotation.Excel; import org.springframework.format.annotation.DateTimeFormat; import com.baomidou.mybatisplus.annotation.IdType; @@ -38,16 +39,19 @@ public class SysRole implements Serializable { /** * 角色名称 */ + @Excel(name="角色名",width=15) private String roleName; /** * 角色编码 */ + @Excel(name="角色编码",width=15) private String roleCode; /** * 描述 */ + @Excel(name="描述",width=60) private String description; /** 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 index 61cdb3c..ec79162 100644 --- 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 @@ -39,6 +39,11 @@ public class SysRolePermission implements Serializable { * 权限id */ private String permissionId; + + /** + * 数据权限 + */ + private String dataRuleIds; public SysRolePermission() { } 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 index 13fa1a2..d7a66dc 100644 --- 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 @@ -1,8 +1,9 @@ package org.jeecg.modules.system.entity; -import java.time.LocalDateTime; import java.util.Date; +import org.jeecg.common.aspect.annotation.Dict; +import org.jeecgframework.poi.excel.annotation.Excel; import org.springframework.format.annotation.DateTimeFormat; import com.baomidou.mybatisplus.annotation.IdType; @@ -10,6 +11,7 @@ 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; @@ -34,15 +36,17 @@ public class SysUser implements Serializable { */ @TableId(type = IdType.UUID) private String id; - + /** * 登录账号 */ + @Excel(name = "登录账号", width = 15) private String username; /** * 真实姓名 */ + @Excel(name = "真实姓名", width = 15) private String realname; /** @@ -58,38 +62,47 @@ public class SysUser implements Serializable { /** * 头像 */ + @Excel(name = "头像", width = 15) private String avatar; /** * 生日 */ - @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd") - @DateTimeFormat(pattern="yyyy-MM-dd") + @Excel(name = "生日", width = 15, format = "yyyy-MM-dd") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd") + @DateTimeFormat(pattern = "yyyy-MM-dd") private Date birthday; /** * 性别(1:男 2:女) */ + @Excel(name = "性别", width = 15,dicCode="sex") + @Dict(dicCode = "sex") private Integer sex; /** * 电子邮件 */ + @Excel(name = "电子邮件", width = 15) private String email; /** * 电话 */ + @Excel(name = "电话", width = 15) private String phone; /** * 状态(1:正常 2:冻结 ) */ + @Excel(name = "状态", width = 15,dicCode="user_status") + @Dict(dicCode = "user_status") private Integer status; /** * 删除状态(0,正常,1已删除) */ + @Excel(name = "删除状态", width = 15,dicCode="del_flag") private String delFlag; /** diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/system/entity/SysUserDepart.java b/jeecg-boot/src/main/java/org/jeecg/modules/system/entity/SysUserDepart.java new file mode 100644 index 0000000..474ace1 --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/system/entity/SysUserDepart.java @@ -0,0 +1,29 @@ +package org.jeecg.modules.system.entity; + +import java.io.Serializable; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; + +import lombok.Data; +@Data +@TableName("sys_user_depart") +public class SysUserDepart implements Serializable { + private static final long serialVersionUID = 1L; + + /**主键id*/ + @TableId(type = IdType.UUID) + private String id; + /**用户id*/ + private String userId; + /**部门id*/ + private String depId; + public SysUserDepart(String id, String userId, String depId) { + super(); + this.id = id; + this.userId = userId; + this.depId = depId; + } + +} diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/system/mapper/SysDataLogMapper.java b/jeecg-boot/src/main/java/org/jeecg/modules/system/mapper/SysDataLogMapper.java new file mode 100644 index 0000000..e6abc3b --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/system/mapper/SysDataLogMapper.java @@ -0,0 +1,17 @@ +package org.jeecg.modules.system.mapper; + +import org.apache.ibatis.annotations.Param; +import org.jeecg.modules.system.entity.SysDataLog; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +public interface SysDataLogMapper extends BaseMapper<SysDataLog>{ + /** + * 通过表名及数据Id获取最大版本 + * @param tableName + * @param dataId + * @return + */ + public String queryMaxDataVer(@Param("tableName") String tableName,@Param("dataId") String dataId); + +} 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 index 65d66dc..45457e9 100644 --- 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 @@ -17,4 +17,9 @@ import java.util.List; * @Since: 2019-01-22 */ public interface SysDepartMapper extends BaseMapper<SysDepart> { + + /** + * 根据用户ID查询部门集合 + */ + public List<SysDepart> queryUserDeparts(@Param("userId") String userId); } 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 index e92eec0..dbf85bd 100644 --- 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 @@ -1,16 +1,20 @@ package org.jeecg.modules.system.mapper; +import org.apache.ibatis.annotations.Select; import org.jeecg.modules.system.entity.SysDictItem; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import java.util.List; + /** * <p> - * Mapper 接口 + * Mapper 接口 * </p> * * @author zhangweijian * @since 2018-12-28 */ public interface SysDictItemMapper extends BaseMapper<SysDictItem> { - + @Select("SELECT * FROM SYS_DICT_ITEM WHERE DICT_ID = #{mainId}") + public List<SysDictItem> selectItemsByMainId(String mainId); } 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 index 001e28b..62afdb5 100644 --- 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 @@ -5,6 +5,8 @@ import java.util.Map; import org.apache.ibatis.annotations.Param; import org.jeecg.modules.system.entity.SysDict; +import org.jeecg.modules.system.model.DuplicateCheckVo; + import com.baomidou.mybatisplus.core.mapper.BaseMapper; /** @@ -17,8 +19,20 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; */ public interface SysDictMapper extends BaseMapper<SysDict> { - public List<Map<String,String>> queryDictItemsByCode(@Param("code") String code); + /** + * 重复检查SQL + * @return + */ + public Long duplicateCheckCountSql(DuplicateCheckVo duplicateCheckVo); + public Long duplicateCheckCountSqlNoDataId(DuplicateCheckVo duplicateCheckVo); + public List<Map<String,Object>> queryDictItemsByCode(@Param("code") String code); + public List<Map<String,Object>> queryTableDictItemsByCode(@Param("table") String table,@Param("text") String text,@Param("code") String code); + + public String queryDictTextByKey(@Param("code") String code,@Param("key") String key); + public String queryTableDictTextByKey(@Param("table") String table,@Param("text") String text,@Param("code") String code,@Param("key") String key); + + } diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/system/mapper/SysPermissionDataRuleMapper.java b/jeecg-boot/src/main/java/org/jeecg/modules/system/mapper/SysPermissionDataRuleMapper.java new file mode 100644 index 0000000..7f9ef41 --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/system/mapper/SysPermissionDataRuleMapper.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.SysPermissionDataRule; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + * <p> + * 权限规则 Mapper 接口 + * </p> + * + * @author huangzhilin + * @since 2019-04-01 + */ +public interface SysPermissionDataRuleMapper extends BaseMapper<SysPermissionDataRule> { + + /** + * 根据用户名和权限id查询 + * @param username + * @param permissionId + * @return + */ + public List<String> queryDataRuleIds(@Param("username") String username,@Param("permissionId") String permissionId); + +} 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 index 37e3c0c..0b45d6a 100644 --- 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 @@ -3,6 +3,8 @@ package org.jeecg.modules.system.mapper; import java.util.List; import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; +import org.apache.ibatis.annotations.Update; import org.jeecg.modules.system.entity.SysPermission; import org.jeecg.modules.system.model.TreeModel; @@ -17,12 +19,26 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; * @since 2018-12-21 */ public interface SysPermissionMapper extends BaseMapper<SysPermission> { - + /** + * 通过父菜单ID查询子菜单 + * @param parentId + * @return + */ public List<TreeModel> queryListByParentId(@Param("parentId") String parentId); /** * 根据用户查询用户权限 */ public List<SysPermission> queryByUser(@Param("username") String username); + + /** + * 修改菜单状态字段: 是否子节点 + */ + @Update("update sys_permission set is_leaf=#{leaf} where id = #{id}") + public int setMenuLeaf(@Param("id") String id,@Param("leaf") int leaf); + + + @Select("SELECT url FROM sys_permission WHERE del_flag = 0 and menu_type = 2 and url like '%*%'") + public List<String> queryPermissionUrlWithStar(); } diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/system/mapper/SysUserDepartMapper.java b/jeecg-boot/src/main/java/org/jeecg/modules/system/mapper/SysUserDepartMapper.java new file mode 100644 index 0000000..6dbfb6f --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/system/mapper/SysUserDepartMapper.java @@ -0,0 +1,14 @@ +package org.jeecg.modules.system.mapper; + +import java.util.List; + +import org.jeecg.modules.system.entity.SysUserDepart; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +import io.lettuce.core.dynamic.annotation.Param; + +public interface SysUserDepartMapper extends BaseMapper<SysUserDepart>{ + + List<SysUserDepart> getUserDepartByUid(@Param("userId") String userId); +} 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 index c9ec7ea..d6cc2d1 100644 --- 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 @@ -14,6 +14,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; */ public interface SysUserMapper extends BaseMapper<SysUser> { /** + * 通过用户账号查询用户信息 * @param username * @return */ diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/system/mapper/xml/SysDataLogMapper.xml b/jeecg-boot/src/main/java/org/jeecg/modules/system/mapper/xml/SysDataLogMapper.xml new file mode 100644 index 0000000..29b9c3a --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/system/mapper/xml/SysDataLogMapper.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.SysDataLogMapper"> + <!-- 通过表名及数据Id获取最大版本 --> + <select id="queryMaxDataVer" parameterType="String" resultType="String"> + select max(data_version) as mvn from sys_data_log + where data_table = #{tableName} and data_id =#{dataId} + </select> + +</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 index 9dfdfe7..3347151 100644 --- 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 @@ -1,4 +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.SysDepartMapper"> + + <select id="queryUserDeparts" parameterType="String" resultType="org.jeecg.modules.system.entity.SysDepart"> + select a.* from sys_depart a + join sys_user_depart b on a.id = b.dep_id + where b.user_id = #{userId} + </select> </mapper> \ No newline at end of file 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 index 5982b45..28c2e68 100644 --- 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 @@ -15,5 +15,25 @@ where s.dict_id = (select id from sys_dict where dict_code = #{code}) and s.item_value = #{key} </select> + + + <!--通过查询指定table的 text code 获取字典--> + <select id="queryTableDictItemsByCode" parameterType="String" resultType="java.util.HashMap"> + select ${text} as 'text',${code} as 'value' from ${table} + </select> + + <!--通过查询指定table的 text code key 获取字典值--> + <select id="queryTableDictTextByKey" parameterType="String" resultType="java.util.HashMap"> + select ${code} as 'value', ${text} as 'text' from ${table} where ${code}= #{key} + </select> + + <!-- 重复校验 sql语句 --> + <select id="duplicateCheckCountSql" resultType="Long" parameterType="org.jeecg.modules.system.model.DuplicateCheckVo"> + SELECT COUNT(*) FROM ${tableName} WHERE ${fieldName} = #{fieldVal} and id != #{dataId} + </select> + <!-- 重复校验 sql语句 --> + <select id="duplicateCheckCountSqlNoDataId" resultType="Long" parameterType="org.jeecg.modules.system.model.DuplicateCheckVo"> + SELECT COUNT(*) FROM ${tableName} WHERE ${fieldName} = #{fieldVal} + </select> </mapper> diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/system/mapper/xml/SysPermissionDataRuleMapper.xml b/jeecg-boot/src/main/java/org/jeecg/modules/system/mapper/xml/SysPermissionDataRuleMapper.xml new file mode 100644 index 0000000..eae3fb7 --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/system/mapper/xml/SysPermissionDataRuleMapper.xml @@ -0,0 +1,16 @@ +<?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.SysPermissionDataRuleMapper"> + + <!-- 查询权限 TODO 这里是不是可以不关联查找 sys_role 表 --> + <select id="queryDataRuleIds" resultType="java.lang.String"> + select data_rule_ids + from sys_role_permission a + join sys_permission b on a.permission_id = b.id + join sys_role c on a.role_id = c.id + join sys_user_role d on d.role_id = c.id + join sys_user e on d.user_id = e.id + where e.username = #{username} and b.id = #{permissionId} + </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 index decad84..bf0e42a 100644 --- 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 @@ -11,6 +11,13 @@ <result column="leaf_flag" property="isLeaf" jdbcType="INTEGER"/> </resultMap> + <!-- 通过<resultMap>映射实体类属性名和表的字段名对应关系 --> + <resultMap id="SysPermission" type="org.jeecg.modules.system.entity.SysPermission"> + <!-- result属性映射非匹配字段 --> + <result column="is_route" property="route"/> + <result column="is_leaf" property="leaf"/> + </resultMap> + <select id="queryListByParentId" parameterType="Object" resultMap="TreeModel"> SELECT @@ -31,7 +38,7 @@ </choose> </select> - <select id="queryByUser" parameterType="Object" resultType="org.jeecg.modules.system.entity.SysPermission"> + <select id="queryByUser" parameterType="Object" resultMap="SysPermission"> SELECT p.* FROM sys_permission p WHERE exists( diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/system/mapper/xml/SysUserDepartMapper.xml b/jeecg-boot/src/main/java/org/jeecg/modules/system/mapper/xml/SysUserDepartMapper.xml new file mode 100644 index 0000000..139e597 --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/system/mapper/xml/SysUserDepartMapper.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.system.mapper.SysUserDepartMapper"> + <select id="getUserDepartByUid" parameterType="String" resultType="org.jeecg.modules.system.entity.SysUserDepart"> + SELECT * + FROM sys_user_depart + WHERE user_id = #{userId, jdbcType=VARCHAR} + </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 index d5e275b..3834426 100644 --- 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 @@ -4,6 +4,8 @@ import java.io.Serializable; import java.util.ArrayList; import java.util.List; +import org.jeecg.modules.system.entity.SysDepart; + /** * <p> * 部门表 封装树结构的部门的名称的实体类 @@ -38,7 +40,19 @@ public class DepartIdModel implements Serializable { this.value = treeModel.getId(); this.title = treeModel.getDepartName(); return this; - } + } + + /** + * 该方法为用户部门的实现类所使用 + * @param sysDepart + * @return + */ + public DepartIdModel convertByUserDepart(SysDepart sysDepart) { + this.key = sysDepart.getId(); + this.value = sysDepart.getId(); + this.title = sysDepart.getDepartName(); + return this; + } public List<DepartIdModel> getChildren() { return children; diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/system/model/DuplicateCheckVo.java b/jeecg-boot/src/main/java/org/jeecg/modules/system/model/DuplicateCheckVo.java new file mode 100644 index 0000000..126acd1 --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/system/model/DuplicateCheckVo.java @@ -0,0 +1,44 @@ +package org.jeecg.modules.system.model; + +import java.io.Serializable; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Title: DuplicateCheckVo + * @Description: 重复校验VO + * @author 张代浩 + * @date 2019-03-25 + * @version V1.0 + */ +@Data +@ApiModel(value="重复校验数据模型",description="重复校验数据模型") +public class DuplicateCheckVo implements Serializable { + private static final long serialVersionUID = 1L; + + /** + * 表名 + */ + @ApiModelProperty(value="表名",name="tableName",example="sys_log") + private String tableName; + + /** + * 字段名 + */ + @ApiModelProperty(value="字段名",name="fieldName",example="id") + private String fieldName; + + /** + * 字段值 + */ + @ApiModelProperty(value="字段值",name="fieldVal",example="1000") + private String fieldVal; + + /** + * 数据ID + */ + @ApiModelProperty(value="数据ID",name="dataId",example="2000") + private String dataId; + +} \ No newline at end of file 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 index 71b62ad..9caeda6 100644 --- 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 @@ -28,8 +28,9 @@ public class SysDepartTreeModel implements Serializable{ /** 对应depart_name字段,前端数据树中的title*/ private String title; - + + private boolean isLeaf; // 以下所有字段均与SysDepart相同 private String id; @@ -101,8 +102,15 @@ public class SysDepartTreeModel implements Serializable{ this.updateBy = sysDepart.getUpdateBy(); this.updateTime = sysDepart.getUpdateTime(); } - - + + public boolean getIsLeaf() { + return isLeaf; + } + + public void setIsLeaf(boolean isleaf) { + this.isLeaf = isleaf; + } + public String getKey() { return key; } @@ -146,6 +154,9 @@ public class SysDepartTreeModel implements Serializable{ } public void setChildren(List<SysDepartTreeModel> children) { + if (children==null){ + this.isLeaf=true; + } this.children = children; } @@ -304,8 +315,12 @@ public class SysDepartTreeModel implements Serializable{ */ @Override public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; + 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) && 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 index d2b31f3..4c7bf9f 100644 --- 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 @@ -36,6 +36,12 @@ public class SysDictTree implements Serializable { */ @TableId(type = IdType.UUID) private String id; + /** + * 字典类型,0 string,1 number类型,2 boolean + * 前端js对stirng类型和number类型 boolean 类型敏感,需要区分。在select 标签匹配的时候会用到 + * 默认为string类型 + */ + private Integer type; /** * 字典名称 @@ -84,6 +90,7 @@ public class SysDictTree implements Serializable { this.dictCode = node.getDictCode(); this.description = node.getDescription(); this.delFlag = node.getDelFlag(); + this.type = node.getType(); } } 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 index 0f5fc10..6e97c0f 100644 --- 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 @@ -16,6 +16,7 @@ public class SysPermissionTree implements Serializable { private String id; private String key; + private String title; /** * 父id @@ -65,7 +66,12 @@ public class SysPermissionTree implements Serializable { /** * 是否叶子节点: 1:是 0:不是 */ - private Integer isLeaf; + private boolean isLeaf; + + /** + * 是否路由菜单: 0:不是 1:是(默认值1) + */ + private boolean route; /** * 描述 @@ -116,7 +122,7 @@ public class SysPermissionTree implements Serializable { this.delFlag = permission.getDelFlag(); this.description = permission.getDescription(); this.icon = permission.getIcon(); - this.isLeaf = permission.getIsLeaf(); + this.isLeaf = permission.isLeaf(); this.menuType = permission.getMenuType(); this.name = permission.getName(); this.parentId = permission.getParentId(); @@ -126,12 +132,22 @@ public class SysPermissionTree implements Serializable { this.redirect = permission.getRedirect(); this.url = permission.getUrl(); this.hidden = permission.isHidden(); + this.route = permission.isRoute(); this.alwaysShow= permission.isAlwaysShow(); - if (permission.getIsLeaf() == 0) { + this.title=permission.getName(); + if (!permission.isLeaf()) { this.children = new ArrayList<SysPermissionTree>(); } } + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + private List<SysPermissionTree> children; public boolean isAlwaysShow() { @@ -237,6 +253,14 @@ public class SysPermissionTree implements Serializable { this.description = description; } + public boolean isRoute() { + return route; + } + + public void setRoute(boolean route) { + this.route = route; + } + public Integer getDelFlag() { return delFlag; } @@ -293,11 +317,11 @@ public class SysPermissionTree implements Serializable { this.perms = perms; } - public Integer getIsLeaf() { + public boolean getIsLeaf() { return isLeaf; } - public void setIsLeaf(Integer isLeaf) { + public void setIsLeaf(boolean isLeaf) { this.isLeaf = isLeaf; } diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/system/model/SysUserCacheInfo.java b/jeecg-boot/src/main/java/org/jeecg/modules/system/model/SysUserCacheInfo.java new file mode 100644 index 0000000..524fa2c --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/system/model/SysUserCacheInfo.java @@ -0,0 +1,73 @@ +package org.jeecg.modules.system.model; + +import java.util.List; + +import org.jeecg.common.util.DateUtils; + +public class SysUserCacheInfo { + + private String sysUserCode; + + private String sysUserName; + + /*private String sysDate; + + private String sysTime;*/ + + private String companyCode; + + private List<String> sysOrgCode; + + private boolean oneDepart; + + public boolean isOneDepart() { + return oneDepart; + } + + public void setOneDepart(boolean oneDepart) { + this.oneDepart = oneDepart; + } + + public String getSysDate() { + return DateUtils.formatDate(); + } + + public String getSysTime() { + return DateUtils.now(); + } + + public String getSysUserCode() { + return sysUserCode; + } + + public void setSysUserCode(String sysUserCode) { + this.sysUserCode = sysUserCode; + } + + public String getSysUserName() { + return sysUserName; + } + + public void setSysUserName(String sysUserName) { + this.sysUserName = sysUserName; + } + + + + public String getCompanyCode() { + return companyCode; + } + + public void setCompanyCode(String companyCode) { + this.companyCode = companyCode; + } + + public List<String> getSysOrgCode() { + return sysOrgCode; + } + + public void setSysOrgCode(List<String> sysOrgCode) { + this.sysOrgCode = sysOrgCode; + } + +} diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/system/model/SysUserDepartsVO.java b/jeecg-boot/src/main/java/org/jeecg/modules/system/model/SysUserDepartsVO.java new file mode 100644 index 0000000..1588540 --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/system/model/SysUserDepartsVO.java @@ -0,0 +1,23 @@ +package org.jeecg.modules.system.model; + +import java.io.Serializable; +import java.util.List; + +import lombok.Data; + +@Data +public class SysUserDepartsVO implements Serializable{ + private static final long serialVersionUID = 1L; + + /**用户id*/ + private String userId; + /**对应的部门id集合*/ + private List<String> departIdList; + public SysUserDepartsVO(String userId, List<String> departIdList) { + super(); + this.userId = userId; + this.departIdList = departIdList; + } + + +} 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 index b6d2e94..b409455 100644 --- 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 @@ -2,7 +2,9 @@ package org.jeecg.modules.system.model; import java.io.Serializable; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; import org.jeecg.modules.system.entity.SysPermission; @@ -14,10 +16,22 @@ public class TreeModel implements Serializable { private String title; + private String slotTitle; + private boolean isLeaf; private String icon; + private Map<String,String> scopedSlots; + + public Map<String, String> getScopedSlots() { + return scopedSlots; + } + + public void setScopedSlots(Map<String, String> scopedSlots) { + this.scopedSlots = scopedSlots; + } + public String getKey() { return key; } @@ -34,11 +48,11 @@ public class TreeModel implements Serializable { this.title = title; } - public boolean isLeaf() { + public boolean getIsLeaf() { return isLeaf; } - public void setLeaf(boolean isLeaf) { + public void setIsLeaf(boolean isLeaf) { this.isLeaf = isLeaf; } @@ -64,13 +78,31 @@ public class TreeModel implements Serializable { } - 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) { + public TreeModel(SysPermission permission) { + this.key = permission.getId(); + this.icon = permission.getIcon(); + this.parentId = permission.getParentId(); + this.title = permission.getName(); + this.slotTitle = permission.getName(); + this.value = permission.getId(); + this.isLeaf = permission.isLeaf(); + this.label = permission.getName(); + if(!permission.isLeaf()) { + this.children = new ArrayList<TreeModel>(); + } + } + + public TreeModel(String key,String parentId,String slotTitle,String icon,boolean isLeaf) { + this.key = key; + this.parentId = parentId; + this.icon=icon; + this.slotTitle = slotTitle; + Map<String,String> map = new HashMap<String,String>(); + map.put("title", "hasDatarule"); + this.scopedSlots = map; + this.isLeaf = isLeaf; + this.value = key; + if(!isLeaf) { this.children = new ArrayList<TreeModel>(); } } @@ -117,8 +149,14 @@ public class TreeModel implements Serializable { public void setValue(String value) { this.value = value; } - - + public String getSlotTitle() { + return slotTitle; + } + + public void setSlotTitle(String slotTitle) { + this.slotTitle = slotTitle; + } + } diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/system/service/ISysDataLogService.java b/jeecg-boot/src/main/java/org/jeecg/modules/system/service/ISysDataLogService.java new file mode 100644 index 0000000..a18b8bf --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/system/service/ISysDataLogService.java @@ -0,0 +1,17 @@ +package org.jeecg.modules.system.service; + +import org.jeecg.modules.system.entity.SysDataLog; + +import com.baomidou.mybatisplus.extension.service.IService; + +public interface ISysDataLogService extends IService<SysDataLog> { + + /** + * 添加数据日志 + * @param tableName + * @param dataId + * @param dataContent + */ + public void addDataLog(String tableName, String dataId, String dataContent); + +} 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 index 6f65ba6..ba962c4 100644 --- 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 @@ -49,4 +49,11 @@ public interface ISysDepartService extends IService<SysDepart>{ */ List<SysDepartTreeModel> searhBy(String keyWord); + /** + * 根据部门id删除并删除其可能存在的子级部门 + * @param id + * @return + */ + boolean delete(String id); + } 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 index f99e8ea..b177820 100644 --- 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 @@ -3,6 +3,8 @@ package org.jeecg.modules.system.service; import org.jeecg.modules.system.entity.SysDictItem; import com.baomidou.mybatisplus.extension.service.IService; +import java.util.List; + /** * <p> * 服务类 @@ -12,5 +14,5 @@ import com.baomidou.mybatisplus.extension.service.IService; * @since 2018-12-28 */ public interface ISysDictItemService extends IService<SysDictItem> { - + public List<SysDictItem> selectItemsByMainId(String mainId); } 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 index 2a06196..cf95302 100644 --- 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 @@ -2,8 +2,10 @@ 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; +import org.jeecg.modules.system.entity.SysDictItem; /** * <p> @@ -14,7 +16,26 @@ import com.baomidou.mybatisplus.extension.service.IService; * @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); + + public List<Map<String, Object>> queryDictItemsByCode(String code); + + List<Map<String, Object>> queryTableDictItemsByCode(String table, String text, String code); + + public String queryDictTextByKey(String code, String key); + + String queryTableDictTextByKey(String table, String text, String code, String key); + + /** + * 根据字典类型删除关联表中其对应的数据 + * + * @param sysDict + * @return + */ + boolean deleteByDictId(SysDict sysDict); + + /** + * 添加一对多 + */ + public void saveMain(SysDict sysDict, List<SysDictItem> sysDictItemList); + } diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/system/service/ISysPermissionDataRuleService.java b/jeecg-boot/src/main/java/org/jeecg/modules/system/service/ISysPermissionDataRuleService.java new file mode 100644 index 0000000..ef89006 --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/system/service/ISysPermissionDataRuleService.java @@ -0,0 +1,41 @@ +package org.jeecg.modules.system.service; + +import java.util.List; + +import org.jeecg.modules.system.entity.SysPermissionDataRule; + +import com.baomidou.mybatisplus.extension.service.IService; + +/** + * <p> + * 菜单权限规则 服务类 + * </p> + * + * @author huangzhilin + * @since 2019-04-01 + */ +public interface ISysPermissionDataRuleService extends IService<SysPermissionDataRule> { + + /** + * 根据菜单id查询其对应的权限数据 + * + * @param permRule + */ + List<SysPermissionDataRule> getPermRuleListByPermId(String permissionId); + + /** + * 根据页面传递的参数查询菜单权限数据 + * + * @return + */ + List<SysPermissionDataRule> queryPermissionRule(SysPermissionDataRule permRule); + + + /** + * 根据菜单ID和用户名查找数据权限配置信息 + * @param permission + * @param username + * @return + */ + List<SysPermissionDataRule> queryPermissionDataRules(String username,String permissionId); +} 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 index c41f5ed..b209d6b 100644 --- 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 @@ -31,4 +31,18 @@ public interface ISysPermissionService extends IService<SysPermission> { public void editPermission(SysPermission sysPermission) throws JeecgBootException; public List<SysPermission> queryByUser(String username); + + /** + * 根据permissionId删除其关联的SysPermissionDataRule表中的数据 + * + * @param id + * @return + */ + public void deletePermRuleByPermId(String id); + + /** + * 查询出带有特殊符号的菜单地址的集合 + * @return + */ + public List<String> queryPermissionUrlWithStar(); } diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/system/service/ISysUserDepartService.java b/jeecg-boot/src/main/java/org/jeecg/modules/system/service/ISysUserDepartService.java new file mode 100644 index 0000000..9c3fbeb --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/system/service/ISysUserDepartService.java @@ -0,0 +1,49 @@ +package org.jeecg.modules.system.service; + + +import java.util.List; + +import org.jeecg.modules.system.entity.SysUser; +import org.jeecg.modules.system.entity.SysUserDepart; +import org.jeecg.modules.system.model.DepartIdModel; +import org.jeecg.modules.system.model.SysUserDepartsVO; + +import com.baomidou.mybatisplus.extension.service.IService; + +/** + * <p> + * SysUserDpeart用户组织机构service + * </p> + * @author ZhiLin + * + */ +public interface ISysUserDepartService extends IService<SysUserDepart> { + + /** + * 根据指定用户添加部门信息 + * @param sysUserDepartsVO + * @return + */ + boolean addSysUseWithrDepart(SysUserDepartsVO sysUserDepartsVO); + + /** + * 根据指定用户id查询部门信息 + * @param userId + * @return + */ + List<DepartIdModel> queryDepartIdsOfUser(String userId); + + /** + * 根据指定用户id编辑部门信息 + * @param sysUserDepartsVO + * @return + */ + boolean editSysUserWithDepart(SysUserDepartsVO sysUserDepartsVO); + + /** + * 根据部门id查询用户信息 + * @param depId + * @return + */ + List<SysUser> queryUserByDepId(String depId); +} 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 index 2d9b0f2..00ba14d 100644 --- 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 @@ -1,6 +1,9 @@ package org.jeecg.modules.system.service; +import java.util.Map; + import org.jeecg.modules.system.entity.SysUserRole; + import com.baomidou.mybatisplus.extension.service.IService; /** @@ -12,5 +15,10 @@ import com.baomidou.mybatisplus.extension.service.IService; * @since 2018-12-21 */ public interface ISysUserRoleService extends IService<SysUserRole> { - + + /** + * 查询所有的用户角色信息 + * @return + */ + Map<String,String> queryUserRole(); } 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 index 04f4bdd..e6136f1 100644 --- 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 @@ -2,6 +2,8 @@ package org.jeecg.modules.system.service; import java.util.List; import org.jeecg.modules.system.entity.SysUser; +import org.jeecg.modules.system.model.SysUserCacheInfo; + import com.baomidou.mybatisplus.extension.service.IService; /** @@ -37,4 +39,11 @@ public interface ISysUserService extends IService<SysUser> { * @return */ public List<String> getRole(String username); + + /** + * 查询用户信息包括 部门信息 + * @param username + * @return + */ + public SysUserCacheInfo getCacheUser(String username); } diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/system/service/impl/AutoPoiDictService.java b/jeecg-boot/src/main/java/org/jeecg/modules/system/service/impl/AutoPoiDictService.java new file mode 100644 index 0000000..cf538a5 --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/system/service/impl/AutoPoiDictService.java @@ -0,0 +1,62 @@ +package org.jeecg.modules.system.service.impl; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import org.jeecg.common.util.oConvertUtils; +import org.jeecg.modules.system.mapper.SysDictMapper; +import org.jeecgframework.dict.service.AutoPoiDictServiceI; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import lombok.extern.slf4j.Slf4j; + +/** + * 描述:AutoPoi Excel注解支持字典参数设置 + * 举例: @Excel(name = "性别", width = 15, dicCode = "sex") + * 1、导出的时候会根据字典配置,把值1,2翻译成:男、女; + * 2、导入的时候,会把男、女翻译成1,2存进数据库; + * + * @author:scott + * @since:2019-04-09 + * @version:1.0 + */ +@Slf4j +@Service +public class AutoPoiDictService implements AutoPoiDictServiceI { + @Autowired + private SysDictMapper sysDictMapper; + + /** + * 通过字典查询easypoi,所需字典文本 + * + * @author:scott + * @since:2019-04-09 + * @return + */ + @Override + public String[] queryDict(String dicTable, String dicCode, String dicText) { + List<String> dictReplaces = new ArrayList<String>(); + List<Map<String, Object>> dictList = null; + // step.1 如果没有字典表则使用系统字典表 + if (oConvertUtils.isEmpty(dicTable)) { + dictList = sysDictMapper.queryDictItemsByCode(dicCode); + } else { + try { + dicText = oConvertUtils.getString(dicText, dicCode); + dictList = sysDictMapper.queryTableDictItemsByCode(dicTable, dicText, dicCode); + } catch (Exception e) { + log.error(e.toString()); + } + } + for (Map<String, Object> t : dictList) { + dictReplaces.add(t.get("text") + "_" + t.get("value")); + } + if (dictReplaces != null && dictReplaces.size() != 0) { + log.info("---AutoPoi--Get_DB_Dict------"+ dictReplaces.toString()); + return dictReplaces.toArray(new String[dictReplaces.size()]); + } + return null; + } +} diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/system/service/impl/SysDataLogServiceImpl.java b/jeecg-boot/src/main/java/org/jeecg/modules/system/service/impl/SysDataLogServiceImpl.java new file mode 100644 index 0000000..c805010 --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/system/service/impl/SysDataLogServiceImpl.java @@ -0,0 +1,33 @@ +package org.jeecg.modules.system.service.impl; + +import org.jeecg.modules.system.entity.SysDataLog; +import org.jeecg.modules.system.mapper.SysDataLogMapper; +import org.jeecg.modules.system.service.ISysDataLogService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; + +@Service +public class SysDataLogServiceImpl extends ServiceImpl<SysDataLogMapper,SysDataLog> implements ISysDataLogService { + @Autowired + private SysDataLogMapper logMapper; + + /** + * 添加数据日志 + */ + @Override + public void addDataLog(String tableName, String dataId, String dataContent) { + String versionNumber = "0"; + String dataVersion = logMapper.queryMaxDataVer(tableName, dataId); + if(dataVersion != null ) { + versionNumber = String.valueOf(Integer.parseInt(dataVersion)+1); + } + SysDataLog log = new SysDataLog(); + log.setDataTable(tableName); + log.setDataId(dataId); + log.setDataContent(dataContent); + log.setDataVersion(versionNumber); + this.save(log); + } + +} 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 index 8d081fe..a0dac2a 100644 --- 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 @@ -6,11 +6,11 @@ import java.util.List; import java.util.UUID; import org.jeecg.common.util.YouBianCodeUtil; -import org.jeecg.modules.system.controller.FindsDepartsChildrenUtil; 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.jeecg.modules.system.util.FindsDepartsChildrenUtil; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -188,6 +188,35 @@ public class SysDepartServiceImpl<T> extends ServiceImpl<SysDepartMapper, SysDep } return null; } + + /** + * 根据部门id删除并且删除其可能存在的子级任何部门 + */ + @Override + public boolean delete(String id) { + List<String> idList = new ArrayList<>(); + idList.add(id); + this.checkChildrenExists(id, idList); + boolean ok = this.removeByIds(idList); + return ok; + } + + /** + * delete 方法调用 + * @param id + * @param idList + */ + private void checkChildrenExists(String id, List<String> idList) { + LambdaQueryWrapper<SysDepart> query = new LambdaQueryWrapper<SysDepart>(); + query.eq(SysDepart::getParentId,id); + List<SysDepart> departList = this.list(query); + if(departList != null && departList.size() > 0) { + for(SysDepart depart : departList) { + idList.add(depart.getId()); + this.checkChildrenExists(depart.getId(), idList); + } + } + } } 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 index d656fde..a38a46f 100644 --- 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 @@ -4,11 +4,14 @@ 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.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import java.util.List; + /** * <p> - * 服务实现类 + * 服务实现类 * </p> * * @author zhangweijian @@ -17,4 +20,11 @@ import org.springframework.stereotype.Service; @Service public class SysDictItemServiceImpl extends ServiceImpl<SysDictItemMapper, SysDictItem> implements ISysDictItemService { + @Autowired + private SysDictItemMapper sysDictItemMapper; + + @Override + public List<SysDictItem> selectItemsByMainId(String mainId) { + return sysDictItemMapper.selectItemsByMainId(mainId); + } } 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 index c5b3074..3bbc924 100644 --- 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 @@ -1,15 +1,28 @@ package org.jeecg.modules.system.service.impl; -import java.util.List; -import java.util.Map; +import java.util.*; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import lombok.extern.slf4j.Slf4j; import org.jeecg.modules.system.entity.SysDict; +import org.jeecg.modules.system.entity.SysDictItem; +import org.jeecg.modules.system.mapper.SysDictItemMapper; import org.jeecg.modules.system.mapper.SysDictMapper; +import org.jeecg.modules.system.service.ISysDictItemService; 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.cache.CacheManager; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.cache.concurrent.ConcurrentMapCache; +import org.springframework.cache.support.SimpleCacheManager; +import org.springframework.context.annotation.Bean; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.PostConstruct; /** * <p> @@ -19,19 +32,102 @@ import org.springframework.stereotype.Service; * @author zhangweijian * @since 2018-12-28 */ -@Service +@Service() +@Slf4j public class SysDictServiceImpl extends ServiceImpl<SysDictMapper, SysDict> implements ISysDictService { - @Autowired - private SysDictMapper sysDictMapper; + @Autowired + private SysDictMapper sysDictMapper; + @Autowired + private SysDictItemMapper sysDictItemMapper; + @Autowired + private ISysDictService sysDictService; + @Autowired + private ISysDictItemService sysDictItemService; + + /** + * 通过查询指定code 获取字典 + * @param code + * @return + */ @Override - public List<Map<String, String>> queryDictItemsByCode(String code) { + @Cacheable(value = "dictCache",key = "#code") + public List<Map<String, Object>> queryDictItemsByCode(String code) { + log.info("无缓存dictList的时候调用这里!"); return sysDictMapper.queryDictItemsByCode(code); } - + + /** + * 通过查询指定code 获取字典值text + * @param code + * @param key + * @return + */ + @Override + @Cacheable(value = "dictCache") public String queryDictTextByKey(String code, String key) { + log.info("无缓存dictText的时候调用这里!"); return sysDictMapper.queryDictTextByKey(code, key); } + /** + * 通过查询指定table的 text code 获取字典 + * dictTableCache采用redis缓存有效期10分钟 + * @param table + * @param text + * @param code + * @return + */ + @Override + @Cacheable(value = "dictTableCache") + public List<Map<String, Object>> queryTableDictItemsByCode(String table, String text, String code) { + log.info("无缓存dictTableList的时候调用这里!"); + return sysDictMapper.queryTableDictItemsByCode(table,text,code); + } + + /** + * 通过查询指定table的 text code 获取字典值text + * dictTableCache采用redis缓存有效期10分钟 + * @param table + * @param text + * @param code + * @param key + * @return + */ + @Override + @Cacheable(value = "dictTableCache") + public String queryTableDictTextByKey(String table,String text,String code, String key) { + log.info("无缓存dictTable的时候调用这里!"); + return sysDictMapper.queryTableDictTextByKey(table,text,code,key); + } + + /** + * 根据字典类型id删除关联表中其对应的数据 + */ + @Override + public boolean deleteByDictId(SysDict sysDict) { + sysDict.setDelFlag(2); + sysDictService.updateById(sysDict); + // 删除关联表中的数据 + String deleteId = sysDict.getId(); + LambdaQueryWrapper<SysDictItem> dictItemQuery = new LambdaQueryWrapper<SysDictItem>(); + dictItemQuery.eq(SysDictItem::getDictId, deleteId); + boolean ok = sysDictItemService.remove(dictItemQuery); + return ok; + } + + @Override + @Transactional + public void saveMain(SysDict sysDict, List<SysDictItem> sysDictItemList) { + + sysDictMapper.insert(sysDict); + if (sysDictItemList != null) { + for (SysDictItem entity : sysDictItemList) { + entity.setDictId(sysDict.getId()); + sysDictItemMapper.insert(entity); + } + } + } + } diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/system/service/impl/SysPermissionDataRuleImpl.java b/jeecg-boot/src/main/java/org/jeecg/modules/system/service/impl/SysPermissionDataRuleImpl.java new file mode 100644 index 0000000..9eebc99 --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/system/service/impl/SysPermissionDataRuleImpl.java @@ -0,0 +1,76 @@ +package org.jeecg.modules.system.service.impl; + +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import org.jeecg.common.system.query.QueryGenerator; +import org.jeecg.common.util.oConvertUtils; +import org.jeecg.modules.system.entity.SysPermissionDataRule; +import org.jeecg.modules.system.mapper.SysPermissionDataRuleMapper; +import org.jeecg.modules.system.service.ISysPermissionDataRuleService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; + +/** + * <p> + * 菜单权限规则 服务实现类 + * </p> + * + * @author huangzhilin + * @since 2019-04-01 + */ +@Service +public class SysPermissionDataRuleImpl extends ServiceImpl<SysPermissionDataRuleMapper, SysPermissionDataRule> + implements ISysPermissionDataRuleService { + + @Autowired + private ISysPermissionDataRuleService permRuleService; + + /** + * 根据菜单id查询其对应的权限数据 + */ + @Override + public List<SysPermissionDataRule> getPermRuleListByPermId(String permissionId) { + LambdaQueryWrapper<SysPermissionDataRule> query = new LambdaQueryWrapper<SysPermissionDataRule>(); + query.eq(SysPermissionDataRule::getPermissionId, permissionId); + query.orderByDesc(SysPermissionDataRule::getCreateTime); + List<SysPermissionDataRule> permRuleList = permRuleService.list(query); + return permRuleList; + } + + /** + * 根据前端传递的权限名称和权限值参数来查询权限数据 + */ + @Override + public List<SysPermissionDataRule> queryPermissionRule(SysPermissionDataRule permRule) { + QueryWrapper<SysPermissionDataRule> queryWrapper = QueryGenerator.initQueryWrapper(permRule, null); + return permRuleService.list(queryWrapper); + } + + @Override + public List<SysPermissionDataRule> queryPermissionDataRules(String username,String permissionId) { + List<String> idsList = this.baseMapper.queryDataRuleIds(username, permissionId); + if(idsList==null || idsList.size()==0) { + return null; + } + Set<String> set = new HashSet<String>(); + for (String ids : idsList) { + if(ids==null) { + continue; + } + String arr[] = ids.split(","); + for (String id : arr) { + if(oConvertUtils.isNotEmpty(id)) { + set.add(id); + } + } + } + return this.baseMapper.selectList(new QueryWrapper<SysPermissionDataRule>().in("id", set)); + } + +} 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 index 1e5fd2d..f597559 100644 --- 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 @@ -9,13 +9,18 @@ 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.entity.SysPermissionDataRule; import org.jeecg.modules.system.mapper.SysPermissionMapper; import org.jeecg.modules.system.model.TreeModel; +import org.jeecg.modules.system.service.ISysPermissionDataRuleService; import org.jeecg.modules.system.service.ISysPermissionService; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.Cacheable; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +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.extension.service.impl.ServiceImpl; /** @@ -32,6 +37,9 @@ public class SysPermissionServiceImpl extends ServiceImpl<SysPermissionMapper, S @Resource private SysPermissionMapper sysPermissionMapper; + @Resource + private ISysPermissionDataRuleService permissionDataRuleService; + @Override public List<TreeModel> queryListByParentId(String parentId) { return sysPermissionMapper.queryListByParentId(parentId); @@ -41,6 +49,8 @@ public class SysPermissionServiceImpl extends ServiceImpl<SysPermissionMapper, S * 真实删除 */ @Override + @Transactional + @CacheEvict(value = "permission",allEntries=true) public void deletePermission(String id) throws JeecgBootException { SysPermission sysPermission = this.getById(id); if(sysPermission==null) { @@ -50,15 +60,46 @@ public class SysPermissionServiceImpl extends ServiceImpl<SysPermissionMapper, S 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)); + this.sysPermissionMapper.setMenuLeaf(pid, 1); } sysPermissionMapper.deleteById(id); + // 该节点可能是子节点但也可能是其它节点的父节点,所以需要级联删除 + this.removeChildrenBy(sysPermission.getId()); + } + + /** + * 根据父id删除其关联的子节点数据 + * + * @return + */ + public void removeChildrenBy(String parentId) { + LambdaQueryWrapper<SysPermission> query = new LambdaQueryWrapper<>(); + // 封装查询条件parentId为主键, + query.eq(SysPermission::getParentId, parentId); + // 查出该主键下的所有子级 + List<SysPermission> permissionList = this.list(query); + if (permissionList != null && permissionList.size() > 0) { + String id = ""; // id + int num = 0; // 查出的子级数量 + // 如果查出的集合不为空, 则先删除所有 + this.remove(query); + // 再遍历刚才查出的集合, 根据每个对象,查找其是否仍有子级 + for (int i = 0, len = permissionList.size(); i < len; i++) { + id = permissionList.get(i).getId(); + num = this.count(new LambdaQueryWrapper<SysPermission>().eq(SysPermission::getParentId, id)); + // 如果有, 则递归 + if (num > 0) { + this.removeChildrenBy(id); + } + } + } } /** * 逻辑删除 */ @Override + @CacheEvict(value = "permission",allEntries=true) public void deletePermissionLogical(String id) throws JeecgBootException { SysPermission sysPermission = this.getById(id); if(sysPermission==null) { @@ -68,13 +109,14 @@ public class SysPermissionServiceImpl extends ServiceImpl<SysPermissionMapper, S 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)); + this.sysPermissionMapper.setMenuLeaf(pid, 1); } sysPermission.setDelFlag(1); this.updateById(sysPermission); } @Override + @CacheEvict(value = "permission",allEntries=true,condition="#sysPermission.menuType=2") public void addPermission(SysPermission sysPermission) throws JeecgBootException { //---------------------------------------------------------------------- //判断是否是一级菜单,是的话清空父菜单 @@ -85,15 +127,16 @@ public class SysPermissionServiceImpl extends ServiceImpl<SysPermissionMapper, S String pid = sysPermission.getParentId(); if(oConvertUtils.isNotEmpty(pid)) { //设置父节点不为叶子节点 - this.update(new SysPermission().setIsLeaf(0),new UpdateWrapper<SysPermission>().eq("id",pid)); + this.sysPermissionMapper.setMenuLeaf(pid, 0); } sysPermission.setCreateTime(new Date()); sysPermission.setDelFlag(0); - sysPermission.setIsLeaf(1); + sysPermission.setLeaf(true); this.save(sysPermission); } @Override + @CacheEvict(value = "permission",allEntries=true,condition="#sysPermission.menuType=2") public void editPermission(SysPermission sysPermission) throws JeecgBootException { SysPermission p = this.getById(sysPermission.getId()); //TODO 该节点判断是否还有子节点 @@ -102,16 +145,29 @@ public class SysPermissionServiceImpl extends ServiceImpl<SysPermissionMapper, S }else { sysPermission.setUpdateTime(new Date()); //---------------------------------------------------------------------- - //判断是否是一级菜单,是的话清空父菜单 + //Step1.判断是否是一级菜单,是的话清空父菜单ID if(CommonConstant.MENU_TYPE_0.equals(sysPermission.getMenuType())) { sysPermission.setParentId(""); } + //Step2.判断菜单下级是否有菜单,无则设置为叶子节点 + int count = this.count(new QueryWrapper<SysPermission>().lambda().eq(SysPermission::getParentId, sysPermission.getId())); + if(count==0) { + sysPermission.setLeaf(true); + } //---------------------------------------------------------------------- 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)); + if((oConvertUtils.isNotEmpty(pid) && !pid.equals(p.getParentId())) || oConvertUtils.isEmpty(pid)&&oConvertUtils.isNotEmpty(p.getParentId())) { + //a.设置新的父菜单不为叶子节点 + this.sysPermissionMapper.setMenuLeaf(pid, 0); + //b.判断老的菜单下是否还有其他子菜单,没有的话则设置为叶子节点 + int cc = this.count(new QueryWrapper<SysPermission>().lambda().eq(SysPermission::getParentId, p.getParentId())); + if(cc==0) { + this.sysPermissionMapper.setMenuLeaf(p.getParentId(), 1); + } + } } @@ -121,5 +177,24 @@ public class SysPermissionServiceImpl extends ServiceImpl<SysPermissionMapper, S public List<SysPermission> queryByUser(String username) { return this.sysPermissionMapper.queryByUser(username); } - + + /** + * 根据permissionId删除其关联的SysPermissionDataRule表中的数据 + */ + @Override + public void deletePermRuleByPermId(String id) { + LambdaQueryWrapper<SysPermissionDataRule> query = new LambdaQueryWrapper<>(); + query.eq(SysPermissionDataRule::getPermissionId, id); + int countValue = this.permissionDataRuleService.count(query); + if(countValue > 0) { + this.permissionDataRuleService.remove(query); + } + } + + @Override + @Cacheable(value = "permission") + public List<String> queryPermissionUrlWithStar() { + return this.baseMapper.queryPermissionUrlWithStar(); + } + } diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/system/service/impl/SysUserDepartServiceImpl.java b/jeecg-boot/src/main/java/org/jeecg/modules/system/service/impl/SysUserDepartServiceImpl.java new file mode 100644 index 0000000..5be1f4c --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/system/service/impl/SysUserDepartServiceImpl.java @@ -0,0 +1,138 @@ +package org.jeecg.modules.system.service.impl; + +import java.util.ArrayList; +import java.util.List; + +import org.jeecg.modules.system.entity.SysDepart; +import org.jeecg.modules.system.entity.SysUser; +import org.jeecg.modules.system.entity.SysUserDepart; +import org.jeecg.modules.system.mapper.SysUserDepartMapper; +import org.jeecg.modules.system.model.DepartIdModel; +import org.jeecg.modules.system.model.SysUserDepartsVO; +import org.jeecg.modules.system.service.ISysDepartService; +import org.jeecg.modules.system.service.ISysUserDepartService; +import org.jeecg.modules.system.service.ISysUserService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; + +/** + * <P> + * 用户部门表实现类 + * <p/> + * @author ZhiLin + *@since 2019-02-22 + */ +@Service +public class SysUserDepartServiceImpl extends ServiceImpl<SysUserDepartMapper, SysUserDepart> implements ISysUserDepartService { + + @Autowired + private ISysUserDepartService userDepartService; + @Autowired + private ISysDepartService sysDepartService; + @Autowired + private ISysUserService sysUserService; + + /** + *根据用户id添加部门信息 + */ + @Override + public boolean addSysUseWithrDepart(SysUserDepartsVO sysUserDepartsVO) { + LambdaQueryWrapper<SysUserDepart> query = new LambdaQueryWrapper<SysUserDepart>(); + if(sysUserDepartsVO != null) { + String userId = sysUserDepartsVO.getUserId(); + List<String> departIdList = sysUserDepartsVO.getDepartIdList(); + if(departIdList != null && departIdList.size() > 0) { + for(String depId : departIdList) { + query.eq(SysUserDepart::getDepId, depId); + query.eq(SysUserDepart::getUserId, userId); + List<SysUserDepart> uDepList = userDepartService.list(query); + if(uDepList == null || uDepList.size() == 0) { + userDepartService.save(new SysUserDepart("",userId,depId)); + } + } + } + return true; + }else { + return false; + } + + } + + /** + * 根据用户id查询部门信息 + */ + @Override + public List<DepartIdModel> queryDepartIdsOfUser(String userId) { + LambdaQueryWrapper<SysUserDepart> queryUDep = new LambdaQueryWrapper<SysUserDepart>(); + LambdaQueryWrapper<SysDepart> queryDep = new LambdaQueryWrapper<SysDepart>(); + try { + queryUDep.eq(SysUserDepart::getUserId, userId); + List<String> depIdList = new ArrayList<>(); + List<DepartIdModel> depIdModelList = new ArrayList<>(); + List<SysUserDepart> userDepList = userDepartService.list(queryUDep); + if(userDepList != null && userDepList.size() > 0) { + for(SysUserDepart userDepart : userDepList) { + depIdList.add(userDepart.getDepId()); + } + queryDep.in(SysDepart::getId, depIdList); + List<SysDepart> depList = sysDepartService.list(queryDep); + if(depList != null || depList.size() > 0) { + for(SysDepart depart : depList) { + depIdModelList.add(new DepartIdModel().convertByUserDepart(depart)); + } + } + return depIdModelList; + } + }catch(Exception e) { + e.fillInStackTrace(); + } + return null; + + + } + + /** + * 根据用户id修改部门信息 + */ + @Override + public boolean editSysUserWithDepart(SysUserDepartsVO sysUserDepartsVO) { + LambdaQueryWrapper<SysUserDepart> queryDep = new LambdaQueryWrapper<SysUserDepart>(); + List<String> depIdList = sysUserDepartsVO.getDepartIdList(); + if(depIdList != null && depIdList.size() > 0) { + queryDep.eq(SysUserDepart::getUserId, sysUserDepartsVO.getUserId()); + boolean ok = userDepartService.remove(queryDep); + if(ok) { + for(String str : depIdList) { + userDepartService.save(new SysUserDepart("", sysUserDepartsVO.getUserId(), str)); + } + return ok; + } + } + queryDep.eq(SysUserDepart::getUserId, sysUserDepartsVO.getUserId()); + boolean ok = userDepartService.remove(queryDep); + return ok; + } + + /** + * 根据部门id查询用户信息 + */ + @Override + public List<SysUser> queryUserByDepId(String depId) { + LambdaQueryWrapper<SysUserDepart> queryUDep = new LambdaQueryWrapper<SysUserDepart>(); + queryUDep.eq(SysUserDepart::getDepId, depId); + List<String> userIdList = new ArrayList<>(); + List<SysUserDepart> uDepList = this.list(queryUDep); + if(uDepList != null && uDepList.size() > 0) { + for(SysUserDepart uDep : uDepList) { + userIdList.add(uDep.getUserId()); + } + List<SysUser> userList = (List<SysUser>) sysUserService.listByIds(userIdList); + return userList; + } + return new ArrayList<SysUser>(); + } + +} 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 index 04b3bda..571d52f 100644 --- 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 @@ -1,9 +1,22 @@ package org.jeecg.modules.system.service.impl; +import java.util.Hashtable; +import java.util.IdentityHashMap; +import java.util.List; +import java.util.Map; + +import org.jeecg.modules.system.entity.SysRole; +import org.jeecg.modules.system.entity.SysUser; import org.jeecg.modules.system.entity.SysUserRole; import org.jeecg.modules.system.mapper.SysUserRoleMapper; +import org.jeecg.modules.system.service.ISysRoleService; import org.jeecg.modules.system.service.ISysUserRoleService; +import org.jeecg.modules.system.service.ISysUserService; + + import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; + +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; /** @@ -17,4 +30,53 @@ import org.springframework.stereotype.Service; @Service public class SysUserRoleServiceImpl extends ServiceImpl<SysUserRoleMapper, SysUserRole> implements ISysUserRoleService { + @Autowired + private ISysUserService userService; + @Autowired + private ISysRoleService roleService; + + /** + * 查询所有用户对应的角色信息 + */ + @Override + public Map<String,String> queryUserRole() { + List<SysUserRole> uRoleList = this.list(); + List<SysUser> userList = userService.list(); + List<SysRole> roleList = roleService.list(); + Map<String,String> map = new IdentityHashMap<>(); + String userId = ""; + String roleId = ""; + String roleName = ""; + if(uRoleList != null && uRoleList.size() > 0) { + for(SysUserRole uRole : uRoleList) { + roleId = uRole.getRoleId(); + for(SysUser user : userList) { + userId = user.getId(); + if(uRole.getUserId().equals(userId)) { + roleName = this.searchByRoleId(roleList,roleId); + map.put(userId, roleName); + } + } + } + return map; + } + return map; + } + + /** + * queryUserRole调用的方法 + * @param roleList + * @param roleId + * @return + */ + private String searchByRoleId(List<SysRole> roleList, String roleId) { + while(true) { + for(SysRole role : roleList) { + if(roleId.equals(role.getId())) { + return role.getRoleName(); + } + } + } + } + } 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 index 75d6724..3cc4458 100644 --- 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 @@ -1,12 +1,16 @@ package org.jeecg.modules.system.service.impl; +import java.util.ArrayList; import java.util.List; import java.util.UUID; import org.jeecg.common.util.oConvertUtils; +import org.jeecg.modules.system.entity.SysDepart; import org.jeecg.modules.system.entity.SysUser; import org.jeecg.modules.system.entity.SysUserRole; +import org.jeecg.modules.system.mapper.SysDepartMapper; import org.jeecg.modules.system.mapper.SysUserMapper; import org.jeecg.modules.system.mapper.SysUserRoleMapper; +import org.jeecg.modules.system.model.SysUserCacheInfo; import org.jeecg.modules.system.service.ISysUserService; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -30,6 +34,9 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl @Autowired private SysUserRoleMapper sysUserRoleMapper; + @Autowired + private SysDepartMapper sysDepartMapper; + @Override public SysUser getUserByName(String username) { return userMapper.getUserByName(username); @@ -38,13 +45,11 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl @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); + SysUserRole userRole = new SysUserRole(user.getId(), roleId); sysUserRoleMapper.insert(userRole); } } @@ -70,4 +75,31 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl return sysUserRoleMapper.getRoleByUserName(username); } + + @Override + public SysUserCacheInfo getCacheUser(String username) { + SysUserCacheInfo info = new SysUserCacheInfo(); + info.setOneDepart(true); + SysUser user = userMapper.getUserByName(username); + info.setSysUserCode(user.getUsername()); + info.setSysUserName(user.getRealname()); + + List<SysDepart> list = sysDepartMapper.queryUserDeparts(user.getId()); + List<String> sysOrgCode = new ArrayList<String>(); + if(list==null || list.size()==0) { + //当前用户无部门 + sysOrgCode.add("0"); + }else if(list.size()==1) { + sysOrgCode.add(list.get(0).getOrgCode()); + }else { + info.setOneDepart(false); + for (SysDepart dpt : list) { + sysOrgCode.add(dpt.getOrgCode()); + } + } + info.setSysOrgCode(sysOrgCode); + // TODO companycode 没有处理 + return info; + } + } diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/system/util/FindsDepartsChildrenUtil.java b/jeecg-boot/src/main/java/org/jeecg/modules/system/util/FindsDepartsChildrenUtil.java new file mode 100644 index 0000000..fcbe4a0 --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/system/util/FindsDepartsChildrenUtil.java @@ -0,0 +1,105 @@ +package org.jeecg.modules.system.util; + +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 ("".equals(branch.getParentId())) { + 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); + model.setIsLeaf(true); + }else{ + setEmptyChildrenAsNull(model.getChildren()); + model.setIsLeaf(false); + } + } + } +} diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/system/util/JeecgDataAutorUtils.java b/jeecg-boot/src/main/java/org/jeecg/modules/system/util/JeecgDataAutorUtils.java new file mode 100644 index 0000000..9200b6a --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/system/util/JeecgDataAutorUtils.java @@ -0,0 +1,90 @@ +package org.jeecg.modules.system.util; + +import java.util.ArrayList; +import java.util.List; + +import javax.servlet.http.HttpServletRequest; + +import org.jeecg.common.util.SpringContextUtils; +import org.jeecg.modules.system.entity.SysPermissionDataRule; +import org.jeecg.modules.system.model.SysUserCacheInfo; +import org.springframework.util.StringUtils; + +/** + * @ClassName: JeecgDataAutorUtils + * @Description: 数据权限查询规则容器工具类 + * @author 张代浩 + * @date 2012-12-15 下午11:27:39 + * + */ +public class JeecgDataAutorUtils { + + public static final String MENU_DATA_AUTHOR_RULES = "MENU_DATA_AUTHOR_RULES"; + + public static final String MENU_DATA_AUTHOR_RULE_SQL = "MENU_DATA_AUTHOR_RULE_SQL"; + + public static final String SYS_USER_INFO = "SYS_USER_INFO"; + + /** + * 往链接请求里面,传入数据查询条件 + * + * @param request + * @param MENU_DATA_AUTHOR_RULES + */ + public static synchronized void installDataSearchConditon(HttpServletRequest request, List<SysPermissionDataRule> dataRules) { + @SuppressWarnings("unchecked") + List<SysPermissionDataRule> list = (List<SysPermissionDataRule>)loadDataSearchConditon();// 1.先从request获取MENU_DATA_AUTHOR_RULES,如果存则获取到LIST + if (list==null) { + // 2.如果不存在,则new一个list + list = new ArrayList<SysPermissionDataRule>(); + } + for (SysPermissionDataRule tsDataRule : dataRules) { + list.add(tsDataRule); + } + request.setAttribute(MENU_DATA_AUTHOR_RULES, list); // 3.往list里面增量存指 + } + + /** + * 获取请求对应的数据权限规则 + * + * @param request + * @return + */ + @SuppressWarnings("unchecked") + public static synchronized List<SysPermissionDataRule> loadDataSearchConditon() { + return (List<SysPermissionDataRule>) SpringContextUtils.getHttpServletRequest().getAttribute(MENU_DATA_AUTHOR_RULES); + + } + + /** + * 获取请求对应的数据权限SQL + * + * @param request + * @return + */ + public static synchronized String loadDataSearchConditonSQLString() { + return (String) SpringContextUtils.getHttpServletRequest().getAttribute(MENU_DATA_AUTHOR_RULE_SQL); + } + + /** + * 往链接请求里面,传入数据查询条件 + * + * @param request + * @param MENU_DATA_AUTHOR_RULE_SQL + */ + public static synchronized void installDataSearchConditon(HttpServletRequest request, String sql) { + String ruleSql = (String)loadDataSearchConditonSQLString(); + if (!StringUtils.hasText(ruleSql)) { + request.setAttribute(MENU_DATA_AUTHOR_RULE_SQL,sql); + } + } + + public static synchronized void installUserInfo(HttpServletRequest request, SysUserCacheInfo userinfo) { + request.setAttribute(SYS_USER_INFO, userinfo); + } + + public static synchronized SysUserCacheInfo loadUserInfo() { + return (SysUserCacheInfo) SpringContextUtils.getHttpServletRequest().getAttribute(SYS_USER_INFO); + + } +} diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/system/util/PermissionDataUtil.java b/jeecg-boot/src/main/java/org/jeecg/modules/system/util/PermissionDataUtil.java new file mode 100644 index 0000000..ea6c933 --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/system/util/PermissionDataUtil.java @@ -0,0 +1,58 @@ +package org.jeecg.modules.system.util; + +import org.jeecg.modules.system.entity.SysPermission; + +/** + * @author scott + * @since 2019-04-03 + */ +public class PermissionDataUtil { + + /** + * 智能处理错误数据,简化用户失误操作 + * + * @param permission + */ + public static SysPermission intelligentProcessData(SysPermission permission) { + if (permission == null) { + return null; + } + + // 组件 + if (permission.getComponent() != null) { + String component = permission.getComponent(); + if (component.startsWith("/")) { + component = component.substring(1); + } + if (component.startsWith("views/")) { + component = component.replaceFirst("views/", ""); + } + if (component.startsWith("src/views/")) { + component = component.replaceFirst("src/views/", ""); + } + if (component.endsWith(".vue")) { + component = component.replace(".vue", ""); + } + permission.setComponent(component); + } + + // 请求URL + if (permission.getUrl() != null) { + String url = permission.getUrl(); + if (url.endsWith(".vue")) { + url = url.replace(".vue", ""); + } + if (!url.startsWith("http") && !url.startsWith("/")) { + url = "/" + url; + } + permission.setUrl(url); + } + + // 一级菜单默认组件 + if (0 == permission.getMenuType() && permission.getComponent() == null) { + // 一级菜单默认组件 + permission.setComponent("layouts/RouteView"); + } + return permission; + } +} diff --git a/jeecg-boot/src/main/java/org/jeecg/modules/system/vo/SysDictPage.java b/jeecg-boot/src/main/java/org/jeecg/modules/system/vo/SysDictPage.java new file mode 100644 index 0000000..bd06e8b --- /dev/null +++ b/jeecg-boot/src/main/java/org/jeecg/modules/system/vo/SysDictPage.java @@ -0,0 +1,41 @@ +package org.jeecg.modules.system.vo; + +import lombok.Data; +import org.jeecg.modules.system.entity.SysDictItem; +import org.jeecgframework.poi.excel.annotation.Excel; +import org.jeecgframework.poi.excel.annotation.ExcelCollection; + +import java.util.List; + +@Data +public class SysDictPage { + + /** + * 主键 + */ + private String id; + /** + * 字典名称 + */ + @Excel(name = "字典名称", width = 20) + private String dictName; + + /** + * 字典编码 + */ + @Excel(name = "字典编码", width = 30) + private String dictCode; + /** + * 删除状态 + */ + private Integer delFlag; + /** + * 描述 + */ + @Excel(name = "描述", width = 30) + private String description; + + @ExcelCollection(name = "字典列表") + private List<SysDictItem> sysDictItemList; + +} diff --git a/jeecg-boot/src/main/resources/application-dev.yml b/jeecg-boot/src/main/resources/application-dev.yml new file mode 100644 index 0000000..19d4dee --- /dev/null +++ b/jeecg-boot/src/main/resources/application-dev.yml @@ -0,0 +1,120 @@ +server: + port: 8080 + servlet: + context-path: /jeecg-boot + compression: + enabled: true + mime-types: application/javascript,application/json,application/xml,text/html,text/xml,text/plain,text/css,image/* + +management: + endpoints: + web: + exposure: + include: metrics,httptrace + +spring: + mail: + host: smtp.163.com + username: jeecgos@163.com + password: ?? + properties: + mail: + smtp: + auth: true + starttls: + enable: true + required: true + ## 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-20190411?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 + 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 + +#jeecg专用配置 +jeecg : + path : + #文件上传根目录 设置 + upload: D://upFiles + #webapp文件路径 + webapp: D://webapp diff --git a/jeecg-boot/src/main/resources/application-prod.yml b/jeecg-boot/src/main/resources/application-prod.yml new file mode 100644 index 0000000..c336463 --- /dev/null +++ b/jeecg-boot/src/main/resources/application-prod.yml @@ -0,0 +1,120 @@ +server: + port: 8080 + servlet: + context-path: /jeecg-boot + compression: + enabled: true + mime-types: application/javascript,application/json,application/xml,text/html,text/xml,text/plain,text/css,image/* + +management: + endpoints: + web: + exposure: + include: metrics,httptrace + +spring: + mail: + host: smtp.163.com + username: jeecgos@163.com + password: ?? + properties: + mail: + smtp: + auth: true + starttls: + enable: true + required: true + ## 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: 118.89.223.144 + 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 + +#jeecg专用配置 +jeecg : + path : + #文件上传根目录 设置 + upload: /opt/jeecg-boot/upload + #webapp文件路径 + webapp: /opt/jeecg-boot/webapp diff --git a/jeecg-boot/src/main/resources/application-test.yml b/jeecg-boot/src/main/resources/application-test.yml new file mode 100644 index 0000000..cc0b73a --- /dev/null +++ b/jeecg-boot/src/main/resources/application-test.yml @@ -0,0 +1,122 @@ +server: + port: 8080 + servlet: + context-path: /jeecg-boot + compression: + enabled: true + mime-types: application/javascript,application/json,application/xml,text/html,text/xml,text/plain,text/css,image/* + +management: + endpoints: + web: + exposure: + include: metrics,httptrace + +spring: + mail: + host: smtp.163.com + username: jeecgos@163.com + password: ?? + properties: + mail: + smtp: + auth: true + starttls: + enable: true + required: true + ## 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: 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 +#jeecg专用配置 +jeecg : + path : + #文件上传根目录 设置 + upload: D://upFiles + #webapp文件路径 + webapp: D://webapp +logging: + level: + org.jeecg.modules.system.mapper : debug diff --git a/jeecg-boot/src/main/resources/application.yml b/jeecg-boot/src/main/resources/application.yml index bc5dbb6..caf4dfc 100644 --- a/jeecg-boot/src/main/resources/application.yml +++ b/jeecg-boot/src/main/resources/application.yml @@ -1,95 +1,3 @@ -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 + profiles: + active: dev \ No newline at end of file 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 index 31a63ac..e99b1ef 100644 --- 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 @@ -1,20 +1,37 @@ package ${bussiPackage}.${entityPackage}.controller; import java.util.Arrays; -import java.util.Date; import java.util.List; +import java.util.Map; +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.net.URLDecoder; import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; import org.jeecg.common.api.vo.Result; +import org.jeecg.common.system.query.QueryGenerator; 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; +import org.jeecgframework.poi.excel.ExcelImportUtil; +import org.jeecgframework.poi.excel.def.NormalExcelConstants; +import org.jeecgframework.poi.excel.entity.ExportParams; +import org.jeecgframework.poi.excel.entity.ImportParams; +import org.jeecgframework.poi.excel.view.JeecgEntityExcelView; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.multipart.MultipartHttpServletRequest; +import org.springframework.web.servlet.ModelAndView; +import com.alibaba.fastjson.JSON; + /** * @Title: Controller * @Description: ${tableVo.ftlDescription} @@ -43,23 +60,9 @@ public class ${entityName}Controller { @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)); - } - } + QueryWrapper<${entityName}> queryWrapper = QueryGenerator.initQueryWrapper(${entityName?uncap_first}, req.getParameterMap()); + Page<${entityName}> page = new Page<${entityName}>(pageNo, pageSize); 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; @@ -90,7 +93,7 @@ public class ${entityName}Controller { * @return */ @PutMapping(value = "/edit") - public Result<${entityName}> eidt(@RequestBody ${entityName} ${entityName?uncap_first}) { + public Result<${entityName}> edit(@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) { @@ -162,4 +165,73 @@ public class ${entityName}Controller { return result; } + /** + * 导出excel + * + * @param request + * @param response + */ + @RequestMapping(value = "/exportXls") + public ModelAndView exportXls(HttpServletRequest request, HttpServletResponse response) { + // Step.1 组装查询条件 + QueryWrapper<${entityName}> queryWrapper = null; + try { + String paramsStr = request.getParameter("paramsStr"); + if (oConvertUtils.isNotEmpty(paramsStr)) { + String deString = URLDecoder.decode(paramsStr, "UTF-8"); + ${entityName} ${entityName?uncap_first} = JSON.parseObject(deString, ${entityName}.class); + queryWrapper = QueryGenerator.initQueryWrapper(${entityName?uncap_first}, request.getParameterMap()); + } + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + + //Step.2 AutoPoi 导出Excel + ModelAndView mv = new ModelAndView(new JeecgEntityExcelView()); + List<${entityName}> pageList = ${entityName?uncap_first}Service.list(queryWrapper); + //导出文件名称 + mv.addObject(NormalExcelConstants.FILE_NAME, "${tableVo.ftlDescription}列表"); + mv.addObject(NormalExcelConstants.CLASS, ${entityName}.class); + mv.addObject(NormalExcelConstants.PARAMS, new ExportParams("${tableVo.ftlDescription}列表数据", "导出人:Jeecg", "导出信息")); + mv.addObject(NormalExcelConstants.DATA_LIST, pageList); + return mv; + } + + /** + * 通过excel导入数据 + * + * @param request + * @param response + * @return + */ + @RequestMapping(value = "/importExcel", method = RequestMethod.POST) + public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) { + MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request; + Map<String, MultipartFile> fileMap = multipartRequest.getFileMap(); + for (Map.Entry<String, MultipartFile> entity : fileMap.entrySet()) { + MultipartFile file = entity.getValue();// 获取上传文件对象 + ImportParams params = new ImportParams(); + params.setTitleRows(2); + params.setHeadRows(1); + params.setNeedSave(true); + try { + List<${entityName}> list${entityName}s = ExcelImportUtil.importExcel(file.getInputStream(), ${entityName}.class, params); + for (${entityName} ${entityName?uncap_first}Excel : list${entityName}s) { + ${entityName?uncap_first}Service.save(${entityName?uncap_first}Excel); + } + return Result.ok("文件导入成功!数据行数:" + list${entityName}s.size()); + } catch (Exception e) { + log.error(e.getMessage()); + return Result.error("文件导入失败!"); + } finally { + try { + file.getInputStream().close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + return Result.ok("文件导入失败!"); + } + } 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 index a617492..5dfc06b 100644 --- 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 @@ -8,6 +8,7 @@ import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; import com.fasterxml.jackson.annotation.JsonFormat; import org.springframework.format.annotation.DateTimeFormat; +import org.jeecgframework.poi.excel.annotation.Excel; /** * @Description: ${tableVo.ftlDescription} @@ -22,17 +23,22 @@ public class ${entityName} implements Serializable { <#list originalColumns as po> /**${po.filedComment}*/ - <#if po.fieldName == tableId> + <#if po.fieldName == primaryKeyField> @TableId(type = IdType.UUID) - </#if> + <#else> <#if po.fieldType =='java.util.Date'> <#if po.fieldDbType =='date'> + @Excel(name = "${po.filedComment}", width = 15, format = "yyyy-MM-dd") @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd") @DateTimeFormat(pattern="yyyy-MM-dd") <#elseif po.fieldDbType =='datetime'> + @Excel(name = "${po.filedComment}", width = 20, format = "yyyy-MM-dd HH:mm:ss") @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") </#if> + <#else> + @Excel(name = "${po.filedComment}", width = 15) + </#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}/vue/${entityName}List.vuei b/jeecg-boot/src/main/resources/jeecg/code-template/one/java/${bussiPackage}/${entityPackage}/vue/${entityName}List.vuei index ab6c8e1..0cf9b9d 100644 --- 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 @@ -8,18 +8,36 @@ <#list columns as po> <#if po.fieldName !='id' && po_index<= tableVo.searchFieldNum> - <a-col :span="6"> + <a-col :md="6" :sm="8"> <a-form-item label="${po.filedComment}"> <a-input placeholder="请输入${po.filedComment}" v-model="queryParam.${po.fieldName}"></a-input> </a-form-item> </a-col> +<#elseif po_index == 2> + <template v-if="toggleSearchStatus"> + <a-col :md="6" :sm="8"> + <a-form-item label="${po.filedComment}"> + <a-input placeholder="请输入${po.filedComment}" v-model="queryParam.${po.fieldName}"></a-input> + </a-form-item> + </a-col> +<#elseif po.fieldName !='id' && po_index< 5> + <a-col :md="6" :sm="8"> + <a-form-item label="${po.filedComment}"> + <a-input placeholder="请输入${po.filedComment}" v-model="queryParam.${po.fieldName}"></a-input> + </a-form-item> + </a-col> +<#else> </#if> </#list> - - <a-col :span="8" > + </template> + <a-col :md="6" :sm="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> + <a @click="handleToggleSearch" style="margin-left: 8px"> + {{ toggleSearchStatus ? '收起' : '展开' }} + <a-icon :type="toggleSearchStatus ? 'up' : 'down'"/> + </a> </span> </a-col> @@ -30,7 +48,10 @@ <!-- 操作按钮区域 --> <div class="table-operator"> <a-button @click="handleAdd" type="primary" icon="plus">新增</a-button> - + <a-button type="primary" icon="download" @click="handleExportXls">导出</a-button> + <a-upload name="file" :showUploadList="false" :multiple="false" :action="importExcelUrl" @change="handleImportExcel"> + <a-button type="primary" icon="import">导入</a-button> + </a-upload> <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> @@ -79,25 +100,23 @@ <!-- table区域-end --> <!-- 表单区域 --> - <${entityName?uncap_first}-modal ref="${entityName?uncap_first}Modal" @ok="modalFormOk"></${entityName?uncap_first}-modal> + <${entityName?uncap_first}-modal ref="modalForm" @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' + import { JeecgListMixin } from '@/mixins/JeecgListMixin' export default { name: "${entityName}List", + mixins:[JeecgListMixin], components: { ${entityName}Modal }, data () { return { description: '${tableVo.ftlDescription}管理页面', - // 查询条件 - queryParam: {}, // 表头 columns: [ { @@ -109,14 +128,14 @@ 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> { @@ -126,154 +145,33 @@ 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(); - }, + exportXlsUrl: "${entityPackage}/${entityName?uncap_first}/exportXls", + importExcelUrl: "${entityPackage}/${entityName?uncap_first}/importExcel", + }, + } + }, + computed: { + importExcelUrl: function(){ + <#noparse>return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`;</#noparse> + } + }, 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> +/** Button按钮间距 */ + .ant-btn { + margin-left: 3px + } .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; diff --git a/jeecg-boot/src/main/resources/jeecg/code-template/one/java/${bussiPackage}/${entityPackage}/vue/modules/${entityName}Modal__Style@Drawer.vuei b/jeecg-boot/src/main/resources/jeecg/code-template/one/java/${bussiPackage}/${entityPackage}/vue/modules/${entityName}Modal__Style@Drawer.vuei new file mode 100644 index 0000000..4446ba6 --- /dev/null +++ b/jeecg-boot/src/main/resources/jeecg/code-template/one/java/${bussiPackage}/${entityPackage}/vue/modules/${entityName}Modal__Style@Drawer.vuei @@ -0,0 +1,162 @@ +<template> + <a-drawer + :title="title" + :width="800" + placement="right" + :closable="false" + @close="close" + :visible="visible" + > + + <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-button type="primary" @click="handleOk">确定</a-button> + <a-button type="primary" @click="handleCancel">取消</a-button> + </a-drawer> +</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> +/** Button按钮间距 */ + .ant-btn { + margin-left: 30px; + margin-bottom: 30px; + float: right; + } +</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 index 52d215c..170e925 100644 --- 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 @@ -1,20 +1,41 @@ package ${bussiPackage}.controller.${entityPackage}; import java.util.Arrays; -import java.util.Date; import java.util.List; +import java.util.Map; +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.net.URLDecoder; + import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + import org.jeecg.common.api.vo.Result; +import org.jeecg.common.system.query.QueryGenerator; 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 org.springframework.web.multipart.MultipartFile; +import org.springframework.web.multipart.MultipartHttpServletRequest; +import org.springframework.web.servlet.ModelAndView; + +import org.jeecgframework.poi.excel.ExcelImportUtil; +import org.jeecgframework.poi.excel.def.NormalExcelConstants; +import org.jeecgframework.poi.excel.entity.ExportParams; +import org.jeecgframework.poi.excel.entity.ImportParams; +import org.jeecgframework.poi.excel.view.JeecgEntityExcelView; + 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; +import com.alibaba.fastjson.JSON; + /** * @Title: Controller * @Description: ${tableVo.ftlDescription} @@ -43,23 +64,9 @@ public class ${entityName}Controller { @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)); - } - } + QueryWrapper<${entityName}> queryWrapper = QueryGenerator.initQueryWrapper(${entityName?uncap_first}, req.getParameterMap()); + Page<${entityName}> page = new Page<${entityName}>(pageNo, pageSize); 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; @@ -90,7 +97,7 @@ public class ${entityName}Controller { * @return */ @PutMapping(value = "/edit") - public Result<${entityName}> eidt(@RequestBody ${entityName} ${entityName?uncap_first}) { + public Result<${entityName}> edit(@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) { @@ -162,4 +169,73 @@ public class ${entityName}Controller { return result; } + /** + * 导出excel + * + * @param request + * @param response + */ + @RequestMapping(value = "/exportXls") + public ModelAndView exportXls(HttpServletRequest request, HttpServletResponse response) { + // Step.1 组装查询条件 + QueryWrapper<${entityName}> queryWrapper = null; + try { + String paramsStr = request.getParameter("paramsStr"); + if (oConvertUtils.isNotEmpty(paramsStr)) { + String deString = URLDecoder.decode(paramsStr, "UTF-8"); + ${entityName} ${entityName?uncap_first} = JSON.parseObject(deString, ${entityName}.class); + queryWrapper = QueryGenerator.initQueryWrapper(${entityName?uncap_first}, request.getParameterMap()); + } + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + + //Step.2 AutoPoi 导出Excel + ModelAndView mv = new ModelAndView(new JeecgEntityExcelView()); + List<${entityName}> pageList = ${entityName?uncap_first}Service.list(queryWrapper); + //导出文件名称 + mv.addObject(NormalExcelConstants.FILE_NAME, "${tableVo.ftlDescription}列表"); + mv.addObject(NormalExcelConstants.CLASS, ${entityName}.class); + mv.addObject(NormalExcelConstants.PARAMS, new ExportParams("${tableVo.ftlDescription}列表数据", "导出人:Jeecg", "导出信息")); + mv.addObject(NormalExcelConstants.DATA_LIST, pageList); + return mv; + } + + /** + * 通过excel导入数据 + * + * @param request + * @param response + * @return + */ + @RequestMapping(value = "/importExcel", method = RequestMethod.POST) + public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) { + MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request; + Map<String, MultipartFile> fileMap = multipartRequest.getFileMap(); + for (Map.Entry<String, MultipartFile> entity : fileMap.entrySet()) { + MultipartFile file = entity.getValue();// 获取上传文件对象 + ImportParams params = new ImportParams(); + params.setTitleRows(2); + params.setHeadRows(1); + params.setNeedSave(true); + try { + List<${entityName}> list${entityName}s = ExcelImportUtil.importExcel(file.getInputStream(), ${entityName}.class, params); + for (${entityName} ${entityName?uncap_first}Excel : list${entityName}s) { + ${entityName?uncap_first}Service.save(${entityName?uncap_first}Excel); + } + return Result.ok("文件导入成功!数据行数:" + list${entityName}s.size()); + } catch (Exception e) { + log.error(e.getMessage()); + return Result.error("文件导入失败!"); + } finally { + try { + file.getInputStream().close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + return Result.ok("文件导入失败!"); + } + } 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 index 1c1da2c..0dcc6d0 100644 --- 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 @@ -1,13 +1,14 @@ 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 java.util.Date; import com.fasterxml.jackson.annotation.JsonFormat; import org.springframework.format.annotation.DateTimeFormat; +import org.jeecgframework.poi.excel.annotation.Excel; /** * @Description: ${tableVo.ftlDescription} @@ -22,17 +23,22 @@ public class ${entityName} implements Serializable { <#list originalColumns as po> /**${po.filedComment}*/ - <#if po.fieldName == tableId> + <#if po.fieldName == primaryKeyField> @TableId(type = IdType.UUID) - </#if> - <#if po.fieldType =='java.util.Date'> - <#if po.fieldDbType =='date'> - @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd") + <#else> + <#if po.fieldType =='java.util.Date'> + <#if po.fieldDbType =='date'> + @Excel(name = "${po.filedComment}", width = 15, format = "yyyy-MM-dd") + @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") + <#elseif po.fieldDbType =='datetime'> + @Excel(name = "${po.filedComment}", width = 20, format = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") - </#if> + </#if> + <#else> + @Excel(name = "${po.filedComment}", width = 15) + </#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}/vue/${entityPackage}/${entityName}List.vuei b/jeecg-boot/src/main/resources/jeecg/code-template/one2/java/${bussiPackage}/vue/${entityPackage}/${entityName}List.vuei index ab6c8e1..91c1391 100644 --- 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 @@ -8,18 +8,36 @@ <#list columns as po> <#if po.fieldName !='id' && po_index<= tableVo.searchFieldNum> - <a-col :span="6"> + <a-col :md="6" :sm="8"> <a-form-item label="${po.filedComment}"> <a-input placeholder="请输入${po.filedComment}" v-model="queryParam.${po.fieldName}"></a-input> </a-form-item> </a-col> +<#elseif po_index == 2> + <template v-if="toggleSearchStatus"> + <a-col :md="6" :sm="8"> + <a-form-item label="${po.filedComment}"> + <a-input placeholder="请输入${po.filedComment}" v-model="queryParam.${po.fieldName}"></a-input> + </a-form-item> + </a-col> +<#elseif po.fieldName !='id' && po_index< 5> + <a-col :md="6" :sm="8"> + <a-form-item label="${po.filedComment}"> + <a-input placeholder="请输入${po.filedComment}" v-model="queryParam.${po.fieldName}"></a-input> + </a-form-item> + </a-col> +<#else> </#if> </#list> - - <a-col :span="8" > + </template> + <a-col :md="6" :sm="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> + <a @click="handleToggleSearch" style="margin-left: 8px"> + {{ toggleSearchStatus ? '收起' : '展开' }} + <a-icon :type="toggleSearchStatus ? 'up' : 'down'"/> + </a> </span> </a-col> @@ -30,7 +48,10 @@ <!-- 操作按钮区域 --> <div class="table-operator"> <a-button @click="handleAdd" type="primary" icon="plus">新增</a-button> - + <a-button type="primary" icon="download" @click="handleExportXls">导出</a-button> + <a-upload name="file" :showUploadList="false" :multiple="false" :action="importExcelUrl" @change="handleImportExcel"> + <a-button type="primary" icon="import">导入</a-button> + </a-upload> <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> @@ -79,25 +100,23 @@ <!-- table区域-end --> <!-- 表单区域 --> - <${entityName?uncap_first}-modal ref="${entityName?uncap_first}Modal" @ok="modalFormOk"></${entityName?uncap_first}-modal> + <${entityName?uncap_first}-modal ref="modalForm" @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' + import { JeecgListMixin } from '@/mixins/JeecgListMixin' export default { name: "${entityName}List", + mixins:[JeecgListMixin], components: { ${entityName}Modal }, data () { return { description: '${tableVo.ftlDescription}管理页面', - // 查询条件 - queryParam: {}, // 表头 columns: [ { @@ -109,14 +128,14 @@ 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> { @@ -126,154 +145,33 @@ 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(); - }, + exportXlsUrl: "${entityPackage}/${entityName?uncap_first}/exportXls", + importExcelUrl: "${entityPackage}/${entityName?uncap_first}/importExcel", + }, + } + }, + computed: { + importExcelUrl: function(){ + <#noparse>return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`;</#noparse> + } + }, 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> +/** Button按钮间距 */ + .ant-btn { + margin-left: 3px + } .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; 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 index dc56664..d7ea43d 100644 --- 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 @@ -7,10 +7,10 @@ @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 @@ -29,7 +29,7 @@ </a-form-item> </#if> </#list> - + </a-form> </a-spin> </a-modal> @@ -122,7 +122,7 @@ 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){ diff --git a/jeecg-boot/src/main/resources/jeecg/code-template/one2/java/${bussiPackage}/vue/${entityPackage}/modules/${entityName}Modal__Style@Drawer.vuei b/jeecg-boot/src/main/resources/jeecg/code-template/one2/java/${bussiPackage}/vue/${entityPackage}/modules/${entityName}Modal__Style@Drawer.vuei new file mode 100644 index 0000000..4446ba6 --- /dev/null +++ b/jeecg-boot/src/main/resources/jeecg/code-template/one2/java/${bussiPackage}/vue/${entityPackage}/modules/${entityName}Modal__Style@Drawer.vuei @@ -0,0 +1,162 @@ +<template> + <a-drawer + :title="title" + :width="800" + placement="right" + :closable="false" + @close="close" + :visible="visible" + > + + <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-button type="primary" @click="handleOk">确定</a-button> + <a-button type="primary" @click="handleCancel">取消</a-button> + </a-drawer> +</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> +/** Button按钮间距 */ + .ant-btn { + margin-left: 30px; + margin-bottom: 30px; + float: right; + } +</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 index 6889945..893c4c5 100644 --- 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 @@ -1,83 +1,81 @@ -package org.jeecg.modules.demo.test.controller; +package ${bussiPackage}.${entityPackage}.controller; +import java.io.UnsupportedEncodingException; +import java.io.IOException; +import java.net.URLDecoder; +import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import java.util.Map; import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.jeecgframework.poi.excel.ExcelImportUtil; +import org.jeecgframework.poi.excel.def.NormalExcelConstants; +import org.jeecgframework.poi.excel.entity.ExportParams; +import org.jeecgframework.poi.excel.entity.ImportParams; +import org.jeecgframework.poi.excel.view.JeecgEntityExcelView; + import org.jeecg.common.api.vo.Result; +import org.jeecg.common.system.query.QueryGenerator; 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; +<#list subTables as sub> +import ${bussiPackage}.${entityPackage}.entity.${sub.entityName}; +</#list> +import ${bussiPackage}.${entityPackage}.entity.${entityName}; +import ${bussiPackage}.${entityPackage}.vo.${entityName}Page; +import ${bussiPackage}.${entityPackage}.service.I${entityName}Service; +<#list subTables as sub> +import ${bussiPackage}.${entityPackage}.service.I${sub.entityName}Service; +</#list> +import org.springframework.beans.BeanUtils; 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 org.springframework.web.bind.annotation.*; +import org.springframework.web.servlet.ModelAndView; +import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.multipart.MultipartHttpServletRequest; 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; +import com.alibaba.fastjson.JSON; /** * @Title: Controller - * @Description: 订单 + * @Description: ${tableVo.ftlDescription} * @author: jeecg-boot - * @date: 2019-02-15 + * @date: ${.now?string["yyyy-MM-dd"]} * @version: V1.0 */ @RestController -@RequestMapping("/test/jeecgOrderMain") +@RequestMapping("/${entityPackage}/${entityName?uncap_first}") @Slf4j -public class JeecgOrderMainController { +public class ${entityName}Controller { @Autowired - private IJeecgOrderMainService jeecgOrderMainService; - <#if isMainTable == "true"> + private I${entityName}Service ${entityName?uncap_first}Service; + <#list subTables as sub> @Autowired - private IJeecgOrderCustomerService jeecgOrderCustomerService; - @Autowired - private IJeecgOrderTicketService jeecgOrderTicketService; - </#if> + private I${sub.entityName}Service ${sub.entityName?uncap_first}Service; + </#list> /** * 分页列表查询 - * @param jeecgOrderMain + * @param ${entityName?uncap_first} * @param pageNo * @param pageSize * @param req * @return */ @GetMapping(value = "/list") - public Result<IPage<JeecgOrderMain>> queryPageList(JeecgOrderMain jeecgOrderMain, + 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<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<IPage<${entityName}>> result = new Result<IPage<${entityName}>>(); + QueryWrapper<${entityName}> queryWrapper = QueryGenerator.initQueryWrapper(${entityName?uncap_first}, req.getParameterMap()); + Page<${entityName}> page = new Page<${entityName}>(pageNo, pageSize); + IPage<${entityName}> pageList = ${entityName?uncap_first}Service.page(page, queryWrapper); result.setSuccess(true); result.setResult(pageList); return result; @@ -85,14 +83,17 @@ public class JeecgOrderMainController { /** * 添加 - * @param jeecgOrderMain + * @param ${entityName?uncap_first}Page * @return */ @PostMapping(value = "/add") - public Result<JeecgOrderMain> add(@RequestBody JeecgOrderMainPage jeecgOrderMainPage) { - Result<JeecgOrderMain> result = new Result<JeecgOrderMain>(); + public Result<${entityName}> add(@RequestBody ${entityName}Page ${entityName?uncap_first}Page) { + Result<${entityName}> result = new Result<${entityName}>(); try { - jeecgOrderMainService.saveMain(jeecgOrderMainPage.getJeecgOrderMain(), jeecgOrderMainPage.getJeecgOrderCustomerList(), jeecgOrderMainPage.getJeecgOrderTicketList());; + ${entityName} ${entityName?uncap_first} = new ${entityName}(); + BeanUtils.copyProperties(${entityName?uncap_first}Page, ${entityName?uncap_first}); + + ${entityName?uncap_first}Service.saveMain(${entityName?uncap_first}, <#list subTables as sub>${entityName?uncap_first}Page.get${sub.entityName}List()<#if sub_has_next>,</#if></#list>); result.success("添加成功!"); } catch (Exception e) { e.printStackTrace(); @@ -104,18 +105,20 @@ public class JeecgOrderMainController { /** * 编辑 - * @param jeecgOrderMain + * @param ${entityName?uncap_first}Page * @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) { + public Result<${entityName}> edit(@RequestBody ${entityName}Page ${entityName?uncap_first}Page) { + Result<${entityName}> result = new Result<${entityName}>(); + ${entityName} ${entityName?uncap_first} = new ${entityName}(); + BeanUtils.copyProperties(${entityName?uncap_first}Page, ${entityName?uncap_first}); + ${entityName} ${entityName?uncap_first}Entity = ${entityName?uncap_first}Service.getById(${entityName?uncap_first}.getId()); + if(${entityName?uncap_first}Entity==null) { result.error500("未找到对应实体"); }else { - jeecgOrderMainService.updateMain(jeecgOrderMain, jeecgOrderMainPage.getJeecgOrderCustomerList(), jeecgOrderMainPage.getJeecgOrderTicketList()); + boolean ok = ${entityName?uncap_first}Service.updateById(${entityName?uncap_first}); + ${entityName?uncap_first}Service.updateMain(${entityName?uncap_first}, <#list subTables as sub>${entityName?uncap_first}Page.get${sub.entityName}List()<#if sub_has_next>,</#if></#list>); result.success("修改成功!"); } @@ -128,13 +131,13 @@ public class JeecgOrderMainController { * @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) { + 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 { - jeecgOrderMainService.delMain(id); + ${entityName?uncap_first}Service.delMain(id); result.success("删除成功!"); } @@ -147,12 +150,12 @@ public class JeecgOrderMainController { * @return */ @DeleteMapping(value = "/deleteBatch") - public Result<JeecgOrderMain> deleteBatch(@RequestParam(name="ids",required=true) String ids) { - Result<JeecgOrderMain> result = new Result<JeecgOrderMain>(); + 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.jeecgOrderMainService.removeByIds(Arrays.asList(ids.split(","))); + this.${entityName?uncap_first}Service.delBatchMain(Arrays.asList(ids.split(","))); result.success("删除成功!"); } return result; @@ -164,44 +167,113 @@ public class JeecgOrderMainController { * @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) { + 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(jeecgOrderMain); + result.setResult(${entityName?uncap_first}); result.setSuccess(true); } return result; } + <#list subTables as sub> /** * 通过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); + @GetMapping(value = "/query${sub.entityName}ByMainId") + public Result<List<${sub.entityName}>> query${sub.entityName}ListByMainId(@RequestParam(name="id",required=true) String id) { + Result<List<${sub.entityName}>> result = new Result<List<${sub.entityName}>>(); + List<${sub.entityName}> ${sub.entityName?uncap_first}List = ${sub.entityName?uncap_first}Service.selectByMainId(id); + result.setResult(${sub.entityName?uncap_first}List); result.setSuccess(true); return result; } + </#list> + + /** + * 导出excel + * + * @param request + * @param response + */ + @RequestMapping(value = "/exportXls") + public ModelAndView exportXls(HttpServletRequest request, HttpServletResponse response) { + // Step.1 组装查询条件 + QueryWrapper<${entityName}> queryWrapper = null; + try { + String paramsStr = request.getParameter("paramsStr"); + if (oConvertUtils.isNotEmpty(paramsStr)) { + String deString = URLDecoder.decode(paramsStr, "UTF-8"); + ${entityName} ${entityName?uncap_first} = JSON.parseObject(deString, ${entityName}.class); + queryWrapper = QueryGenerator.initQueryWrapper(${entityName?uncap_first}, request.getParameterMap()); + } + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + + //Step.2 AutoPoi 导出Excel + ModelAndView mv = new ModelAndView(new JeecgEntityExcelView()); + List<${entityName}Page> pageList = new ArrayList<${entityName}Page>(); + List<${entityName}> ${entityName?uncap_first}List = ${entityName?uncap_first}Service.list(queryWrapper); + for (${entityName} ${entityName?uncap_first} : ${entityName?uncap_first}List) { + ${entityName}Page vo = new ${entityName}Page(); + BeanUtils.copyProperties(${entityName?uncap_first}, vo); + <#list subTables as sub> + List<${sub.entityName}> ${sub.entityName?uncap_first}List = ${sub.entityName?uncap_first}Service.selectByMainId(${entityName?uncap_first}.getId()); + vo.set${sub.entityName}List(${sub.entityName?uncap_first}List); + </#list> + pageList.add(vo); + } + //导出文件名称 + mv.addObject(NormalExcelConstants.FILE_NAME, "${tableVo.ftlDescription}列表"); + mv.addObject(NormalExcelConstants.CLASS, ${entityName}Page.class); + mv.addObject(NormalExcelConstants.PARAMS, new ExportParams("${tableVo.ftlDescription}列表数据", "导出人:Jeecg", "导出信息")); + mv.addObject(NormalExcelConstants.DATA_LIST, pageList); + return mv; + } + + /** + * 通过excel导入数据 + * + * @param request + * @param response + * @return + */ + @RequestMapping(value = "/importExcel", method = RequestMethod.POST) + public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) { + MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request; + Map<String, MultipartFile> fileMap = multipartRequest.getFileMap(); + for (Map.Entry<String, MultipartFile> entity : fileMap.entrySet()) { + MultipartFile file = entity.getValue();// 获取上传文件对象 + ImportParams params = new ImportParams(); + params.setTitleRows(2); + params.setHeadRows(1); + params.setNeedSave(true); + try { + List<${entityName}Page> list = ExcelImportUtil.importExcel(file.getInputStream(), ${entityName}Page.class, params); + for (${entityName}Page page : list) { + ${entityName} po = new ${entityName}(); + BeanUtils.copyProperties(page, po); + ${entityName?uncap_first}Service.saveMain(po, <#list subTables as sub>page.get${sub.entityName}List()<#if sub_has_next>,</#if></#list>); + } + return Result.ok("文件导入成功!数据行数:" + list.size()); + } catch (Exception e) { + log.error(e.getMessage()); + return Result.error("文件导入失败!"); + } finally { + try { + file.getInputStream().close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + return Result.ok("文件导入失败!"); + } } 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 index a617492..5cbe5e1 100644 --- 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 @@ -22,7 +22,7 @@ public class ${entityName} implements Serializable { <#list originalColumns as po> /**${po.filedComment}*/ - <#if po.fieldName == tableId> + <#if po.fieldName == primaryKeyField> @TableId(type = IdType.UUID) </#if> <#if po.fieldType =='java.util.Date'> diff --git a/jeecg-boot/src/main/resources/jeecg/code-template/onetomany/java/${bussiPackage}/${entityPackage}/entity/[1-n]Entity.javai b/jeecg-boot/src/main/resources/jeecg/code-template/onetomany/java/${bussiPackage}/${entityPackage}/entity/[1-n]Entity.javai new file mode 100644 index 0000000..fa5b75e --- /dev/null +++ b/jeecg-boot/src/main/resources/jeecg/code-template/onetomany/java/${bussiPackage}/${entityPackage}/entity/[1-n]Entity.javai @@ -0,0 +1,50 @@ +<#list subTables as subTab> +#segment#${subTab.entityName}.java +package ${bussiPackage}.${entityPackage}.entity; + +import java.io.Serializable; +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; +import org.jeecgframework.poi.excel.annotation.Excel; +import java.util.Date; + +/** + * @Description: ${subTab.ftlDescription} + * @author: jeecg-boot + * @date: ${.now?string["yyyy-MM-dd"]} + * @version: V1.0 + */ +@Data +@TableName("${subTab.tableName}") +public class ${subTab.entityName} implements Serializable { + private static final long serialVersionUID = 1L; + + <#list subTab.originalColumns as po> + /**${po.filedComment}*/ + <#if po.fieldName == primaryKeyField> + @TableId(type = IdType.UUID) + <#else> + <#if po.fieldType =='java.util.Date'> + <#if po.fieldDbType =='date'> + @Excel(name = "${po.filedComment}", width = 15, format = "yyyy-MM-dd") + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd") + @DateTimeFormat(pattern="yyyy-MM-dd") + <#elseif po.fieldDbType =='datetime'> + @Excel(name = "${po.filedComment}", width = 20, format = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + </#if> + <#else> + <#if !subTab.foreignKeys?seq_contains(po.fieldName?cap_first)> + @Excel(name = "${po.filedComment}", width = 15) + </#if> + </#if> + </#if> + private <#if po.fieldType=='java.sql.Blob'>byte[]<#else>${po.fieldType}</#if> ${po.fieldName}; + </#list> +} +</#list> \ No newline at end of file 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 index 1e3fdb2..34deb8b 100644 --- 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 @@ -13,15 +13,5 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; * @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/[1-n]Mapper.javai b/jeecg-boot/src/main/resources/jeecg/code-template/onetomany/java/${bussiPackage}/${entityPackage}/mapper/[1-n]Mapper.javai new file mode 100644 index 0000000..e607930 --- /dev/null +++ b/jeecg-boot/src/main/resources/jeecg/code-template/onetomany/java/${bussiPackage}/${entityPackage}/mapper/[1-n]Mapper.javai @@ -0,0 +1,21 @@ +<#list subTables as subTab> +#segment#${subTab.entityName}Mapper.java +package ${bussiPackage}.${entityPackage}.mapper; + +import java.util.List; +import ${bussiPackage}.${entityPackage}.entity.${subTab.entityName}; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + * @Description: ${subTab.ftlDescription} + * @author: jeecg-boot + * @date: ${.now?string["yyyy-MM-dd"]} + * @version: V1.0 + */ +public interface ${subTab.entityName}Mapper extends BaseMapper<${subTab.entityName}> { + + public boolean deleteByMainId(String mainId); + + public List<${subTab.entityName}> selectByMainId(String mainId); +} +</#list> \ No newline at end of file diff --git a/jeecg-boot/src/main/resources/jeecg/code-template/onetomany/java/${bussiPackage}/${entityPackage}/mapper/xml/[1-n]Mapper.xml b/jeecg-boot/src/main/resources/jeecg/code-template/onetomany/java/${bussiPackage}/${entityPackage}/mapper/xml/[1-n]Mapper.xml new file mode 100644 index 0000000..708ae0b --- /dev/null +++ b/jeecg-boot/src/main/resources/jeecg/code-template/onetomany/java/${bussiPackage}/${entityPackage}/mapper/xml/[1-n]Mapper.xml @@ -0,0 +1,36 @@ +<#list subTables as subTab> +<#assign originalForeignKeys = subTab.originalForeignKeys> +#segment#${subTab.entityName}Mapper.xml +<?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.${subTab.entityName}Mapper"> + + <delete id="deleteByMainId" parameterType="java.lang.String"> + DELETE + FROM ${subTab.tableName} + WHERE + <#list originalForeignKeys as key> + <#if key?lower_case?index_of("${primaryKeyField}")!=-1> + ${key} = ${r'#'}{${primaryKeyField}} <#rt/> + <#else> + ${key} = ${r'#'}{${key}} <#rt/> + </#if> + <#if key_has_next>AND</#if> + </#list> + </delete> + + <select id="selectByMainId" parameterType="java.lang.String" resultType="${bussiPackage}.${entityPackage}.entity.${subTab.entityName}"> + SELECT * + FROM ${subTab.tableName} + WHERE + <#list originalForeignKeys as key> + <#if key?lower_case?index_of("${primaryKeyField}")!=-1> + ${key} = ${r'#'}{${primaryKeyField}} <#rt/> + <#else> + ${key} = ${r'#'}{${key}} <#rt/> + </#if> + <#if key_has_next>AND</#if> + </#list> + </select> +</mapper> +</#list> \ 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 index c39592f..9032bd8 100644 --- 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 @@ -1,7 +1,13 @@ package ${bussiPackage}.${entityPackage}.service; +<#list subTables as sub> +import ${bussiPackage}.${entityPackage}.entity.${sub.entityName}; +</#list> import ${bussiPackage}.${entityPackage}.entity.${entityName}; import com.baomidou.mybatisplus.extension.service.IService; +import java.io.Serializable; +import java.util.Collection; +import java.util.List; /** * @Description: ${tableVo.ftlDescription} @@ -10,32 +16,27 @@ import com.baomidou.mybatisplus.extension.service.IService; * @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 saveMain(${entityName} ${entityName?uncap_first},<#list subTables as sub>List<${sub.entityName}> ${sub.entityName?uncap_first}List<#if sub_has_next>,</#if></#list>) ; /** * 修改一对多 * */ - public void updateMain(JeecgOrderMain jeecgOrderMain,List<JeecgOrderCustomer> jeecgOrderCustomerList,List<JeecgOrderTicket> jeecgOrderTicketList); + public void updateMain(${entityName} ${entityName?uncap_first},<#list subTables as sub>List<${sub.entityName}> ${sub.entityName?uncap_first}List<#if sub_has_next>,</#if></#list>); /** * 删除一对多 - * @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/[1-n]Service.javai b/jeecg-boot/src/main/resources/jeecg/code-template/onetomany/java/${bussiPackage}/${entityPackage}/service/[1-n]Service.javai new file mode 100644 index 0000000..af91385 --- /dev/null +++ b/jeecg-boot/src/main/resources/jeecg/code-template/onetomany/java/${bussiPackage}/${entityPackage}/service/[1-n]Service.javai @@ -0,0 +1,19 @@ +<#list subTables as subTab> +#segment#I${subTab.entityName}Service.java +package ${bussiPackage}.${entityPackage}.service; + +import ${bussiPackage}.${entityPackage}.entity.${subTab.entityName}; +import com.baomidou.mybatisplus.extension.service.IService; +import java.util.List; + +/** + * @Description: ${subTab.ftlDescription} + * @author: jeecg-boot + * @date: ${.now?string["yyyy-MM-dd"]} + * @version: V1.0 + */ +public interface I${subTab.entityName}Service extends IService<${subTab.entityName}> { + + public List<${subTab.entityName}> selectByMainId(String mainId); +} +</#list> 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 index 31e1b16..5b539dd 100644 --- 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 @@ -1,11 +1,21 @@ package ${bussiPackage}.${entityPackage}.service.impl; import ${bussiPackage}.${entityPackage}.entity.${entityName}; +<#list subTables as sub> +import ${bussiPackage}.${entityPackage}.entity.${sub.entityName}; +</#list> +<#list subTables as sub> +import ${bussiPackage}.${entityPackage}.mapper.${sub.entityName}Mapper; +</#list> 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; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.transaction.annotation.Transactional; +import java.io.Serializable; +import java.util.List; +import java.util.Collection; /** * @Description: ${tableVo.ftlDescription} @@ -15,73 +25,77 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; */ @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; + private ${entityName}Mapper ${entityName?uncap_first}Mapper; + <#list subTables as sub> @Autowired - private JeecgOrderTicketMapper jeecgOrderTicketMapper; + private ${sub.entityName}Mapper ${sub.entityName?uncap_first}Mapper; + </#list> @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); + public void saveMain(${entityName} ${entityName?uncap_first}, <#list subTables as sub>List<${sub.entityName}> ${sub.entityName?uncap_first}List<#if sub_has_next>,</#if></#list>) { + ${entityName?uncap_first}Mapper.insert(${entityName?uncap_first}); + <#list subTables as sub> + for(${sub.entityName} entity:${sub.entityName?uncap_first}List) { + <#list sub.foreignKeys as key> + //外键设置 + <#if key?lower_case?index_of("${primaryKeyField}")!=-1> + entity.set${key?cap_first}(${entityName?uncap_first}.get${primaryKeyField?cap_first}()); + <#else> + entity.set${key?cap_first}(${entityName?uncap_first}.get${key}()); + </#if> + </#list> + ${sub.entityName?uncap_first}Mapper.insert(entity); } + </#list> } @Override @Transactional - public void updateMain(JeecgOrderMain jeecgOrderMain, List<JeecgOrderCustomer> jeecgOrderCustomerList, List<JeecgOrderTicket> jeecgOrderTicketList) { - jeecgOrderMainMapper.updateById(jeecgOrderMain); + public void updateMain(${entityName} ${entityName?uncap_first},<#list subTables as sub>List<${sub.entityName}> ${sub.entityName?uncap_first}List<#if sub_has_next>,</#if></#list>) { + ${entityName?uncap_first}Mapper.updateById(${entityName?uncap_first}); //1.先删除子表数据 - jeecgOrderTicketMapper.deleteTicketsByMainId(jeecgOrderMain.getId()); - jeecgOrderCustomerMapper.deleteCustomersByMainId(jeecgOrderMain.getId()); + <#list subTables as sub> + ${sub.entityName?uncap_first}Mapper.deleteByMainId(${entityName?uncap_first}.getId()); + </#list> //2.子表数据重新插入 - for(JeecgOrderCustomer entity:jeecgOrderCustomerList) { - entity.setOrderId(jeecgOrderMain.getId()); - jeecgOrderCustomerMapper.insert(entity); - } - for(JeecgOrderTicket entity:jeecgOrderTicketList) { - entity.setOrderId(jeecgOrderMain.getId()); - jeecgOrderTicketMapper.insert(entity); + <#list subTables as sub> + for(${sub.entityName} entity:${sub.entityName?uncap_first}List) { + <#list sub.foreignKeys as key> + //外键设置 + <#if key?lower_case?index_of("${primaryKeyField}")!=-1> + entity.set${key?cap_first}(${entityName?uncap_first}.get${primaryKeyField?cap_first}()); + <#else> + entity.set${key?cap_first}(${entityName?uncap_first}.get${key}()); + </#if> + </#list> + ${sub.entityName?uncap_first}Mapper.insert(entity); } + </#list> } @Override @Transactional public void delMain(String id) { - jeecgOrderMainMapper.deleteById(id); - jeecgOrderTicketMapper.deleteTicketsByMainId(id); - jeecgOrderCustomerMapper.deleteCustomersByMainId(id); + ${entityName?uncap_first}Mapper.deleteById(id); + <#list subTables as sub> + ${sub.entityName?uncap_first}Mapper.deleteByMainId(id); + </#list> } @Override @Transactional public void delBatchMain(Collection<? extends Serializable> idList) { for(Serializable id:idList) { - jeecgOrderMainMapper.deleteById(id); - jeecgOrderTicketMapper.deleteTicketsByMainId(id.toString()); - jeecgOrderCustomerMapper.deleteCustomersByMainId(id.toString()); + ${entityName?uncap_first}Mapper.deleteById(id); + <#list subTables as sub> + ${sub.entityName?uncap_first}Mapper.deleteByMainId(id.toString()); + </#list> } } -</#if> + } diff --git a/jeecg-boot/src/main/resources/jeecg/code-template/onetomany/java/${bussiPackage}/${entityPackage}/service/impl/[1-n]ServiceImpl.javai b/jeecg-boot/src/main/resources/jeecg/code-template/onetomany/java/${bussiPackage}/${entityPackage}/service/impl/[1-n]ServiceImpl.javai new file mode 100644 index 0000000..c893c7e --- /dev/null +++ b/jeecg-boot/src/main/resources/jeecg/code-template/onetomany/java/${bussiPackage}/${entityPackage}/service/impl/[1-n]ServiceImpl.javai @@ -0,0 +1,30 @@ +<#list subTables as subTab> +#segment#${subTab.entityName}ServiceImpl.java +package ${bussiPackage}.${entityPackage}.service.impl; + +import ${bussiPackage}.${entityPackage}.entity.${subTab.entityName}; +import ${bussiPackage}.${entityPackage}.mapper.${subTab.entityName}Mapper; +import ${bussiPackage}.${entityPackage}.service.I${subTab.entityName}Service; +import org.springframework.stereotype.Service; +import java.util.List; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * @Description: ${subTab.ftlDescription} + * @author: jeecg-boot + * @date: ${.now?string["yyyy-MM-dd"]} + * @version: V1.0 + */ +@Service +public class ${subTab.entityName}ServiceImpl extends ServiceImpl<${subTab.entityName}Mapper, ${subTab.entityName}> implements I${subTab.entityName}Service { + + @Autowired + private ${subTab.entityName}Mapper ${subTab.entityName?uncap_first}Mapper; + + @Override + public List<${subTab.entityName}> selectByMainId(String mainId) { + return ${subTab.entityName?uncap_first}Mapper.selectByMainId(mainId); + } +} +</#list> \ No newline at end of file diff --git a/jeecg-boot/src/main/resources/jeecg/code-template/onetomany/java/${bussiPackage}/${entityPackage}/vo/${entityName}Page.javai b/jeecg-boot/src/main/resources/jeecg/code-template/onetomany/java/${bussiPackage}/${entityPackage}/vo/${entityName}Page.javai new file mode 100644 index 0000000..2c41c39 --- /dev/null +++ b/jeecg-boot/src/main/resources/jeecg/code-template/onetomany/java/${bussiPackage}/${entityPackage}/vo/${entityName}Page.javai @@ -0,0 +1,44 @@ +package ${bussiPackage}.${entityPackage}.vo; + +import java.util.List; +import ${bussiPackage}.${entityPackage}.entity.${entityName}; +<#list subTables as sub> +import ${bussiPackage}.${entityPackage}.entity.${sub.entityName}; +</#list> +import lombok.Data; +import org.jeecgframework.poi.excel.annotation.Excel; +import org.jeecgframework.poi.excel.annotation.ExcelCollection; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.springframework.format.annotation.DateTimeFormat; +import java.util.Date; + +@Data +public class ${entityName}Page { + + <#list originalColumns as po> + /**${po.filedComment}*/ + <#if po.fieldName == primaryKeyField> + <#else> + <#if po.fieldType =='java.util.Date'> + <#if po.fieldDbType =='date'> + @Excel(name = "${po.filedComment}", width = 15, format = "yyyy-MM-dd") + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd") + @DateTimeFormat(pattern="yyyy-MM-dd") + <#elseif po.fieldDbType =='datetime'> + @Excel(name = "${po.filedComment}", width = 20, format = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + </#if> + <#else> + @Excel(name = "${po.filedComment}", width = 15) + </#if> + </#if> + private <#if po.fieldType=='java.sql.Blob'>byte[]<#else>${po.fieldType}</#if> ${po.fieldName}; + </#list> + + <#list subTables as sub> + @ExcelCollection(name="${sub.ftlDescription}") + private List<${sub.entityName}> ${sub.entityName?uncap_first}List; + </#list> + +} 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 index 54a977e..abdd79a 100644 --- 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 @@ -5,8 +5,7 @@ <div class="table-page-search-wrapper"> <a-form layout="inline"> <a-row :gutter="24"> - -<#list columns as po> +<#list columns as po><#rt/> <#if po.fieldName !='id' && po_index<= tableVo.searchFieldNum> <a-col :span="6"> <a-form-item label="${po.filedComment}"> @@ -15,7 +14,6 @@ </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> @@ -30,7 +28,10 @@ <!-- 操作按钮区域 --> <div class="table-operator"> <a-button @click="handleAdd" type="primary" icon="plus">新增</a-button> - + <a-button type="primary" icon="download" @click="handleExportXls">导出</a-button> + <a-upload name="file" :showUploadList="false" :multiple="false" :action="importExcelUrl" @change="handleImportExcel"> + <a-button type="primary" icon="import">导入</a-button> + </a-upload> <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> @@ -42,7 +43,12 @@ <!-- 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>项 + <i class="anticon anticon-info-circle ant-alert-icon"></i> + <span>已选择</span> + <a style="font-weight: 600"> + {{ selectedRowKeys.length }} + </a> + <span>项</span> <a style="margin-left: 24px" @click="onClearSelected">清空</a> </div> @@ -79,46 +85,46 @@ <!-- table区域-end --> <!-- 表单区域 --> - <${entityName?uncap_first}-modal ref="${entityName?uncap_first}Modal" @ok="modalFormOk"></${entityName?uncap_first}-modal> + <${entityName?uncap_first}-modal ref="modalForm" @ok="modalFormOk"/> + </a-card> </template> <script> + + import { JeecgListMixin } from '@/mixins/JeecgListMixin' import ${entityName}Modal from './modules/${entityName}Modal' - import { filterObj } from '@/utils/util' - import { deleteAction,getAction } from '@/api/manage' export default { name: "${entityName}List", + mixins: [JeecgListMixin], components: { ${entityName}Modal }, data () { return { description: '${tableVo.ftlDescription}管理页面', - // 查询条件 - queryParam: {}, // 表头 columns: [ { title: '#', dataIndex: '', - key:'rowIndex', - width:60, - align:"center", - customRender:function (t,r,index) { + key: 'rowIndex', + width: 60, + align: "center", + customRender:function (t, r, index) { return parseInt(index)+1; } }, - <#list columns as po> - <#if po.fieldName !='id'> - { +<#list columns as po><#rt/> + <#if po.fieldName !='id'> + { title: '${po.filedComment}', align:"center", dataIndex: '${po.fieldName}' }, - </#if> - </#list> + </#if> +</#list> { title: '操作', dataIndex: 'action', @@ -126,162 +132,64 @@ 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); - } - }); - } - }); + // 请求参数 + url: { + list: "/${entityPackage}/${entityName?uncap_first}/list", + delete: "/${entityPackage}/${entityName?uncap_first}/delete", + deleteBatch: "/${entityPackage}/${entityName?uncap_first}/deleteBatch", + exportXlsUrl: "${entityPackage}/${entityName?uncap_first}/exportXls", + importExcelUrl: "${entityPackage}/${entityName?uncap_first}/importExcel", + }, } }, - 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" + computed: { + importExcelUrl: function(){ + <#noparse>return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`;</#noparse> } - this.ipagination = pagination; - this.loadData(); }, - modalFormOk () { - // 新增/修改 成功时,重载列表 - this.loadData(); + + + methods: { + + initDictConfig() { } + } } </script> -<style scoped> - .ant-card-body .table-operator{ +<style lang="less" scoped> +/** Button按钮间距 */ + .ant-btn { + margin-left: 3px + } + .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-table-tbody .ant-table-row td{ - padding-top:15px; - padding-bottom:15px; + + .ant-btn-danger { + background-color: #ffffff } - .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} + .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 index 20a115a..e6c6807 100644 --- 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 @@ -1,155 +1,184 @@ <template> <a-modal :title="title" - :width="800" + :width="1200" :visible="visible" + :maskClosable="false" :confirmLoading="confirmLoading" @ok="handleOk" - @cancel="handleCancel" - cancelText="关闭"> - + @cancel="handleCancel"> <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> + <#if po_index % 2 == 0 ><#rt/> + <a-row> + <#if po.fieldName !='id'> + <#list [po_index, po_index+1] as idx><#rt/> + <#if idx lt columns?size> + <a-col :span="12" :gutter="8"> + <a-form-item + :labelCol="labelCol" + :wrapperCol="wrapperCol" + label="${columns[idx].filedComment}"> + <#if columns[idx].fieldType =='date'> + <a-date-picker + placeholder="请输入${columns[idx].filedComment}" + style="width:100%" + v-decorator="[ '${columns[idx].fieldName}', <#if columns[idx].nullable =='N'>validatorRules.${columns[idx].fieldName} <#else>{}</#if>]"/> + <#elseif columns[idx].fieldType =='datetime'> + <a-date-picker + placeholder="请输入${columns[idx].filedComment}" + style="width:100%" + :showTime="true" + format="YYYY-MM-DD HH:mm:ss" + v-decorator="[ '${columns[idx].fieldName}', <#if columns[idx].nullable =='N'>validatorRules.${columns[idx].fieldName} <#else>{}</#if>]"/> + <#elseif "int,decimal,double,"?contains(columns[idx].fieldType)> + <a-input-number placeholder="请输入${columns[idx].filedComment}" style="width:100%" v-decorator="[ '${columns[idx].fieldName}', <#if columns[idx].nullable =='N'>validatorRules.${columns[idx].fieldName} <#else>{}</#if>]"/> + <#else> + <a-input placeholder="请输入${columns[idx].filedComment}" v-decorator="['${columns[idx].fieldName}', <#if columns[idx].nullable =='N'>validatorRules.${columns[idx].fieldName} <#else>{}</#if>]"/> + </#if> + </a-form-item> + </a-col> + </#if> + </#list><#rt/> + </#if><#rt/> + </a-row> + </#if><#rt/> </#list> - </a-form> + + <!-- 子表单区域 --> + <a-tabs v-model="activeKey" @change="handleChangeTabs"> +<#list subTables as sub><#rt/> + <a-tab-pane tab="${sub.ftlDescription}" :key="refKeys[${sub_index}]" :forceRender="true"> + <j-editable-table + :ref="refKeys[${sub_index}]" + :loading="${sub.entityName?uncap_first}Table.loading" + :columns="${sub.entityName?uncap_first}Table.columns" + :dataSource="${sub.entityName?uncap_first}Table.dataSource" + :maxHeight="300" + :rowNumber="true" + :rowSelection="true" + :actionButton="true"/> + </a-tab-pane> +</#list> + </a-tabs> + </a-spin> </a-modal> </template> <script> - import { httpAction } from '@/api/manage' + + import moment from 'moment' import pick from 'lodash.pick' - import moment from "moment" + import { FormTypes } from '@/utils/JEditableTableUtil' + import { JEditableTableOneToManyMixin } from '@/mixins/JEditableTableOneToManyMixin' export default { - name: "${entityName}Modal", - data () { + name: '${entityName}Modal', + mixins: [JEditableTableOneToManyMixin], + data() { return { - title:"操作", - visible: false, - model: {}, - labelCol: { - xs: { span: 24 }, - sm: { span: 5 }, - }, - wrapperCol: { - xs: { span: 24 }, - sm: { span: 16 }, + // 新增时子表默认添加几行空数据 + addDefaultRowNum: 1, + validatorRules: { +<#list columns as po> + <#if po.fieldName !='id'> + <#if po.nullable =='N'> + ${po.fieldName}: { rules: [{ required: true, message: '请输入${po.filedComment}!' }] }, + </#if> + </#if> +</#list> }, - - 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> + refKeys: [<#list subTables as sub>'${sub.entityName?uncap_first}', </#list>], + activeKey: '${subTables[0].entityName?uncap_first}', +<#list subTables as sub><#rt/> + // ${sub.ftlDescription} + ${sub.entityName?uncap_first}Table: { + loading: false, + dataSource: [], + columns: [ +<#list sub.colums as col><#rt/> + <#if col.filedComment !='外键'> + { + title: '${col.filedComment}', + key: '${col.fieldName}', + <#if col.fieldType =='date'> + type: FormTypes.date, + <#elseif col.fieldType =='datetime'> + type: FormTypes.datetime, + <#elseif "int,decimal,double,"?contains(col.fieldType)> + type: FormTypes.inputNumber, + <#else> + type: FormTypes.input, + </#if> + defaultValue: '', + placeholder: '请输入${'$'}{title}', + <#if col.nullable =='N'> + validateRules: [{ required: true, message: '${'$'}{title}不能为空' }], + </#if> + }, + </#if> +</#list> + ] }, +</#list> url: { add: "/${entityPackage}/${entityName?uncap_first}/add", edit: "/${entityPackage}/${entityName?uncap_first}/edit", - }, +<#list subTables as sub><#rt/> + ${sub.entityName?uncap_first}: { + list: '/${entityPackage}/${entityName?uncap_first}/query${sub.entityName}ByMainId' + }, +</#list> + } } }, - created () { - }, methods: { - add () { - this.edit({}); - }, - edit (record) { - this.form.resetFields(); - this.model = Object.assign({}, record); - this.visible = true; + + /** 调用完edit()方法之后会自动调用此方法 */ + editAfter() { 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(); - }) - - - - } + this.form.setFieldsValue(pick(this.model, <#list columns as col>'${col.fieldName}', </#list>)) + // 时间格式化 +<#list columns as col><#rt/> + <#if col.fieldName !='id' && (col.fieldType =='date' || col.fieldType =='datetime')> + this.form.setFieldsValue({ ${col.fieldName}: this.model.${col.fieldName} ? moment(this.model.${col.fieldName}) : null }) + </#if> +</#list> }) + // 加载子表数据 + if (this.model.id) { + let params = { id: this.model.id } +<#list subTables as sub><#rt/> + this.requestSubTableData(this.url.${sub.entityName?uncap_first}.list, params, this.${sub.entityName?uncap_first}Table) +</#list> + } }, - handleCancel () { - this.close() - }, - - + + /** 整理成formData */ + classifyIntoFormData(allValues) { + let main = Object.assign(this.model, allValues.formValue) + //时间格式化 +<#list columns as col><#rt/> + <#if col.fieldName !='id' && col.fieldType =='date'> + main.${col.fieldName} = main.${col.fieldName} ? main.${col.fieldName}.format() : null; + <#elseif col.fieldName !='id' && col.fieldType =='datetime'> + main.${col.fieldName} = main.${col.fieldName} ? main.${col.fieldName}.format('YYYY-MM-DD HH:mm:ss') : null; + </#if> +</#list> + return { + ...main, // 展开 +<#list subTables as sub><#rt/> + ${sub.entityName?uncap_first}List: allValues.tablesValue[${sub_index}].values, +</#list> + } + } } } </script> <style scoped> - </style> \ No newline at end of file diff --git a/jeecg-boot/src/main/resources/jeecg/code-template/onetomany2/java/${bussiPackage}/${entityPackage}/controller/${entityName}Controller.javai b/jeecg-boot/src/main/resources/jeecg/code-template/onetomany2/java/${bussiPackage}/${entityPackage}/controller/${entityName}Controller.javai new file mode 100644 index 0000000..c53a5b0 --- /dev/null +++ b/jeecg-boot/src/main/resources/jeecg/code-template/onetomany2/java/${bussiPackage}/${entityPackage}/controller/${entityName}Controller.javai @@ -0,0 +1,379 @@ +package ${bussiPackage}.${entityPackage}.controller; + +import java.io.UnsupportedEncodingException; +import java.io.IOException; +import java.net.URLDecoder; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Map; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.jeecgframework.poi.excel.ExcelImportUtil; +import org.jeecgframework.poi.excel.def.NormalExcelConstants; +import org.jeecgframework.poi.excel.entity.ExportParams; +import org.jeecgframework.poi.excel.entity.ImportParams; +import org.jeecgframework.poi.excel.view.JeecgEntityExcelView; + +import org.jeecg.common.api.vo.Result; +import org.jeecg.common.system.query.QueryGenerator; +import org.jeecg.common.util.oConvertUtils; +<#list subTables as sub> +import ${bussiPackage}.${entityPackage}.entity.${sub.entityName}; +</#list> +import ${bussiPackage}.${entityPackage}.entity.${entityName}; +import ${bussiPackage}.${entityPackage}.vo.${entityName}Page; +import ${bussiPackage}.${entityPackage}.service.I${entityName}Service; +<#list subTables as sub> +import ${bussiPackage}.${entityPackage}.service.I${sub.entityName}Service; +</#list> +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.servlet.ModelAndView; +import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.multipart.MultipartHttpServletRequest; +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; +import com.alibaba.fastjson.JSON; + + /** + * @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; + <#list subTables as sub> + @Autowired + private I${sub.entityName}Service ${sub.entityName?uncap_first}Service; + </#list> + + /** + * 分页列表查询 + * @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 = QueryGenerator.initQueryWrapper(${entityName?uncap_first}, req.getParameterMap()); + Page<${entityName}> page = new Page<${entityName}>(pageNo, pageSize); + IPage<${entityName}> pageList = ${entityName?uncap_first}Service.page(page, queryWrapper); + result.setSuccess(true); + result.setResult(pageList); + return result; + } + + /** + * 添加 + * @param ${entityName?uncap_first}Page + * @return + */ + @PostMapping(value = "/add") + public Result<${entityName}> add(@RequestBody ${entityName}Page ${entityName?uncap_first}Page) { + Result<${entityName}> result = new Result<${entityName}>(); + try { + ${entityName} ${entityName?uncap_first} = new ${entityName}(); + BeanUtils.copyProperties(${entityName?uncap_first}Page, ${entityName?uncap_first}); + + ${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}Page + * @return + */ + @PutMapping(value = "/edit") + public Result<${entityName}> edit(@RequestBody ${entityName}Page ${entityName?uncap_first}Page) { + Result<${entityName}> result = new Result<${entityName}>(); + ${entityName} ${entityName?uncap_first} = new ${entityName}(); + BeanUtils.copyProperties(${entityName?uncap_first}Page, ${entityName?uncap_first}); + ${entityName} ${entityName?uncap_first}Entity = ${entityName?uncap_first}Service.getById(${entityName?uncap_first}.getId()); + if(${entityName?uncap_first}Entity==null) { + result.error500("未找到对应实体"); + }else { + ${entityName?uncap_first}Service.updateById(${entityName?uncap_first}); + 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 { + ${entityName?uncap_first}Service.delMain(id); + 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; + } + + //===========================以下是子表信息操作相关API==================================== + + <#list subTables as sub> + /** + * 通过主表id查询${sub.ftlDescription} + * @param mainId + * @return + */ + @GetMapping(value = "/list${sub.entityName}ByMainId") + public Result<List<${sub.entityName}>> query${sub.entityName}ListByMainId(@RequestParam(name="mainId",required=false) String mainId) { + Result<List<${sub.entityName}>> result = new Result<List<${sub.entityName}>>(); + List<${sub.entityName}> ${sub.entityName?uncap_first}List = null; + if (mainId != null) { + ${sub.entityName?uncap_first}List = ${sub.entityName?uncap_first}Service.selectByMainId(mainId); + result.setResult(${sub.entityName?uncap_first}List); + result.setSuccess(true); + return result; + }else return null; + } + + /** + * 添加${sub.ftlDescription} + * + * @param ${sub.entityName?uncap_first} + * @return + */ + @PostMapping(value = "/add${sub.entityName}") + public Result<${sub.entityName}> add${sub.entityName}(@RequestBody ${sub.entityName} ${sub.entityName?uncap_first}) { + Result<${sub.entityName}> result = new Result<>(); + try { + boolean ok = ${sub.entityName?uncap_first}Service.save(${sub.entityName?uncap_first}); + if (ok) { + result.setSuccess(true); + result.setMessage("添加${sub.ftlDescription}成功."); + } else { + result.setSuccess(false); + result.setMessage("添加${sub.ftlDescription}失败!"); + } + return result; + } catch (Exception e) { + e.fillInStackTrace(); + result.setSuccess(false); + result.setMessage("添加${sub.ftlDescription}过程中出现了异常: " + e.getMessage()); + return result; + } + } + + /** + * 编辑${sub.ftlDescription} + * + * @param ${sub.entityName?uncap_first} + * @return + */ + @PutMapping("/edit${sub.entityName}") + public Result<${sub.entityName}> edit${sub.entityName}(@RequestBody ${sub.entityName} ${sub.entityName?uncap_first}) { + Result<${sub.entityName}> result = new Result<>(); + try { + boolean ok = ${sub.entityName?uncap_first}Service.updateById(${sub.entityName?uncap_first}); + if (ok) { + result.setSuccess(true); + result.setMessage("更新${sub.ftlDescription}成功."); + } else { + result.setSuccess(false); + result.setMessage("更新${sub.ftlDescription}失败!"); + } + return result; + } catch (Exception e) { + result.setSuccess(false); + result.setMessage("更新数据过程中出现异常啦: " + e.getMessage()); + return result; + } + } + + /** + * 通过id删除${sub.ftlDescription} + * + * @param id + * @return + */ + @DeleteMapping(value = "/delete${sub.entityName}") + public Result<${sub.entityName}> delete${sub.entityName}(@RequestParam(name = "id", required = true) String id) { + Result<${sub.entityName}> result = new Result<>(); + try { + boolean ok = ${sub.entityName?uncap_first}Service.removeById(id); + if (ok) { + result.setSuccess(true); + result.setMessage("删除${sub.ftlDescription}成功."); + } else { + result.setSuccess(false); + result.setMessage("删除${sub.ftlDescription}失败!"); + } + return result; + } catch (Exception e) { + result.setSuccess(false); + result.setMessage("删除${sub.ftlDescription}过程中出现异常啦: " + e.getMessage()); + return result; + } + } + + /** + * 批量删除${sub.ftlDescription} + * + * @param ids + * @return + */ + @DeleteMapping(value = "/deleteBatch${sub.entityName}") + public Result<${sub.entityName}> deleteBatch${sub.entityName}(@RequestParam(name = "ids", required = true) String ids) { + Result<${sub.entityName}> result = new Result<${sub.entityName}>(); + if (ids == null || "".equals(ids.trim())) { + result.error500("参数不识别!"); + } else { + this.${sub.entityName?uncap_first}Service.removeByIds(Arrays.asList(ids.split(","))); + result.success("删除成功!"); + } + return result; + } + + </#list> + + /** + * 导出excel + * + * @param request + * @param response + */ + @RequestMapping(value = "/exportXls") + public ModelAndView exportXls(HttpServletRequest request, HttpServletResponse response) { + // Step.1 组装查询条件 + QueryWrapper<${entityName}> queryWrapper = null; + try { + String paramsStr = request.getParameter("paramsStr"); + if (oConvertUtils.isNotEmpty(paramsStr)) { + String deString = URLDecoder.decode(paramsStr, "UTF-8"); + ${entityName} ${entityName?uncap_first} = JSON.parseObject(deString, ${entityName}.class); + queryWrapper = QueryGenerator.initQueryWrapper(${entityName?uncap_first}, request.getParameterMap()); + } + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + //Step.2 AutoPoi 导出Excel + ModelAndView mv = new ModelAndView(new JeecgEntityExcelView()); + List<${entityName}Page> pageList = new ArrayList<${entityName}Page>(); + List<${entityName}> ${entityName?uncap_first}List = ${entityName?uncap_first}Service.list(queryWrapper); + for (${entityName} ${entityName?uncap_first} : ${entityName?uncap_first}List) { + ${entityName}Page vo = new ${entityName}Page(); + BeanUtils.copyProperties(${entityName?uncap_first}, vo); + <#list subTables as sub> + List<${sub.entityName}> ${sub.entityName?uncap_first}List = ${sub.entityName?uncap_first}Service.selectByMainId(${entityName?uncap_first}.getId()); + vo.set${sub.entityName}List(${sub.entityName?uncap_first}List); + </#list> + pageList.add(vo); + } + //导出文件名称 + mv.addObject(NormalExcelConstants.FILE_NAME, "${tableVo.ftlDescription}列表"); + mv.addObject(NormalExcelConstants.CLASS, ${entityName}Page.class); + mv.addObject(NormalExcelConstants.PARAMS, new ExportParams("${tableVo.ftlDescription}列表数据", "导出人:Jeecg", "导出信息")); + mv.addObject(NormalExcelConstants.DATA_LIST, pageList); + return mv; + } + + /** + * 通过excel导入数据 + * + * @param request + * @param response + * @return + */ + @RequestMapping(value = "/importExcel", method = RequestMethod.POST) + public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) { + MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request; + Map<String, MultipartFile> fileMap = multipartRequest.getFileMap(); + for (Map.Entry<String, MultipartFile> entity : fileMap.entrySet()) { + MultipartFile file = entity.getValue();// 获取上传文件对象 + ImportParams params = new ImportParams(); + params.setTitleRows(2); + params.setHeadRows(1); + params.setNeedSave(true); + try { + List<${entityName}Page> list = ExcelImportUtil.importExcel(file.getInputStream(), ${entityName}Page.class, params); + for (${entityName}Page page : list) { + ${entityName} po = new ${entityName}(); + BeanUtils.copyProperties(page, po); + ${entityName?uncap_first}Service.saveMain(po, <#list subTables as sub>page.get${sub.entityName}List()<#if sub_has_next>,</#if></#list>); + } + return Result.ok("文件导入成功!数据行数:" + list.size()); + } catch (Exception e) { + log.error(e.getMessage()); + return Result.error("文件导入失败!"); + } finally { + try { + file.getInputStream().close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + return Result.ok("文件导入失败!"); + } +} diff --git a/jeecg-boot/src/main/resources/jeecg/code-template/onetomany2/java/${bussiPackage}/${entityPackage}/entity/${entityName}.javai b/jeecg-boot/src/main/resources/jeecg/code-template/onetomany2/java/${bussiPackage}/${entityPackage}/entity/${entityName}.javai new file mode 100644 index 0000000..5cbe5e1 --- /dev/null +++ b/jeecg-boot/src/main/resources/jeecg/code-template/onetomany2/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 == primaryKeyField> + @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/onetomany2/java/${bussiPackage}/${entityPackage}/entity/[1-n]Entity.javai b/jeecg-boot/src/main/resources/jeecg/code-template/onetomany2/java/${bussiPackage}/${entityPackage}/entity/[1-n]Entity.javai new file mode 100644 index 0000000..bf376ad --- /dev/null +++ b/jeecg-boot/src/main/resources/jeecg/code-template/onetomany2/java/${bussiPackage}/${entityPackage}/entity/[1-n]Entity.javai @@ -0,0 +1,49 @@ +<#list subTables as subTab> +#segment#${subTab.entityName}.java +package ${bussiPackage}.${entityPackage}.entity; + +import java.io.Serializable; +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; +import org.jeecgframework.poi.excel.annotation.Excel; + +/** + * @Description: ${subTab.ftlDescription} + * @author: jeecg-boot + * @date: ${.now?string["yyyy-MM-dd"]} + * @version: V1.0 + */ +@Data +@TableName("${subTab.tableName}") +public class ${subTab.entityName} implements Serializable { + private static final long serialVersionUID = 1L; + + <#list subTab.originalColumns as po> + /**${po.filedComment}*/ + <#if po.fieldName == primaryKeyField> + @TableId(type = IdType.UUID) + <#else> + <#if po.fieldType =='java.util.Date'> + <#if po.fieldDbType =='date'> + @Excel(name = "${po.filedComment}", width = 15, format = "yyyy-MM-dd") + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd") + @DateTimeFormat(pattern="yyyy-MM-dd") + <#elseif po.fieldDbType =='datetime'> + @Excel(name = "${po.filedComment}", width = 20, format = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + </#if> + <#else> + <#if !subTab.foreignKeys?seq_contains(po.fieldName?cap_first)> + @Excel(name = "${po.filedComment}", width = 15) + </#if> + </#if> + </#if> + private <#if po.fieldType=='java.sql.Blob'>byte[]<#else>${po.fieldType}</#if> ${po.fieldName}; + </#list> +} +</#list> \ No newline at end of file diff --git a/jeecg-boot/src/main/resources/jeecg/code-template/onetomany2/java/${bussiPackage}/${entityPackage}/mapper/${entityName}Mapper.javai b/jeecg-boot/src/main/resources/jeecg/code-template/onetomany2/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/onetomany2/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/onetomany2/java/${bussiPackage}/${entityPackage}/mapper/[1-n]Mapper.javai b/jeecg-boot/src/main/resources/jeecg/code-template/onetomany2/java/${bussiPackage}/${entityPackage}/mapper/[1-n]Mapper.javai new file mode 100644 index 0000000..e607930 --- /dev/null +++ b/jeecg-boot/src/main/resources/jeecg/code-template/onetomany2/java/${bussiPackage}/${entityPackage}/mapper/[1-n]Mapper.javai @@ -0,0 +1,21 @@ +<#list subTables as subTab> +#segment#${subTab.entityName}Mapper.java +package ${bussiPackage}.${entityPackage}.mapper; + +import java.util.List; +import ${bussiPackage}.${entityPackage}.entity.${subTab.entityName}; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + * @Description: ${subTab.ftlDescription} + * @author: jeecg-boot + * @date: ${.now?string["yyyy-MM-dd"]} + * @version: V1.0 + */ +public interface ${subTab.entityName}Mapper extends BaseMapper<${subTab.entityName}> { + + public boolean deleteByMainId(String mainId); + + public List<${subTab.entityName}> selectByMainId(String mainId); +} +</#list> \ No newline at end of file diff --git a/jeecg-boot/src/main/resources/jeecg/code-template/onetomany2/java/${bussiPackage}/${entityPackage}/mapper/xml/${entityName}Mapper.xml b/jeecg-boot/src/main/resources/jeecg/code-template/onetomany2/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/onetomany2/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/onetomany2/java/${bussiPackage}/${entityPackage}/mapper/xml/[1-n]Mapper.xml b/jeecg-boot/src/main/resources/jeecg/code-template/onetomany2/java/${bussiPackage}/${entityPackage}/mapper/xml/[1-n]Mapper.xml new file mode 100644 index 0000000..708ae0b --- /dev/null +++ b/jeecg-boot/src/main/resources/jeecg/code-template/onetomany2/java/${bussiPackage}/${entityPackage}/mapper/xml/[1-n]Mapper.xml @@ -0,0 +1,36 @@ +<#list subTables as subTab> +<#assign originalForeignKeys = subTab.originalForeignKeys> +#segment#${subTab.entityName}Mapper.xml +<?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.${subTab.entityName}Mapper"> + + <delete id="deleteByMainId" parameterType="java.lang.String"> + DELETE + FROM ${subTab.tableName} + WHERE + <#list originalForeignKeys as key> + <#if key?lower_case?index_of("${primaryKeyField}")!=-1> + ${key} = ${r'#'}{${primaryKeyField}} <#rt/> + <#else> + ${key} = ${r'#'}{${key}} <#rt/> + </#if> + <#if key_has_next>AND</#if> + </#list> + </delete> + + <select id="selectByMainId" parameterType="java.lang.String" resultType="${bussiPackage}.${entityPackage}.entity.${subTab.entityName}"> + SELECT * + FROM ${subTab.tableName} + WHERE + <#list originalForeignKeys as key> + <#if key?lower_case?index_of("${primaryKeyField}")!=-1> + ${key} = ${r'#'}{${primaryKeyField}} <#rt/> + <#else> + ${key} = ${r'#'}{${key}} <#rt/> + </#if> + <#if key_has_next>AND</#if> + </#list> + </select> +</mapper> +</#list> \ No newline at end of file diff --git a/jeecg-boot/src/main/resources/jeecg/code-template/onetomany2/java/${bussiPackage}/${entityPackage}/service/I${entityName}Service.javai b/jeecg-boot/src/main/resources/jeecg/code-template/onetomany2/java/${bussiPackage}/${entityPackage}/service/I${entityName}Service.javai new file mode 100644 index 0000000..9032bd8 --- /dev/null +++ b/jeecg-boot/src/main/resources/jeecg/code-template/onetomany2/java/${bussiPackage}/${entityPackage}/service/I${entityName}Service.javai @@ -0,0 +1,42 @@ +package ${bussiPackage}.${entityPackage}.service; + +<#list subTables as sub> +import ${bussiPackage}.${entityPackage}.entity.${sub.entityName}; +</#list> +import ${bussiPackage}.${entityPackage}.entity.${entityName}; +import com.baomidou.mybatisplus.extension.service.IService; +import java.io.Serializable; +import java.util.Collection; +import java.util.List; + +/** + * @Description: ${tableVo.ftlDescription} + * @author: jeecg-boot + * @date: ${.now?string["yyyy-MM-dd"]} + * @version: V1.0 + */ +public interface I${entityName}Service extends IService<${entityName}> { + + /** + * 添加一对多 + * + */ + public void saveMain(${entityName} ${entityName?uncap_first},<#list subTables as sub>List<${sub.entityName}> ${sub.entityName?uncap_first}List<#if sub_has_next>,</#if></#list>) ; + + /** + * 修改一对多 + * + */ + public void updateMain(${entityName} ${entityName?uncap_first},<#list subTables as sub>List<${sub.entityName}> ${sub.entityName?uncap_first}List<#if sub_has_next>,</#if></#list>); + + /** + * 删除一对多 + */ + public void delMain (String id); + + /** + * 批量删除一对多 + */ + public void delBatchMain (Collection<? extends Serializable> idList); + +} diff --git a/jeecg-boot/src/main/resources/jeecg/code-template/onetomany2/java/${bussiPackage}/${entityPackage}/service/[1-n]Service.javai b/jeecg-boot/src/main/resources/jeecg/code-template/onetomany2/java/${bussiPackage}/${entityPackage}/service/[1-n]Service.javai new file mode 100644 index 0000000..af91385 --- /dev/null +++ b/jeecg-boot/src/main/resources/jeecg/code-template/onetomany2/java/${bussiPackage}/${entityPackage}/service/[1-n]Service.javai @@ -0,0 +1,19 @@ +<#list subTables as subTab> +#segment#I${subTab.entityName}Service.java +package ${bussiPackage}.${entityPackage}.service; + +import ${bussiPackage}.${entityPackage}.entity.${subTab.entityName}; +import com.baomidou.mybatisplus.extension.service.IService; +import java.util.List; + +/** + * @Description: ${subTab.ftlDescription} + * @author: jeecg-boot + * @date: ${.now?string["yyyy-MM-dd"]} + * @version: V1.0 + */ +public interface I${subTab.entityName}Service extends IService<${subTab.entityName}> { + + public List<${subTab.entityName}> selectByMainId(String mainId); +} +</#list> diff --git a/jeecg-boot/src/main/resources/jeecg/code-template/onetomany2/java/${bussiPackage}/${entityPackage}/service/impl/${entityName}ServiceImpl.javai b/jeecg-boot/src/main/resources/jeecg/code-template/onetomany2/java/${bussiPackage}/${entityPackage}/service/impl/${entityName}ServiceImpl.javai new file mode 100644 index 0000000..5b539dd --- /dev/null +++ b/jeecg-boot/src/main/resources/jeecg/code-template/onetomany2/java/${bussiPackage}/${entityPackage}/service/impl/${entityName}ServiceImpl.javai @@ -0,0 +1,101 @@ +package ${bussiPackage}.${entityPackage}.service.impl; + +import ${bussiPackage}.${entityPackage}.entity.${entityName}; +<#list subTables as sub> +import ${bussiPackage}.${entityPackage}.entity.${sub.entityName}; +</#list> +<#list subTables as sub> +import ${bussiPackage}.${entityPackage}.mapper.${sub.entityName}Mapper; +</#list> +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; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.transaction.annotation.Transactional; +import java.io.Serializable; +import java.util.List; +import java.util.Collection; + +/** + * @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 { + + @Autowired + private ${entityName}Mapper ${entityName?uncap_first}Mapper; + <#list subTables as sub> + @Autowired + private ${sub.entityName}Mapper ${sub.entityName?uncap_first}Mapper; + </#list> + + @Override + @Transactional + public void saveMain(${entityName} ${entityName?uncap_first}, <#list subTables as sub>List<${sub.entityName}> ${sub.entityName?uncap_first}List<#if sub_has_next>,</#if></#list>) { + ${entityName?uncap_first}Mapper.insert(${entityName?uncap_first}); + <#list subTables as sub> + for(${sub.entityName} entity:${sub.entityName?uncap_first}List) { + <#list sub.foreignKeys as key> + //外键设置 + <#if key?lower_case?index_of("${primaryKeyField}")!=-1> + entity.set${key?cap_first}(${entityName?uncap_first}.get${primaryKeyField?cap_first}()); + <#else> + entity.set${key?cap_first}(${entityName?uncap_first}.get${key}()); + </#if> + </#list> + ${sub.entityName?uncap_first}Mapper.insert(entity); + } + </#list> + } + + @Override + @Transactional + public void updateMain(${entityName} ${entityName?uncap_first},<#list subTables as sub>List<${sub.entityName}> ${sub.entityName?uncap_first}List<#if sub_has_next>,</#if></#list>) { + ${entityName?uncap_first}Mapper.updateById(${entityName?uncap_first}); + + //1.先删除子表数据 + <#list subTables as sub> + ${sub.entityName?uncap_first}Mapper.deleteByMainId(${entityName?uncap_first}.getId()); + </#list> + + //2.子表数据重新插入 + <#list subTables as sub> + for(${sub.entityName} entity:${sub.entityName?uncap_first}List) { + <#list sub.foreignKeys as key> + //外键设置 + <#if key?lower_case?index_of("${primaryKeyField}")!=-1> + entity.set${key?cap_first}(${entityName?uncap_first}.get${primaryKeyField?cap_first}()); + <#else> + entity.set${key?cap_first}(${entityName?uncap_first}.get${key}()); + </#if> + </#list> + ${sub.entityName?uncap_first}Mapper.insert(entity); + } + </#list> + } + + @Override + @Transactional + public void delMain(String id) { + ${entityName?uncap_first}Mapper.deleteById(id); + <#list subTables as sub> + ${sub.entityName?uncap_first}Mapper.deleteByMainId(id); + </#list> + } + + @Override + @Transactional + public void delBatchMain(Collection<? extends Serializable> idList) { + for(Serializable id:idList) { + ${entityName?uncap_first}Mapper.deleteById(id); + <#list subTables as sub> + ${sub.entityName?uncap_first}Mapper.deleteByMainId(id.toString()); + </#list> + } + } + +} diff --git a/jeecg-boot/src/main/resources/jeecg/code-template/onetomany2/java/${bussiPackage}/${entityPackage}/service/impl/[1-n]ServiceImpl.javai b/jeecg-boot/src/main/resources/jeecg/code-template/onetomany2/java/${bussiPackage}/${entityPackage}/service/impl/[1-n]ServiceImpl.javai new file mode 100644 index 0000000..c893c7e --- /dev/null +++ b/jeecg-boot/src/main/resources/jeecg/code-template/onetomany2/java/${bussiPackage}/${entityPackage}/service/impl/[1-n]ServiceImpl.javai @@ -0,0 +1,30 @@ +<#list subTables as subTab> +#segment#${subTab.entityName}ServiceImpl.java +package ${bussiPackage}.${entityPackage}.service.impl; + +import ${bussiPackage}.${entityPackage}.entity.${subTab.entityName}; +import ${bussiPackage}.${entityPackage}.mapper.${subTab.entityName}Mapper; +import ${bussiPackage}.${entityPackage}.service.I${subTab.entityName}Service; +import org.springframework.stereotype.Service; +import java.util.List; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * @Description: ${subTab.ftlDescription} + * @author: jeecg-boot + * @date: ${.now?string["yyyy-MM-dd"]} + * @version: V1.0 + */ +@Service +public class ${subTab.entityName}ServiceImpl extends ServiceImpl<${subTab.entityName}Mapper, ${subTab.entityName}> implements I${subTab.entityName}Service { + + @Autowired + private ${subTab.entityName}Mapper ${subTab.entityName?uncap_first}Mapper; + + @Override + public List<${subTab.entityName}> selectByMainId(String mainId) { + return ${subTab.entityName?uncap_first}Mapper.selectByMainId(mainId); + } +} +</#list> \ No newline at end of file diff --git a/jeecg-boot/src/main/resources/jeecg/code-template/onetomany2/java/${bussiPackage}/${entityPackage}/vo/${entityName}Page.javai b/jeecg-boot/src/main/resources/jeecg/code-template/onetomany2/java/${bussiPackage}/${entityPackage}/vo/${entityName}Page.javai new file mode 100644 index 0000000..7e20b38 --- /dev/null +++ b/jeecg-boot/src/main/resources/jeecg/code-template/onetomany2/java/${bussiPackage}/${entityPackage}/vo/${entityName}Page.javai @@ -0,0 +1,43 @@ +package ${bussiPackage}.${entityPackage}.vo; + +import java.util.List; +import ${bussiPackage}.${entityPackage}.entity.${entityName}; +<#list subTables as sub> +import ${bussiPackage}.${entityPackage}.entity.${sub.entityName}; +</#list> +import lombok.Data; +import org.jeecgframework.poi.excel.annotation.Excel; +import org.jeecgframework.poi.excel.annotation.ExcelCollection; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.springframework.format.annotation.DateTimeFormat; + +@Data +public class ${entityName}Page { + + <#list originalColumns as po> + /**${po.filedComment}*/ + <#if po.fieldName == primaryKeyField> + <#else> + <#if po.fieldType =='java.util.Date'> + <#if po.fieldDbType =='date'> + @Excel(name = "${po.filedComment}", width = 15, format = "yyyy-MM-dd") + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd") + @DateTimeFormat(pattern="yyyy-MM-dd") + <#elseif po.fieldDbType =='datetime'> + @Excel(name = "${po.filedComment}", width = 20, format = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + </#if> + <#else> + @Excel(name = "${po.filedComment}", width = 15) + </#if> + </#if> + private <#if po.fieldType=='java.sql.Blob'>byte[]<#else>${po.fieldType}</#if> ${po.fieldName}; + </#list> + + <#list subTables as sub> + @ExcelCollection(name="${sub.ftlDescription}") + private List<${sub.entityName}> ${sub.entityName?uncap_first}List; + </#list> + +} diff --git a/jeecg-boot/src/main/resources/jeecg/code-template/onetomany2/java/${bussiPackage}/${entityPackage}/vue/${entityName}List.vuei b/jeecg-boot/src/main/resources/jeecg/code-template/onetomany2/java/${bussiPackage}/${entityPackage}/vue/${entityName}List.vuei new file mode 100644 index 0000000..c0f196e --- /dev/null +++ b/jeecg-boot/src/main/resources/jeecg/code-template/onetomany2/java/${bussiPackage}/${entityPackage}/vue/${entityName}List.vuei @@ -0,0 +1,258 @@ +<template> + <a-card :bordered="false"> + + <!-- 查询区域 --> + <div class="table-page-search-wrapper"> + <a-form layout="inline"> + <a-row :gutter="24"> +<#list columns as po><#rt/> +<#if po.fieldName !='id' && po_index<= tableVo.searchFieldNum> + <a-col :md="6" :sm="24"> + <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 :md="6" :sm="24"> + <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-button type="primary" icon="download" @click="handleExportXls">导出</a-button> + <a-upload name="file" :showUploadList="false" :multiple="false" :action="importExcelUrl" @change="handleImportExcel"> + <a-button type="primary" icon="import">导入</a-button> + </a-upload> + <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> + <span>已选择</span> + <a style="font-weight: 600"> + {{ selectedRowKeys.length }} + </a> + <span>项</span> + <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,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"> + <#list subTables as sub><#rt/> + <a-tab-pane tab="${sub.ftlDescription}" :key="refKeys[${sub_index}]" :forceRender="true"> + <${sub.entityName?uncap_first}-List ref="${sub.entityName}List"></${sub.entityName?uncap_first}-List> + </a-tab-pane> + </#list> + </a-tabs> + + <!-- 表单区域 --> + <${entityName?uncap_first}-modal ref="modalForm" @ok="modalFormOk"/> + + </a-card> +</template> + +<script> + import { JeecgListMixin } from '@/mixins/JeecgListMixin' + import ${entityName}Modal from './modules/${entityName}Modal' + import {deleteAction} from '@/api/manage' + <#list subTables as sub><#rt/> + import ${sub.entityName}List from './${sub.entityName}List' + import ${sub.entityName}Modal from './modules/${sub.entityName}Modal' + </#list> + + export default { + name: "${entityName}List", + mixins: [JeecgListMixin], + components: { + ${entityName}Modal, + <#list subTables as sub><#rt/> + ${sub.entityName}Modal, + ${sub.entityName}List, + </#list> + }, + data () { + return { + refKeys: [<#list subTables as sub>'${sub.entityName?uncap_first}', </#list>], + description: '${tableVo.ftlDescription}管理页面', + // 表头 + columns: [ + { + title: '#', + dataIndex: '', + key: 'rowIndex', + width: 60, + align: "center", + customRender:function (t, r, index) { + return parseInt(index)+1; + } + }, +<#list columns as po><#rt/> + <#if po.fieldName !='id'> + { + title: '${po.filedComment}', + align:"center", + dataIndex: '${po.fieldName}' + }, + </#if> +</#list> + { + title: '操作', + dataIndex: 'action', + align:"center", + scopedSlots: { customRender: 'action' }, + } + ], + + //操作url + type: "radio", + url: { + list: "/${entityPackage}/${entityName?uncap_first}/list", + delete: "/${entityPackage}/${entityName?uncap_first}/delete", + deleteBatch: "/${entityPackage}/${entityName?uncap_first}/deleteBatch", + exportXlsUrl: "${entityPackage}/${entityName?uncap_first}/exportXls", + importExcelUrl: "${entityPackage}/${entityName?uncap_first}/importExcel", + }, + } + }, + computed: { + importExcelUrl: function(){ + <#noparse>return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`;</#noparse> + } + }, + methods: { + clickThenCheck(record) { + return { + on: { + click: () => { + this.onSelectChange(record.id.split(","), [record]); + } + } + }; + }, + onSelectChange(selectedRowKeys, selectionRows) { + this.selectedRowKeys = selectedRowKeys; + this.selectionRows = selectionRows; + <#list subTables as sub><#rt/> + this.$refs.${sub.entityName}List.getMain(this.selectedRowKeys[0]); + </#list> + }, + onClearSelected() { + this.selectedRowKeys = []; + this.selectionRows = []; + <#list subTables as sub><#rt/> + this.$refs.${sub.entityName}List.queryParam.mainId = null; + this.$refs.${sub.entityName}List.loadData(); + this.$refs.${sub.entityName}List.selectedRowKeys = []; + this.$refs.${sub.entityName}List.selectionRows = []; + </#list> + }, + + handleDelete: function (id) { + var that = this; + deleteAction(that.url.delete, {id: id}).then((res) => { + if (res.success) { + that.$message.success(res.message); + that.loadData(); + <#list subTables as sub><#rt/> + this.$refs.${sub.entityName}List.loadData(); + </#list> + } else { + that.$message.warning(res.message); + } + }); + }, + searchQuery:function(){ + this.selectedRowKeys = []; + this.selectionRows = []; + <#list subTables as sub><#rt/> + this.$refs.${sub.entityName}List.queryParam.mainId = null; + this.$refs.${sub.entityName}List.loadData(); + this.$refs.${sub.entityName}List.selectedRowKeys = []; + this.$refs.${sub.entityName}List.selectionRows = []; + </#list> + this.loadData(); + } + } + } +</script> +<style scoped> +/** Button按钮间距 */ + .ant-btn { + margin-left: 3px + } + .ant-card-body .table-operator { + margin-bottom: 18px; + } + + .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/onetomany2/java/${bussiPackage}/${entityPackage}/vue/[1-n]List.vuei b/jeecg-boot/src/main/resources/jeecg/code-template/onetomany2/java/${bussiPackage}/${entityPackage}/vue/[1-n]List.vuei new file mode 100644 index 0000000..fb3601f --- /dev/null +++ b/jeecg-boot/src/main/resources/jeecg/code-template/onetomany2/java/${bussiPackage}/${entityPackage}/vue/[1-n]List.vuei @@ -0,0 +1,140 @@ +<#list subTables as subTab> +#segment#${subTab.entityName}List.vue +<template> + <a-card :bordered="false"> + + <!-- 操作按钮区域 --> + <div class="table-operator" :md="24" :sm="24" style="margin: 0px 0px 20px 0px"> + <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 --> + + <!-- 表单区域 --> + <${subTab.entityName}-modal ref="modalForm" @ok="modalFormOk"/> + </a-card> +</template> + +<script> + import ${subTab.entityName}Modal from './modules/${subTab.entityName}Modal' + import {JeecgListMixin} from '@/mixins/JeecgListMixin' + import {getAction} from '@/api/manage' + + export default { + name: "${subTab.entityName}List", + mixins: [JeecgListMixin], + components: { + ${subTab.entityName}Modal, + }, + data() { + return { + description: '信息', + // 表头 + columns: [ + <#list subTab.colums as po><#rt/> + <#if po.fieldName !='id' && subTab.foreignKeys[0]?uncap_first != po.fieldName> + { + title: '${po.filedComment}', + align:"center", + dataIndex: '${po.fieldName}' + }, + </#if> +</#list> + { + title: '操作', + key: 'operation', + align: "center", + width: 130, + scopedSlots: {customRender: 'action'}, + }], + url: { + list: "/${entityPackage}/${entityName?uncap_first}/list${subTab.entityName}ByMainId", + delete: "/${entityPackage}/${entityName?uncap_first}/delete${subTab.entityName}", + deleteBatch: "/${entityPackage}/${entityName?uncap_first}/deleteBatch${subTab.entityName}", + } + } + }, + methods: { + loadData(arg) { + if (arg === 1) { + this.ipagination.current = 1; + } + var params = this.getQueryParams(); + getAction(this.url.list, {mainId: params.mainId}).then((res) => { + if (res.success) { + this.dataSource = res.result; + } else { + this.dataSource = null; + } + }) + }, + getMain(mainId) { + this.queryParam.mainId = mainId; + this.loadData(1); + }, + handleAdd: function () { + this.$refs.modalForm.add(this.queryParam.mainId); + this.$refs.modalForm.title = "添加${subTab.ftlDescription}"; + }, + } + } +</script> +<style scoped> + .ant-card { + margin-left: -30px; + margin-right: -30px; + } +</style> +</#list> \ No newline at end of file diff --git a/jeecg-boot/src/main/resources/jeecg/code-template/onetomany2/java/${bussiPackage}/${entityPackage}/vue/modules/${entityName}Modal.vuei b/jeecg-boot/src/main/resources/jeecg/code-template/onetomany2/java/${bussiPackage}/${entityPackage}/vue/modules/${entityName}Modal.vuei new file mode 100644 index 0000000..02c97c2 --- /dev/null +++ b/jeecg-boot/src/main/resources/jeecg/code-template/onetomany2/java/${bussiPackage}/${entityPackage}/vue/modules/${entityName}Modal.vuei @@ -0,0 +1,167 @@ +<template> + <a-modal + :title="title" + :width="1000" + :visible="visible" + :confirmLoading="confirmLoading" + @ok="handleOk" + @cancel="handleCancel"> + <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 JDate from '@/components/jeecg/JDate' + import pick from 'lodash.pick' + import moment from "moment" + + export default { + name: '${entityName}Modal', + components: { + JDate + }, + 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", +<#list subTables as sub><#rt/> + ${sub.entityName?uncap_first}List: '/${entityPackage}/${entityName?uncap_first}/query${sub.entityName}ByMainId', +</#list> + } + } + }, + methods: { + add() { + this.edit({}); + }, + edit(record) { + this.form.resetFields(); + this.model = Object.assign({}, record); + //初始化明细表数据 + console.log(this.model.id) + this.visible = true; + this.$nextTick(() => { + this.form.setFieldsValue(pick(this.model, <#list columns as col>'${col.fieldName}', </#list>)) + // 时间格式化 +<#list columns as col><#rt/> + <#if col.fieldName !='id' && (col.fieldType =='date' || col.fieldType =='datetime')> + this.form.setFieldsValue({ ${col.fieldName}: this.model.${col.fieldName} ? moment(this.model.${col.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> + 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> + .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/jeecg-boot/src/main/resources/jeecg/code-template/onetomany2/java/${bussiPackage}/${entityPackage}/vue/modules/[1-n]Modal.vuei b/jeecg-boot/src/main/resources/jeecg/code-template/onetomany2/java/${bussiPackage}/${entityPackage}/vue/modules/[1-n]Modal.vuei new file mode 100644 index 0000000..ee0c9b0 --- /dev/null +++ b/jeecg-boot/src/main/resources/jeecg/code-template/onetomany2/java/${bussiPackage}/${entityPackage}/vue/modules/[1-n]Modal.vuei @@ -0,0 +1,183 @@ +<#list subTables as subTab> +#segment#${subTab.entityName}Modal.vue +<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"> +<#list subTab.colums as po><#rt/> + +<#if po.fieldName !='id'><#rt/> + <a-form-item + :labelCol="labelCol" + :wrapperCol="wrapperCol" + label="${po.filedComment}" + <#if subTab.foreignKeys[0]?uncap_first == po.fieldName> + :hidden="hiding" + </#if> + hasFeedback> + <#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> + <#if subTab.foreignKeys[0]?uncap_first == po.fieldName> + <a-input placeholder="请输入${po.filedComment}" v-decorator="['${po.fieldName}', {'initialValue':this.mainId}]" /> + <#else> + <a-input placeholder="请输入${po.filedComment}" v-decorator="['${po.fieldName}', <#if po.nullable =='N'>validatorRules.${po.fieldName} <#else>{}</#if>]" /> + </#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' + import JDate from '@/components/jeecg/JDate' + + export default { + components: { + JDate + }, + name: '${subTab.entityName}Modal', + 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, + mainId: '', + hiding: false, + confirmLoading: false, + form: this.$form.createForm(this), + validatorRules: { + <#list subTab.colums as po> + <#if po.fieldName !='id' && subTab.foreignKeys[0]?uncap_first != po.fieldName> + <#if po.nullable =='N'> + ${po.fieldName}: { rules: [{ required: true, message: '请输入${po.filedComment}!' }] }, + </#if> + </#if> +</#list> + }, + url: { + add: '/${entityPackage}/${entityName?uncap_first}/add${subTab.entityName}', + edit: '/${entityPackage}/${entityName?uncap_first}/edit${subTab.entityName}' + } + } + }, + created() { + }, + methods: { + add(mainId) { + if (mainId) { + this.edit({mainId}, '') + } 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.mainId = record.mainId; + this.model = Object.assign({}, record); + this.visible = true; + this.$nextTick(() => { + this.form.setFieldsValue(pick(this.model, <#list subTab.colums as col>'${col.fieldName}', </#list>)) + // 时间格式化 +<#list subTab.colums as col><#rt/> + <#if col.fieldName !='id' && (col.fieldType =='date' || col.fieldType =='datetime')> + this.form.setFieldsValue({ ${col.fieldName}: this.model.${col.fieldName} ? moment(this.model.${col.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 subTab.colums 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> + 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> +</#list> \ 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 index c8a8df4..cecf6a1 100644 --- a/jeecg-boot/src/main/resources/jeecg/jeecg_config.properties +++ b/jeecg-boot/src/main/resources/jeecg/jeecg_config.properties @@ -13,7 +13,7 @@ source_root_package=src.main.java webroot_package=src.main.webapp #ftl resource url -templatepath=/jeecg/code-template/one +templatepath=/jeecg/code-template system_encoding=utf-8 #db Table id [User defined] diff --git a/jeecg-boot/src/main/resources/logback-spring.xml b/jeecg-boot/src/main/resources/logback-spring.xml index f058602..7e9a273 100644 --- a/jeecg-boot/src/main/resources/logback-spring.xml +++ b/jeecg-boot/src/main/resources/logback-spring.xml @@ -1,105 +1,94 @@ <?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>--> + <!--定义日志文件的存储地址 --> + <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格式的日志结束 --> + + <!--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> + </configuration> \ 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 index e56027d..177cf10 100644 --- a/jeecg-boot/src/test/java/org/jeecg/SampleTest.java +++ b/jeecg-boot/src/test/java/org/jeecg/SampleTest.java @@ -4,9 +4,11 @@ import java.util.List; import javax.annotation.Resource; +import org.jeecg.modules.demo.mock.MockController; 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.jeecg.modules.system.service.ISysDataLogService; import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; @@ -21,6 +23,10 @@ public class SampleTest { private JeecgDemoMapper jeecgDemoMapper; @Resource private IJeecgDemoService jeecgDemoService; + @Resource + private ISysDataLogService sysDataLogService; + @Resource + private MockController mock; @Test public void testSelect() { @@ -44,5 +50,18 @@ public class SampleTest { public void testTran() { jeecgDemoService.testTran(); } - + + //author:lvdandan-----date:20190315---for:添加数据日志测试---- + /** + * 测试数据日志添加 + */ + @Test + public void testDataLogSave() { + System.out.println(("----- datalog test ------")); + String tableName = "jeecg_demo"; + String dataId = "4028ef81550c1a7901550c1cd6e70001"; + String dataContent = mock.sysDataLogJson(); + sysDataLogService.addDataLog(tableName, dataId, dataContent); + } + //author:lvdandan-----date:20190315---for:添加数据日志测试---- } -- libgit2 0.22.2