From d8e70b7f900961a63eaadc909a493768a5bf357d Mon Sep 17 00:00:00 2001 From: zhangdaihao Date: Sun, 14 Apr 2019 16:20:04 +0800 Subject: [PATCH] =?UTF-8?q?jeecg-boot=201.1=20=E7=A8=B3=E5=AE=9A=E7=89=88?= =?UTF-8?q?=E6=9C=AC=E5=8F=91=E5=B8=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 101 +- 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 -> 3279 bytes .../public/tinymce/langs/zh_CN.js | 261 + .../tinymce/skins/lightgray/content.min.css | 554 + .../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 + .../src/assets/less/common.css | 29 + .../src/assets/less/index.less | 7 + ant-design-jeecg-vue/src/assets/logo.png | Bin 20228 -> 3279 bytes ant-design-jeecg-vue/src/components/README.md | 41 + .../src/components/_util/StringUtil.js | 12 +- .../src/components/chart/AreaChartTy.vue | 68 + .../src/components/chart/Bar.vue | 55 +- .../src/components/chart/BarMultid.vue | 79 + .../src/components/chart/DashChartDemo.vue | 190 + .../src/components/chart/LineChartMultid.vue | 100 + .../src/components/chart/Liquid.vue | 31 +- .../src/components/chart/MiniArea.vue | 72 +- .../src/components/chart/MiniBar.vue | 48 +- .../src/components/chart/MiniProgress.vue | 12 +- .../src/components/chart/Pie.vue | 83 + .../src/components/chart/README.md | 328 + .../src/components/chart/Radar.vue | 46 +- .../src/components/chart/RankList.vue | 6 +- .../src/components/chart/TransferBar.vue | 72 +- .../src/components/chart/Trend.vue | 2 + .../{DictSelectTag.vue => JDictSelectTag.vue} | 9 +- .../{DictSelectUtil.js => JDictSelectUtil.js} | 26 + .../src/components/dict/README.md | 52 +- .../src/components/dict/UserInfoTag.vue | 22 - .../src/components/dict/index.js | 8 +- .../src/components/jeecg/JCheckbox.vue | 52 + .../src/components/jeecg/JDate.vue | 2 +- .../src/components/jeecg/JEditableTable.vue | 1248 ++ .../src/components/jeecg/JEditor.vue | 92 + .../src/components/jeecg/JEllipsis.vue | 29 + .../src/components/jeecg/JImportModal.vue | 110 + .../src/components/jeecg/JSelectMultiple.vue | 65 + .../src/components/jeecg/JSuperQuery.vue | 152 + .../src/components/jeecg/README.md | 193 +- .../components/jeecg/README_JEditableTable.md | 396 + .../components/jeecgbiz/JSearchUserByDep.vue | 309 + .../jeecgbiz/JSearchUserByDepModal.vue | 309 + .../src/components/jeecgbiz/JSelectUser.vue | 87 + .../jeecgbiz/SearchUserByDepModal.vue | 308 + .../jeecgbiz/SelectMultipleUserModal.vue | 276 + .../jeecgbiz/modal/SelectUserListModal.vue | 122 + .../src/components/layouts/TabLayout.vue | 166 +- .../src/components/layouts/UserLayout.vue | 6 +- .../src/components/menu/SideMenu.vue | 4 +- .../src/components/menu/index.js | 44 +- .../src/components/page/GlobalHeader.vue | 246 +- .../src/components/page/GlobalLayout.vue | 143 +- .../src/components/page/PageLayout.vue | 2 +- .../src/components/setting/SettingDrawer.vue | 18 +- .../src/components/tools/Logo.vue | 26 +- .../src/components/tools/UserMenu.vue | 32 +- .../src/config/router.config.js | 329 +- ant-design-jeecg-vue/src/defaultSettings.js | 1 + ant-design-jeecg-vue/src/main.js | 10 +- .../mixins/JEditableTableOneToManyMixin.js | 160 + .../src/mixins/JeecgListMixin.js | 220 + ant-design-jeecg-vue/src/store/modules/app.js | 9 +- .../src/store/modules/user.js | 5 +- .../src/utils/JEditableTableUtil.js | 97 + ant-design-jeecg-vue/src/utils/axios.js | 2 +- ant-design-jeecg-vue/src/utils/filter.js | 12 + .../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 + .../src/views/account/center/Index.vue | 4 +- .../src/views/dashboard/Analysis.vue | 20 +- .../src/views/dashboard/Workplace.vue | 27 +- .../jeecg/{FlowTest.vue => InterfaceTest.vue} | 4 +- .../src/views/jeecg/JSearchUserByDepList.vue | 43 + .../src/views/jeecg/JeecgDemoList.vue | 253 +- .../views/jeecg/JeecgEditableTableExample.vue | 191 + .../src/views/jeecg/JeecgOrderMainList.vue | 178 +- .../JeecgOrderMainListForJEditableTable.vue | 217 + .../{PrintDemoList.vue => PrintDemo.vue} | 112 +- .../src/views/jeecg/SearchUserByDepList.vue | 43 + .../src/views/jeecg/SelectDemo.vue | 135 + .../src/views/jeecg/TableExpandeSub.vue | 270 + .../src/views/jeecg/helloworld.vue | 79 +- .../jeecg/modules/JeecgOrderMainModal.vue | 14 +- .../JeecgOrderModalForJEditableTable.vue | 340 + .../src/views/jeecg/report/Analysis.vue | 698 + .../jeecg/report/ArchivesStatisticst.vue | 315 + .../src/views/jeecg/report/ViserChartDemo.vue | 136 + .../jeecg/tablist/JeecgOrderCustomerList.vue | 212 +- .../jeecg/tablist/JeecgOrderDMainList.vue | 251 +- .../jeecg/tablist/JeecgOrderTicketList.vue | 245 +- .../tablist/form/JeecgOrderCustomerModal.vue | 296 +- .../tablist/form/JeecgOrderDMainModal.vue | 274 +- .../tablist/form/JeecgOrderTicketModal.vue | 110 +- .../views/modules/message/SysMessageList.vue | 261 + .../message/SysMessageTemplateList.vue | 250 + .../message/modules/SysMessageModal.vue | 184 + .../modules/SysMessageTemplateModal.vue | 156 + .../message/modules/SysMessageTestModal.vue | 122 + .../online/cgreport/OnlCgreportHeadList.vue | 218 + .../cgreport/auto/OnlCgreportAutoList.vue | 208 + .../auto/OnlCgreportQueryFormItem.vue | 91 + .../cgreport/modules/OnlCgreportHeadModal.vue | 562 + .../src/views/monitor/HttpTrace.vue | 150 + .../src/views/monitor/JvmInfo.vue | 256 + .../src/views/monitor/RedisInfo.vue | 216 + .../src/views/monitor/RedisTerminal.vue | 13 + .../src/views/monitor/SystemInfo.vue | 125 + .../src/views/monitor/TomcatInfo.vue | 202 + .../src/views/system/DataLogList.vue | 173 + .../src/views/system/DepartList.vue | 634 +- .../src/views/system/DepartList2.vue | 3 - .../src/views/system/DictItemList.vue | 203 + .../src/views/system/DictList.vue | 518 +- .../src/views/system/LogList.vue | 103 +- .../views/system/PermissionDataRuleList.vue | 176 + .../src/views/system/PermissionList.vue | 216 +- .../src/views/system/QuartzJobList.vue | 215 +- .../src/views/system/RoleList.vue | 206 +- .../src/views/system/SysAnnouncementList.vue | 323 +- .../src/views/system/UserList.vue | 405 +- .../system/modules/DataLogCompareModal.vue | 163 + .../src/views/system/modules/DataLogModal.vue | 153 + .../src/views/system/modules/DepartModal.vue | 1 - .../src/views/system/modules/DepartWindow.vue | 5 +- .../views/system/modules/DictItemModal.vue | 91 +- .../src/views/system/modules/DictModal.vue | 75 +- .../modules/PermissionDataRuleModal.vue | 162 + .../views/system/modules/PermissionModal.vue | 62 +- .../system/modules/RoleDataruleModal.vue | 121 + .../src/views/system/modules/UserModal.vue | 211 +- .../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 + ...1\271\347\233\256\350\257\264\346\230\216" | 16 +- .../docs/db/jeecg-boot_1.1.0-20190415.sql | 2392 +++ jeecg-boot/docs/db/sys-init-20190225.sql | 1342 -- jeecg-boot/pom.xml | 84 +- .../main/java/org/jeecg/JeecgApplication.java | 4 +- .../java/org/jeecg/JeecgCodeGenerator.java | 46 - .../src/main/java/org/jeecg/JeecgOneGUI.java | 18 + .../java/org/jeecg/JeecgOneToMainUtil.java | 65 + .../java/org/jeecg/common/api/vo/Result.java | 14 +- .../org/jeecg/common/aspect/DictAspect.java | 126 + .../common/aspect/PermissionDataAspect.java | 175 + .../jeecg/common/aspect/annotation/Dict.java | 42 + .../aspect/annotation/PermissionData.java | 25 + .../jeecg/common/constant/CommonConstant.java | 2 +- .../common/constant/DataBaseConstant.java | 103 + .../common/jsonschema/CommonProperty.java | 140 + .../common/jsonschema/JsonSchemaDescrip.java | 87 + .../common/jsonschema/JsonschemaUtil.java | 69 + .../jsonschema/validate/NumberProperty.java | 139 + .../jsonschema/validate/StringProperty.java | 100 + .../system/controller/CommonController.java | 2 +- .../common/system/query/QueryCondition.java | 55 + .../common/system/query/QueryGenerator.java | 484 + .../common/system/query/QueryRuleEnum.java | 71 + .../java/org/jeecg/common/util/DateUtils.java | 5 +- .../java/org/jeecg/common/util/MD5Util.java | 12 +- .../org/jeecg/common/util/MyClassLoader.java | 19 +- .../java/org/jeecg/common/util/RedisUtil.java | 9 +- .../org/jeecg/common/util/UUIDGenerator.java | 95 + .../org/jeecg/common/util/oConvertUtils.java | 18 +- .../java/org/jeecg/config/AutoPoiConfig.java | 28 + .../java/org/jeecg/config/RedisConfig.java | 81 +- .../java/org/jeecg/config/ShiroConfig.java | 39 +- .../org/jeecg/config/WebMvcConfiguration.java | 61 +- .../config/mybatis/MybatisInterceptor.java | 2 +- .../modules/demo/mock/MockController.java | 111 + .../jeecg/modules/demo/mock/json/area.json | 13551 ++++++++++++++++ .../demo/mock/json/getCntrNoCountInfo.json | 27 + .../demo/mock/json/graphreport_chart.json | 50 + .../modules/demo/mock/json/sysdatalog.json | 12 + .../modules/demo/mock/json/task_process.json | 55 + .../modules/demo/mock/json/user_info.json | 407 + .../demo/test/controller/AutoController.java | 42 - .../test/controller/JeecgDemoController.java | 106 +- .../controller/JeecgOrderDMainController.java | 736 +- .../controller/JeecgOrderMainController.java | 224 +- .../modules/demo/test/entity/JeecgDemo.java | 11 + .../demo/test/entity/JeecgOrderCustomer.java | 6 +- .../demo/test/entity/JeecgOrderTicket.java | 4 +- .../service/impl/JeecgDemoServiceImpl.java | 3 + .../impl/JeecgOrderMainServiceImpl.java | 86 +- .../demo/test/vo/JeecgOrderMainPage.java | 32 +- .../controller/SysMessageController.java | 237 + .../SysMessageTemplateController.java | 267 + .../modules/message/entity/MsgParams.java | 23 + .../modules/message/entity/SysMessage.java | 75 + .../message/entity/SysMessageTemplate.java | 58 + .../message/handle/ISendMsgHandle.java | 6 + .../handle/enums/SendMsgStatusEnum.java | 25 + .../message/handle/enums/SendMsgTypeEnum.java | 51 + .../handle/impl/EmailSendMsgHandle.java | 22 + .../message/handle/impl/SmsSendMsgHandle.java | 13 + .../message/handle/impl/WxSendMsgHandle.java | 13 + .../jeecg/modules/message/job/SendMsgJob.java | 72 + .../message/mapper/SysMessageMapper.java | 17 + .../mapper/SysMessageTemplateMapper.java | 18 + .../message/mapper/xml/SysMessageMapper.xml | 5 + .../mapper/xml/SysMessageTemplateMapper.xml | 5 + .../message/service/ISysMessageService.java | 14 + .../service/ISysMessageTemplateService.java | 16 + .../service/impl/SysMessageServiceImpl.java | 19 + .../impl/SysMessageTemplateServiceImpl.java | 29 + .../modules/message/util/PushMsgUtil.java | 63 + .../monitor/controller/RedisController.java | 46 + .../modules/monitor/domain/RedisInfo.java | 137 + .../exception/RedisConnectException.java | 13 + .../modules/monitor/service/RedisService.java | 33 + .../service/impl/RedisServiceImpl.java | 75 + .../modules/ngalain/aop/LogRecordAspect.java | 46 + .../ngalain/controller/NgAlainController.java | 85 + .../modules/ngalain/mapper/NgAlainMapper.java | 12 + .../ngalain/mapper/xml/NgAlainMapper.xml | 7 + .../ngalain/service/NgAlainService.java | 12 + .../service/impl/NgAlainServiceImpl.java | 182 + .../cgreport/controller/OnlCgreportAPI.java | 253 + .../controller/OnlCgreportHeadController.java | 269 + .../controller/OnlCgreportItemController.java | 183 + .../OnlCgreportParamController.java | 183 + .../online/cgreport/def/CgReportConstant.java | 70 + .../cgreport/entity/OnlCgreportHead.java | 57 + .../cgreport/entity/OnlCgreportItem.java | 66 + .../cgreport/entity/OnlCgreportParam.java | 50 + .../mapper/OnlCgreportHeadMapper.java | 52 + .../mapper/OnlCgreportItemMapper.java | 15 + .../mapper/OnlCgreportParamMapper.java | 15 + .../mapper/xml/OnlCgreportHeadMapper.xml | 58 + .../mapper/xml/OnlCgreportItemMapper.xml | 5 + .../mapper/xml/OnlCgreportParamMapper.xml | 5 + .../cgreport/model/OnlCgreportModel.java | 79 + .../service/CgReportExcelServiceI.java | 24 + .../service/IOnlCgreportHeadService.java | 51 + .../service/IOnlCgreportItemService.java | 20 + .../service/IOnlCgreportParamService.java | 15 + .../impl/CgReportExcelServiceImpl.java | 144 + .../impl/OnlCgreportHeadServiceImpl.java | 242 + .../impl/OnlCgreportItemServiceImpl.java | 50 + .../impl/OnlCgreportParamServiceImpl.java | 19 + .../online/cgreport/util/BrowserType.java | 10 + .../online/cgreport/util/BrowserUtils.java | 194 + .../cgreport/util/CgReportQueryParamUtil.java | 178 + .../modules/online/cgreport/util/SqlUtil.java | 260 + .../controller/QuartzJobController.java | 99 +- .../modules/quartz/entity/QuartzJob.java | 6 + .../jeecg/modules/shiro/authc/MyRealm.java | 6 +- .../modules/shiro/authc/util/JwtUtil.java | 92 + .../controller/DuplicateCheckController.java | 59 + .../system/controller/LoginController.java | 31 + .../controller/SysAnnouncementController.java | 136 +- .../controller/SysDataLogController.java | 94 + .../controller/SysDepartController.java | 23 +- .../system/controller/SysDictController.java | 177 +- .../controller/SysDictItemController.java | 31 +- .../system/controller/SysLogController.java | 22 +- .../controller/SysPermissionController.java | 182 +- .../system/controller/SysRoleController.java | 253 +- .../system/controller/SysUserController.java | 497 +- .../system/entity/SysAnnouncement.java | 146 +- .../modules/system/entity/SysDataLog.java | 36 + .../modules/system/entity/SysDepart.java | 16 +- .../jeecg/modules/system/entity/SysDict.java | 8 + .../modules/system/entity/SysDictItem.java | 14 +- .../jeecg/modules/system/entity/SysLog.java | 3 + .../modules/system/entity/SysPermission.java | 19 +- .../system/entity/SysPermissionDataRule.java | 78 + .../jeecg/modules/system/entity/SysRole.java | 4 + .../system/entity/SysRolePermission.java | 5 + .../jeecg/modules/system/entity/SysUser.java | 21 +- .../modules/system/entity/SysUserDepart.java | 29 + .../system/mapper/SysDataLogMapper.java | 17 + .../system/mapper/SysDepartMapper.java | 5 + .../system/mapper/SysDictItemMapper.java | 8 +- .../modules/system/mapper/SysDictMapper.java | 16 +- .../mapper/SysPermissionDataRuleMapper.java | 28 + .../system/mapper/SysPermissionMapper.java | 18 +- .../system/mapper/SysUserDepartMapper.java | 14 + .../modules/system/mapper/SysUserMapper.java | 1 + .../system/mapper/xml/SysDataLogMapper.xml | 10 + .../system/mapper/xml/SysDepartMapper.xml | 6 + .../system/mapper/xml/SysDictMapper.xml | 20 + .../xml/SysPermissionDataRuleMapper.xml | 16 + .../system/mapper/xml/SysPermissionMapper.xml | 9 +- .../system/mapper/xml/SysUserDepartMapper.xml | 9 + .../modules/system/model/DepartIdModel.java | 16 +- .../system/model/DuplicateCheckVo.java | 44 + .../system/model/SysDepartTreeModel.java | 25 +- .../modules/system/model/SysDictTree.java | 7 + .../system/model/SysPermissionTree.java | 34 +- .../system/model/SysUserCacheInfo.java | 73 + .../system/model/SysUserDepartsVO.java | 23 + .../jeecg/modules/system/model/TreeModel.java | 60 +- .../system/service/ISysDataLogService.java | 17 + .../system/service/ISysDepartService.java | 7 + .../system/service/ISysDictItemService.java | 4 +- .../system/service/ISysDictService.java | 27 +- .../ISysPermissionDataRuleService.java | 41 + .../system/service/ISysPermissionService.java | 14 + .../system/service/ISysUserDepartService.java | 49 + .../system/service/ISysUserRoleService.java | 10 +- .../system/service/ISysUserService.java | 9 + .../service/impl/AutoPoiDictService.java | 62 + .../service/impl/SysDataLogServiceImpl.java | 33 + .../service/impl/SysDepartServiceImpl.java | 31 +- .../service/impl/SysDictItemServiceImpl.java | 12 +- .../service/impl/SysDictServiceImpl.java | 110 +- .../impl/SysPermissionDataRuleImpl.java | 76 + .../impl/SysPermissionServiceImpl.java | 95 +- .../impl/SysUserDepartServiceImpl.java | 138 + .../service/impl/SysUserRoleServiceImpl.java | 62 + .../service/impl/SysUserServiceImpl.java | 38 +- .../FindsDepartsChildrenUtil.java | 6 +- .../system/util/JeecgDataAutorUtils.java | 90 + .../system/util/PermissionDataUtil.java | 58 + .../jeecg/modules/system/vo/SysDictPage.java | 41 + .../src/main/resources/application-dev.yml | 120 + .../src/main/resources/application-prod.yml | 120 + .../src/main/resources/application-test.yml | 122 + jeecg-boot/src/main/resources/application.yml | 96 +- .../controller/${entityName}Controller.javai | 112 +- .../entity/${entityName}.javai | 10 +- .../vue/${entityName}List.vuei | 194 +- .../${entityName}Modal__Style@Drawer.vuei | 162 + .../${entityName}Controller.javai | 112 +- .../${entityPackage}/${entityName}.javai | 24 +- .../${entityPackage}/${entityName}List.vuei | 194 +- .../modules/${entityName}Modal.vuei | 8 +- .../${entityName}Modal__Style@Drawer.vuei | 162 + .../controller/${entityName}Controller.javai | 250 +- .../entity/${entityName}.javai | 2 +- .../${entityPackage}/entity/[1-n]Entity.javai | 50 + .../mapper/${entityName}Mapper.javai | 12 +- .../${entityPackage}/mapper/[1-n]Mapper.javai | 21 + .../mapper/xml/[1-n]Mapper.xml | 36 + .../service/I${entityName}Service.javai | 19 +- .../service/[1-n]Service.javai | 19 + .../impl/${entityName}ServiceImpl.javai | 98 +- .../service/impl/[1-n]ServiceImpl.javai | 30 + .../vo/${entityName}Page.javai | 44 + .../vue/${entityName}List.vuei | 236 +- .../vue/modules/${entityName}Modal.vuei | 265 +- .../controller/${entityName}Controller.javai | 379 + .../entity/${entityName}.javai | 39 + .../${entityPackage}/entity/[1-n]Entity.javai | 49 + .../mapper/${entityName}Mapper.javai | 17 + .../${entityPackage}/mapper/[1-n]Mapper.javai | 21 + .../mapper/xml/${entityName}Mapper.xml | 5 + .../mapper/xml/[1-n]Mapper.xml | 36 + .../service/I${entityName}Service.javai | 42 + .../service/[1-n]Service.javai | 19 + .../impl/${entityName}ServiceImpl.javai | 101 + .../service/impl/[1-n]ServiceImpl.javai | 30 + .../vo/${entityName}Page.javai | 43 + .../vue/${entityName}List.vuei | 258 + .../${entityPackage}/vue/[1-n]List.vuei | 140 + .../vue/modules/${entityName}Modal.vuei | 167 + .../vue/modules/[1-n]Modal.vuei | 183 + .../resources/jeecg/jeecg_config.properties | 2 +- .../src/main/resources/logback-spring.xml | 193 +- .../src/test/java/org/jeecg/SampleTest.java | 21 +- 375 files changed, 48758 insertions(+), 7497 deletions(-) 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 rename ant-design-jeecg-vue/src/components/dict/{DictSelectTag.vue => JDictSelectTag.vue} (84%) rename ant-design-jeecg-vue/src/components/dict/{DictSelectUtil.js => JDictSelectUtil.js} (70%) 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 rename ant-design-jeecg-vue/src/views/jeecg/{FlowTest.vue => InterfaceTest.vue} (97%) 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 rename ant-design-jeecg-vue/src/views/jeecg/{PrintDemoList.vue => PrintDemo.vue} (52%) 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 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 rename jeecg-boot/src/main/java/org/jeecg/modules/system/{controller => util}/FindsDepartsChildrenUtil.java (95%) 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/README.md b/README.md index ffc756c7..063631ad 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ Jeecg-Boot 快速开发平台(前后端分离版本) =============== -当前最新版本: 1.0(发布日期:20190304) +当前最新版本: 1.1(发布日期:20190415) 项目介绍: ----------------------------------- @@ -79,28 +79,85 @@ 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 e8835f02..8c713302 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 6d6baff5..16020ede 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 c7e6b1b2..f41d377d 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 0000000000000000000000000000000000000000..13c4b54fd48a01288e9e23084b1adda9a6ffca1e GIT binary patch literal 1105 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLl<6e(pbstU$g(vPY0F z14ES>14Ba#1H&(%P{RubhEf9thF1v;3|2E37{m+a>Z9h3PvC*V+MOep* z;I?H!$xWsW3%%1lTven((2w{X;JhR(}8@Fnhv>$?dV(<)7XF6)`4xySp%S zu*!M>IqW5#zOL-ISfqgLt)VTKfYek^7sn8Z%duyV3LOd%aJkqxorU9F-od+f?|%Jn z-{!g3Gw5jKmq&S059WI&2eUWNJW(kr&aC{+>Eb~Nwnhu@r(NC$9()Vg8MXJ~m!uC{ zZ^bOX{hI#|L*qja^Laka0<+HYc0c7h^tv~3ceg`H{RLTn!-k4SXJXfFuNI1TnN(#H zpDEbvV)WiWY?47l$EVN&!w6H$Qii%Y+R_iRckE3DI#9L5HKHUXu_VKdAd7@Arc8Ce+{Xd75q85mfL?Kecxkei>9nN|tXV4!PYqHAOpVqgGN2SgAJ z3qq}9ff{^4HWcTlm6RtIr80QtCZ?zQCZ=a5XDgWN8R!}6nkfVtnkiIRn8ll!C?ITC z$S5f(u+rBrFE7{21Ze_dpeDWiqV&5rm-+z>mH-(Xl2MwQWM$=&pIn-onpa|F6#!IP z%wV|u|89Mt8gV2wV5_aHJW?~$GfEf?&1Bcd z%-qzH%7Rn|u$%M?^3v@$g@IgyY?E&YP!)rrk-3qPp`nq10jDPKd!P~lBy)l@t5O+E zEX|$L%HlYIa?wa~p+TMuX_+~xK;P?U!k{QWzeK+{vjoi1OHC}U%uLSD)5}XO v(N9jv)6L9HM+he8=@%Cz>l>PyfUtq39?+GM7mPmxtzqzV^>bP0l+XkKoCT9z literal 0 HcmV?d00001 diff --git a/ant-design-jeecg-vue/public/index.html b/ant-design-jeecg-vue/public/index.html index 05d0f5a0..9b938e50 100644 --- a/ant-design-jeecg-vue/public/index.html +++ b/ant-design-jeecg-vue/public/index.html @@ -5,7 +5,7 @@ - Jeecg-Boot 快速开发平台(Ant Design Vue) + Jeecg-Boot 快速开发平台 + + @@ -228,7 +234,7 @@
-
正在加载 Jeecg-Boot 快速开发平台(Ant Design Vue),请耐心等待 +
正在加载 Jeecg-Boot 快速开发平台,请耐心等待
diff --git a/ant-design-jeecg-vue/public/logo.png b/ant-design-jeecg-vue/public/logo.png index e887375c355c8045315ca9f39de93ec21d5e71d9..1a55a53c6c4fc39e48bd1fabf24f82c1c12d16de 100644 GIT binary patch literal 3279 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 N002ovPDHLkV1hBTTc7{{ literal 20228 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 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 00000000..3ea9b442 --- /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 19a4b00d..5306ff03 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 53d49854..35367e20 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 9e72c428..f5b306b6 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 cc505181..f0e1438f 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 00000000..717295ad --- /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 ec5420d3..f086f5fe 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 e887375c355c8045315ca9f39de93ec21d5e71d9..1a55a53c6c4fc39e48bd1fabf24f82c1c12d16de 100644 GIT binary patch literal 3279 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 N002ovPDHLkV1hBTTc7{{ literal 20228 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 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 00000000..ea1b42f5 --- /dev/null +++ b/ant-design-jeecg-vue/src/components/chart/AreaChartTy.vue @@ -0,0 +1,68 @@ + + + + + \ 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 0a103c63..0b0f0962 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 @@ \ 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 00000000..1edfac31 --- /dev/null +++ b/ant-design-jeecg-vue/src/components/chart/BarMultid.vue @@ -0,0 +1,79 @@ + + + + + \ 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 00000000..101c9f79 --- /dev/null +++ b/ant-design-jeecg-vue/src/components/chart/DashChartDemo.vue @@ -0,0 +1,190 @@ + + + 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 00000000..66e61381 --- /dev/null +++ b/ant-design-jeecg-vue/src/components/chart/LineChartMultid.vue @@ -0,0 +1,100 @@ + + + + + \ 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 fdf58ee5..85e5b617 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 @@ 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 00000000..f181af2d --- /dev/null +++ b/ant-design-jeecg-vue/src/views/modules/message/SysMessageList.vue @@ -0,0 +1,261 @@ + + + + \ 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 00000000..7fd26124 --- /dev/null +++ b/ant-design-jeecg-vue/src/views/modules/message/SysMessageTemplateList.vue @@ -0,0 +1,250 @@ + + + + \ 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 00000000..f2fb6905 --- /dev/null +++ b/ant-design-jeecg-vue/src/views/modules/message/modules/SysMessageModal.vue @@ -0,0 +1,184 @@ + + + + + \ 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 00000000..5f2fc2c3 --- /dev/null +++ b/ant-design-jeecg-vue/src/views/modules/message/modules/SysMessageTemplateModal.vue @@ -0,0 +1,156 @@ + + + + + \ 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 00000000..77cc36fd --- /dev/null +++ b/ant-design-jeecg-vue/src/views/modules/message/modules/SysMessageTestModal.vue @@ -0,0 +1,122 @@ + + + + + \ 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 00000000..30cca513 --- /dev/null +++ b/ant-design-jeecg-vue/src/views/modules/online/cgreport/OnlCgreportHeadList.vue @@ -0,0 +1,218 @@ + + + + \ 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 00000000..95ddc2c7 --- /dev/null +++ b/ant-design-jeecg-vue/src/views/modules/online/cgreport/auto/OnlCgreportAutoList.vue @@ -0,0 +1,208 @@ + + + + \ 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 00000000..c76fd93b --- /dev/null +++ b/ant-design-jeecg-vue/src/views/modules/online/cgreport/auto/OnlCgreportQueryFormItem.vue @@ -0,0 +1,91 @@ + + + + + \ 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 00000000..508ec026 --- /dev/null +++ b/ant-design-jeecg-vue/src/views/modules/online/cgreport/modules/OnlCgreportHeadModal.vue @@ -0,0 +1,562 @@ + + + + + \ 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 00000000..ad205186 --- /dev/null +++ b/ant-design-jeecg-vue/src/views/monitor/HttpTrace.vue @@ -0,0 +1,150 @@ + + + + + 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 00000000..4fa98cbf --- /dev/null +++ b/ant-design-jeecg-vue/src/views/monitor/JvmInfo.vue @@ -0,0 +1,256 @@ + + + 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 00000000..05a7e8a3 --- /dev/null +++ b/ant-design-jeecg-vue/src/views/monitor/RedisInfo.vue @@ -0,0 +1,216 @@ + + + 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 00000000..e671afa1 --- /dev/null +++ b/ant-design-jeecg-vue/src/views/monitor/RedisTerminal.vue @@ -0,0 +1,13 @@ + + + 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 00000000..c3d86404 --- /dev/null +++ b/ant-design-jeecg-vue/src/views/monitor/SystemInfo.vue @@ -0,0 +1,125 @@ + + + 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 00000000..84f539e0 --- /dev/null +++ b/ant-design-jeecg-vue/src/views/monitor/TomcatInfo.vue @@ -0,0 +1,202 @@ + + + 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 00000000..db518f93 --- /dev/null +++ b/ant-design-jeecg-vue/src/views/system/DataLogList.vue @@ -0,0 +1,173 @@ + + + + + \ 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 58a2b12c..d69fbb3c 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 @@ - @@ -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 00000000..dd715d77 --- /dev/null +++ b/ant-design-jeecg-vue/src/views/system/PermissionDataRuleList.vue @@ -0,0 +1,176 @@ + + + + \ 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 c93fd709..1c0eb073 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 @@
新增 批量删除 + icon="delete">批量删除 +
+ :loading="loading" + :rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}"> 编辑 - + - 更多 + 更多 @@ -43,59 +45,61 @@ - - 删除 - + 数据规则 - - - + + + + + + + +
- + + \ 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 5aa6526f..fcc5c3c8 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 @@ - + - + - + 全部 正常 停止 @@ -21,7 +21,7 @@ - + 查询 重置 @@ -35,7 +35,11 @@
新增 - + 导出 + + 导入 + 删除 @@ -63,6 +67,12 @@ :rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}" @change="handleTableChange"> + + + + + + 启动 停止 @@ -91,19 +101,22 @@ - + \ 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 3eb99cf6..681f6bf9 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 @@ - + 查询 重置 @@ -31,12 +31,20 @@
新增 - + 导出 + + 导入 + - 删除 + + + 删除 + - 批量操作 + 批量操作 + +
@@ -62,9 +70,9 @@ 编辑 - + - 更多 + 更多 @@ -90,22 +98,22 @@ - + \ 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 9a0454ab..d26aef8b 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 @@ - + - + 请选择性别查询 @@ -24,19 +24,19 @@ - + - 查询 + 查询 重置 {{ toggleSearchStatus ? '收起' : '展开' }} @@ -63,25 +63,31 @@
-
- 添加用户 - - - +
+ 添加用户 + 重新同步流程用户 + 导出 + + 导入 + - 删除 - 冻结 - 解冻 + + + 删除 + + + + 冻结 + + + + 解冻 + - 批量操作 + 批量操作 +
@@ -89,8 +95,7 @@
@@ -110,32 +115,24 @@
- - - 编辑 - + + - 更多 + 更多 - + 详情 - - 修改密码 + + 密码 @@ -165,7 +162,7 @@
- + @@ -173,19 +170,20 @@ \ 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 00000000..e02bb02c --- /dev/null +++ b/ant-design-jeecg-vue/src/views/system/modules/DataLogCompareModal.vue @@ -0,0 +1,163 @@ + + + + + \ 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 00000000..c9f1e9c0 --- /dev/null +++ b/ant-design-jeecg-vue/src/views/system/modules/DataLogModal.vue @@ -0,0 +1,153 @@ + + + + + \ 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 e55e87bb..c4b76d0d 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 da933838..a4de2f83 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 cda81a36..6d40f64d 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 @@ \ 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 68899454..893c4c5a 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}; + +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; + +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; - + private I${sub.entityName}Service ${sub.entityName?uncap_first}Service; + /** * 分页列表查询 - * @param jeecgOrderMain + * @param ${entityName?uncap_first} * @param pageNo * @param pageSize * @param req * @return */ @GetMapping(value = "/list") - public Result> queryPageList(JeecgOrderMain jeecgOrderMain, + public Result> queryPageList(${entityName} ${entityName?uncap_first}, @RequestParam(name="pageNo", defaultValue="1") Integer pageNo, @RequestParam(name="pageSize", defaultValue="10") Integer pageSize, HttpServletRequest req) { - Result> result = new Result>(); - QueryWrapper queryWrapper = new QueryWrapper(jeecgOrderMain); - Page page = new Page(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 pageList = jeecgOrderMainService.page(page, queryWrapper); - //log.debug("查询当前页:"+pageList.getCurrent()); - //log.debug("查询当前页数量:"+pageList.getSize()); - //log.debug("查询结果数量:"+pageList.getRecords().size()); - //log.debug("数据总数:"+pageList.getTotal()); + Result> result = new Result>(); + 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 add(@RequestBody JeecgOrderMainPage jeecgOrderMainPage) { - Result result = new Result(); + 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>,); 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 eidt(@RequestBody JeecgOrderMainPage jeecgOrderMainPage) { - Result result = new Result(); - 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>,); result.success("修改成功!"); } @@ -128,13 +131,13 @@ public class JeecgOrderMainController { * @return */ @DeleteMapping(value = "/delete") - public Result delete(@RequestParam(name="id",required=true) String id) { - Result result = new Result(); - 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 deleteBatch(@RequestParam(name="ids",required=true) String ids) { - Result result = new Result(); + 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 queryById(@RequestParam(name="id",required=true) String id) { - Result result = new Result(); - 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> queryOrderCustomerListByMainId(@RequestParam(name="id",required=true) String id) { - Result> result = new Result>(); - List jeecgOrderCustomerList = jeecgOrderCustomerService.selectCustomersByMainId(id); - result.setResult(jeecgOrderCustomerList); - result.setSuccess(true); - return result; - } - - /** - * 通过id查询 - * @param id - * @return - */ - @GetMapping(value = "/queryOrderTicketListByMainId") - public Result> queryOrderTicketListByMainId(@RequestParam(name="id",required=true) String id) { - Result> result = new Result>(); - List jeecgOrderTicketList = jeecgOrderTicketService.selectTicketsByMainId(id); - result.setResult(jeecgOrderTicketList); + @GetMapping(value = "/query${sub.entityName}ByMainId") + public Result> query${sub.entityName}ListByMainId(@RequestParam(name="id",required=true) String id) { + Result> result = new Result>(); + 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; } + + + /** + * 导出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); + + 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 fileMap = multipartRequest.getFileMap(); + for (Map.Entry 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>,); + } + 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 a6174922..5cbe5e18 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 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 00000000..fa5b75ec --- /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") + + <#else> + <#if !subTab.foreignKeys?seq_contains(po.fieldName?cap_first)> + @Excel(name = "${po.filedComment}", width = 15) + + + + private <#if po.fieldType=='java.sql.Blob'>byte[]<#else>${po.fieldType} ${po.fieldName}; + +} + \ 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 1e3fdb22..34deb8b8 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 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 00000000..e6079305 --- /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); +} + \ 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 00000000..708ae0b5 --- /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 + + + + + + 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 key_has_next>AND + + + + + + \ 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 c39592fd..9032bd87 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}; + 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 selectCustomersByMainId(String mainId); - -<#if isMainTable == "true"> + /** * 添加一对多 * */ - public void saveMain(JeecgOrderMain jeecgOrderMain,List jeecgOrderCustomerList,List jeecgOrderTicketList) ; + public void saveMain(${entityName} ${entityName?uncap_first},<#list subTables as sub>List<${sub.entityName}> ${sub.entityName?uncap_first}List<#if sub_has_next>,) ; /** * 修改一对多 * */ - public void updateMain(JeecgOrderMain jeecgOrderMain,List jeecgOrderCustomerList,List jeecgOrderTicketList); + public void updateMain(${entityName} ${entityName?uncap_first},<#list subTables as sub>List<${sub.entityName}> ${sub.entityName?uncap_first}List<#if sub_has_next>,); /** * 删除一对多 - * @param jformOrderMain */ public void delMain (String id); /** * 批量删除一对多 - * @param jformOrderMain */ public void delBatchMain (Collection idList); - + } 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 00000000..af913858 --- /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); +} + 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 31e1b166..5b539dd4 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 subTables as sub> +import ${bussiPackage}.${entityPackage}.mapper.${sub.entityName}Mapper; + 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 selectTicketsByMainId(String mainId) { - return jeecgOrderTicketMapper.selectTicketsByMainId(mainId); - } - -<#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; + @Override @Transactional - public void saveMain(JeecgOrderMain jeecgOrderMain, List jeecgOrderCustomerList, List 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>,) { + ${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}()); + + + ${sub.entityName?uncap_first}Mapper.insert(entity); } + } @Override @Transactional - public void updateMain(JeecgOrderMain jeecgOrderMain, List jeecgOrderCustomerList, List 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>,) { + ${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()); + //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}()); + + + ${sub.entityName?uncap_first}Mapper.insert(entity); } + } @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); + } @Override @Transactional public void delBatchMain(Collection 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()); + } } - + } 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 00000000..c893c7e1 --- /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); + } +} + \ 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 00000000..2c41c391 --- /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}; + +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") + + <#else> + @Excel(name = "${po.filedComment}", width = 15) + + + private <#if po.fieldType=='java.sql.Blob'>byte[]<#else>${po.fieldType} ${po.fieldName}; + + + <#list subTables as sub> + @ExcelCollection(name="${sub.ftlDescription}") + private List<${sub.entityName}> ${sub.entityName?uncap_first}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 54a977e5..abdd79a7 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 @@
- -<#list columns as po> +<#list columns as po><#rt/> <#if po.fieldName !='id' && po_index<= tableVo.searchFieldNum> @@ -15,7 +14,6 @@ - 查询 @@ -30,7 +28,10 @@
新增 - + 导出 + + 导入 + 删除 @@ -42,7 +43,12 @@
@@ -79,46 +85,46 @@ - <${entityName?uncap_first}-modal ref="${entityName?uncap_first}Modal" @ok="modalFormOk"> + <${entityName?uncap_first}-modal ref="modalForm" @ok="modalFormOk"/> + - \ 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 20a115ad..e6c6807c 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 @@ \ 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 00000000..c53a5b03 --- /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}; + +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; + +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; + + + /** + * 分页列表查询 + * @param ${entityName?uncap_first} + * @param pageNo + * @param pageSize + * @param req + * @return + */ + @GetMapping(value = "/list") + public Result> queryPageList(${entityName} ${entityName?uncap_first}, + @RequestParam(name="pageNo", defaultValue="1") Integer pageNo, + @RequestParam(name="pageSize", defaultValue="10") Integer pageSize, + HttpServletRequest req) { + Result> result = new Result>(); + 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> query${sub.entityName}ListByMainId(@RequestParam(name="mainId",required=false) String mainId) { + Result> result = new Result>(); + 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; + } + + + + /** + * 导出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); + + 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 fileMap = multipartRequest.getFileMap(); + for (Map.Entry 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>,); + } + 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 00000000..5cbe5e18 --- /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 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") + + + private <#if po.fieldType=='java.sql.Blob'>byte[]<#else>${po.fieldType} ${po.fieldName}; + +} 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 00000000..bf376ad6 --- /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") + + <#else> + <#if !subTab.foreignKeys?seq_contains(po.fieldName?cap_first)> + @Excel(name = "${po.filedComment}", width = 15) + + + + private <#if po.fieldType=='java.sql.Blob'>byte[]<#else>${po.fieldType} ${po.fieldName}; + +} + \ 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 00000000..34deb8b8 --- /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 00000000..e6079305 --- /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); +} + \ 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 00000000..16f3d653 --- /dev/null +++ b/jeecg-boot/src/main/resources/jeecg/code-template/onetomany2/java/${bussiPackage}/${entityPackage}/mapper/xml/${entityName}Mapper.xml @@ -0,0 +1,5 @@ + + + + + \ 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 00000000..708ae0b5 --- /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 + + + + + + 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 key_has_next>AND + + + + + + \ 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 00000000..9032bd87 --- /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}; + +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>,) ; + + /** + * 修改一对多 + * + */ + public void updateMain(${entityName} ${entityName?uncap_first},<#list subTables as sub>List<${sub.entityName}> ${sub.entityName?uncap_first}List<#if sub_has_next>,); + + /** + * 删除一对多 + */ + public void delMain (String id); + + /** + * 批量删除一对多 + */ + public void delBatchMain (Collection 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 00000000..af913858 --- /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); +} + 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 00000000..5b539dd4 --- /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 subTables as sub> +import ${bussiPackage}.${entityPackage}.mapper.${sub.entityName}Mapper; + +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; + + + @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>,) { + ${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}()); + + + ${sub.entityName?uncap_first}Mapper.insert(entity); + } + + } + + @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>,) { + ${entityName?uncap_first}Mapper.updateById(${entityName?uncap_first}); + + //1.先删除子表数据 + <#list subTables as sub> + ${sub.entityName?uncap_first}Mapper.deleteByMainId(${entityName?uncap_first}.getId()); + + + //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}()); + + + ${sub.entityName?uncap_first}Mapper.insert(entity); + } + + } + + @Override + @Transactional + public void delMain(String id) { + ${entityName?uncap_first}Mapper.deleteById(id); + <#list subTables as sub> + ${sub.entityName?uncap_first}Mapper.deleteByMainId(id); + + } + + @Override + @Transactional + public void delBatchMain(Collection idList) { + for(Serializable id:idList) { + ${entityName?uncap_first}Mapper.deleteById(id); + <#list subTables as sub> + ${sub.entityName?uncap_first}Mapper.deleteByMainId(id.toString()); + + } + } + +} 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 00000000..c893c7e1 --- /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); + } +} + \ 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 00000000..7e20b38f --- /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}; + +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") + + <#else> + @Excel(name = "${po.filedComment}", width = 15) + + + private <#if po.fieldType=='java.sql.Blob'>byte[]<#else>${po.fieldType} ${po.fieldName}; + + + <#list subTables as sub> + @ExcelCollection(name="${sub.ftlDescription}") + private List<${sub.entityName}> ${sub.entityName?uncap_first}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 00000000..c0f196ea --- /dev/null +++ b/jeecg-boot/src/main/resources/jeecg/code-template/onetomany2/java/${bussiPackage}/${entityPackage}/vue/${entityName}List.vuei @@ -0,0 +1,258 @@ + + + + \ 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 00000000..fb3601f0 --- /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 + + + + + \ 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 00000000..02c97c22 --- /dev/null +++ b/jeecg-boot/src/main/resources/jeecg/code-template/onetomany2/java/${bussiPackage}/${entityPackage}/vue/modules/${entityName}Modal.vuei @@ -0,0 +1,167 @@ + + + + + \ 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 00000000..ee0c9b0f --- /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 + + + + + + \ 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 c8a8df47..cecf6a19 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 f058602a..7e9a273b 100644 --- a/jeecg-boot/src/main/resources/logback-spring.xml +++ b/jeecg-boot/src/main/resources/logback-spring.xml @@ -1,105 +1,94 @@ - - - - - - - - %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50}:%L - %msg%n - - - - - - - - ${LOG_HOME}/jeecgboot.%d{yyyy-MM-dd}.log - - 30 - - - - %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50}:%L - %msg%n - - - - 10MB - - - - - - - - - - - %p%d%msg%M%F{32}%L - - - ${LOG_HOME}/error-log.html - - - - - - - - ${LOG_HOME}/jeecgboot.%d{yyyy-MM-dd}.html - - 30 - - - - %p%d%msg%M%F{32}%L - - - - - 10MB - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50}:%L - %msg%n + + + + + + + + ${LOG_HOME}/jeecgboot.%d{yyyy-MM-dd}.log + + + 30 + + + + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50}:%L - %msg%n + + + + 10MB + + + + + + + + + + + %p%d%msg%M%F{32}%L + + + ${LOG_HOME}/error-log.html + + + + + + + + ${LOG_HOME}/jeecgboot.%d{yyyy-MM-dd}.html + + + 30 + + + + %p%d%msg%M%F{32}%L + + + + + 10MB + + + + + + + + + + + + + + + + + + \ 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 e56027d4..177cf103 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:添加数据日志测试---- } -- GitLab