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能力的同
 
 系统效果
 ----
-![输入图片说明](https://static.oschina.net/uploads/img/201902/25154007_icdX.png "在这里输入图片标题")
-![输入图片说明](https://static.oschina.net/uploads/img/201902/25153956_Q752.png "在这里输入图片标题")
-![输入图片说明](https://static.oschina.net/uploads/img/201901/07154149_555Q.png "在这里输入图片标题")
-![输入图片说明](https://static.oschina.net/uploads/img/201902/25154209_qlCg.png "在这里输入图片标题")
-![输入图片说明](https://static.oschina.net/uploads/img/201902/25154251_XoW9.png "在这里输入图片标题")
-![输入图片说明](https://static.oschina.net/uploads/img/201902/25154331_0ndT.png "在这里输入图片标题")
-![输入图片说明](https://static.oschina.net/uploads/img/201902/25154414_ckFS.png "在这里输入图片标题")
-![输入图片说明](https://static.oschina.net/uploads/img/201902/25155155_Hm6H.png "在这里输入图片标题")
-![输入图片说明](https://static.oschina.net/uploads/img/201902/25155213_T04n.png "在这里输入图片标题")
-![输入图片说明](https://static.oschina.net/uploads/img/201902/25155224_MRLU.png "在这里输入图片标题")
-![输入图片说明](https://static.oschina.net/uploads/img/201902/25155234_7zCP.png "在这里输入图片标题")
-![输入图片说明](https://static.oschina.net/uploads/img/201902/25155242_K7Sw.png "在这里输入图片标题")
 
+![输入图片说明](https://static.oschina.net/uploads/img/201902/25154007_icdX.png "在这里输入图片标题")
+![输入图片说明](https://static.oschina.net/uploads/img/201904/14155402_AmlV.png "在这里输入图片标题")
+![输入图片说明](https://static.oschina.net/uploads/img/201904/14160623_8fwk.png "在这里输入图片标题")
+![输入图片说明](https://static.oschina.net/uploads/img/201904/14160633_u59G.png "在这里输入图片标题")
+![输入图片说明](https://static.oschina.net/uploads/img/201904/14160643_kCJ7.png "在这里输入图片标题")
+![输入图片说明](https://static.oschina.net/uploads/img/201904/14160650_fcgw.png "在这里输入图片标题")
+![输入图片说明](https://static.oschina.net/uploads/img/201904/14160657_cHwb.png "在这里输入图片标题")
+![输入图片说明](https://static.oschina.net/uploads/img/201904/14160705_NAJn.png "在这里输入图片标题")
+![输入图片说明](https://static.oschina.net/uploads/img/201904/14160751_bsO9.png "在这里输入图片标题")
+![输入图片说明](https://static.oschina.net/uploads/img/201904/14160801_2AhS.png "在这里输入图片标题")
+![输入图片说明](https://static.oschina.net/uploads/img/201904/14160813_KmXS.png "在这里输入图片标题")
+![输入图片说明](https://static.oschina.net/uploads/img/201904/14160828_pkFr.png "在这里输入图片标题")
+![输入图片说明](https://static.oschina.net/uploads/img/201904/14160834_Lo23.png "在这里输入图片标题")
+![输入图片说明](https://static.oschina.net/uploads/img/201904/14160842_QK7B.png "在这里输入图片标题")
+![输入图片说明](https://static.oschina.net/uploads/img/201904/14160849_GBm5.png "在这里输入图片标题")
+![输入图片说明](https://static.oschina.net/uploads/img/201904/14160858_6RAM.png "在这里输入图片标题")
+![输入图片说明](https://static.oschina.net/uploads/img/201904/14160905_RGJ5.png "在这里输入图片标题")
+![输入图片说明](https://static.oschina.net/uploads/img/201904/14160917_9Ftz.png "在这里输入图片标题")
+![输入图片说明](https://static.oschina.net/uploads/img/201904/14160926_PUDV.png "在这里输入图片标题")
+![输入图片说明](https://static.oschina.net/uploads/img/201904/14160935_Nibs.png "在这里输入图片标题")
+![输入图片说明](https://static.oschina.net/uploads/img/201904/14160947_gfoN.png "在这里输入图片标题")
+![输入图片说明](https://static.oschina.net/uploads/img/201904/14160957_hN3X.png "在这里输入图片标题")
+![输入图片说明](https://static.oschina.net/uploads/img/201904/14161004_bxQ4.png "在这里输入图片标题")
+![输入图片说明](https://static.oschina.net/uploads/img/201904/14161013_zW5n.png "在这里输入图片标题")
 
 
 
@@ -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(如下图)
+![输入图片说明](https://static.oschina.net/uploads/img/201904/12181253_O0Xi.png "在这里输入图片标题")
+####3.chart包:存放各种图表相关的组件,条形图柱形图折线图等等 具体用法参考首页
+####4.countDown包:一个倒计时组件,用法参考home页,简单描述,该组件有3个属性,
+target(时间/毫秒数)必填,
+format(function,该方法接收一个毫秒数的参数,用于格式化显示当前倒计时时间)非必填,
+onEnd倒计时结束触发函数
+![输入图片说明](https://static.oschina.net/uploads/img/201904/12182046_mwqJ.png "在这里输入图片标题")
+####5.dict包:数据字典专用,用法参考文件夹下readme文件
+####6.Ellipsis包:字符串截取组件,可以指定字符串的显示长度,并将全部内容显示到tip中,简单使用参考src\views\system\PermissionList.vue
+####7.jeecg包:该包下自定义了很多列表/表单中用到的组件 参考包下readme文件
+####8.jeecgbiz包:该包下定义了一些业务相关的组件,比如选择用户弹框,根据部门选择用户等等
+####9.layouts+page包:系统页面布局相关组件,比如登陆进去之后页面顶部显示什么,底部显示什么,菜单点击触发多个tab的布局等等 一般情况不需要修改
+####10.menun包:菜单组件,俩个,一个折叠菜单一个正常显示的菜单
+####11.NumberInfo:数字信息显示组件 如下图
+![输入图片说明](https://static.oschina.net/uploads/img/201904/12185858_uvJ5.png "在这里输入图片标题")
+####12.online包:该包下封装了online表单的相关组件,用于展示表单各种控件,验证表单等等,相关用法参考readme
+####13.setting包:该包下封装了首页风格切换等功能如下图
+![输入图片说明](https://static.oschina.net/uploads/img/201904/12190520_jySG.png "在这里输入图片标题")
+####14.table包:一个二次封装的table组件,用于展示列表,参考readme
+####15.tools包:
+Breadcrumb.vue:面包屑二次封装,支持路由跳转
+DetailList.vue:详情展示用法参考src\views\profile\advanced\Advanced.vue(效果如下图)
+![输入图片说明](https://static.oschina.net/uploads/img/201904/12193954_Uar6.png "在这里输入图片标题")
+````
+个人认为该页面代码有两点值得学习:
+1.vue provide/inject的使用
+2.该页面css定义方式,只定义一个顶层class,其余样式都定义在其下,这样只要顶层class不和别的页面冲突,整个页面的样式都是唯一生效的
+````
+FooterToolBar.vue:fixed定位的底部,通过是否定义内部控件的属性slot="extra"决定是左浮动或是右浮动
+HeaderNotice.vue:首页通知(如下图)
+![输入图片说明](https://static.oschina.net/uploads/img/201904/12195340_fPe0.png "在这里输入图片标题")
+HeaderInfo.vue:上下文字布局(如下图)
+![输入图片说明](https://static.oschina.net/uploads/img/201904/12195638_dG5o.png "在这里输入图片标题")
+Logo.vue:首页左上侧的log图
+![输入图片说明](https://static.oschina.net/uploads/img/201904/12200908_ihv3.png "在这里输入图片标题")
+UserMenu.vue:首页右上侧的内容
+![输入图片说明](https://static.oschina.net/uploads/img/201904/12201226_laQK.png "在这里输入图片标题")
+####16.trend包 趋势显示组件(如下图)
+![输入图片说明](https://static.oschina.net/uploads/img/201904/12201600_Wo8K.png "在这里输入图片标题")
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>&nbsp;
+              <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 &copy; 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()">&nbsp;退出登录</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>&nbsp;
-                    <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>&nbsp;
-                    <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>已选择&nbsp;<a style="font-weight: 600">{{ selectedRowKeys.length }}</a>项&nbsp;&nbsp;
+        <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"/>&nbsp;
-        当前选中:
-        <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>
-          已选择&nbsp;<a style="font-weight: 600">{{ selectedRowKeys.length }}</a>项&nbsp;&nbsp;
-          <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>
-        已选择&nbsp;<a style="font-weight: 600">{{ selectedRowKeys.length }}</a>项&nbsp;&nbsp;
+        <i class="anticon anticon-info-circle ant-alert-icon"></i>已选择&nbsp;<a style="font-weight: 600">{{
+        selectedRowKeys.length }}</a>项&nbsp;&nbsp;
         <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>
-        已选择&nbsp;<a style="font-weight: 600">{{ selectedRowKeys.length }}</a>项&nbsp;&nbsp;
+        <i class="anticon anticon-info-circle ant-alert-icon"></i>已选择&nbsp;<a style="font-weight: 600">{{ selectedRowKeys.length }}</a>项&nbsp;&nbsp;
         <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">&nbsp;&nbsp;</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&&paramList.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&&paramData.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&&paramData.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&&params.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