From fbfb353aacb525e04a492713c51785481f7c9fa3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=86=BC=E5=AD=90=E6=98=8E?= <2513889970@qq.com> Date: Fri, 21 Mar 2025 23:51:45 +0800 Subject: [PATCH] first commit --- Dockerfile | 13 + LICENSE | 21 + README.md | 122 + doc/mysql.sql | 311 + doc/oracle.sql | 302 + doc/sqlServer.sql | 295 + pom.xml | 177 + .../vip/fuck/sm/SolonManagerApplication.java | 25 + .../common/aop/annotation/LogAnnotation.java | 25 + .../aop/aspect/LoggingRouterInterceptor.java | 80 + .../config/GlobalResultInterceptor.java | 55 + .../config/MetaObjectHandlerConfig.java | 78 + .../sm/common/config/MyBatisPlusConfig.java | 47 + .../sm/common/config/StpInterfaceImpl.java | 42 + .../common/config/SwaggerConfiguration.java | 50 + .../sm/common/config/WebMvcConfigurer.java | 95 + .../common/exception/BusinessException.java | 52 + .../exception/code/BaseResponseCode.java | 59 + .../exception/code/ResponseCodeInterface.java | 24 + .../common/exception/handler/AppFilter.java | 45 + .../vip/fuck/sm/common/utils/AssertUtil.java | 110 + .../vip/fuck/sm/common/utils/Constant.java | 38 + .../vip/fuck/sm/common/utils/DataResult.java | 112 + .../vip/fuck/sm/common/utils/DateUtils.java | 30 + .../vip/fuck/sm/common/utils/GenUtils.java | 244 + .../fuck/sm/common/utils/PasswordEncoder.java | 117 + .../fuck/sm/common/utils/PasswordUtils.java | 47 + .../fuck/sm/controller/DeptController.java | 96 + .../fuck/sm/controller/IndexController.java | 145 + .../sm/controller/PermissionController.java | 148 + .../fuck/sm/controller/RoleController.java | 141 + .../sm/controller/SysContentController.java | 75 + .../fuck/sm/controller/SysDictController.java | 89 + .../controller/SysDictDetailController.java | 88 + .../sm/controller/SysFilesController.java | 67 + .../sm/controller/SysGeneratorController.java | 58 + .../fuck/sm/controller/SysLogController.java | 64 + .../fuck/sm/controller/UserController.java | 217 + .../sm/controller/UserRoleController.java | 36 + .../sm/controller/api/TestController.java | 44 + .../vip/fuck/sm/entity/BasePageEntity.java | 38 + .../java/vip/fuck/sm/entity/ColumnEntity.java | 104 + .../vip/fuck/sm/entity/SysContentEntity.java | 78 + src/main/java/vip/fuck/sm/entity/SysDept.java | 54 + .../fuck/sm/entity/SysDictDetailEntity.java | 68 + .../vip/fuck/sm/entity/SysDictEntity.java | 51 + .../vip/fuck/sm/entity/SysFilesEntity.java | 51 + .../java/vip/fuck/sm/entity/SysGenerator.java | 30 + src/main/java/vip/fuck/sm/entity/SysLog.java | 48 + .../vip/fuck/sm/entity/SysPermission.java | 63 + src/main/java/vip/fuck/sm/entity/SysRole.java | 66 + .../vip/fuck/sm/entity/SysRoleDeptEntity.java | 49 + .../vip/fuck/sm/entity/SysRolePermission.java | 30 + src/main/java/vip/fuck/sm/entity/SysUser.java | 88 + .../java/vip/fuck/sm/entity/SysUserRole.java | 31 + .../java/vip/fuck/sm/entity/TableEntity.java | 93 + .../vip/fuck/sm/mapper/GeneratorMapper.java | 28 + .../vip/fuck/sm/mapper/SysContentMapper.java | 17 + .../vip/fuck/sm/mapper/SysDeptMapper.java | 16 + .../fuck/sm/mapper/SysDictDetailMapper.java | 17 + .../vip/fuck/sm/mapper/SysDictMapper.java | 17 + .../vip/fuck/sm/mapper/SysFilesMapper.java | 17 + .../java/vip/fuck/sm/mapper/SysLogMapper.java | 16 + .../fuck/sm/mapper/SysPermissionMapper.java | 17 + .../vip/fuck/sm/mapper/SysRoleDeptMapper.java | 17 + .../vip/fuck/sm/mapper/SysRoleMapper.java | 17 + .../sm/mapper/SysRolePermissionMapper.java | 17 + .../vip/fuck/sm/mapper/SysUserMapper.java | 16 + .../vip/fuck/sm/mapper/SysUserRoleMapper.java | 17 + .../java/vip/fuck/sm/service/DeptService.java | 47 + .../java/vip/fuck/sm/service/HomeService.java | 21 + .../fuck/sm/service/ISysGeneratorService.java | 32 + .../java/vip/fuck/sm/service/LogService.java | 14 + .../fuck/sm/service/PermissionService.java | 86 + .../sm/service/RolePermissionService.java | 22 + .../java/vip/fuck/sm/service/RoleService.java | 53 + .../fuck/sm/service/SysContentService.java | 16 + .../fuck/sm/service/SysDictDetailService.java | 26 + .../vip/fuck/sm/service/SysDictService.java | 16 + .../vip/fuck/sm/service/SysFilesService.java | 36 + .../fuck/sm/service/SysRoleDeptService.java | 16 + .../vip/fuck/sm/service/UserRoleService.java | 32 + .../java/vip/fuck/sm/service/UserService.java | 76 + .../fuck/sm/service/impl/DeptServiceImpl.java | 214 + .../fuck/sm/service/impl/HomeServiceImpl.java | 59 + .../fuck/sm/service/impl/LogServiceImpl.java | 18 + .../service/impl/PermissionServiceImpl.java | 263 + .../impl/RolePermissionServiceImpl.java | 36 + .../fuck/sm/service/impl/RoleServiceImpl.java | 147 + .../service/impl/SysContentServiceImpl.java | 20 + .../impl/SysDictDetailServiceImpl.java | 53 + .../sm/service/impl/SysDictServiceImpl.java | 57 + .../sm/service/impl/SysFilesServiceImpl.java | 123 + .../service/impl/SysGeneratorServiceImpl.java | 64 + .../service/impl/SysRoleDeptServiceImpl.java | 14 + .../sm/service/impl/UserRoleServiceImpl.java | 55 + .../fuck/sm/service/impl/UserServiceImpl.java | 237 + .../vo/req/RolePermissionOperationReqVO.java | 25 + .../sm/vo/req/UserRoleOperationReqVO.java | 25 + .../vip/fuck/sm/vo/resp/DeptRespNodeVO.java | 53 + .../java/vip/fuck/sm/vo/resp/HomeRespVO.java | 22 + .../java/vip/fuck/sm/vo/resp/LoginRespVO.java | 27 + .../fuck/sm/vo/resp/PermissionRespNode.java | 53 + .../vip/fuck/sm/vo/resp/UserInfoRespVO.java | 30 + .../fuck/sm/vo/resp/UserOwnRoleRespVO.java | 22 + src/main/resources/app.yml | 80 + src/main/resources/generator.properties | 61 + .../mapper/mysql/SysGeneratorMapper.xml | 39 + .../mapper/oracle/SysGeneratorMapper.xml | 78 + .../mapper/sqlServer/SysGeneratorMapper.xml | 106 + src/main/resources/static/css/403.css | 9 + src/main/resources/static/css/404.css | 9 + src/main/resources/static/css/500.css | 9 + src/main/resources/static/css/build.css | 111 + src/main/resources/static/css/custom.form.css | 38 + src/main/resources/static/css/home.css | 110 + src/main/resources/static/css/images/403.png | Bin 0 -> 147566 bytes src/main/resources/static/css/images/404.png | Bin 0 -> 147186 bytes src/main/resources/static/css/images/500.png | Bin 0 -> 147716 bytes src/main/resources/static/css/images/bg.jpg | Bin 0 -> 26174 bytes src/main/resources/static/css/login.css | 98 + src/main/resources/static/css/login2.css | 99 + src/main/resources/static/js/build.js | 167 + src/main/resources/static/js/core.util.js | 182 + src/main/resources/static/js/home.js | 369 + .../js/jq-module/jquery.particleground.min.js | 195 + .../static/js/jq-module/paigusu.min.js | 1 + .../jq-module/zyupload/zyupload-1.0.0.min.css | 2 + .../jq-module/zyupload/zyupload-1.0.0.min.js | 17 + src/main/resources/static/js/jquery.js | 2 + .../resources/static/layui-ext/cron/cron.css | 184 + .../resources/static/layui-ext/cron/cron.js | 1137 ++ .../static/layui-ext/eleTree/eleTree.js | 1 + .../static/layui-ext/icon/iconPicker.js | 327 + .../static/layui-ext/tinymce/tinymce.js | 268 + .../tinymce/icons/default/icons.min.js | 1 + .../tinymce/tinymce/jquery.tinymce.min.js | 92 + .../layui-ext/tinymce/tinymce/langs/readme.md | 3 + .../layui-ext/tinymce/tinymce/langs/zh_CN.js | 419 + .../layui-ext/tinymce/tinymce/license.txt | 504 + .../tinymce/tinymce/plugins/advlist/plugin.js | 281 + .../tinymce/plugins/advlist/plugin.min.js | 9 + .../tinymce/tinymce/plugins/anchor/plugin.js | 216 + .../tinymce/plugins/anchor/plugin.min.js | 9 + .../tinymce/plugins/autolink/plugin.js | 185 + .../tinymce/plugins/autolink/plugin.min.js | 9 + .../tinymce/plugins/autoresize/plugin.js | 171 + .../tinymce/plugins/autoresize/plugin.min.js | 9 + .../tinymce/plugins/autosave/plugin.js | 214 + .../tinymce/plugins/autosave/plugin.min.js | 9 + .../tinymce/tinymce/plugins/bbcode/plugin.js | 99 + .../tinymce/plugins/bbcode/plugin.min.js | 9 + .../tinymce/tinymce/plugins/charmap/plugin.js | 1706 +++ .../tinymce/plugins/charmap/plugin.min.js | 9 + .../tinymce/tinymce/plugins/code/plugin.js | 92 + .../tinymce/plugins/code/plugin.min.js | 9 + .../tinymce/plugins/codesample/plugin.js | 1717 +++ .../tinymce/plugins/codesample/plugin.min.js | 9 + .../tinymce/plugins/colorpicker/plugin.js | 22 + .../tinymce/plugins/colorpicker/plugin.min.js | 9 + .../tinymce/plugins/contextmenu/plugin.js | 22 + .../tinymce/plugins/contextmenu/plugin.min.js | 9 + .../tinymce/plugins/directionality/plugin.js | 314 + .../plugins/directionality/plugin.min.js | 9 + .../tinymce/plugins/emoticons/js/emojis.js | 9015 +++++++++++++++ .../plugins/emoticons/js/emojis.min.js | 2 + .../tinymce/plugins/emoticons/plugin.js | 564 + .../tinymce/plugins/emoticons/plugin.min.js | 9 + .../tinymce/plugins/fullpage/plugin.js | 544 + .../tinymce/plugins/fullpage/plugin.min.js | 9 + .../tinymce/plugins/fullscreen/plugin.js | 851 ++ .../tinymce/plugins/fullscreen/plugin.min.js | 9 + .../tinymce/tinymce/plugins/help/plugin.js | 846 ++ .../tinymce/plugins/help/plugin.min.js | 9 + .../tinymce/tinymce/plugins/hr/plugin.js | 46 + .../tinymce/tinymce/plugins/hr/plugin.min.js | 9 + .../tinymce/tinymce/plugins/image/plugin.js | 1660 +++ .../tinymce/plugins/image/plugin.min.js | 9 + .../tinymce/plugins/imagetools/plugin.js | 1304 +++ .../tinymce/plugins/imagetools/plugin.min.js | 9 + .../tinymce/plugins/importcss/plugin.js | 337 + .../tinymce/plugins/importcss/plugin.min.js | 9 + .../tinymce/plugins/indent2em/plugin.js | 62 + .../tinymce/plugins/indent2em/plugin.min.js | 62 + .../tinymce/plugins/insertdatetime/plugin.js | 177 + .../plugins/insertdatetime/plugin.min.js | 9 + .../tinymce/plugins/legacyoutput/plugin.js | 199 + .../plugins/legacyoutput/plugin.min.js | 9 + .../tinymce/tinymce/plugins/link/plugin.js | 1219 +++ .../tinymce/plugins/link/plugin.min.js | 9 + .../tinymce/tinymce/plugins/lists/plugin.js | 2163 ++++ .../tinymce/plugins/lists/plugin.min.js | 9 + .../tinymce/tinymce/plugins/media/plugin.js | 1315 +++ .../tinymce/plugins/media/plugin.min.js | 9 + .../tinymce/plugins/nonbreaking/plugin.js | 101 + .../tinymce/plugins/nonbreaking/plugin.min.js | 9 + .../tinymce/plugins/noneditable/plugin.js | 117 + .../tinymce/plugins/noneditable/plugin.min.js | 9 + .../tinymce/plugins/pagebreak/plugin.js | 107 + .../tinymce/plugins/pagebreak/plugin.min.js | 9 + .../tinymce/tinymce/plugins/paste/plugin.js | 1707 +++ .../tinymce/plugins/paste/plugin.min.js | 9 + .../tinymce/tinymce/plugins/preview/plugin.js | 127 + .../tinymce/plugins/preview/plugin.min.js | 9 + .../tinymce/tinymce/plugins/print/plugin.js | 53 + .../tinymce/plugins/print/plugin.min.js | 9 + .../tinymce/plugins/quickbars/plugin.js | 488 + .../tinymce/plugins/quickbars/plugin.min.js | 9 + .../tinymce/tinymce/plugins/save/plugin.js | 119 + .../tinymce/plugins/save/plugin.min.js | 9 + .../tinymce/plugins/searchreplace/plugin.js | 1167 ++ .../plugins/searchreplace/plugin.min.js | 9 + .../tinymce/plugins/spellchecker/plugin.js | 737 ++ .../plugins/spellchecker/plugin.min.js | 9 + .../tinymce/plugins/tabfocus/plugin.js | 128 + .../tinymce/plugins/tabfocus/plugin.min.js | 9 + .../tinymce/tinymce/plugins/table/plugin.js | 9743 +++++++++++++++++ .../tinymce/plugins/table/plugin.min.js | 9 + .../tinymce/plugins/template/plugin.js | 562 + .../tinymce/plugins/template/plugin.min.js | 9 + .../tinymce/plugins/textcolor/plugin.js | 22 + .../tinymce/plugins/textcolor/plugin.min.js | 9 + .../tinymce/plugins/textpattern/plugin.js | 1392 +++ .../tinymce/plugins/textpattern/plugin.min.js | 9 + .../tinymce/tinymce/plugins/toc/plugin.js | 235 + .../tinymce/tinymce/plugins/toc/plugin.min.js | 9 + .../tinymce/plugins/visualblocks/plugin.js | 104 + .../plugins/visualblocks/plugin.min.js | 9 + .../tinymce/plugins/visualchars/plugin.js | 541 + .../tinymce/plugins/visualchars/plugin.min.js | 9 + .../tinymce/plugins/wordcount/plugin.js | 416 + .../tinymce/plugins/wordcount/plugin.min.js | 9 + .../skins/content/dark/content.min.css | 7 + .../skins/content/default/content.min.css | 7 + .../skins/content/document/content.min.css | 7 + .../skins/content/writer/content.min.css | 7 + .../ui/oxide-dark/content.inline.min.css | 7 + .../skins/ui/oxide-dark/content.min.css | 7 + .../ui/oxide-dark/content.mobile.min.css | 7 + .../ui/oxide-dark/fonts/tinymce-mobile.woff | Bin 0 -> 4624 bytes .../tinymce/skins/ui/oxide-dark/skin.min.css | 7 + .../skins/ui/oxide-dark/skin.mobile.min.css | 7 + .../skins/ui/oxide/content.inline.min.css | 7 + .../tinymce/skins/ui/oxide/content.min.css | 7 + .../skins/ui/oxide/content.mobile.min.css | 7 + .../skins/ui/oxide/fonts/tinymce-mobile.woff | Bin 0 -> 4624 bytes .../tinymce/skins/ui/oxide/skin.min.css | 7 + .../skins/ui/oxide/skin.mobile.min.css | 7 + .../tinymce/themes/mobile/theme.min.js | 9 + .../tinymce/themes/silver/theme.min.js | 9 + .../layui-ext/tinymce/tinymce/tinymce.min.js | 9 + .../layui-ext/treetable-lay/treetable.css | 18 + .../layui-ext/treetable-lay/treetable.js | 206 + src/main/resources/static/layui/css/layui.css | 1 + .../static/layui/css/layui.mobile.css | 2 + .../static/layui/css/modules/code.css | 1 + .../css/modules/laydate/default/laydate.css | 1 + .../css/modules/layer/default/icon-ext.png | Bin 0 -> 5911 bytes .../layui/css/modules/layer/default/icon.png | Bin 0 -> 11493 bytes .../layui/css/modules/layer/default/layer.css | 1 + .../css/modules/layer/default/loading-0.gif | Bin 0 -> 5793 bytes .../css/modules/layer/default/loading-1.gif | Bin 0 -> 701 bytes .../css/modules/layer/default/loading-2.gif | Bin 0 -> 1787 bytes .../resources/static/layui/font/iconfont.eot | Bin 0 -> 54172 bytes .../resources/static/layui/font/iconfont.svg | 405 + .../resources/static/layui/font/iconfont.ttf | Bin 0 -> 53996 bytes .../resources/static/layui/font/iconfont.woff | Bin 0 -> 34624 bytes .../static/layui/font/iconfont.woff2 | Bin 0 -> 29736 bytes .../resources/static/layui/images/face/0.gif | Bin 0 -> 2689 bytes .../resources/static/layui/images/face/1.gif | Bin 0 -> 5514 bytes .../resources/static/layui/images/face/10.gif | Bin 0 -> 2797 bytes .../resources/static/layui/images/face/11.gif | Bin 0 -> 4121 bytes .../resources/static/layui/images/face/12.gif | Bin 0 -> 3361 bytes .../resources/static/layui/images/face/13.gif | Bin 0 -> 7425 bytes .../resources/static/layui/images/face/14.gif | Bin 0 -> 2375 bytes .../resources/static/layui/images/face/15.gif | Bin 0 -> 1793 bytes .../resources/static/layui/images/face/16.gif | Bin 0 -> 6721 bytes .../resources/static/layui/images/face/17.gif | Bin 0 -> 4439 bytes .../resources/static/layui/images/face/18.gif | Bin 0 -> 3017 bytes .../resources/static/layui/images/face/19.gif | Bin 0 -> 3040 bytes .../resources/static/layui/images/face/2.gif | Bin 0 -> 3222 bytes .../resources/static/layui/images/face/20.gif | Bin 0 -> 5144 bytes .../resources/static/layui/images/face/21.gif | Bin 0 -> 5191 bytes .../resources/static/layui/images/face/22.gif | Bin 0 -> 9823 bytes .../resources/static/layui/images/face/23.gif | Bin 0 -> 3792 bytes .../resources/static/layui/images/face/24.gif | Bin 0 -> 8096 bytes .../resources/static/layui/images/face/25.gif | Bin 0 -> 3127 bytes .../resources/static/layui/images/face/26.gif | Bin 0 -> 3291 bytes .../resources/static/layui/images/face/27.gif | Bin 0 -> 4377 bytes .../resources/static/layui/images/face/28.gif | Bin 0 -> 2793 bytes .../resources/static/layui/images/face/29.gif | Bin 0 -> 4854 bytes .../resources/static/layui/images/face/3.gif | Bin 0 -> 4017 bytes .../resources/static/layui/images/face/30.gif | Bin 0 -> 2555 bytes .../resources/static/layui/images/face/31.gif | Bin 0 -> 2002 bytes .../resources/static/layui/images/face/32.gif | Bin 0 -> 3481 bytes .../resources/static/layui/images/face/33.gif | Bin 0 -> 2454 bytes .../resources/static/layui/images/face/34.gif | Bin 0 -> 3700 bytes .../resources/static/layui/images/face/35.gif | Bin 0 -> 1800 bytes .../resources/static/layui/images/face/36.gif | Bin 0 -> 2331 bytes .../resources/static/layui/images/face/37.gif | Bin 0 -> 1513 bytes .../resources/static/layui/images/face/38.gif | Bin 0 -> 3615 bytes .../resources/static/layui/images/face/39.gif | Bin 0 -> 6495 bytes .../resources/static/layui/images/face/4.gif | Bin 0 -> 5689 bytes .../resources/static/layui/images/face/40.gif | Bin 0 -> 3154 bytes .../resources/static/layui/images/face/41.gif | Bin 0 -> 3644 bytes .../resources/static/layui/images/face/42.gif | Bin 0 -> 5305 bytes .../resources/static/layui/images/face/43.gif | Bin 0 -> 2674 bytes .../resources/static/layui/images/face/44.gif | Bin 0 -> 4126 bytes .../resources/static/layui/images/face/45.gif | Bin 0 -> 3417 bytes .../resources/static/layui/images/face/46.gif | Bin 0 -> 3007 bytes .../resources/static/layui/images/face/47.gif | Bin 0 -> 2333 bytes .../resources/static/layui/images/face/48.gif | Bin 0 -> 2689 bytes .../resources/static/layui/images/face/49.gif | Bin 0 -> 2315 bytes .../resources/static/layui/images/face/5.gif | Bin 0 -> 4567 bytes .../resources/static/layui/images/face/50.gif | Bin 0 -> 5866 bytes .../resources/static/layui/images/face/51.gif | Bin 0 -> 2785 bytes .../resources/static/layui/images/face/52.gif | Bin 0 -> 777 bytes .../resources/static/layui/images/face/53.gif | Bin 0 -> 2127 bytes .../resources/static/layui/images/face/54.gif | Bin 0 -> 2196 bytes .../resources/static/layui/images/face/55.gif | Bin 0 -> 1971 bytes .../resources/static/layui/images/face/56.gif | Bin 0 -> 2034 bytes .../resources/static/layui/images/face/57.gif | Bin 0 -> 2705 bytes .../resources/static/layui/images/face/58.gif | Bin 0 -> 2258 bytes .../resources/static/layui/images/face/59.gif | Bin 0 -> 10311 bytes .../resources/static/layui/images/face/6.gif | Bin 0 -> 2213 bytes .../resources/static/layui/images/face/60.gif | Bin 0 -> 3245 bytes .../resources/static/layui/images/face/61.gif | Bin 0 -> 2495 bytes .../resources/static/layui/images/face/62.gif | Bin 0 -> 2017 bytes .../resources/static/layui/images/face/63.gif | Bin 0 -> 5871 bytes .../resources/static/layui/images/face/64.gif | Bin 0 -> 6448 bytes .../resources/static/layui/images/face/65.gif | Bin 0 -> 3576 bytes .../resources/static/layui/images/face/66.gif | Bin 0 -> 3029 bytes .../resources/static/layui/images/face/67.gif | Bin 0 -> 2701 bytes .../resources/static/layui/images/face/68.gif | Bin 0 -> 1424 bytes .../resources/static/layui/images/face/69.gif | Bin 0 -> 2431 bytes .../resources/static/layui/images/face/7.gif | Bin 0 -> 3398 bytes .../resources/static/layui/images/face/70.gif | Bin 0 -> 4590 bytes .../resources/static/layui/images/face/71.gif | Bin 0 -> 5304 bytes .../resources/static/layui/images/face/8.gif | Bin 0 -> 4050 bytes .../resources/static/layui/images/face/9.gif | Bin 0 -> 4221 bytes .../static/layui/lay/modules/carousel.js | 2 + .../static/layui/lay/modules/code.js | 2 + .../static/layui/lay/modules/colorpicker.js | 2 + .../static/layui/lay/modules/element.js | 2 + .../static/layui/lay/modules/flow.js | 2 + .../static/layui/lay/modules/form.js | 2 + .../static/layui/lay/modules/jquery.js | 5 + .../static/layui/lay/modules/laydate.js | 2 + .../static/layui/lay/modules/layedit.js | 2 + .../static/layui/lay/modules/layer.js | 2 + .../static/layui/lay/modules/laypage.js | 2 + .../static/layui/lay/modules/laytpl.js | 2 + .../static/layui/lay/modules/mobile.js | 2 + .../static/layui/lay/modules/rate.js | 2 + .../static/layui/lay/modules/slider.js | 2 + .../static/layui/lay/modules/table.js | 2 + .../static/layui/lay/modules/transfer.js | 2 + .../static/layui/lay/modules/tree.js | 2 + .../static/layui/lay/modules/upload.js | 2 + .../static/layui/lay/modules/util.js | 2 + src/main/resources/static/layui/layui.js | 1 + .../resources/template/Controller.java.vm | 87 + src/main/resources/template/Dao.java.vm | 16 + src/main/resources/template/Dao.xml.vm | 14 + src/main/resources/template/Entity.java.vm | 46 + src/main/resources/template/Service.java.vm | 16 + .../resources/template/ServiceImpl.java.vm | 15 + src/main/resources/template/list.html.vm | 235 + src/main/resources/template/menu.sql.vm | 18 + src/main/resources/templates/about.html | 50 + src/main/resources/templates/build.html | 155 + .../resources/templates/depts/dept_list.html | 265 + src/main/resources/templates/error/403.html | 18 + src/main/resources/templates/error/404.html | 24 + src/main/resources/templates/error/500.html | 20 + .../resources/templates/generator/list.html | 114 + src/main/resources/templates/home.html | 230 + src/main/resources/templates/layout.html | 27 + src/main/resources/templates/login.html | 98 + src/main/resources/templates/login2.html | 82 + src/main/resources/templates/main.html | 173 + .../resources/templates/menus/menu_list.html | 368 + .../resources/templates/roles/role_list.html | 291 + .../resources/templates/syscontent/list.html | 281 + .../resources/templates/sysdict/list.html | 464 + .../resources/templates/sysfiles/list.html | 152 + .../templates/users/update_password.html | 68 + .../resources/templates/users/user_edit.html | 106 + .../resources/templates/users/user_list.html | 472 + 389 files changed, 60259 insertions(+) create mode 100644 Dockerfile create mode 100644 LICENSE create mode 100644 README.md create mode 100644 doc/mysql.sql create mode 100644 doc/oracle.sql create mode 100644 doc/sqlServer.sql create mode 100644 pom.xml create mode 100644 src/main/java/vip/fuck/sm/SolonManagerApplication.java create mode 100644 src/main/java/vip/fuck/sm/common/aop/annotation/LogAnnotation.java create mode 100644 src/main/java/vip/fuck/sm/common/aop/aspect/LoggingRouterInterceptor.java create mode 100644 src/main/java/vip/fuck/sm/common/config/GlobalResultInterceptor.java create mode 100644 src/main/java/vip/fuck/sm/common/config/MetaObjectHandlerConfig.java create mode 100644 src/main/java/vip/fuck/sm/common/config/MyBatisPlusConfig.java create mode 100644 src/main/java/vip/fuck/sm/common/config/StpInterfaceImpl.java create mode 100644 src/main/java/vip/fuck/sm/common/config/SwaggerConfiguration.java create mode 100644 src/main/java/vip/fuck/sm/common/config/WebMvcConfigurer.java create mode 100644 src/main/java/vip/fuck/sm/common/exception/BusinessException.java create mode 100644 src/main/java/vip/fuck/sm/common/exception/code/BaseResponseCode.java create mode 100644 src/main/java/vip/fuck/sm/common/exception/code/ResponseCodeInterface.java create mode 100644 src/main/java/vip/fuck/sm/common/exception/handler/AppFilter.java create mode 100644 src/main/java/vip/fuck/sm/common/utils/AssertUtil.java create mode 100644 src/main/java/vip/fuck/sm/common/utils/Constant.java create mode 100644 src/main/java/vip/fuck/sm/common/utils/DataResult.java create mode 100644 src/main/java/vip/fuck/sm/common/utils/DateUtils.java create mode 100644 src/main/java/vip/fuck/sm/common/utils/GenUtils.java create mode 100644 src/main/java/vip/fuck/sm/common/utils/PasswordEncoder.java create mode 100644 src/main/java/vip/fuck/sm/common/utils/PasswordUtils.java create mode 100644 src/main/java/vip/fuck/sm/controller/DeptController.java create mode 100644 src/main/java/vip/fuck/sm/controller/IndexController.java create mode 100644 src/main/java/vip/fuck/sm/controller/PermissionController.java create mode 100644 src/main/java/vip/fuck/sm/controller/RoleController.java create mode 100644 src/main/java/vip/fuck/sm/controller/SysContentController.java create mode 100644 src/main/java/vip/fuck/sm/controller/SysDictController.java create mode 100644 src/main/java/vip/fuck/sm/controller/SysDictDetailController.java create mode 100644 src/main/java/vip/fuck/sm/controller/SysFilesController.java create mode 100644 src/main/java/vip/fuck/sm/controller/SysGeneratorController.java create mode 100644 src/main/java/vip/fuck/sm/controller/SysLogController.java create mode 100644 src/main/java/vip/fuck/sm/controller/UserController.java create mode 100644 src/main/java/vip/fuck/sm/controller/UserRoleController.java create mode 100644 src/main/java/vip/fuck/sm/controller/api/TestController.java create mode 100644 src/main/java/vip/fuck/sm/entity/BasePageEntity.java create mode 100644 src/main/java/vip/fuck/sm/entity/ColumnEntity.java create mode 100644 src/main/java/vip/fuck/sm/entity/SysContentEntity.java create mode 100644 src/main/java/vip/fuck/sm/entity/SysDept.java create mode 100644 src/main/java/vip/fuck/sm/entity/SysDictDetailEntity.java create mode 100644 src/main/java/vip/fuck/sm/entity/SysDictEntity.java create mode 100644 src/main/java/vip/fuck/sm/entity/SysFilesEntity.java create mode 100644 src/main/java/vip/fuck/sm/entity/SysGenerator.java create mode 100644 src/main/java/vip/fuck/sm/entity/SysLog.java create mode 100644 src/main/java/vip/fuck/sm/entity/SysPermission.java create mode 100644 src/main/java/vip/fuck/sm/entity/SysRole.java create mode 100644 src/main/java/vip/fuck/sm/entity/SysRoleDeptEntity.java create mode 100644 src/main/java/vip/fuck/sm/entity/SysRolePermission.java create mode 100644 src/main/java/vip/fuck/sm/entity/SysUser.java create mode 100644 src/main/java/vip/fuck/sm/entity/SysUserRole.java create mode 100644 src/main/java/vip/fuck/sm/entity/TableEntity.java create mode 100644 src/main/java/vip/fuck/sm/mapper/GeneratorMapper.java create mode 100644 src/main/java/vip/fuck/sm/mapper/SysContentMapper.java create mode 100644 src/main/java/vip/fuck/sm/mapper/SysDeptMapper.java create mode 100644 src/main/java/vip/fuck/sm/mapper/SysDictDetailMapper.java create mode 100644 src/main/java/vip/fuck/sm/mapper/SysDictMapper.java create mode 100644 src/main/java/vip/fuck/sm/mapper/SysFilesMapper.java create mode 100644 src/main/java/vip/fuck/sm/mapper/SysLogMapper.java create mode 100644 src/main/java/vip/fuck/sm/mapper/SysPermissionMapper.java create mode 100644 src/main/java/vip/fuck/sm/mapper/SysRoleDeptMapper.java create mode 100644 src/main/java/vip/fuck/sm/mapper/SysRoleMapper.java create mode 100644 src/main/java/vip/fuck/sm/mapper/SysRolePermissionMapper.java create mode 100644 src/main/java/vip/fuck/sm/mapper/SysUserMapper.java create mode 100644 src/main/java/vip/fuck/sm/mapper/SysUserRoleMapper.java create mode 100644 src/main/java/vip/fuck/sm/service/DeptService.java create mode 100644 src/main/java/vip/fuck/sm/service/HomeService.java create mode 100644 src/main/java/vip/fuck/sm/service/ISysGeneratorService.java create mode 100644 src/main/java/vip/fuck/sm/service/LogService.java create mode 100644 src/main/java/vip/fuck/sm/service/PermissionService.java create mode 100644 src/main/java/vip/fuck/sm/service/RolePermissionService.java create mode 100644 src/main/java/vip/fuck/sm/service/RoleService.java create mode 100644 src/main/java/vip/fuck/sm/service/SysContentService.java create mode 100644 src/main/java/vip/fuck/sm/service/SysDictDetailService.java create mode 100644 src/main/java/vip/fuck/sm/service/SysDictService.java create mode 100644 src/main/java/vip/fuck/sm/service/SysFilesService.java create mode 100644 src/main/java/vip/fuck/sm/service/SysRoleDeptService.java create mode 100644 src/main/java/vip/fuck/sm/service/UserRoleService.java create mode 100644 src/main/java/vip/fuck/sm/service/UserService.java create mode 100644 src/main/java/vip/fuck/sm/service/impl/DeptServiceImpl.java create mode 100644 src/main/java/vip/fuck/sm/service/impl/HomeServiceImpl.java create mode 100644 src/main/java/vip/fuck/sm/service/impl/LogServiceImpl.java create mode 100644 src/main/java/vip/fuck/sm/service/impl/PermissionServiceImpl.java create mode 100644 src/main/java/vip/fuck/sm/service/impl/RolePermissionServiceImpl.java create mode 100644 src/main/java/vip/fuck/sm/service/impl/RoleServiceImpl.java create mode 100644 src/main/java/vip/fuck/sm/service/impl/SysContentServiceImpl.java create mode 100644 src/main/java/vip/fuck/sm/service/impl/SysDictDetailServiceImpl.java create mode 100644 src/main/java/vip/fuck/sm/service/impl/SysDictServiceImpl.java create mode 100644 src/main/java/vip/fuck/sm/service/impl/SysFilesServiceImpl.java create mode 100644 src/main/java/vip/fuck/sm/service/impl/SysGeneratorServiceImpl.java create mode 100644 src/main/java/vip/fuck/sm/service/impl/SysRoleDeptServiceImpl.java create mode 100644 src/main/java/vip/fuck/sm/service/impl/UserRoleServiceImpl.java create mode 100644 src/main/java/vip/fuck/sm/service/impl/UserServiceImpl.java create mode 100644 src/main/java/vip/fuck/sm/vo/req/RolePermissionOperationReqVO.java create mode 100644 src/main/java/vip/fuck/sm/vo/req/UserRoleOperationReqVO.java create mode 100644 src/main/java/vip/fuck/sm/vo/resp/DeptRespNodeVO.java create mode 100644 src/main/java/vip/fuck/sm/vo/resp/HomeRespVO.java create mode 100644 src/main/java/vip/fuck/sm/vo/resp/LoginRespVO.java create mode 100644 src/main/java/vip/fuck/sm/vo/resp/PermissionRespNode.java create mode 100644 src/main/java/vip/fuck/sm/vo/resp/UserInfoRespVO.java create mode 100644 src/main/java/vip/fuck/sm/vo/resp/UserOwnRoleRespVO.java create mode 100644 src/main/resources/app.yml create mode 100644 src/main/resources/generator.properties create mode 100644 src/main/resources/mapper/mysql/SysGeneratorMapper.xml create mode 100644 src/main/resources/mapper/oracle/SysGeneratorMapper.xml create mode 100644 src/main/resources/mapper/sqlServer/SysGeneratorMapper.xml create mode 100644 src/main/resources/static/css/403.css create mode 100644 src/main/resources/static/css/404.css create mode 100644 src/main/resources/static/css/500.css create mode 100644 src/main/resources/static/css/build.css create mode 100644 src/main/resources/static/css/custom.form.css create mode 100644 src/main/resources/static/css/home.css create mode 100644 src/main/resources/static/css/images/403.png create mode 100644 src/main/resources/static/css/images/404.png create mode 100644 src/main/resources/static/css/images/500.png create mode 100644 src/main/resources/static/css/images/bg.jpg create mode 100644 src/main/resources/static/css/login.css create mode 100644 src/main/resources/static/css/login2.css create mode 100644 src/main/resources/static/js/build.js create mode 100644 src/main/resources/static/js/core.util.js create mode 100644 src/main/resources/static/js/home.js create mode 100644 src/main/resources/static/js/jq-module/jquery.particleground.min.js create mode 100644 src/main/resources/static/js/jq-module/paigusu.min.js create mode 100644 src/main/resources/static/js/jq-module/zyupload/zyupload-1.0.0.min.css create mode 100644 src/main/resources/static/js/jq-module/zyupload/zyupload-1.0.0.min.js create mode 100644 src/main/resources/static/js/jquery.js create mode 100644 src/main/resources/static/layui-ext/cron/cron.css create mode 100644 src/main/resources/static/layui-ext/cron/cron.js create mode 100644 src/main/resources/static/layui-ext/eleTree/eleTree.js create mode 100644 src/main/resources/static/layui-ext/icon/iconPicker.js create mode 100644 src/main/resources/static/layui-ext/tinymce/tinymce.js create mode 100644 src/main/resources/static/layui-ext/tinymce/tinymce/icons/default/icons.min.js create mode 100644 src/main/resources/static/layui-ext/tinymce/tinymce/jquery.tinymce.min.js create mode 100644 src/main/resources/static/layui-ext/tinymce/tinymce/langs/readme.md create mode 100644 src/main/resources/static/layui-ext/tinymce/tinymce/langs/zh_CN.js create mode 100644 src/main/resources/static/layui-ext/tinymce/tinymce/license.txt create mode 100644 src/main/resources/static/layui-ext/tinymce/tinymce/plugins/advlist/plugin.js create mode 100644 src/main/resources/static/layui-ext/tinymce/tinymce/plugins/advlist/plugin.min.js create mode 100644 src/main/resources/static/layui-ext/tinymce/tinymce/plugins/anchor/plugin.js create mode 100644 src/main/resources/static/layui-ext/tinymce/tinymce/plugins/anchor/plugin.min.js create mode 100644 src/main/resources/static/layui-ext/tinymce/tinymce/plugins/autolink/plugin.js create mode 100644 src/main/resources/static/layui-ext/tinymce/tinymce/plugins/autolink/plugin.min.js create mode 100644 src/main/resources/static/layui-ext/tinymce/tinymce/plugins/autoresize/plugin.js create mode 100644 src/main/resources/static/layui-ext/tinymce/tinymce/plugins/autoresize/plugin.min.js create mode 100644 src/main/resources/static/layui-ext/tinymce/tinymce/plugins/autosave/plugin.js create mode 100644 src/main/resources/static/layui-ext/tinymce/tinymce/plugins/autosave/plugin.min.js create mode 100644 src/main/resources/static/layui-ext/tinymce/tinymce/plugins/bbcode/plugin.js create mode 100644 src/main/resources/static/layui-ext/tinymce/tinymce/plugins/bbcode/plugin.min.js create mode 100644 src/main/resources/static/layui-ext/tinymce/tinymce/plugins/charmap/plugin.js create mode 100644 src/main/resources/static/layui-ext/tinymce/tinymce/plugins/charmap/plugin.min.js create mode 100644 src/main/resources/static/layui-ext/tinymce/tinymce/plugins/code/plugin.js create mode 100644 src/main/resources/static/layui-ext/tinymce/tinymce/plugins/code/plugin.min.js create mode 100644 src/main/resources/static/layui-ext/tinymce/tinymce/plugins/codesample/plugin.js create mode 100644 src/main/resources/static/layui-ext/tinymce/tinymce/plugins/codesample/plugin.min.js create mode 100644 src/main/resources/static/layui-ext/tinymce/tinymce/plugins/colorpicker/plugin.js create mode 100644 src/main/resources/static/layui-ext/tinymce/tinymce/plugins/colorpicker/plugin.min.js create mode 100644 src/main/resources/static/layui-ext/tinymce/tinymce/plugins/contextmenu/plugin.js create mode 100644 src/main/resources/static/layui-ext/tinymce/tinymce/plugins/contextmenu/plugin.min.js create mode 100644 src/main/resources/static/layui-ext/tinymce/tinymce/plugins/directionality/plugin.js create mode 100644 src/main/resources/static/layui-ext/tinymce/tinymce/plugins/directionality/plugin.min.js create mode 100644 src/main/resources/static/layui-ext/tinymce/tinymce/plugins/emoticons/js/emojis.js create mode 100644 src/main/resources/static/layui-ext/tinymce/tinymce/plugins/emoticons/js/emojis.min.js create mode 100644 src/main/resources/static/layui-ext/tinymce/tinymce/plugins/emoticons/plugin.js create mode 100644 src/main/resources/static/layui-ext/tinymce/tinymce/plugins/emoticons/plugin.min.js create mode 100644 src/main/resources/static/layui-ext/tinymce/tinymce/plugins/fullpage/plugin.js create mode 100644 src/main/resources/static/layui-ext/tinymce/tinymce/plugins/fullpage/plugin.min.js create mode 100644 src/main/resources/static/layui-ext/tinymce/tinymce/plugins/fullscreen/plugin.js create mode 100644 src/main/resources/static/layui-ext/tinymce/tinymce/plugins/fullscreen/plugin.min.js create mode 100644 src/main/resources/static/layui-ext/tinymce/tinymce/plugins/help/plugin.js create mode 100644 src/main/resources/static/layui-ext/tinymce/tinymce/plugins/help/plugin.min.js create mode 100644 src/main/resources/static/layui-ext/tinymce/tinymce/plugins/hr/plugin.js create mode 100644 src/main/resources/static/layui-ext/tinymce/tinymce/plugins/hr/plugin.min.js create mode 100644 src/main/resources/static/layui-ext/tinymce/tinymce/plugins/image/plugin.js create mode 100644 src/main/resources/static/layui-ext/tinymce/tinymce/plugins/image/plugin.min.js create mode 100644 src/main/resources/static/layui-ext/tinymce/tinymce/plugins/imagetools/plugin.js create mode 100644 src/main/resources/static/layui-ext/tinymce/tinymce/plugins/imagetools/plugin.min.js create mode 100644 src/main/resources/static/layui-ext/tinymce/tinymce/plugins/importcss/plugin.js create mode 100644 src/main/resources/static/layui-ext/tinymce/tinymce/plugins/importcss/plugin.min.js create mode 100644 src/main/resources/static/layui-ext/tinymce/tinymce/plugins/indent2em/plugin.js create mode 100644 src/main/resources/static/layui-ext/tinymce/tinymce/plugins/indent2em/plugin.min.js create mode 100644 src/main/resources/static/layui-ext/tinymce/tinymce/plugins/insertdatetime/plugin.js create mode 100644 src/main/resources/static/layui-ext/tinymce/tinymce/plugins/insertdatetime/plugin.min.js create mode 100644 src/main/resources/static/layui-ext/tinymce/tinymce/plugins/legacyoutput/plugin.js create mode 100644 src/main/resources/static/layui-ext/tinymce/tinymce/plugins/legacyoutput/plugin.min.js create mode 100644 src/main/resources/static/layui-ext/tinymce/tinymce/plugins/link/plugin.js create mode 100644 src/main/resources/static/layui-ext/tinymce/tinymce/plugins/link/plugin.min.js create mode 100644 src/main/resources/static/layui-ext/tinymce/tinymce/plugins/lists/plugin.js create mode 100644 src/main/resources/static/layui-ext/tinymce/tinymce/plugins/lists/plugin.min.js create mode 100644 src/main/resources/static/layui-ext/tinymce/tinymce/plugins/media/plugin.js create mode 100644 src/main/resources/static/layui-ext/tinymce/tinymce/plugins/media/plugin.min.js create mode 100644 src/main/resources/static/layui-ext/tinymce/tinymce/plugins/nonbreaking/plugin.js create mode 100644 src/main/resources/static/layui-ext/tinymce/tinymce/plugins/nonbreaking/plugin.min.js create mode 100644 src/main/resources/static/layui-ext/tinymce/tinymce/plugins/noneditable/plugin.js create mode 100644 src/main/resources/static/layui-ext/tinymce/tinymce/plugins/noneditable/plugin.min.js create mode 100644 src/main/resources/static/layui-ext/tinymce/tinymce/plugins/pagebreak/plugin.js create mode 100644 src/main/resources/static/layui-ext/tinymce/tinymce/plugins/pagebreak/plugin.min.js create mode 100644 src/main/resources/static/layui-ext/tinymce/tinymce/plugins/paste/plugin.js create mode 100644 src/main/resources/static/layui-ext/tinymce/tinymce/plugins/paste/plugin.min.js create mode 100644 src/main/resources/static/layui-ext/tinymce/tinymce/plugins/preview/plugin.js create mode 100644 src/main/resources/static/layui-ext/tinymce/tinymce/plugins/preview/plugin.min.js create mode 100644 src/main/resources/static/layui-ext/tinymce/tinymce/plugins/print/plugin.js create mode 100644 src/main/resources/static/layui-ext/tinymce/tinymce/plugins/print/plugin.min.js create mode 100644 src/main/resources/static/layui-ext/tinymce/tinymce/plugins/quickbars/plugin.js create mode 100644 src/main/resources/static/layui-ext/tinymce/tinymce/plugins/quickbars/plugin.min.js create mode 100644 src/main/resources/static/layui-ext/tinymce/tinymce/plugins/save/plugin.js create mode 100644 src/main/resources/static/layui-ext/tinymce/tinymce/plugins/save/plugin.min.js create mode 100644 src/main/resources/static/layui-ext/tinymce/tinymce/plugins/searchreplace/plugin.js create mode 100644 src/main/resources/static/layui-ext/tinymce/tinymce/plugins/searchreplace/plugin.min.js create mode 100644 src/main/resources/static/layui-ext/tinymce/tinymce/plugins/spellchecker/plugin.js create mode 100644 src/main/resources/static/layui-ext/tinymce/tinymce/plugins/spellchecker/plugin.min.js create mode 100644 src/main/resources/static/layui-ext/tinymce/tinymce/plugins/tabfocus/plugin.js create mode 100644 src/main/resources/static/layui-ext/tinymce/tinymce/plugins/tabfocus/plugin.min.js create mode 100644 src/main/resources/static/layui-ext/tinymce/tinymce/plugins/table/plugin.js create mode 100644 src/main/resources/static/layui-ext/tinymce/tinymce/plugins/table/plugin.min.js create mode 100644 src/main/resources/static/layui-ext/tinymce/tinymce/plugins/template/plugin.js create mode 100644 src/main/resources/static/layui-ext/tinymce/tinymce/plugins/template/plugin.min.js create mode 100644 src/main/resources/static/layui-ext/tinymce/tinymce/plugins/textcolor/plugin.js create mode 100644 src/main/resources/static/layui-ext/tinymce/tinymce/plugins/textcolor/plugin.min.js create mode 100644 src/main/resources/static/layui-ext/tinymce/tinymce/plugins/textpattern/plugin.js create mode 100644 src/main/resources/static/layui-ext/tinymce/tinymce/plugins/textpattern/plugin.min.js create mode 100644 src/main/resources/static/layui-ext/tinymce/tinymce/plugins/toc/plugin.js create mode 100644 src/main/resources/static/layui-ext/tinymce/tinymce/plugins/toc/plugin.min.js create mode 100644 src/main/resources/static/layui-ext/tinymce/tinymce/plugins/visualblocks/plugin.js create mode 100644 src/main/resources/static/layui-ext/tinymce/tinymce/plugins/visualblocks/plugin.min.js create mode 100644 src/main/resources/static/layui-ext/tinymce/tinymce/plugins/visualchars/plugin.js create mode 100644 src/main/resources/static/layui-ext/tinymce/tinymce/plugins/visualchars/plugin.min.js create mode 100644 src/main/resources/static/layui-ext/tinymce/tinymce/plugins/wordcount/plugin.js create mode 100644 src/main/resources/static/layui-ext/tinymce/tinymce/plugins/wordcount/plugin.min.js create mode 100644 src/main/resources/static/layui-ext/tinymce/tinymce/skins/content/dark/content.min.css create mode 100644 src/main/resources/static/layui-ext/tinymce/tinymce/skins/content/default/content.min.css create mode 100644 src/main/resources/static/layui-ext/tinymce/tinymce/skins/content/document/content.min.css create mode 100644 src/main/resources/static/layui-ext/tinymce/tinymce/skins/content/writer/content.min.css create mode 100644 src/main/resources/static/layui-ext/tinymce/tinymce/skins/ui/oxide-dark/content.inline.min.css create mode 100644 src/main/resources/static/layui-ext/tinymce/tinymce/skins/ui/oxide-dark/content.min.css create mode 100644 src/main/resources/static/layui-ext/tinymce/tinymce/skins/ui/oxide-dark/content.mobile.min.css create mode 100644 src/main/resources/static/layui-ext/tinymce/tinymce/skins/ui/oxide-dark/fonts/tinymce-mobile.woff create mode 100644 src/main/resources/static/layui-ext/tinymce/tinymce/skins/ui/oxide-dark/skin.min.css create mode 100644 src/main/resources/static/layui-ext/tinymce/tinymce/skins/ui/oxide-dark/skin.mobile.min.css create mode 100644 src/main/resources/static/layui-ext/tinymce/tinymce/skins/ui/oxide/content.inline.min.css create mode 100644 src/main/resources/static/layui-ext/tinymce/tinymce/skins/ui/oxide/content.min.css create mode 100644 src/main/resources/static/layui-ext/tinymce/tinymce/skins/ui/oxide/content.mobile.min.css create mode 100644 src/main/resources/static/layui-ext/tinymce/tinymce/skins/ui/oxide/fonts/tinymce-mobile.woff create mode 100644 src/main/resources/static/layui-ext/tinymce/tinymce/skins/ui/oxide/skin.min.css create mode 100644 src/main/resources/static/layui-ext/tinymce/tinymce/skins/ui/oxide/skin.mobile.min.css create mode 100644 src/main/resources/static/layui-ext/tinymce/tinymce/themes/mobile/theme.min.js create mode 100644 src/main/resources/static/layui-ext/tinymce/tinymce/themes/silver/theme.min.js create mode 100644 src/main/resources/static/layui-ext/tinymce/tinymce/tinymce.min.js create mode 100644 src/main/resources/static/layui-ext/treetable-lay/treetable.css create mode 100644 src/main/resources/static/layui-ext/treetable-lay/treetable.js create mode 100644 src/main/resources/static/layui/css/layui.css create mode 100644 src/main/resources/static/layui/css/layui.mobile.css create mode 100644 src/main/resources/static/layui/css/modules/code.css create mode 100644 src/main/resources/static/layui/css/modules/laydate/default/laydate.css create mode 100644 src/main/resources/static/layui/css/modules/layer/default/icon-ext.png create mode 100644 src/main/resources/static/layui/css/modules/layer/default/icon.png create mode 100644 src/main/resources/static/layui/css/modules/layer/default/layer.css create mode 100644 src/main/resources/static/layui/css/modules/layer/default/loading-0.gif create mode 100644 src/main/resources/static/layui/css/modules/layer/default/loading-1.gif create mode 100644 src/main/resources/static/layui/css/modules/layer/default/loading-2.gif create mode 100644 src/main/resources/static/layui/font/iconfont.eot create mode 100644 src/main/resources/static/layui/font/iconfont.svg create mode 100644 src/main/resources/static/layui/font/iconfont.ttf create mode 100644 src/main/resources/static/layui/font/iconfont.woff create mode 100644 src/main/resources/static/layui/font/iconfont.woff2 create mode 100644 src/main/resources/static/layui/images/face/0.gif create mode 100644 src/main/resources/static/layui/images/face/1.gif create mode 100644 src/main/resources/static/layui/images/face/10.gif create mode 100644 src/main/resources/static/layui/images/face/11.gif create mode 100644 src/main/resources/static/layui/images/face/12.gif create mode 100644 src/main/resources/static/layui/images/face/13.gif create mode 100644 src/main/resources/static/layui/images/face/14.gif create mode 100644 src/main/resources/static/layui/images/face/15.gif create mode 100644 src/main/resources/static/layui/images/face/16.gif create mode 100644 src/main/resources/static/layui/images/face/17.gif create mode 100644 src/main/resources/static/layui/images/face/18.gif create mode 100644 src/main/resources/static/layui/images/face/19.gif create mode 100644 src/main/resources/static/layui/images/face/2.gif create mode 100644 src/main/resources/static/layui/images/face/20.gif create mode 100644 src/main/resources/static/layui/images/face/21.gif create mode 100644 src/main/resources/static/layui/images/face/22.gif create mode 100644 src/main/resources/static/layui/images/face/23.gif create mode 100644 src/main/resources/static/layui/images/face/24.gif create mode 100644 src/main/resources/static/layui/images/face/25.gif create mode 100644 src/main/resources/static/layui/images/face/26.gif create mode 100644 src/main/resources/static/layui/images/face/27.gif create mode 100644 src/main/resources/static/layui/images/face/28.gif create mode 100644 src/main/resources/static/layui/images/face/29.gif create mode 100644 src/main/resources/static/layui/images/face/3.gif create mode 100644 src/main/resources/static/layui/images/face/30.gif create mode 100644 src/main/resources/static/layui/images/face/31.gif create mode 100644 src/main/resources/static/layui/images/face/32.gif create mode 100644 src/main/resources/static/layui/images/face/33.gif create mode 100644 src/main/resources/static/layui/images/face/34.gif create mode 100644 src/main/resources/static/layui/images/face/35.gif create mode 100644 src/main/resources/static/layui/images/face/36.gif create mode 100644 src/main/resources/static/layui/images/face/37.gif create mode 100644 src/main/resources/static/layui/images/face/38.gif create mode 100644 src/main/resources/static/layui/images/face/39.gif create mode 100644 src/main/resources/static/layui/images/face/4.gif create mode 100644 src/main/resources/static/layui/images/face/40.gif create mode 100644 src/main/resources/static/layui/images/face/41.gif create mode 100644 src/main/resources/static/layui/images/face/42.gif create mode 100644 src/main/resources/static/layui/images/face/43.gif create mode 100644 src/main/resources/static/layui/images/face/44.gif create mode 100644 src/main/resources/static/layui/images/face/45.gif create mode 100644 src/main/resources/static/layui/images/face/46.gif create mode 100644 src/main/resources/static/layui/images/face/47.gif create mode 100644 src/main/resources/static/layui/images/face/48.gif create mode 100644 src/main/resources/static/layui/images/face/49.gif create mode 100644 src/main/resources/static/layui/images/face/5.gif create mode 100644 src/main/resources/static/layui/images/face/50.gif create mode 100644 src/main/resources/static/layui/images/face/51.gif create mode 100644 src/main/resources/static/layui/images/face/52.gif create mode 100644 src/main/resources/static/layui/images/face/53.gif create mode 100644 src/main/resources/static/layui/images/face/54.gif create mode 100644 src/main/resources/static/layui/images/face/55.gif create mode 100644 src/main/resources/static/layui/images/face/56.gif create mode 100644 src/main/resources/static/layui/images/face/57.gif create mode 100644 src/main/resources/static/layui/images/face/58.gif create mode 100644 src/main/resources/static/layui/images/face/59.gif create mode 100644 src/main/resources/static/layui/images/face/6.gif create mode 100644 src/main/resources/static/layui/images/face/60.gif create mode 100644 src/main/resources/static/layui/images/face/61.gif create mode 100644 src/main/resources/static/layui/images/face/62.gif create mode 100644 src/main/resources/static/layui/images/face/63.gif create mode 100644 src/main/resources/static/layui/images/face/64.gif create mode 100644 src/main/resources/static/layui/images/face/65.gif create mode 100644 src/main/resources/static/layui/images/face/66.gif create mode 100644 src/main/resources/static/layui/images/face/67.gif create mode 100644 src/main/resources/static/layui/images/face/68.gif create mode 100644 src/main/resources/static/layui/images/face/69.gif create mode 100644 src/main/resources/static/layui/images/face/7.gif create mode 100644 src/main/resources/static/layui/images/face/70.gif create mode 100644 src/main/resources/static/layui/images/face/71.gif create mode 100644 src/main/resources/static/layui/images/face/8.gif create mode 100644 src/main/resources/static/layui/images/face/9.gif create mode 100644 src/main/resources/static/layui/lay/modules/carousel.js create mode 100644 src/main/resources/static/layui/lay/modules/code.js create mode 100644 src/main/resources/static/layui/lay/modules/colorpicker.js create mode 100644 src/main/resources/static/layui/lay/modules/element.js create mode 100644 src/main/resources/static/layui/lay/modules/flow.js create mode 100644 src/main/resources/static/layui/lay/modules/form.js create mode 100644 src/main/resources/static/layui/lay/modules/jquery.js create mode 100644 src/main/resources/static/layui/lay/modules/laydate.js create mode 100644 src/main/resources/static/layui/lay/modules/layedit.js create mode 100644 src/main/resources/static/layui/lay/modules/layer.js create mode 100644 src/main/resources/static/layui/lay/modules/laypage.js create mode 100644 src/main/resources/static/layui/lay/modules/laytpl.js create mode 100644 src/main/resources/static/layui/lay/modules/mobile.js create mode 100644 src/main/resources/static/layui/lay/modules/rate.js create mode 100644 src/main/resources/static/layui/lay/modules/slider.js create mode 100644 src/main/resources/static/layui/lay/modules/table.js create mode 100644 src/main/resources/static/layui/lay/modules/transfer.js create mode 100644 src/main/resources/static/layui/lay/modules/tree.js create mode 100644 src/main/resources/static/layui/lay/modules/upload.js create mode 100644 src/main/resources/static/layui/lay/modules/util.js create mode 100644 src/main/resources/static/layui/layui.js create mode 100644 src/main/resources/template/Controller.java.vm create mode 100644 src/main/resources/template/Dao.java.vm create mode 100644 src/main/resources/template/Dao.xml.vm create mode 100644 src/main/resources/template/Entity.java.vm create mode 100644 src/main/resources/template/Service.java.vm create mode 100644 src/main/resources/template/ServiceImpl.java.vm create mode 100644 src/main/resources/template/list.html.vm create mode 100644 src/main/resources/template/menu.sql.vm create mode 100644 src/main/resources/templates/about.html create mode 100644 src/main/resources/templates/build.html create mode 100644 src/main/resources/templates/depts/dept_list.html create mode 100644 src/main/resources/templates/error/403.html create mode 100644 src/main/resources/templates/error/404.html create mode 100644 src/main/resources/templates/error/500.html create mode 100644 src/main/resources/templates/generator/list.html create mode 100644 src/main/resources/templates/home.html create mode 100644 src/main/resources/templates/layout.html create mode 100644 src/main/resources/templates/login.html create mode 100644 src/main/resources/templates/login2.html create mode 100644 src/main/resources/templates/main.html create mode 100644 src/main/resources/templates/menus/menu_list.html create mode 100644 src/main/resources/templates/roles/role_list.html create mode 100644 src/main/resources/templates/syscontent/list.html create mode 100644 src/main/resources/templates/sysdict/list.html create mode 100644 src/main/resources/templates/sysfiles/list.html create mode 100644 src/main/resources/templates/users/update_password.html create mode 100644 src/main/resources/templates/users/user_edit.html create mode 100644 src/main/resources/templates/users/user_list.html diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..a1e43ea --- /dev/null +++ b/Dockerfile @@ -0,0 +1,13 @@ +# 基础镜像 +FROM registry.cn-hangzhou.aliyuncs.com/wb_public/openjdk:8-jre +# author +MAINTAINER manager +# 复制jar文件到路径 +ADD ./target/manager.jar ./ +# 时间 +RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime +RUN echo 'Asia/Shanghai' >/etc/timezone +# 启动服务 +ENTRYPOINT ["java","-jar","/manager.jar"] +# 暴露端口 +EXPOSE 8080 diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..8eadaac --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2020 xian.zi.ming@qq.com fuck.vip + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..fe7d69c --- /dev/null +++ b/README.md @@ -0,0 +1,122 @@ +# solon-manager + +## 介绍 +基于Solon + Mybatis Plus + SaToken + Thymeleaf + Layui的后台管理系统 +接入Sa-Token,支持菜单权限 +数据库支持 MySQL、Oracle、sqlServer 等主流数据库 +提供代码生成器,基本增删改查无需编写,可快速完成开发任务。 +后台接口RESTful 风格,支持前后端分离,可与app公用一套接口。 +开发最精简,可当脚手架,适合你来 DIY +**如果喜欢,防止您迷路, 请尽快Star项目。多了您的支持,更多了一份动力!感谢~** + +## 特征 +- 后台接口RESTful 风格,支持前后端分离,可与app公用一套接口 +- 采用RBAC的权限控制 +- 统一响应结果封装及生成工具 统一异常处理 +- 拥抱Sa-Token 实现角色权限认证,让鉴权变得简单、优雅! +- 使用 Solon 集成Druid数据库连接池与监控 +- 集成MyBatis-Plus,实现单表业务零SQL +- 集成国人风格的knife4j,自动生成接口文档 +- 提供代码生成器(MySQL、Oracle、sqlServer等主流数据库),生成从Html到Mapper,爽歪歪 + +## 代码仓库 最新请移步gitee, github定期同步 +Gitee地址:[https://gitee.com/uidoer/solon-manager](https://gitee.com/uidoer/solon-manager) + + +## 开发文档&项目演示 +- 开发文档:[开发文档wiki](https://gitee.com/uidoer/solon-manager/wikis/pages) +- 演示地址:[solon-manager](http://1.94.23.145:9000/login) +- **账号密码:admin/123456** + + +## 代码结构 +``` +├─main +│ ├─java +│ │ └─vip +│ │ └─fuck +│ │ └─sm +│ │ ├─CompanyProjectApplication.java 项目启动类 +│ │ ├─common 公共资源,如注解、切面、全局异常处理、组件集成、通用工具类等 +│ │ ├─controller Controler层 +│ │ ├─entity 实体类 +│ │ ├─mapper DAO层 +│ │ ├─service Service层 +│ │ │ └─impl Service层实现 +│ └─resources +│ ├── app-dev.yml 开发环境配置文件 +│ ├── app-test.yml 测试环境配置文件 +│ ├── app-prod.yml 生产环境配置文件 +│ ├── app.yml 通用配置文件 +│ ├─mapper Mybatis XML文件 +│ ├─static 静态文件 +│ │ ├─css 通用css文件 +│ │ ├─images 静态图片 +│ │ ├─js 通用js文件 +│ │ ├─layui layui库 +│ │ └─layui-ext layui插件库 +│ ├─template 代码生成模版 +│ └─templates 项目页面目录 +│ ├─depts 部门管理 +│ ├─error 错误页面 +│ ├─generator 代码生成管理 +│ ├─logs 日志管理 +│ ├─menus 菜单管理 +│ ├─roles 角色管理 +│ ├─syscontent 内容管理 +│ ├─sysdict 字典管理 +│ ├─sysfiles 文件管理 +│ └─users 用户管理 +└─test + └─java + └─vip + └─fuck + └─sm 单元测试 +``` + +## 开发建议 +- Model内成员变量建议与表字段数量对应,如需扩展成员变量(比如连表查询)建议创建VO,否则需在扩展的成员变量上加@TableField(exist = false) +- 建议业务失败直接使用throw new BusinessException("ErrorMessage")抛出,由统一异常处理器来封装业务失败的响应结果,会直接被封装为{"code":500002,"message":"ErrorMessage"}返回,尽情抛出; +- 数据库基础字段:id(bigint)、remark(varchar)、unable_flag(tinyint)、deleted(tinyint)、create_id(bigint)、update_id(bigint)、create_time(datetime)、update_time(datetime) + +## 使用说明 +- 使用IDE导入本项目,IDE需要安装lombok插件 +- 创建数据库, 如mysql数据库导入mysql.sql +- 配置application-dev.yml中的数据库连接 +- 运行项目 + 1. 直接运行CompanyProjectApplication.java + 2. 项目根目录下执行mvn -X clean package -Dmaven.test.skip=true编译打包,然后执行java -jar manager.jar +- 登录地址 http://localhost:8080/index/login 用户名密码:admin/123456 +- 代码生成使用 + 1. 逻辑删除字段,请统一用deleted字段: 0未删 1已删; 主键请统一格式: `id` varchar(50) 类型; 列名请勿使用数据库关键字 + 2. application.yml中配置: 使用代码生成模块时 指定要生成的表存在于哪种数据库。project.database=mysql + 3. 点击[代码生成]菜单,生成一个或多个表的代码,下载到本地 + 4. 解压下载的代码,直接复制main文件夹到本地项目的src目录下 + 5. 数据库执行sql,生成菜单 + 6. admin 刷新页面即刻查看 + +## 技术文档 +* 核心框架:[Solon](https://spring.io/projects/spring-boot) +* 持久层框架:[MyBatis-Plus](https://mybatis.plus) +* 权限认证:[Sa-Token](https://sa-token.cc/doc.html#/) +* 前端框架: [Layui](https://layui.dev/docs/2/) +* 数据库连接池:[Alibaba Druid](https://github.com/alibaba/druid/) +* 模板引擎:[Thymeleaf](https://www.thymeleaf.org/) +* 阿里巴巴Java开发手册[最新版下载](https://github.com/alibaba/p3c) + +## 参与贡献 +1. Fork 本项目 +2. 新建 feature_xxx 分支 +3. 提交代码 +4. 提交 Pull Request + +## **效果图** + + +### 捐赠 +> 项目的发展离不开您的支持, 如果您够宽裕,请作者喝杯咖啡吧! + +### 交流群 +> 如果大家有疑难杂症,技术交流, 可以加我拉你们进群, 务必备注: 开源 +微信: www_fuck_vip + diff --git a/doc/mysql.sql b/doc/mysql.sql new file mode 100644 index 0000000..71650ea --- /dev/null +++ b/doc/mysql.sql @@ -0,0 +1,311 @@ +-- 部门 +DROP TABLE IF EXISTS sys_dept; +CREATE TABLE sys_dept ( + id varchar(64) NOT NULL COMMENT '主键', + dept_no varchar(18) DEFAULT NULL COMMENT '部门编号(规则:父级关系编码+自己的编码)', + name varchar(300) DEFAULT NULL COMMENT '部门名称', + pid varchar(64) NOT NULL COMMENT '父级id', + status tinyint(4) COMMENT '状态(1:正常;0:弃用)', + relation_code varchar(3000) DEFAULT NULL COMMENT '为了维护更深层级关系', + dept_manager_id varchar(64) DEFAULT NULL COMMENT '部门经理user_id', + manager_name varchar(255) DEFAULT NULL COMMENT '部门经理名称', + phone varchar(20) DEFAULT NULL COMMENT '部门经理联系电话', + create_time datetime DEFAULT NULL COMMENT '创建时间', + update_time datetime DEFAULT NULL COMMENT '更新时间', + deleted tinyint(4) COMMENT '是否删除(1未删除;0已删除)', + PRIMARY KEY (id) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='系统部门'; + +-- 系统日志 +DROP TABLE IF EXISTS sys_log; +CREATE TABLE sys_log ( + id varchar(64) NOT NULL, + user_id varchar(64) DEFAULT NULL COMMENT '用户id', + username varchar(50) DEFAULT NULL COMMENT '用户名', + operation varchar(50) DEFAULT NULL COMMENT '用户操作', + time int(11) DEFAULT NULL COMMENT '响应时间', + method varchar(200) DEFAULT NULL COMMENT '请求方法', + params varchar(5000) DEFAULT NULL COMMENT '请求参数', + ip varchar(64) DEFAULT NULL COMMENT 'IP地址', + create_time datetime DEFAULT NULL COMMENT '创建时间', + PRIMARY KEY (id) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='系统日志'; + +-- 菜单权限 +DROP TABLE IF EXISTS sys_permission; +CREATE TABLE sys_permission ( + id varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '主键', + name varchar(300) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '菜单权限名称', + perms varchar(500) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '授权(多个用逗号分隔,如:sys:user:add,sys:user:edit)', + icon varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '图标', + url varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '访问地址URL', + target varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT 'a target属性:_self _blank', + pid varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '父级菜单权限名称', + order_num int(11) NULL COMMENT '排序', + type tinyint(4) NULL DEFAULT NULL COMMENT '菜单权限类型(1:目录;2:菜单;3:按钮)', + status tinyint(4) NULL COMMENT '状态1:正常 0:禁用', + create_time datetime NULL DEFAULT NULL COMMENT '创建时间', + update_time datetime NULL DEFAULT NULL COMMENT '更新时间', + deleted tinyint(4) NULL COMMENT '是否删除(1未删除;0已删除)', + PRIMARY KEY (id) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '系统权限' ROW_FORMAT = Compact; + +-- 角色 +DROP TABLE IF EXISTS sys_role; +CREATE TABLE sys_role ( + id varchar(64) NOT NULL COMMENT '主键', + name varchar(255) DEFAULT NULL COMMENT '角色名称', + description varchar(300) DEFAULT NULL, + status tinyint(4) COMMENT '状态(1:正常0:弃用)', + create_time datetime DEFAULT NULL COMMENT '创建时间', + update_time datetime DEFAULT NULL COMMENT '更新时间', + deleted tinyint(4) COMMENT '是否删除(1未删除;0已删除)', + data_scope int COMMENT '数据范围(1:所有 2:自定义 3: 本部门及以下部门 4:仅本部门 5:自己)', + PRIMARY KEY (id) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='系统角色'; + +-- 角色部门 +DROP TABLE IF EXISTS sys_role_dept; +CREATE TABLE sys_role_dept ( + id varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '主键', + role_id varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '角色id', + dept_id varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '部门id', + create_time datetime NULL DEFAULT NULL COMMENT '创建时间', + PRIMARY KEY (id) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '角色部门' ROW_FORMAT = Compact; + +SET FOREIGN_KEY_CHECKS = 1; + + +-- 角色权限关联 +DROP TABLE IF EXISTS sys_role_permission; +CREATE TABLE sys_role_permission ( + id varchar(64) NOT NULL COMMENT '主键', + role_id varchar(64) DEFAULT NULL COMMENT '角色id', + permission_id varchar(64) DEFAULT NULL COMMENT '菜单权限id', + create_time datetime DEFAULT NULL COMMENT '创建时间', + PRIMARY KEY (id) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- 用户表 +DROP TABLE IF EXISTS sys_user; +CREATE TABLE sys_user ( + id varchar(64) NOT NULL COMMENT '用户id', + username varchar(50) NOT NULL COMMENT '账户名称', + salt varchar(20) DEFAULT NULL COMMENT '加密盐值', + password varchar(200) NOT NULL COMMENT '用户密码密文', + phone varchar(20) DEFAULT NULL COMMENT '手机号码', + dept_id varchar(64) DEFAULT NULL COMMENT '部门id', + real_name varchar(60) DEFAULT NULL COMMENT '真实名称', + nick_name varchar(60) DEFAULT NULL COMMENT '昵称', + email varchar(50) DEFAULT NULL COMMENT '邮箱(唯一)', + status tinyint(4) COMMENT '账户状态(1.正常 0.锁定 )', + sex tinyint(4) COMMENT '性别(1.男 2.女)', + deleted tinyint(4) COMMENT '是否删除(1未删除;0已删除)', + create_id varchar(64) DEFAULT NULL COMMENT '创建人', + update_id varchar(64) DEFAULT NULL COMMENT '更新人', + create_where tinyint(4) COMMENT '创建来源(1.web 2.android 3.ios )', + create_time datetime DEFAULT NULL COMMENT '创建时间', + update_time datetime DEFAULT NULL, + PRIMARY KEY (id) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='系统用户'; + +-- 用户角色关联表 +DROP TABLE IF EXISTS sys_user_role; +CREATE TABLE sys_user_role ( + id varchar(64) NOT NULL COMMENT '用户id', + user_id varchar(64) DEFAULT NULL, + role_id varchar(64) DEFAULT NULL COMMENT '角色id', + create_time datetime DEFAULT NULL COMMENT '创建时间', + PRIMARY KEY (id) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='系统用户角色'; + +-- 数据字典表 +DROP TABLE IF EXISTS sys_dict; +CREATE TABLE sys_dict ( + id varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + name varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '字典名称', + remark varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '描述', + create_time datetime NULL DEFAULT NULL COMMENT '创建时间', + PRIMARY KEY (id) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '数据字典表' ROW_FORMAT = Compact; + +SET FOREIGN_KEY_CHECKS = 1; + + + +-- 数据字典详情 +DROP TABLE IF EXISTS sys_dict_detail; +CREATE TABLE sys_dict_detail ( + id varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + label varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '字典标签', + value varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '字典值', + sort smallint(6) NULL DEFAULT NULL COMMENT '排序', + dict_id varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '字典id', + create_time datetime NULL DEFAULT NULL COMMENT '创建日期', + PRIMARY KEY (id) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '数据字典详情' ROW_FORMAT = Compact; + +SET FOREIGN_KEY_CHECKS = 1; + + +-- 2020.5.27添加文章管理 +DROP TABLE IF EXISTS sys_content; +CREATE TABLE sys_content ( + id varchar(50) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT '主键', + title varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT '标题', + one_img varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT '单图url', + multiple_img varchar(500) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT '多图url', + keywords varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT '关键字', + type int(11) DEFAULT NULL COMMENT '文章类型', + content longtext CHARACTER SET utf8 COLLATE utf8_bin NULL COMMENT '内容', + create_time datetime NULL DEFAULT NULL COMMENT '创建时间', + create_id varchar(50) NULL DEFAULT NULL COMMENT '创建人', + PRIMARY KEY (id) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_bin COMMENT = '文章管理' ROW_FORMAT = Compact; + +-- 2020.6.15添加文件管理 +DROP TABLE IF EXISTS sys_files; +CREATE TABLE sys_files ( + id varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + url varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT 'URL地址', + create_date datetime NULL DEFAULT NULL COMMENT '创建时间', + file_name varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '文件名称', + file_path varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + PRIMARY KEY (id) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '文件上传' ROW_FORMAT = Compact; + + +-- 初始数据 +INSERT INTO sys_dept(id, dept_no, name, pid, status, relation_code, dept_manager_id, manager_name, phone, deleted) VALUES ('1', 'D000001', '总公司', '0', 1, 'D000001', NULL, '小李', '13888888888', 1); +INSERT INTO sys_permission VALUES ('1', '删除', 'sysGenerator:delete', NULL, 'sysGenerator/delete', NULL, '15', 1, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1); +INSERT INTO sys_permission VALUES ('10', '赋予角色', 'sys:user:role:update', NULL, 'sys/user/roles/*', NULL, '24', 100, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1); +INSERT INTO sys_permission VALUES ('11', '菜单权限管理', NULL, NULL, 'index/menus', '_self', '51', 98, 2, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1); +INSERT INTO sys_permission VALUES ('12', '列表', 'sys:dept:list', NULL, 'sys/depts', NULL, '41', 100, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1); +INSERT INTO sys_permission VALUES ('13', '删除', 'sys:role:deleted', NULL, 'sys/role/*', NULL, '53', 100, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1); +INSERT INTO sys_permission VALUES ('1311115974068449281', '数据权限', 'sys:role:bindDept', '', 'sys/role/bindDept', '_self', '53', 5, 3, 1, '2020-09-30 09:29:42', NULL, 1); +INSERT INTO sys_permission VALUES ('15', '代码生成', NULL, NULL, 'index/sysGenerator', '_self', '54', 1, 2, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1); +INSERT INTO sys_permission VALUES ('16', '列表', 'sysGenerator:list', NULL, 'sysGenerator/listByPage', NULL, '15', 1, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1); +INSERT INTO sys_permission VALUES ('17', '详情', 'sys:permission:detail', NULL, 'sys/permission/*', NULL, '11', 100, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1); +INSERT INTO sys_permission VALUES ('19', '列表', 'sys:role:list', NULL, 'sys/roles', NULL, '53', 0, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1); +INSERT INTO sys_permission VALUES ('2', 'SQL 监控', '', '', 'druid/sql.html', '_self', '21', 98, 2, 1, '2020-03-19 13:29:40', '2020-05-07 13:36:59', 1); +INSERT INTO sys_permission VALUES ('20', '修改', 'sysGenerator:update', NULL, 'sysGenerator/update', NULL, '15', 1, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1); +INSERT INTO sys_permission VALUES ('21', '其他', NULL, 'layui-icon-list', NULL, NULL, '0', 200, 1, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1); +INSERT INTO sys_permission VALUES ('22', '详情', 'sys:dept:detail', NULL, 'sys/dept/*', NULL, '41', 100, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1); +INSERT INTO sys_permission VALUES ('23', '列表', 'sys:user:list', NULL, 'sys/users', NULL, '24', 100, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1); +INSERT INTO sys_permission VALUES ('24', '用户管理', NULL, NULL, 'index/users', '_self', '51', 100, 2, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1); +INSERT INTO sys_permission VALUES ('25', '详情', 'sys:user:detail', NULL, 'sys/user/*', NULL, '24', 100, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1); +INSERT INTO sys_permission VALUES ('26', '删除', 'sys:permission:deleted', NULL, 'sys/permission/*', NULL, '11', 100, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1); +INSERT INTO sys_permission VALUES ('27', '文件管理', '', '', 'index/sysFiles', '_self', '54', 10, 2, 1, NULL, '2020-06-15 16:00:29', 1); +INSERT INTO sys_permission VALUES ('28', '列表', 'sysFiles:list', NULL, 'sysFiles/listByPage', NULL, '27', 0, 3, 1, NULL, NULL, 1); +INSERT INTO sys_permission VALUES ('29', '新增', 'sysFiles:add', NULL, 'sysFiles/add', NULL, '27', 0, 3, 1, NULL, NULL, 1); +INSERT INTO sys_permission VALUES ('3', '新增', 'sys:role:add', NULL, 'sys/role', NULL, '53', 0, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1); +INSERT INTO sys_permission VALUES ('30', '删除', 'sysFiles:delete', NULL, 'sysFiles/delete', NULL, '27', 0, 3, 1, NULL, NULL, 1); +INSERT INTO sys_permission VALUES ('31', '文章管理', NULL, NULL, 'index/sysContent', '_self', '54', 10, 2, 1, NULL, NULL, 1); +INSERT INTO sys_permission VALUES ('32', '列表', 'sysContent:list', NULL, 'sysContent/listByPage', NULL, '31', 0, 3, 1, NULL, NULL, 1); +INSERT INTO sys_permission VALUES ('33', '新增', 'sysContent:add', NULL, 'sysContent/add', NULL, '31', 0, 3, 1, NULL, NULL, 1); +INSERT INTO sys_permission VALUES ('34', '修改', 'sysContent:update', NULL, 'sysContent/update', NULL, '31', 0, 3, 1, NULL, NULL, 1); +INSERT INTO sys_permission VALUES ('35', '删除', 'sysContent:delete', NULL, 'sysContent/delete', NULL, '31', 0, 3, 1, NULL, NULL, 1); +INSERT INTO sys_permission VALUES ('36', '更新', 'sys:role:update', NULL, 'sys/role', NULL, '53', 0, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1); +INSERT INTO sys_permission VALUES ('38', '更新', 'sys:dept:update', NULL, 'sys/dept', NULL, '41', 100, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1); +INSERT INTO sys_permission VALUES ('39', '详情', 'sys:role:detail', NULL, 'sys/role/*', NULL, '53', 100, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1); +INSERT INTO sys_permission VALUES ('4', '添加', 'sysGenerator:add', NULL, 'sysGenerator/add', NULL, '15', 1, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1); +INSERT INTO sys_permission VALUES ('40', '编辑', 'sys:permission:update', NULL, 'sys/permission', NULL, '11', 100, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1); +INSERT INTO sys_permission VALUES ('41', '部门管理', NULL, NULL, 'index/depts', '_self', '51', 100, 2, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1); +INSERT INTO sys_permission VALUES ('42', '新增', 'sys:user:add', NULL, 'sys/user', NULL, '24', 100, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1); +INSERT INTO sys_permission VALUES ('43', '列表', 'sys:permission:list', NULL, 'sys/permissions', NULL, '11', 100, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1); +INSERT INTO sys_permission VALUES ('44', '新增', 'sys:permission:add', NULL, 'sys/permission', NULL, '11', 100, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1); +INSERT INTO sys_permission VALUES ('45', '字典管理', NULL, '', 'index/sysDict', NULL, '54', 10, 2, 1, NULL, NULL, 1); +INSERT INTO sys_permission VALUES ('46', '列表', 'sysDict:list', NULL, 'sysDict/listByPage', NULL, '45', 0, 3, 1, NULL, NULL, 1); +INSERT INTO sys_permission VALUES ('47', '新增', 'sysDict:add', NULL, 'sysDict/add', NULL, '45', 0, 3, 1, NULL, NULL, 1); +INSERT INTO sys_permission VALUES ('48', '修改', 'sysDict:update', NULL, 'sysDict/update', NULL, '45', 0, 3, 1, NULL, NULL, 1); +INSERT INTO sys_permission VALUES ('49', '删除', 'sysDict:delete', NULL, 'sysDict/delete', NULL, '45', 0, 3, 1, NULL, NULL, 1); +INSERT INTO sys_permission VALUES ('5', '删除', 'sys:dept:deleted', NULL, 'sys/dept/*', NULL, '41', 100, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1); +INSERT INTO sys_permission VALUES ('50', '表单构建', '', '', 'index/build', '_self', '21', 1, 2, 1, '2020-04-22 13:09:41', '2020-05-07 13:36:47', 1); +INSERT INTO sys_permission VALUES ('51', '组织管理', NULL, 'layui-icon-user', NULL, NULL, '0', 1, 1, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1); +INSERT INTO sys_permission VALUES ('52', '拥有角色', 'sys:user:role:detail', NULL, 'sys/user/roles/*', NULL, '24', 100, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1); +INSERT INTO sys_permission VALUES ('53', '角色管理', NULL, NULL, 'index/roles', '_self', '51', 99, 2, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1); +INSERT INTO sys_permission VALUES ('54', '系统管理', NULL, 'layui-icon-set-fill', NULL, NULL, '0', 98, 1, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1); +INSERT INTO sys_permission VALUES ('56', '更新', 'sys:user:update', NULL, 'sys/user', NULL, '24', 100, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1); +INSERT INTO sys_permission VALUES ('57', '删除', 'sys:user:deleted', NULL, 'sys/user', NULL, '24', 100, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1); +INSERT INTO sys_permission VALUES ('58', '删除', 'sys:log:deleted', NULL, 'sys/logs', NULL, '8', 100, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1); +INSERT INTO sys_permission VALUES ('6', '接口管理', '', '', 'doc.html', '_blank', '21', 100, 2, 1, '2020-03-19 13:29:40', '2020-05-07 13:36:02', 1); +INSERT INTO sys_permission VALUES ('7', '列表', 'sys:log:list', NULL, 'sys/logs', NULL, '8', 100, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1); +INSERT INTO sys_permission VALUES ('8', '日志管理', NULL, NULL, 'index/logs', '_self', '54', 97, 2, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1); +INSERT INTO sys_permission VALUES ('9', '新增', 'sys:dept:add', NULL, 'sys/dept', NULL, '41', 100, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1); +INSERT INTO sys_role(id, name, description, status, create_time, update_time, deleted) VALUES ('1', '超级管理员', '拥有所有权限-不能删除', 1, '2019-11-01 19:26:29', '2020-03-19 13:29:51', 1); +INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('1', '1', '1', '2020-04-22 15:48:47'); +INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('10', '1', '10', '2020-04-22 15:48:47'); +INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('11', '1', '11', '2020-04-22 15:48:47'); +INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('12', '1', '12', '2020-04-22 15:48:47'); +INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('13', '1', '13', '2020-04-22 15:48:47'); +INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('14', '1', '14', '2020-05-26 17:04:21'); +INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('15', '1', '15', '2020-04-22 15:48:47'); +INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('16', '1', '16', '2020-04-22 15:48:47'); +INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('17', '1', '17', '2020-04-22 15:48:47'); +INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('18', '1', '18', '2020-04-22 15:48:47'); +INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('19', '1', '19', '2020-04-22 15:48:47'); +INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('2', '1', '2', '2020-04-22 15:48:47'); +INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('20', '1', '20', '2020-05-26 17:04:21'); +INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('21', '1', '21', '2020-04-22 15:48:47'); +INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('22', '1', '22', '2020-04-22 15:48:47'); +INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('23', '1', '23', '2020-04-22 15:48:47'); +INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('24', '1', '24', '2020-04-22 15:48:47'); +INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('25', '1', '25', '2020-04-22 15:48:47'); +INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('26', '1', '26', '2020-04-22 15:48:47'); +INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('27', '1', '27', '2020-04-22 15:48:47'); +INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('28', '1', '28', '2020-04-22 15:48:47'); +INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('29', '1', '29', '2020-04-22 15:48:47'); +INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('3', '1', '3', '2020-04-22 15:48:47'); +INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('30', '1', '30', '2020-04-22 15:48:47'); +INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('31', '1', '31', '2020-05-26 17:04:21'); +INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('32', '1', '32', '2020-04-22 15:48:47'); +INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('33', '1', '33', '2020-04-22 15:48:47'); +INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('34', '1', '34', '2020-04-22 15:48:47'); +INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('35', '1', '35', '2020-05-26 17:04:21'); +INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('36', '1', '36', '2020-04-22 15:48:47'); +INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('38', '1', '38', '2020-04-22 15:48:47'); +INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('39', '1', '39', '2020-04-22 15:48:47'); +INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('4', '1', '4', '2020-04-22 15:48:47'); +INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('40', '1', '40', '2020-06-15 15:21:17'); +INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('41', '1', '41', '2020-06-15 15:21:17'); +INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('42', '1', '42', '2020-06-15 15:21:17'); +INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('43', '1', '43', '2020-06-15 15:21:17'); +INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('44', '1', '44', '2020-04-22 15:48:47'); +INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('45', '1', '45', '2020-04-22 15:48:47'); +INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('46', '1', '46', '2020-04-22 15:48:47'); +INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('47', '1', '47', '2020-04-22 15:48:47'); +INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('48', '1', '48', '2020-04-22 15:48:47'); +INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('49', '1', '49', '2020-04-22 15:48:47'); +INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('5', '1', '5', '2020-04-22 15:48:47'); +INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('50', '1', '50', '2020-04-22 15:48:47'); +INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('51', '1', '51', '2020-04-22 15:48:47'); +INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('52', '1', '52', '2020-04-22 15:48:47'); +INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('53', '1', '53', '2020-04-22 15:48:47'); +INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('54', '1', '54', '2020-04-22 15:48:47'); +INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('55', '1', '55', '2020-04-22 15:48:47'); +INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('56', '1', '56', '2020-05-26 17:04:21'); +INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('57', '1', '57', '2020-04-22 15:48:47'); +INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('58', '1', '58', '2020-04-22 15:48:47'); +INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('6', '1', '6', '2020-04-22 15:48:47'); +INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('60', '1', '60', '2020-04-22 15:48:47'); +INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('61', '1', '61', '2020-05-26 14:21:56'); +INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('62', '1', '62', '2020-04-22 15:48:47'); +INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('63', '1', '63', '2020-04-22 15:48:47'); +INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('7', '1', '7', '2020-04-22 15:48:47'); +INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('8', '1', '8', '2020-04-22 15:48:47'); +INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('9', '1', '9', '2020-04-22 15:48:47'); +INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('1311116066716430339', '1', '1311115974068449281', '2020-09-30 09:30:04'); + +INSERT INTO sys_user(id, username, salt, password, phone, dept_id, real_name, nick_name, email, status, sex, deleted, create_id, update_id, create_where, create_time, update_time) VALUES ('1', 'admin', '324ce32d86224b00a02b', '2102b59a75ab87616b62d0b9432569d0', '13888888888', '1', '爱糖宝', '爱糖宝', 'xxxxxx@163.com', 1, 2, 1, '1', '1', 3, '2019-09-22 19:38:05', '2020-03-18 09:15:22'); +INSERT INTO sys_user_role(id, user_id, role_id, create_time) VALUES ('1', '1', '1', '2020-03-19 02:23:13'); +INSERT INTO sys_dict(id, name, remark, create_time) VALUES ('1255790029680242690', 'sex', '性别', '2020-04-30 17:24:09'); +INSERT INTO sys_dict(id, name, remark, create_time) VALUES ('1255790029680242691', 'content_keyword', '关键字', '2020-04-30 17:24:09'); +INSERT INTO sys_dict(id, name, remark, create_time) VALUES ('1282504369620430849', 'content_type', '文章类型略略略', '2020-07-13 10:37:24'); +INSERT INTO sys_dict_detail(id, label, value, sort, dict_id, create_time) VALUES ('1255790073535885314', '男', '1', 1, '1255790029680242690', '2020-04-30 17:24:19'); +INSERT INTO sys_dict_detail(id, label, value, sort, dict_id, create_time) VALUES ('1255790100115189761', '女', '2', 2, '1255790029680242690', '2020-04-30 17:24:25'); +INSERT INTO sys_dict_detail(id, label, value, sort, dict_id, create_time) VALUES ('1282504475715350530', '诗词', '1', 1, '1282504369620430849', '2020-07-13 10:37:49'); +INSERT INTO sys_dict_detail(id, label, value, sort, dict_id, create_time) VALUES ('1282504651729317889', '散文', '2', 2, '1282504369620430849', '2020-07-13 10:38:31'); +INSERT INTO sys_dict_detail(id, label, value, sort, dict_id, create_time) VALUES ('1282846022950842369', '剧本', '3', 3, '1282504369620430849', '2020-07-14 09:15:01'); +INSERT INTO sys_dict_detail(id, label, value, sort, dict_id, create_time) VALUES ('1282846022950842370', 'java', '1', 1, '1255790029680242691', '2020-07-14 09:15:01'); +INSERT INTO sys_dict_detail(id, label, value, sort, dict_id, create_time) VALUES ('1282846022950842371', 'mysql', '2', 2, '1255790029680242691', '2020-07-14 09:15:01'); diff --git a/doc/oracle.sql b/doc/oracle.sql new file mode 100644 index 0000000..215cf8a --- /dev/null +++ b/doc/oracle.sql @@ -0,0 +1,302 @@ +-- 部门 +CREATE TABLE sys_dept ( + id varchar2(64), + dept_no varchar2(64), + name varchar2(64), + pid varchar2(64), + status NUMBER(10, 0), + relation_code varchar2(3000), + dept_manager_id varchar2(64), + manager_name varchar2(255), + phone varchar2(20), + create_time date, + update_time date, + deleted NUMBER(10, 0), + PRIMARY KEY (id) +); +COMMENT ON TABLE sys_dept IS '部门'; + +-- 日志 +CREATE TABLE sys_log ( + id varchar2(64), + user_id varchar2(64), + username varchar2(50), + operation varchar2(50), + time NUMBER(10, 0), + method varchar2(200), + params varchar2(1000), + ip varchar2(64), + create_time date, + PRIMARY KEY (id) +); +COMMENT ON TABLE sys_log IS '日志'; + +-- 菜单权限 +CREATE TABLE sys_permission ( + id varchar2(64) , + name varchar2(300), + perms varchar2(500) , + icon varchar2(255), + url varchar2(100), + target varchar2(50), + pid varchar2(64), + order_num NUMBER(10, 0), + type NUMBER(10, 0), + status NUMBER(10, 0), + create_time date, + update_time date, + deleted NUMBER(10, 0), + PRIMARY KEY (id) +); +COMMENT ON TABLE sys_permission IS '菜单权限'; + +-- 角色 +CREATE TABLE sys_role ( + id varchar2(64), + name varchar2(255), + description varchar2(255), + status NUMBER(10, 0), + create_time date, + update_time date, + deleted NUMBER(10, 0), + data_scope NUMBER(10, 0), + PRIMARY KEY (id) +); +COMMENT ON TABLE sys_role IS '角色'; + +-- 角色权限关联表 +CREATE TABLE sys_role_permission ( + id varchar2(64) , + role_id varchar2(64), + permission_id varchar2(64), + create_time date, + PRIMARY KEY (id) +); +COMMENT ON TABLE sys_role_permission IS '角色权限关联表'; + +-- 角色部门关联表 +CREATE TABLE sys_role_dept ( + id varchar2(64) , + role_id varchar2(64), + dept_id varchar2(64), + create_time date, + PRIMARY KEY (id) +); +COMMENT ON TABLE sys_role_permission IS '角色部门关联表'; + + +-- 用户 +CREATE TABLE sys_user ( + id varchar2(64), + username varchar2(50), + salt varchar2(20), + password varchar2(200), + phone varchar2(20), + dept_id varchar2(64), + real_name varchar2(60), + nick_name varchar2(60), + email varchar2(50), + status NUMBER(10, 0), + sex NUMBER(10, 0), + deleted NUMBER(10, 0), + create_id varchar2(64), + update_id varchar2(64), + create_where NUMBER(10, 0) DEFAULT 1, + create_time date, + update_time date, + PRIMARY KEY (id) +); +COMMENT ON TABLE sys_user IS '用户'; + +-- 用户角色 +CREATE TABLE sys_user_role ( + id varchar2(64), + user_id varchar2(64), + role_id varchar2(64), + create_time date, + PRIMARY KEY (id) +); +COMMENT ON TABLE sys_user_role IS '用户角色'; + + +-- 数据字典 +CREATE TABLE sys_dict ( + id varchar2(64) , + name varchar2(100) , + remark varchar2(255) , + create_time date, + PRIMARY KEY (id) +); +COMMENT ON TABLE sys_dict IS '数据字典'; + +-- 数据字典明细 +CREATE TABLE sys_dict_detail ( + id varchar2(50) , + label varchar2(255) , + value varchar2(255) , + sort NUMBER(10, 0) , + dict_id varchar2(50) , + create_time date, + PRIMARY KEY (id) +); +COMMENT ON TABLE sys_dict_detail IS '数据字典明细'; + +-- 文章管理 + CREATE TABLE sys_content ( + id varchar2(50), + title varchar2(255), + one_img varchar2(255), + multiple_img varchar2(500), + keywords varchar2(255), + type NUMBER(10, 0), + content VARCHAR2(4000) , + create_time date , + create_id varchar2(50) , + PRIMARY KEY (id) +); +COMMENT ON TABLE sys_content IS '文章管理'; + +-- 文件管理 +CREATE TABLE sys_files ( + id varchar2(50) , + url varchar2(200), + create_date date , + file_name varchar2(255), + file_path varchar2(255) , + PRIMARY KEY (id) +); +COMMENT ON TABLE sys_files IS '文件管理'; + + +-- 初始数据 +INSERT INTO sys_dept(id, dept_no, name, pid, status, relation_code, dept_manager_id, manager_name, phone, deleted) VALUES ('1', 'D000001', '总公司', '0', 1, 'D000001', NULL, '小李', '13888888888', 1); +INSERT INTO sys_permission VALUES ('1', '删除', 'sysGenerator:delete', NULL, 'sysGenerator/delete', NULL, '15', 1, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1); +INSERT INTO sys_permission VALUES ('10', '赋予角色', 'sys:user:role:update', NULL, 'sys/user/roles/*', NULL, '24', 100, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1); +INSERT INTO sys_permission VALUES ('11', '菜单权限管理', NULL, NULL, 'index/menus', '_self', '51', 98, 2, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1); +INSERT INTO sys_permission VALUES ('12', '列表', 'sys:dept:list', NULL, 'sys/depts', NULL, '41', 100, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1); +INSERT INTO sys_permission VALUES ('13', '删除', 'sys:role:deleted', NULL, 'sys/role/*', NULL, '53', 100, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1); +INSERT INTO sys_permission VALUES ('1311115974068449281', '数据权限', 'sys:role:bindDept', '', 'sys/role/bindDept', '_self', '53', 5, 3, 1, '2020-09-30 09:29:42', NULL, 1); +INSERT INTO sys_permission VALUES ('15', '代码生成', NULL, NULL, 'index/sysGenerator', '_self', '54', 1, 2, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1); +INSERT INTO sys_permission VALUES ('16', '列表', 'sysGenerator:list', NULL, 'sysGenerator/listByPage', NULL, '15', 1, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1); +INSERT INTO sys_permission VALUES ('17', '详情', 'sys:permission:detail', NULL, 'sys/permission/*', NULL, '11', 100, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1); +INSERT INTO sys_permission VALUES ('19', '列表', 'sys:role:list', NULL, 'sys/roles', NULL, '53', 0, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1); +INSERT INTO sys_permission VALUES ('2', 'SQL 监控', '', '', 'druid/sql.html', '_self', '21', 98, 2, 1, '2020-03-19 13:29:40', '2020-05-07 13:36:59', 1); +INSERT INTO sys_permission VALUES ('20', '修改', 'sysGenerator:update', NULL, 'sysGenerator/update', NULL, '15', 1, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1); +INSERT INTO sys_permission VALUES ('21', '其他', NULL, 'layui-icon-list', NULL, NULL, '0', 200, 1, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1); +INSERT INTO sys_permission VALUES ('22', '详情', 'sys:dept:detail', NULL, 'sys/dept/*', NULL, '41', 100, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1); +INSERT INTO sys_permission VALUES ('23', '列表', 'sys:user:list', NULL, 'sys/users', NULL, '24', 100, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1); +INSERT INTO sys_permission VALUES ('24', '用户管理', NULL, NULL, 'index/users', '_self', '51', 100, 2, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1); +INSERT INTO sys_permission VALUES ('25', '详情', 'sys:user:detail', NULL, 'sys/user/*', NULL, '24', 100, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1); +INSERT INTO sys_permission VALUES ('26', '删除', 'sys:permission:deleted', NULL, 'sys/permission/*', NULL, '11', 100, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1); +INSERT INTO sys_permission VALUES ('27', '文件管理', '', '', 'index/sysFiles', '_self', '54', 10, 2, 1, NULL, '2020-06-15 16:00:29', 1); +INSERT INTO sys_permission VALUES ('28', '列表', 'sysFiles:list', NULL, 'sysFiles/listByPage', NULL, '27', 0, 3, 1, NULL, NULL, 1); +INSERT INTO sys_permission VALUES ('29', '新增', 'sysFiles:add', NULL, 'sysFiles/add', NULL, '27', 0, 3, 1, NULL, NULL, 1); +INSERT INTO sys_permission VALUES ('3', '新增', 'sys:role:add', NULL, 'sys/role', NULL, '53', 0, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1); +INSERT INTO sys_permission VALUES ('30', '删除', 'sysFiles:delete', NULL, 'sysFiles/delete', NULL, '27', 0, 3, 1, NULL, NULL, 1); +INSERT INTO sys_permission VALUES ('31', '文章管理', NULL, NULL, 'index/sysContent', '_self', '54', 10, 2, 1, NULL, NULL, 1); +INSERT INTO sys_permission VALUES ('32', '列表', 'sysContent:list', NULL, 'sysContent/listByPage', NULL, '31', 0, 3, 1, NULL, NULL, 1); +INSERT INTO sys_permission VALUES ('33', '新增', 'sysContent:add', NULL, 'sysContent/add', NULL, '31', 0, 3, 1, NULL, NULL, 1); +INSERT INTO sys_permission VALUES ('34', '修改', 'sysContent:update', NULL, 'sysContent/update', NULL, '31', 0, 3, 1, NULL, NULL, 1); +INSERT INTO sys_permission VALUES ('35', '删除', 'sysContent:delete', NULL, 'sysContent/delete', NULL, '31', 0, 3, 1, NULL, NULL, 1); +INSERT INTO sys_permission VALUES ('36', '更新', 'sys:role:update', NULL, 'sys/role', NULL, '53', 0, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1); +INSERT INTO sys_permission VALUES ('38', '更新', 'sys:dept:update', NULL, 'sys/dept', NULL, '41', 100, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1); +INSERT INTO sys_permission VALUES ('39', '详情', 'sys:role:detail', NULL, 'sys/role/*', NULL, '53', 100, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1); +INSERT INTO sys_permission VALUES ('4', '添加', 'sysGenerator:add', NULL, 'sysGenerator/add', NULL, '15', 1, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1); +INSERT INTO sys_permission VALUES ('40', '编辑', 'sys:permission:update', NULL, 'sys/permission', NULL, '11', 100, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1); +INSERT INTO sys_permission VALUES ('41', '部门管理', NULL, NULL, 'index/depts', '_self', '51', 100, 2, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1); +INSERT INTO sys_permission VALUES ('42', '新增', 'sys:user:add', NULL, 'sys/user', NULL, '24', 100, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1); +INSERT INTO sys_permission VALUES ('43', '列表', 'sys:permission:list', NULL, 'sys/permissions', NULL, '11', 100, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1); +INSERT INTO sys_permission VALUES ('44', '新增', 'sys:permission:add', NULL, 'sys/permission', NULL, '11', 100, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1); +INSERT INTO sys_permission VALUES ('45', '字典管理', NULL, '', 'index/sysDict', NULL, '54', 10, 2, 1, NULL, NULL, 1); +INSERT INTO sys_permission VALUES ('46', '列表', 'sysDict:list', NULL, 'sysDict/listByPage', NULL, '45', 0, 3, 1, NULL, NULL, 1); +INSERT INTO sys_permission VALUES ('47', '新增', 'sysDict:add', NULL, 'sysDict/add', NULL, '45', 0, 3, 1, NULL, NULL, 1); +INSERT INTO sys_permission VALUES ('48', '修改', 'sysDict:update', NULL, 'sysDict/update', NULL, '45', 0, 3, 1, NULL, NULL, 1); +INSERT INTO sys_permission VALUES ('49', '删除', 'sysDict:delete', NULL, 'sysDict/delete', NULL, '45', 0, 3, 1, NULL, NULL, 1); +INSERT INTO sys_permission VALUES ('5', '删除', 'sys:dept:deleted', NULL, 'sys/dept/*', NULL, '41', 100, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1); +INSERT INTO sys_permission VALUES ('50', '表单构建', '', '', 'index/build', '_self', '21', 1, 2, 1, '2020-04-22 13:09:41', '2020-05-07 13:36:47', 1); +INSERT INTO sys_permission VALUES ('51', '组织管理', NULL, 'layui-icon-user', NULL, NULL, '0', 1, 1, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1); +INSERT INTO sys_permission VALUES ('52', '拥有角色', 'sys:user:role:detail', NULL, 'sys/user/roles/*', NULL, '24', 100, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1); +INSERT INTO sys_permission VALUES ('53', '角色管理', NULL, NULL, 'index/roles', '_self', '51', 99, 2, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1); +INSERT INTO sys_permission VALUES ('54', '系统管理', NULL, 'layui-icon-set-fill', NULL, NULL, '0', 98, 1, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1); +INSERT INTO sys_permission VALUES ('56', '更新', 'sys:user:update', NULL, 'sys/user', NULL, '24', 100, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1); +INSERT INTO sys_permission VALUES ('57', '删除', 'sys:user:deleted', NULL, 'sys/user', NULL, '24', 100, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1); +INSERT INTO sys_permission VALUES ('58', '删除', 'sys:log:deleted', NULL, 'sys/logs', NULL, '8', 100, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1); +INSERT INTO sys_permission VALUES ('6', '接口管理', '', '', 'doc.html', '_blank', '21', 100, 2, 1, '2020-03-19 13:29:40', '2020-05-07 13:36:02', 1); +INSERT INTO sys_permission VALUES ('7', '列表', 'sys:log:list', NULL, 'sys/logs', NULL, '8', 100, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1); +INSERT INTO sys_permission VALUES ('8', '日志管理', NULL, NULL, 'index/logs', '_self', '54', 97, 2, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1); +INSERT INTO sys_permission VALUES ('9', '新增', 'sys:dept:add', NULL, 'sys/dept', NULL, '41', 100, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1); +INSERT INTO sys_role(id, name, description, status, deleted) VALUES ('1', '超级管理员', '拥有所有权限-不能删除', 1, 1); +INSERT INTO sys_role_permission(id, role_id, permission_id) VALUES ('1', '1', '1'); +INSERT INTO sys_role_permission(id, role_id, permission_id) VALUES ('10', '1', '10'); +INSERT INTO sys_role_permission(id, role_id, permission_id) VALUES ('11', '1', '11'); +INSERT INTO sys_role_permission(id, role_id, permission_id) VALUES ('12', '1', '12'); +INSERT INTO sys_role_permission(id, role_id, permission_id) VALUES ('13', '1', '13'); +INSERT INTO sys_role_permission(id, role_id, permission_id) VALUES ('14', '1', '14'); +INSERT INTO sys_role_permission(id, role_id, permission_id) VALUES ('15', '1', '15'); +INSERT INTO sys_role_permission(id, role_id, permission_id) VALUES ('16', '1', '16'); +INSERT INTO sys_role_permission(id, role_id, permission_id) VALUES ('17', '1', '17'); +INSERT INTO sys_role_permission(id, role_id, permission_id) VALUES ('18', '1', '18'); +INSERT INTO sys_role_permission(id, role_id, permission_id) VALUES ('19', '1', '19'); +INSERT INTO sys_role_permission(id, role_id, permission_id) VALUES ('2', '1', '2'); +INSERT INTO sys_role_permission(id, role_id, permission_id) VALUES ('20', '1', '20'); +INSERT INTO sys_role_permission(id, role_id, permission_id) VALUES ('21', '1', '21'); +INSERT INTO sys_role_permission(id, role_id, permission_id) VALUES ('22', '1', '22'); +INSERT INTO sys_role_permission(id, role_id, permission_id) VALUES ('23', '1', '23'); +INSERT INTO sys_role_permission(id, role_id, permission_id) VALUES ('24', '1', '24'); +INSERT INTO sys_role_permission(id, role_id, permission_id) VALUES ('25', '1', '25'); +INSERT INTO sys_role_permission(id, role_id, permission_id) VALUES ('26', '1', '26'); +INSERT INTO sys_role_permission(id, role_id, permission_id) VALUES ('27', '1', '27'); +INSERT INTO sys_role_permission(id, role_id, permission_id) VALUES ('28', '1', '28'); +INSERT INTO sys_role_permission(id, role_id, permission_id) VALUES ('29', '1', '29'); +INSERT INTO sys_role_permission(id, role_id, permission_id) VALUES ('3', '1', '3'); +INSERT INTO sys_role_permission(id, role_id, permission_id) VALUES ('30', '1', '30'); +INSERT INTO sys_role_permission(id, role_id, permission_id) VALUES ('31', '1', '31'); +INSERT INTO sys_role_permission(id, role_id, permission_id) VALUES ('32', '1', '32'); +INSERT INTO sys_role_permission(id, role_id, permission_id) VALUES ('33', '1', '33'); +INSERT INTO sys_role_permission(id, role_id, permission_id) VALUES ('34', '1', '34'); +INSERT INTO sys_role_permission(id, role_id, permission_id) VALUES ('35', '1', '35'); +INSERT INTO sys_role_permission(id, role_id, permission_id) VALUES ('36', '1', '36'); +INSERT INTO sys_role_permission(id, role_id, permission_id) VALUES ('38', '1', '38'); +INSERT INTO sys_role_permission(id, role_id, permission_id) VALUES ('39', '1', '39'); +INSERT INTO sys_role_permission(id, role_id, permission_id) VALUES ('4', '1', '4'); +INSERT INTO sys_role_permission(id, role_id, permission_id) VALUES ('40', '1', '40'); +INSERT INTO sys_role_permission(id, role_id, permission_id) VALUES ('41', '1', '41'); +INSERT INTO sys_role_permission(id, role_id, permission_id) VALUES ('42', '1', '42'); +INSERT INTO sys_role_permission(id, role_id, permission_id) VALUES ('43', '1', '43'); +INSERT INTO sys_role_permission(id, role_id, permission_id) VALUES ('44', '1', '44'); +INSERT INTO sys_role_permission(id, role_id, permission_id) VALUES ('45', '1', '45'); +INSERT INTO sys_role_permission(id, role_id, permission_id) VALUES ('46', '1', '46'); +INSERT INTO sys_role_permission(id, role_id, permission_id) VALUES ('47', '1', '47'); +INSERT INTO sys_role_permission(id, role_id, permission_id) VALUES ('48', '1', '48'); +INSERT INTO sys_role_permission(id, role_id, permission_id) VALUES ('49', '1', '49'); +INSERT INTO sys_role_permission(id, role_id, permission_id) VALUES ('5', '1', '5'); +INSERT INTO sys_role_permission(id, role_id, permission_id) VALUES ('50', '1', '50'); +INSERT INTO sys_role_permission(id, role_id, permission_id) VALUES ('51', '1', '51'); +INSERT INTO sys_role_permission(id, role_id, permission_id) VALUES ('52', '1', '52'); +INSERT INTO sys_role_permission(id, role_id, permission_id) VALUES ('53', '1', '53'); +INSERT INTO sys_role_permission(id, role_id, permission_id) VALUES ('54', '1', '54'); +INSERT INTO sys_role_permission(id, role_id, permission_id) VALUES ('55', '1', '55'); +INSERT INTO sys_role_permission(id, role_id, permission_id) VALUES ('56', '1', '56'); +INSERT INTO sys_role_permission(id, role_id, permission_id) VALUES ('57', '1', '57'); +INSERT INTO sys_role_permission(id, role_id, permission_id) VALUES ('58', '1', '58'); +INSERT INTO sys_role_permission(id, role_id, permission_id) VALUES ('6', '1', '6'); +INSERT INTO sys_role_permission(id, role_id, permission_id) VALUES ('60', '1', '60'); +INSERT INTO sys_role_permission(id, role_id, permission_id) VALUES ('61', '1', '61'); +INSERT INTO sys_role_permission(id, role_id, permission_id) VALUES ('62', '1', '62'); +INSERT INTO sys_role_permission(id, role_id, permission_id) VALUES ('63', '1', '63'); +INSERT INTO sys_role_permission(id, role_id, permission_id) VALUES ('7', '1', '7'); +INSERT INTO sys_role_permission(id, role_id, permission_id) VALUES ('8', '1', '8'); +INSERT INTO sys_role_permission(id, role_id, permission_id) VALUES ('9', '1', '9'); +INSERT INTO sys_role_permission(id, role_id, permission_id) VALUES ('1311116066716430339', '1', '1311115974068449281'); +INSERT INTO sys_user(id, username, salt, password, phone, dept_id, real_name, nick_name, email, status, sex, deleted, create_id, update_id, create_where) VALUES ('1', 'admin', '324ce32d86224b00a02b', '2102b59a75ab87616b62d0b9432569d0', '13888888888', '1', '爱糖宝', '爱糖宝', 'xxxxxx@163.com', 1, 2, 1, '1', '1', 3); +INSERT INTO sys_user_role(id, user_id, role_id) VALUES ('1', '1', '1'); +INSERT INTO sys_dict(id, name, remark, create_time) VALUES ('1255790029680242690', 'sex', '性别', '2020-04-30 17:24:09'); +INSERT INTO sys_dict(id, name, remark, create_time) VALUES ('1255790029680242691', 'content_keyword', '关键字', '2020-04-30 17:24:09'); +INSERT INTO sys_dict(id, name, remark, create_time) VALUES ('1282504369620430849', 'content_type', '文章类型略略略', '2020-07-13 10:37:24'); +INSERT INTO sys_dict_detail(id, label, value, sort, dict_id, create_time) VALUES ('1255790073535885314', '男', '1', 1, '1255790029680242690', '2020-04-30 17:24:19'); +INSERT INTO sys_dict_detail(id, label, value, sort, dict_id, create_time) VALUES ('1255790100115189761', '女', '2', 2, '1255790029680242690', '2020-04-30 17:24:25'); +INSERT INTO sys_dict_detail(id, label, value, sort, dict_id, create_time) VALUES ('1282504475715350530', '诗词', '1', 1, '1282504369620430849', '2020-07-13 10:37:49'); +INSERT INTO sys_dict_detail(id, label, value, sort, dict_id, create_time) VALUES ('1282504651729317889', '散文', '2', 2, '1282504369620430849', '2020-07-13 10:38:31'); +INSERT INTO sys_dict_detail(id, label, value, sort, dict_id, create_time) VALUES ('1282846022950842369', '剧本', '3', 3, '1282504369620430849', '2020-07-14 09:15:01'); +INSERT INTO sys_dict_detail(id, label, value, sort, dict_id, create_time) VALUES ('1282846022950842370', 'java', '1', 1, '1255790029680242691', '2020-07-14 09:15:01'); +INSERT INTO sys_dict_detail(id, label, value, sort, dict_id, create_time) VALUES ('1282846022950842371', 'mysql', '2', 2, '1255790029680242691', '2020-07-14 09:15:01'); diff --git a/doc/sqlServer.sql b/doc/sqlServer.sql new file mode 100644 index 0000000..ce8e98d --- /dev/null +++ b/doc/sqlServer.sql @@ -0,0 +1,295 @@ +-- 部门 +CREATE TABLE sys_dept ( + id varchar(64), + dept_no varchar(64), + name varchar(64), + pid varchar(64), + status int, + relation_code varchar(3000), + dept_manager_id varchar(64), + manager_name varchar(255), + phone varchar(20), + create_time datetime, + update_time datetime, + deleted int, + PRIMARY KEY (id) +); + +-- 日志 +CREATE TABLE sys_log ( + id varchar(64), + user_id varchar(64), + username varchar(50), + operation varchar(50), + time int, + method varchar(200), + params varchar(1000), + ip varchar(64), + create_time datetime, + PRIMARY KEY (id) +); + + +-- 菜单权限 +CREATE TABLE sys_permission ( + id varchar(64) , + name varchar(300), + perms varchar(500) , + icon varchar(255), + url varchar(100), + target varchar(50), + pid varchar(64), + order_num int, + type int, + status int, + create_time datetime, + update_time datetime, + deleted int, + PRIMARY KEY (id) +); + + +-- 角色 +CREATE TABLE sys_role ( + id varchar(64), + name varchar(255), + description varchar(255), + status int, + create_time datetime, + update_time datetime, + deleted int, + data_scope int, + PRIMARY KEY (id) +); + +-- 角色部门关联表 +CREATE TABLE sys_role_dept ( + id varchar(64) , + role_id varchar(64), + dept_id varchar(64), + create_time datetime, + PRIMARY KEY (id) +); + + + +-- 角色权限关联表 +CREATE TABLE sys_role_permission ( + id varchar(64) , + role_id varchar(64), + permission_id varchar(64), + create_time datetime, + PRIMARY KEY (id) +); + + +-- 用户 +CREATE TABLE sys_user ( + id varchar(64), + username varchar(50), + salt varchar(20), + password varchar(200), + phone varchar(20), + dept_id varchar(64), + real_name varchar(60), + nick_name varchar(60), + email varchar(50), + status int, + sex int, + deleted int, + create_id varchar(64), + update_id varchar(64), + create_where int DEFAULT 1, + create_time datetime, + update_time datetime, + PRIMARY KEY (id) +); + + +-- 用户角色 +CREATE TABLE sys_user_role ( + id varchar(64), + user_id varchar(64), + role_id varchar(64), + create_time datetime, + PRIMARY KEY (id) +); + +-- 数据字典 +CREATE TABLE sys_dict ( + id varchar(64) , + name varchar(100) , + remark varchar(255) , + create_time datetime, + PRIMARY KEY (id) +); + +-- 数据字典明细 +CREATE TABLE sys_dict_detail ( + id varchar(50) , + label varchar(255) , + value varchar(255) , + sort int , + dict_id varchar(50) , + create_time datetime, + PRIMARY KEY (id) +); + +-- 文章管理 + CREATE TABLE sys_content ( + id varchar(50), + title varchar(255), + one_img varchar(255), + multiple_img varchar(500), + keywords varchar(255), + type int, + content varchar(4000) , + create_time datetime , + create_id varchar(50) , + PRIMARY KEY (id) +); + +-- 文件管理 +CREATE TABLE sys_files ( + id varchar(50) , + url varchar(200), + create_date datetime , + file_name varchar(255), + file_path varchar(255) , + PRIMARY KEY (id) +); + + +-- 初始数据 +-- 初始数据 +INSERT INTO sys_dept(id, dept_no, name, pid, status, relation_code, dept_manager_id, manager_name, phone, create_time, update_time, deleted) VALUES ('1', 'D000001', '总公司', '0', 1, 'D000001', NULL, '小李', '13888888888', '2019-11-07 22:43:33', NULL, 1); +INSERT INTO sys_permission VALUES ('1', '删除', 'sysGenerator:delete', NULL, 'sysGenerator/delete', NULL, '15', 1, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1); +INSERT INTO sys_permission VALUES ('10', '赋予角色', 'sys:user:role:update', NULL, 'sys/user/roles/*', NULL, '24', 100, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1); +INSERT INTO sys_permission VALUES ('11', '菜单权限管理', NULL, NULL, 'index/menus', '_self', '51', 98, 2, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1); +INSERT INTO sys_permission VALUES ('12', '列表', 'sys:dept:list', NULL, 'sys/depts', NULL, '41', 100, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1); +INSERT INTO sys_permission VALUES ('13', '删除', 'sys:role:deleted', NULL, 'sys/role/*', NULL, '53', 100, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1); +INSERT INTO sys_permission VALUES ('1311115974068449281', '数据权限', 'sys:role:bindDept', '', 'sys/role/bindDept', '_self', '53', 5, 3, 1, '2020-09-30 09:29:42', NULL, 1); +INSERT INTO sys_permission VALUES ('15', '代码生成', NULL, NULL, 'index/sysGenerator', '_self', '54', 1, 2, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1); +INSERT INTO sys_permission VALUES ('16', '列表', 'sysGenerator:list', NULL, 'sysGenerator/listByPage', NULL, '15', 1, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1); +INSERT INTO sys_permission VALUES ('17', '详情', 'sys:permission:detail', NULL, 'sys/permission/*', NULL, '11', 100, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1); +INSERT INTO sys_permission VALUES ('19', '列表', 'sys:role:list', NULL, 'sys/roles', NULL, '53', 0, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1); +INSERT INTO sys_permission VALUES ('2', 'SQL 监控', '', '', 'druid/sql.html', '_self', '21', 98, 2, 1, '2020-03-19 13:29:40', '2020-05-07 13:36:59', 1); +INSERT INTO sys_permission VALUES ('20', '修改', 'sysGenerator:update', NULL, 'sysGenerator/update', NULL, '15', 1, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1); +INSERT INTO sys_permission VALUES ('21', '其他', NULL, 'layui-icon-list', NULL, NULL, '0', 200, 1, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1); +INSERT INTO sys_permission VALUES ('22', '详情', 'sys:dept:detail', NULL, 'sys/dept/*', NULL, '41', 100, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1); +INSERT INTO sys_permission VALUES ('23', '列表', 'sys:user:list', NULL, 'sys/users', NULL, '24', 100, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1); +INSERT INTO sys_permission VALUES ('24', '用户管理', NULL, NULL, 'index/users', '_self', '51', 100, 2, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1); +INSERT INTO sys_permission VALUES ('25', '详情', 'sys:user:detail', NULL, 'sys/user/*', NULL, '24', 100, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1); +INSERT INTO sys_permission VALUES ('26', '删除', 'sys:permission:deleted', NULL, 'sys/permission/*', NULL, '11', 100, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1); +INSERT INTO sys_permission VALUES ('27', '文件管理', '', '', 'index/sysFiles', '_self', '54', 10, 2, 1, NULL, '2020-06-15 16:00:29', 1); +INSERT INTO sys_permission VALUES ('28', '列表', 'sysFiles:list', NULL, 'sysFiles/listByPage', NULL, '27', 0, 3, 1, NULL, NULL, 1); +INSERT INTO sys_permission VALUES ('29', '新增', 'sysFiles:add', NULL, 'sysFiles/add', NULL, '27', 0, 3, 1, NULL, NULL, 1); +INSERT INTO sys_permission VALUES ('3', '新增', 'sys:role:add', NULL, 'sys/role', NULL, '53', 0, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1); +INSERT INTO sys_permission VALUES ('30', '删除', 'sysFiles:delete', NULL, 'sysFiles/delete', NULL, '27', 0, 3, 1, NULL, NULL, 1); +INSERT INTO sys_permission VALUES ('31', '文章管理', NULL, NULL, 'index/sysContent', '_self', '54', 10, 2, 1, NULL, NULL, 1); +INSERT INTO sys_permission VALUES ('32', '列表', 'sysContent:list', NULL, 'sysContent/listByPage', NULL, '31', 0, 3, 1, NULL, NULL, 1); +INSERT INTO sys_permission VALUES ('33', '新增', 'sysContent:add', NULL, 'sysContent/add', NULL, '31', 0, 3, 1, NULL, NULL, 1); +INSERT INTO sys_permission VALUES ('34', '修改', 'sysContent:update', NULL, 'sysContent/update', NULL, '31', 0, 3, 1, NULL, NULL, 1); +INSERT INTO sys_permission VALUES ('35', '删除', 'sysContent:delete', NULL, 'sysContent/delete', NULL, '31', 0, 3, 1, NULL, NULL, 1); +INSERT INTO sys_permission VALUES ('36', '更新', 'sys:role:update', NULL, 'sys/role', NULL, '53', 0, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1); +INSERT INTO sys_permission VALUES ('38', '更新', 'sys:dept:update', NULL, 'sys/dept', NULL, '41', 100, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1); +INSERT INTO sys_permission VALUES ('39', '详情', 'sys:role:detail', NULL, 'sys/role/*', NULL, '53', 100, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1); +INSERT INTO sys_permission VALUES ('4', '添加', 'sysGenerator:add', NULL, 'sysGenerator/add', NULL, '15', 1, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1); +INSERT INTO sys_permission VALUES ('40', '编辑', 'sys:permission:update', NULL, 'sys/permission', NULL, '11', 100, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1); +INSERT INTO sys_permission VALUES ('41', '部门管理', NULL, NULL, 'index/depts', '_self', '51', 100, 2, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1); +INSERT INTO sys_permission VALUES ('42', '新增', 'sys:user:add', NULL, 'sys/user', NULL, '24', 100, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1); +INSERT INTO sys_permission VALUES ('43', '列表', 'sys:permission:list', NULL, 'sys/permissions', NULL, '11', 100, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1); +INSERT INTO sys_permission VALUES ('44', '新增', 'sys:permission:add', NULL, 'sys/permission', NULL, '11', 100, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1); +INSERT INTO sys_permission VALUES ('45', '字典管理', NULL, '', 'index/sysDict', NULL, '54', 10, 2, 1, NULL, NULL, 1); +INSERT INTO sys_permission VALUES ('46', '列表', 'sysDict:list', NULL, 'sysDict/listByPage', NULL, '45', 0, 3, 1, NULL, NULL, 1); +INSERT INTO sys_permission VALUES ('47', '新增', 'sysDict:add', NULL, 'sysDict/add', NULL, '45', 0, 3, 1, NULL, NULL, 1); +INSERT INTO sys_permission VALUES ('48', '修改', 'sysDict:update', NULL, 'sysDict/update', NULL, '45', 0, 3, 1, NULL, NULL, 1); +INSERT INTO sys_permission VALUES ('49', '删除', 'sysDict:delete', NULL, 'sysDict/delete', NULL, '45', 0, 3, 1, NULL, NULL, 1); +INSERT INTO sys_permission VALUES ('5', '删除', 'sys:dept:deleted', NULL, 'sys/dept/*', NULL, '41', 100, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1); +INSERT INTO sys_permission VALUES ('50', '表单构建', '', '', 'index/build', '_self', '21', 1, 2, 1, '2020-04-22 13:09:41', '2020-05-07 13:36:47', 1); +INSERT INTO sys_permission VALUES ('51', '组织管理', NULL, 'layui-icon-user', NULL, NULL, '0', 1, 1, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1); +INSERT INTO sys_permission VALUES ('52', '拥有角色', 'sys:user:role:detail', NULL, 'sys/user/roles/*', NULL, '24', 100, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1); +INSERT INTO sys_permission VALUES ('53', '角色管理', NULL, NULL, 'index/roles', '_self', '51', 99, 2, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1); +INSERT INTO sys_permission VALUES ('54', '系统管理', NULL, 'layui-icon-set-fill', NULL, NULL, '0', 98, 1, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1); +INSERT INTO sys_permission VALUES ('56', '更新', 'sys:user:update', NULL, 'sys/user', NULL, '24', 100, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1); +INSERT INTO sys_permission VALUES ('57', '删除', 'sys:user:deleted', NULL, 'sys/user', NULL, '24', 100, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1); +INSERT INTO sys_permission VALUES ('58', '删除', 'sys:log:deleted', NULL, 'sys/logs', NULL, '8', 100, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1); +INSERT INTO sys_permission VALUES ('6', '接口管理', '', '', 'doc.html', '_blank', '21', 100, 2, 1, '2020-03-19 13:29:40', '2020-05-07 13:36:02', 1); +INSERT INTO sys_permission VALUES ('7', '列表', 'sys:log:list', NULL, 'sys/logs', NULL, '8', 100, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1); +INSERT INTO sys_permission VALUES ('8', '日志管理', NULL, NULL, 'index/logs', '_self', '54', 97, 2, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1); +INSERT INTO sys_permission VALUES ('9', '新增', 'sys:dept:add', NULL, 'sys/dept', NULL, '41', 100, 3, 1, '2020-03-19 13:29:40', '2020-03-19 13:29:40', 1); +INSERT INTO sys_role(id, name, description, status, create_time, update_time, deleted) VALUES ('1', '超级管理员', '拥有所有权限-不能删除', 1, '2019-11-01 19:26:29', '2020-03-19 13:29:51', 1); +INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('1', '1', '1', '2020-04-22 15:48:47'); +INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('10', '1', '10', '2020-04-22 15:48:47'); +INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('11', '1', '11', '2020-04-22 15:48:47'); +INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('12', '1', '12', '2020-04-22 15:48:47'); +INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('13', '1', '13', '2020-04-22 15:48:47'); +INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('14', '1', '14', '2020-05-26 17:04:21'); +INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('15', '1', '15', '2020-04-22 15:48:47'); +INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('16', '1', '16', '2020-04-22 15:48:47'); +INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('17', '1', '17', '2020-04-22 15:48:47'); +INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('18', '1', '18', '2020-04-22 15:48:47'); +INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('19', '1', '19', '2020-04-22 15:48:47'); +INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('2', '1', '2', '2020-04-22 15:48:47'); +INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('20', '1', '20', '2020-05-26 17:04:21'); +INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('21', '1', '21', '2020-04-22 15:48:47'); +INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('22', '1', '22', '2020-04-22 15:48:47'); +INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('23', '1', '23', '2020-04-22 15:48:47'); +INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('24', '1', '24', '2020-04-22 15:48:47'); +INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('25', '1', '25', '2020-04-22 15:48:47'); +INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('26', '1', '26', '2020-04-22 15:48:47'); +INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('27', '1', '27', '2020-04-22 15:48:47'); +INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('28', '1', '28', '2020-04-22 15:48:47'); +INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('29', '1', '29', '2020-04-22 15:48:47'); +INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('3', '1', '3', '2020-04-22 15:48:47'); +INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('30', '1', '30', '2020-04-22 15:48:47'); +INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('31', '1', '31', '2020-05-26 17:04:21'); +INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('32', '1', '32', '2020-04-22 15:48:47'); +INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('33', '1', '33', '2020-04-22 15:48:47'); +INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('34', '1', '34', '2020-04-22 15:48:47'); +INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('35', '1', '35', '2020-05-26 17:04:21'); +INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('36', '1', '36', '2020-04-22 15:48:47'); +INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('38', '1', '38', '2020-04-22 15:48:47'); +INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('39', '1', '39', '2020-04-22 15:48:47'); +INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('4', '1', '4', '2020-04-22 15:48:47'); +INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('40', '1', '40', '2020-06-15 15:21:17'); +INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('41', '1', '41', '2020-06-15 15:21:17'); +INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('42', '1', '42', '2020-06-15 15:21:17'); +INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('43', '1', '43', '2020-06-15 15:21:17'); +INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('44', '1', '44', '2020-04-22 15:48:47'); +INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('45', '1', '45', '2020-04-22 15:48:47'); +INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('46', '1', '46', '2020-04-22 15:48:47'); +INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('47', '1', '47', '2020-04-22 15:48:47'); +INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('48', '1', '48', '2020-04-22 15:48:47'); +INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('49', '1', '49', '2020-04-22 15:48:47'); +INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('5', '1', '5', '2020-04-22 15:48:47'); +INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('50', '1', '50', '2020-04-22 15:48:47'); +INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('51', '1', '51', '2020-04-22 15:48:47'); +INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('52', '1', '52', '2020-04-22 15:48:47'); +INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('53', '1', '53', '2020-04-22 15:48:47'); +INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('54', '1', '54', '2020-04-22 15:48:47'); +INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('55', '1', '55', '2020-04-22 15:48:47'); +INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('56', '1', '56', '2020-05-26 17:04:21'); +INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('57', '1', '57', '2020-04-22 15:48:47'); +INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('58', '1', '58', '2020-04-22 15:48:47'); +INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('6', '1', '6', '2020-04-22 15:48:47'); +INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('60', '1', '60', '2020-04-22 15:48:47'); +INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('61', '1', '61', '2020-05-26 14:21:56'); +INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('62', '1', '62', '2020-04-22 15:48:47'); +INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('63', '1', '63', '2020-04-22 15:48:47'); +INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('7', '1', '7', '2020-04-22 15:48:47'); +INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('8', '1', '8', '2020-04-22 15:48:47'); +INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('9', '1', '9', '2020-04-22 15:48:47'); +INSERT INTO sys_role_permission(id, role_id, permission_id, create_time) VALUES ('1311116066716430339', '1', '1311115974068449281', '2020-09-30 09:30:04'); +INSERT INTO sys_user(id, username, salt, password, phone, dept_id, real_name, nick_name, email, status, sex, deleted, create_id, update_id, create_where, create_time, update_time) VALUES ('1', 'admin', '324ce32d86224b00a02b', '2102b59a75ab87616b62d0b9432569d0', '13888888888', '1', '爱糖宝', '爱糖宝', 'xxxxxx@163.com', 1, 2, 1, '1', '1', 3, '2019-09-22 19:38:05', '2020-03-18 09:15:22'); +INSERT INTO sys_user_role(id, user_id, role_id, create_time) VALUES ('1', '1', '1', '2020-03-19 02:23:13'); +INSERT INTO sys_dict(id, name, remark, create_time) VALUES ('1255790029680242690', 'sex', '性别', '2020-04-30 17:24:09'); +INSERT INTO sys_dict(id, name, remark, create_time) VALUES ('1255790029680242691', 'content_keyword', '关键字', '2020-04-30 17:24:09'); +INSERT INTO sys_dict(id, name, remark, create_time) VALUES ('1282504369620430849', 'content_type', '文章类型略略略', '2020-07-13 10:37:24'); +INSERT INTO sys_dict_detail(id, label, value, sort, dict_id, create_time) VALUES ('1255790073535885314', '男', '1', 1, '1255790029680242690', '2020-04-30 17:24:19'); +INSERT INTO sys_dict_detail(id, label, value, sort, dict_id, create_time) VALUES ('1255790100115189761', '女', '2', 2, '1255790029680242690', '2020-04-30 17:24:25'); +INSERT INTO sys_dict_detail(id, label, value, sort, dict_id, create_time) VALUES ('1282504475715350530', '诗词', '1', 1, '1282504369620430849', '2020-07-13 10:37:49'); +INSERT INTO sys_dict_detail(id, label, value, sort, dict_id, create_time) VALUES ('1282504651729317889', '散文', '2', 2, '1282504369620430849', '2020-07-13 10:38:31'); +INSERT INTO sys_dict_detail(id, label, value, sort, dict_id, create_time) VALUES ('1282846022950842369', '剧本', '3', 3, '1282504369620430849', '2020-07-14 09:15:01'); +INSERT INTO sys_dict_detail(id, label, value, sort, dict_id, create_time) VALUES ('1282846022950842370', 'java', '1', 1, '1255790029680242691', '2020-07-14 09:15:01'); +INSERT INTO sys_dict_detail(id, label, value, sort, dict_id, create_time) VALUES ('1282846022950842371', 'mysql', '2', 2, '1255790029680242691', '2020-07-14 09:15:01'); diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..d8f0c86 --- /dev/null +++ b/pom.xml @@ -0,0 +1,177 @@ + + + 4.0.0 + + org.noear + solon-parent + 3.1.0 + + + vip.fuck.sm + solon-manager + 0.0.1-SNAPSHOT + solon-manager + Demo project for Solon + + 1.8 + 3.4.0 + 2.5.5 + 12.1.0.1-atlassian-hosted + 4.0 + 2.6 + 2.5 + 1.10 + 1.7 + 1.11.0 + 1.1.10 + 1.2.83 + 2.0.0 + 2.0.2 + 1.6.2 + + + + + org.noear + solon-web + + + + org.noear + solon-view-thymeleaf + + + org.noear + solon-logging-logback + + + org.noear + solon-serialization-jackson + + + org.noear + solon-security-validation + + + + com.baomidou + mybatis-plus-solon-plugin + 3.5.10.1 + + + + com.baomidou + mybatis-plus-jsqlparser-4.9 + 3.5.9 + + + + + org.projectlombok + lombok + + + + mysql + mysql-connector-java + runtime + 8.0.33 + + + com.zaxxer + HikariCP + 4.0.3 + + + + com.oracle + ojdbc6 + ${ojdbc6.version} + + + com.microsoft.sqlserver + sqljdbc4 + ${sqlserver.version} + runtime + + + + org.noear + solon-openapi2-knife4j + + + commons-lang + commons-lang + ${commons.lang.version} + + + commons-io + commons-io + ${commons.io.version} + + + commons-configuration + commons-configuration + ${commons.configuration.version} + + + velocity + org.apache.velocity + ${velocity.version} + + + com.github.whvcse + easy-captcha + ${easy-captcha.version} + + + commons-codec + commons-codec + 1.13 + + + + + org.noear + sa-token-solon-plugin + + + cn.hutool + hutool-all + 5.8.22 + + + + + + + + manager + + + org.noear + solon-maven-plugin + + + + + + + tencent + https://mirrors.cloud.tencent.com/nexus/repository/maven-public/ + + false + + + + aliyun-repos + http://maven.aliyun.com/nexus/content/groups/public/ + + false + + + + + + diff --git a/src/main/java/vip/fuck/sm/SolonManagerApplication.java b/src/main/java/vip/fuck/sm/SolonManagerApplication.java new file mode 100644 index 0000000..13c7893 --- /dev/null +++ b/src/main/java/vip/fuck/sm/SolonManagerApplication.java @@ -0,0 +1,25 @@ +package vip.fuck.sm; + +import lombok.extern.slf4j.Slf4j; +import org.noear.solon.Solon; +import org.noear.solon.annotation.SolonMain; +import org.noear.solon.web.cors.CrossFilter; + +/** + * 启动类 + * + * @author xian.zi.ming@qq.com fuck.vip + */ +@Slf4j +@SolonMain +public class SolonManagerApplication { + + public static void main(String[] args) throws Exception { + Solon.start(SolonManagerApplication.class, args, app->{ + //例:或者:增加全局处理(用过滤器模式) + app.filter(-1, new CrossFilter().allowedOrigins("*")); //加-1 优先级更高 + }); + + } + +} diff --git a/src/main/java/vip/fuck/sm/common/aop/annotation/LogAnnotation.java b/src/main/java/vip/fuck/sm/common/aop/annotation/LogAnnotation.java new file mode 100644 index 0000000..50ed105 --- /dev/null +++ b/src/main/java/vip/fuck/sm/common/aop/annotation/LogAnnotation.java @@ -0,0 +1,25 @@ +package vip.fuck.sm.common.aop.annotation; + +import java.lang.annotation.*; + +/** + * LogAnnotation + * + * @author xian.zi.ming@qq.com fuck.vip + * @version V1.0 + * @date 2020年3月18日 + */ +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface LogAnnotation { + /** + * 模块 + */ + String title() default ""; + + /** + * 功能 + */ + String action() default ""; +} diff --git a/src/main/java/vip/fuck/sm/common/aop/aspect/LoggingRouterInterceptor.java b/src/main/java/vip/fuck/sm/common/aop/aspect/LoggingRouterInterceptor.java new file mode 100644 index 0000000..9e5b125 --- /dev/null +++ b/src/main/java/vip/fuck/sm/common/aop/aspect/LoggingRouterInterceptor.java @@ -0,0 +1,80 @@ +package vip.fuck.sm.common.aop.aspect; + +import cn.dev33.satoken.stp.StpUtil; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import vip.fuck.sm.common.aop.annotation.LogAnnotation; +import vip.fuck.sm.entity.SysLog; +import vip.fuck.sm.mapper.SysLogMapper; +import lombok.extern.slf4j.Slf4j; +import org.apache.ibatis.solon.annotation.Db; +import org.noear.solon.annotation.Component; +import org.noear.solon.core.handle.Action; +import org.noear.solon.core.handle.Context; +import org.noear.solon.core.handle.Handler; +import org.noear.solon.core.route.RouterInterceptor; +import org.noear.solon.core.route.RouterInterceptorChain; +import org.noear.solon.core.util.MultiMap; + +import java.lang.reflect.Parameter; + +import static org.noear.solon.validation.annotation.HttpPart.params; + +@Component(index = -99) +@Slf4j +public class LoggingRouterInterceptor implements RouterInterceptor { + + @Db + private SysLogMapper sysLogMapper; + + @Override + public void doIntercept(Context ctx, Handler mainHandler, RouterInterceptorChain chain) throws Throwable { + LogAnnotation logAnnotation = null; + Action action = ctx.action(); + if (action != null) { + logAnnotation = action.method().getAnnotation(LogAnnotation.class); + + } + + if (logAnnotation == null) { + //如果没有注解 + chain.doIntercept(ctx, mainHandler); + } else { + //1.开始计时 + long start = System.currentTimeMillis(); + + try { + chain.doIntercept(ctx, mainHandler); + } finally { + + + //2.获得接口响应时长 + long timespan = System.currentTimeMillis() - start; + JSONObject param = new JSONObject(); + String body = ctx.body(); + if(body!=null && JSONUtil.isTypeJSON(body)){ + param.set("body",JSONUtil.parse(body)); + } + MultiMap keyValues = ctx.paramMap(); + if(keyValues!=null){ + param.set("params",JSONUtil.parse(keyValues)); + } + //3.记日志 + SysLog sysLog = new SysLog(); + sysLog.setParams(param.toJSONString(0)); + sysLog.setUsername(ctx.sessionOrDefault("currentUserName","")); + //注解上的描述 + sysLog.setOperation(logAnnotation.title() + "-" + logAnnotation.action()); + String className = action.controller().clz().getName(); + String methodName = action.method().getName(); + sysLog.setMethod(className + "." + methodName + "()"); + String userId = StpUtil.getLoginIdAsString(); + sysLog.setUserId(userId); + sysLog.setTime((int) timespan); + log.info(sysLog.toString()); + sysLogMapper.insert(sysLog); + + } + } + } +} \ No newline at end of file diff --git a/src/main/java/vip/fuck/sm/common/config/GlobalResultInterceptor.java b/src/main/java/vip/fuck/sm/common/config/GlobalResultInterceptor.java new file mode 100644 index 0000000..34a7a00 --- /dev/null +++ b/src/main/java/vip/fuck/sm/common/config/GlobalResultInterceptor.java @@ -0,0 +1,55 @@ +package vip.fuck.sm.common.config; + +import vip.fuck.sm.common.utils.DataResult; +import org.noear.solon.annotation.Component; +import org.noear.solon.core.handle.Context; +import org.noear.solon.core.handle.Handler; +import org.noear.solon.core.handle.ModelAndView; +import org.noear.solon.core.route.PathRule; +import org.noear.solon.core.route.RouterInterceptor; +import org.noear.solon.core.route.RouterInterceptorChain; + +import java.util.Arrays; + +@Component +public class GlobalResultInterceptor implements RouterInterceptor { + + @Override + public void doIntercept(Context ctx, Handler mainHandler, RouterInterceptorChain chain) throws Throwable { + chain.doIntercept(ctx, mainHandler); + } + + private static final PathRule ORG_PATH_RULE = new PathRule(); + static { + ORG_PATH_RULE.include("/favicon.ico", + "/doc.html", + "/swagger", + "/swagger/**", + "/swagger-resources", + "/swagger-resources/**", + "/webjars/**", + "/error", + "/static/**", + "/files/**" + ); + } + + /** + * 提交结果( render 执行前调用)//不要做太复杂的事情 + */ + @Override + public Object postResult(Context ctx, Object result) throws Throwable { + String path = ctx.path(); + + if(result instanceof Throwable){ + //异常类型,根据需要处理 + return result; + }else if(result instanceof DataResult || result instanceof ModelAndView){ + return result; + } else if( ORG_PATH_RULE.test(path) ){ + return result; + }else { + return DataResult.success(result); + } + } +} \ No newline at end of file diff --git a/src/main/java/vip/fuck/sm/common/config/MetaObjectHandlerConfig.java b/src/main/java/vip/fuck/sm/common/config/MetaObjectHandlerConfig.java new file mode 100644 index 0000000..0067cc3 --- /dev/null +++ b/src/main/java/vip/fuck/sm/common/config/MetaObjectHandlerConfig.java @@ -0,0 +1,78 @@ +package vip.fuck.sm.common.config; + +import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; +import vip.fuck.sm.common.utils.Constant; +import org.apache.ibatis.reflection.MetaObject; +import org.noear.solon.annotation.Component; + +import java.util.Arrays; +import java.util.Date; +import java.util.HashSet; + + +/** + * mybatis plus 默认值配置 + * + * @author xian.zi.ming@qq.com fuck.vip + * @version V1.0 + * @date 2020年3月18日 + */ +@Component +public class MetaObjectHandlerConfig implements MetaObjectHandler { + + @Override + public void insertFill(MetaObject metaObject) { + Date currentDate = new Date(); + String[] setterNames = metaObject.getSetterNames(); + HashSet setterNameSet = new HashSet<>(Arrays.asList(setterNames)); + if (setterNameSet.contains("deleted")) { + //默认未删除 + setFieldValByName("deleted", Constant.DATA_NOT_DELETED, metaObject); + } + if (setterNameSet.contains("createTime")) { + //创建时间默认当前时间 + setFieldValByName("createTime", currentDate, metaObject); + } + if (setterNameSet.contains("createDate")) { + //创建时间默认当前时间 + setFieldValByName("createDate", currentDate, metaObject); + } +// if (setterNameSet.contains("createId")) { +// //创建时间默认当前时间 +// setFieldValByName("createId", StpUtil.getLoginIdAsString(), metaObject); +// } +// if (setterNameSet.contains("updateId")) { +// //创建时间默认当前时间 +// setFieldValByName("updateId", StpUtil.getLoginIdAsString(), metaObject); +// } + if (setterNameSet.contains("updateTime")) { + //创建时间默认当前时间 + setFieldValByName("updateTime", currentDate, metaObject); + } + if (setterNameSet.contains("updateDate")) { + //创建时间默认当前时间 + setFieldValByName("updateDate", currentDate, metaObject); + } + + + } + + @Override + public void updateFill(MetaObject metaObject) { + Date currentDate = new Date(); + String[] setterNames = metaObject.getSetterNames(); + HashSet setterNameSet = new HashSet<>(Arrays.asList(setterNames)); + if (setterNameSet.contains("updateTime")) { + //创建时间默认当前时间 + setFieldValByName("updateTime", currentDate, metaObject); + } + if (setterNameSet.contains("updateDate")) { + //创建时间默认当前时间 + setFieldValByName("updateDate", currentDate, metaObject); + } +// if (setterNameSet.contains("updateId")) { +// //创建时间默认当前时间 +// setFieldValByName("updateId", StpUtil.getLoginIdAsString(), metaObject); +// } + } +} \ No newline at end of file diff --git a/src/main/java/vip/fuck/sm/common/config/MyBatisPlusConfig.java b/src/main/java/vip/fuck/sm/common/config/MyBatisPlusConfig.java new file mode 100644 index 0000000..ae1ec4b --- /dev/null +++ b/src/main/java/vip/fuck/sm/common/config/MyBatisPlusConfig.java @@ -0,0 +1,47 @@ +package vip.fuck.sm.common.config; + + +import com.baomidou.mybatisplus.annotation.DbType; +import com.baomidou.mybatisplus.core.MybatisConfiguration; +import com.baomidou.mybatisplus.core.config.GlobalConfig; +import com.baomidou.mybatisplus.core.toolkit.sql.SqlUtils; +import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; +import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; +import org.apache.ibatis.solon.annotation.Db; +import org.noear.solon.annotation.Bean; +import org.noear.solon.annotation.Configuration; +import org.noear.solon.annotation.Inject; +import org.noear.solon.core.util.ResourceUtil; + +/** + * mybatis plus config + * + * @author xian.zi.ming@qq.com fuck.vip + * @version V1.0 + * @date 2020年3月18日 + */ +@Configuration +public class MyBatisPlusConfig { +// /** +// * 配置mybatis-plus 分页查件 +// */ +// @Bean +// public PaginationInterceptor paginationInterceptor() { +// return new PaginationInterceptor(); +// } + + @Bean + public void db1_cfg( + @Db("master") MybatisConfiguration cfg, + @Db("master") GlobalConfig globalConfig) throws Exception { + + + MybatisPlusInterceptor plusInterceptor = new MybatisPlusInterceptor(); + plusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); + + cfg.setCacheEnabled(false); + cfg.addInterceptor(plusInterceptor); + +// globalConfig.setSqlInjector(new MyLogicSqlInjector()); + } +} \ No newline at end of file diff --git a/src/main/java/vip/fuck/sm/common/config/StpInterfaceImpl.java b/src/main/java/vip/fuck/sm/common/config/StpInterfaceImpl.java new file mode 100644 index 0000000..448fc73 --- /dev/null +++ b/src/main/java/vip/fuck/sm/common/config/StpInterfaceImpl.java @@ -0,0 +1,42 @@ +package vip.fuck.sm.common.config; + +import cn.dev33.satoken.stp.StpInterface; +import cn.dev33.satoken.stp.StpUtil; +import vip.fuck.sm.service.PermissionService; +import org.noear.solon.annotation.Component; +import org.noear.solon.annotation.Inject; + + +import java.util.List; + +/** + * SaToken自定义权限加载接口实现类 + * + * @author xian.zi.ming@qq.com fuck.vip + */ +@Component +public class StpInterfaceImpl implements StpInterface { + + @Inject + PermissionService permissionService; + + /** + * 返回一个账号所拥有的权限码集合 + */ + @Override + public List getPermissionList(Object loginId, String loginType) { + if (loginType.equals(StpUtil.TYPE)) { + return permissionService.getPermissionsByUserId(String.valueOf(loginId)); + } + return null; + } + + /** + * 返回一个账号所拥有的角色标识集合 + */ + @Override + public List getRoleList(Object loginId, String loginType) { + return null; + } + +} diff --git a/src/main/java/vip/fuck/sm/common/config/SwaggerConfiguration.java b/src/main/java/vip/fuck/sm/common/config/SwaggerConfiguration.java new file mode 100644 index 0000000..081d0f7 --- /dev/null +++ b/src/main/java/vip/fuck/sm/common/config/SwaggerConfiguration.java @@ -0,0 +1,50 @@ +package vip.fuck.sm.common.config; + + +import com.github.xiaoymin.knife4j.solon.extension.OpenApiExtensionResolver; +import org.noear.solon.annotation.Bean; +import org.noear.solon.annotation.Configuration; +import org.noear.solon.annotation.Import; +import org.noear.solon.annotation.Inject; +import org.noear.solon.core.handle.Result; +import org.noear.solon.docs.DocDocket; +import org.noear.solon.docs.models.ApiContact; +import org.noear.solon.docs.models.ApiInfo; + +/** + * SwaggerConfiguration + * + * @author xian.zi.ming@qq.com fuck.vip + * @version V1.0 + * @date 2020年3月18日 + */ +@Configuration +public class SwaggerConfiguration { + + + + // knife4j 的配置,由它承载 + @Inject + OpenApiExtensionResolver openApiExtensionResolver; + + @Bean("adminApi") + public DocDocket adminApi() { + //根据情况增加 "knife4j.setting" (可选) + return new DocDocket() + .basicAuth(openApiExtensionResolver.getSetting().getBasic()) + .vendorExtensions(openApiExtensionResolver.buildExtensions()) + .groupName("管理端接口") + .info(new ApiInfo().title("在线文档") + .description("在线API文档") + .termsOfService("https://gitee.com/uidoer") + .contact(new ApiContact().name("rish") + .url("https://gitee.com/uidoer") + .email("xian.zi.ming@qq.com")) + .version("1.0")) +// .schemes(Scheme.HTTP, Scheme.HTTPS) + .globalResponseInData(true) +// .globalResult(Result.class) + .apis("vip.fuck.sm.controller"); //可以加多条,以包名为单位 + + } +} \ No newline at end of file diff --git a/src/main/java/vip/fuck/sm/common/config/WebMvcConfigurer.java b/src/main/java/vip/fuck/sm/common/config/WebMvcConfigurer.java new file mode 100644 index 0000000..d15af9d --- /dev/null +++ b/src/main/java/vip/fuck/sm/common/config/WebMvcConfigurer.java @@ -0,0 +1,95 @@ +package vip.fuck.sm.common.config; + +import cn.dev33.satoken.context.SaHolder; +import cn.dev33.satoken.router.SaRouter; +import cn.dev33.satoken.solon.integration.SaTokenInterceptor; +import cn.dev33.satoken.stp.StpUtil; +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; +import org.noear.solon.annotation.Bean; +import org.noear.solon.annotation.Configuration; +import org.noear.solon.annotation.Inject; +import org.noear.solon.web.staticfiles.StaticMappings; +import org.noear.solon.web.staticfiles.repository.ClassPathStaticRepository; +import org.noear.solon.web.staticfiles.repository.FileStaticRepository; + + +import java.io.File; +import java.math.BigInteger; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.List; + +/** + * mvc 配置 + * + * @author xian.zi.ming@qq.com fuck.vip + * @version V1.0 + * @date 2020年3月18日 + */ +@Configuration +public class WebMvcConfigurer { + + @Inject("${file.path}") + private String filePath; + + + @Bean + public void staticFiles() { + StaticMappings.add("/files/", new FileStaticRepository(filePath)); + StaticMappings.add("/static/", new ClassPathStaticRepository("static")); + } + + + //添加拦截器 + //web是从管理后台来的接口,不走app那一套校验逻辑 + @Bean(index = -100) //-100,是顺序位(低值优先) + public SaTokenInterceptor saTokenInterceptor() { + return new SaTokenInterceptor() + // 指定 [拦截路由] 与 [放行路由] + .addInclude("/**") + .addExclude( + "/favicon.ico", + "/app/api/**", + "/doc.html", + "/swagger-resources", + "/swagger-resources/**", + "/webjars/**", + "/error", + "/static/**", + "/files/**", + "/login", + "/index/login", + "/sys/user/login", + "/sys/getVerify" + ) + + // 认证函数: 每次请求执行 + .setAuth(req -> { + // System.out.println("---------- sa全局认证"); + SaRouter.match("/**", StpUtil::checkLogin); + }) + + // 异常处理函数:每次认证函数发生异常时执行此函数 //包括注解异常 +// .setError(e -> { +// System.out.println("---------- sa全局异常 "); +// return AjaxJson.getError(e.getMessage()); +// }) + + // 前置函数:在每次认证函数之前执行 + .setBeforeAuth(req -> { + // ---------- 设置一些安全响应头 ---------- +// SaHolder.getResponse() +// // 服务器名称 +// .setServer("sa-server") +// // 是否可以在iframe显示视图: DENY=不可以 | SAMEORIGIN=同域下可以 | ALLOW-FROM uri=指定域名下可以 +// .setHeader("X-Frame-Options", "SAMEORIGIN") +// // 是否启用浏览器默认XSS防护: 0=禁用 | 1=启用 | 1; mode=block 启用, 并在检查到XSS攻击时,停止渲染页面 +// .setHeader("X-XSS-Protection", "1; mode=block") +// // 禁用浏览器内容嗅探 +// .setHeader("X-Content-Type-Options", "nosniff"); + }); + + + } +} + diff --git a/src/main/java/vip/fuck/sm/common/exception/BusinessException.java b/src/main/java/vip/fuck/sm/common/exception/BusinessException.java new file mode 100644 index 0000000..343a384 --- /dev/null +++ b/src/main/java/vip/fuck/sm/common/exception/BusinessException.java @@ -0,0 +1,52 @@ +package vip.fuck.sm.common.exception; + +import vip.fuck.sm.common.exception.code.BaseResponseCode; +import vip.fuck.sm.common.exception.code.ResponseCodeInterface; + +/** + * BusinessException + * + * @author xian.zi.ming@qq.com fuck.vip + * @version V1.0 + * @date 2020年3月18日 + */ +public class BusinessException extends RuntimeException { + /** + * 异常编号 + */ + private final int messageCode; + + /** + * 对messageCode 异常信息进行补充说明 + */ + private final String detailMessage; + + public BusinessException(int messageCode, String message) { + super(message); + this.messageCode = messageCode; + this.detailMessage = message; + } + + public BusinessException(String message) { + super(message); + this.messageCode = BaseResponseCode.OPERATION_ERRO.getCode(); + this.detailMessage = message; + } + + /** + * 构造函数 + * + * @param code 异常码 + */ + public BusinessException(ResponseCodeInterface code) { + this(code.getCode(), code.getMsg()); + } + + public int getMessageCode() { + return messageCode; + } + + public String getDetailMessage() { + return detailMessage; + } +} diff --git a/src/main/java/vip/fuck/sm/common/exception/code/BaseResponseCode.java b/src/main/java/vip/fuck/sm/common/exception/code/BaseResponseCode.java new file mode 100644 index 0000000..8fbc9c4 --- /dev/null +++ b/src/main/java/vip/fuck/sm/common/exception/code/BaseResponseCode.java @@ -0,0 +1,59 @@ +package vip.fuck.sm.common.exception.code; + + +/** + * 错误码 + * + * @author xian.zi.ming@qq.com fuck.vip + * @version V1.0 + * @date 2020年3月18日 + */ +public enum BaseResponseCode implements ResponseCodeInterface { + /** + * 错误码 + */ + SUCCESS(0, "操作成功"), + SYSTEM_BUSY(500001, "系统繁忙,请稍候再试"), + OPERATION_ERRO(500002, "操作失败"), + ILLEGAL_DATA(500003, "非法的数据格式"), + TOKEN_ERROR(401001, "登录凭证已过期,请重新登录"), + DATA_ERROR(401003, "传入数据异常"), + NOT_ACCOUNT(401004, "该用户不存在,请先注册"), + USER_LOCK(401005, "该用户已被锁定,请联系运营人员"), + PASSWORD_ERROR(401006, "用户名或密码错误"), + METHODARGUMENTNOTVALIDEXCEPTION(401007, "方法参数校验异常"), + UNAUTHORIZED_ERROR(401008, "权鉴校验不通过"), + ROLE_PERMISSION_RELATION(401009, "该菜单权限存在子集关联,不允许删除"), + OLD_PASSWORD_ERROR(401010, "旧密码不正确"), + NOT_PERMISSION_DELETED_DEPT(401011, "该组织机构下还关联着用户,不允许删除"), + OPERATION_MENU_PERMISSION_CATALOG_ERROR(401012, "操作后的菜单类型是目录,所属菜单必须为默认顶级菜单或者目录"), + OPERATION_MENU_PERMISSION_MENU_ERROR(401013, "操作后的菜单类型是菜单,所属菜单必须为目录类型"), + OPERATION_MENU_PERMISSION_BTN_ERROR(401013, "操作后的菜单类型是按钮,所属菜单必须为菜单类型"), + OPERATION_MENU_PERMISSION_URL_NOT_NULL(401015, "菜单权限的url不能为空"), + OPERATION_MENU_PERMISSION_URL_PERMS_NULL(401016, "菜单权限的标识符不能为空"), + ; + + /** + * 错误码 + */ + private final int code; + /** + * 错误消息 + */ + private final String msg; + + BaseResponseCode(int code, String msg) { + this.code = code; + this.msg = msg; + } + + @Override + public int getCode() { + return code; + } + + @Override + public String getMsg() { + return msg; + } +} diff --git a/src/main/java/vip/fuck/sm/common/exception/code/ResponseCodeInterface.java b/src/main/java/vip/fuck/sm/common/exception/code/ResponseCodeInterface.java new file mode 100644 index 0000000..43a565f --- /dev/null +++ b/src/main/java/vip/fuck/sm/common/exception/code/ResponseCodeInterface.java @@ -0,0 +1,24 @@ +package vip.fuck.sm.common.exception.code; + +/** + * ResponseCodeInterface + * + * @author xian.zi.ming@qq.com fuck.vip + * @version V1.0 + * @date 2020年3月18日 + */ +public interface ResponseCodeInterface { + /** + * 获取code + * + * @return code + */ + int getCode(); + + /** + * 获取信息 + * + * @return msg + */ + String getMsg(); +} diff --git a/src/main/java/vip/fuck/sm/common/exception/handler/AppFilter.java b/src/main/java/vip/fuck/sm/common/exception/handler/AppFilter.java new file mode 100644 index 0000000..1e37f18 --- /dev/null +++ b/src/main/java/vip/fuck/sm/common/exception/handler/AppFilter.java @@ -0,0 +1,45 @@ +package vip.fuck.sm.common.exception.handler; + +import cn.dev33.satoken.exception.NotLoginException; +import vip.fuck.sm.common.exception.BusinessException; +import vip.fuck.sm.common.exception.code.BaseResponseCode; +import vip.fuck.sm.common.utils.DataResult; +import lombok.extern.slf4j.Slf4j; +import org.noear.solon.annotation.Component; +import org.noear.solon.core.exception.StatusException; +import org.noear.solon.core.handle.*; +import org.noear.solon.validation.ValidatorException; +import org.thymeleaf.exceptions.TemplateEngineException; + +@Component(index = 0) //index 为顺序位(不加,则默认为0) +@Slf4j +public class AppFilter implements Filter { + @Override + public void doFilter(Context ctx, FilterChain chain) throws Throwable { + try { + chain.doFilter(ctx); + } catch (NotLoginException e){ + ctx.redirect("/index/login"); + } catch (ValidatorException e) { + ctx.render(DataResult.getResult( + BaseResponseCode.METHODARGUMENTNOTVALIDEXCEPTION.getCode(), + e.getMessage())); + }catch (BusinessException e){ + ctx.render(new DataResult(e.getMessageCode(), e.getDetailMessage())); + } catch (StatusException e){ + ctx.status(e.getCode()); + if (e.getCode() == 404){ + String pathNew = ctx.pathNew(); + log.error("404:{}",pathNew); + ctx.redirect("/index/404"); + } else { + ctx.redirect("/index/500"); + } + } catch (TemplateEngineException e){ + ctx.render(" /** 【页面异常】 **/"); + } catch (Throwable e) { + log.error(e.getMessage(),e); + ctx.render(DataResult.getResult(BaseResponseCode.SYSTEM_BUSY)); + } + } +} \ No newline at end of file diff --git a/src/main/java/vip/fuck/sm/common/utils/AssertUtil.java b/src/main/java/vip/fuck/sm/common/utils/AssertUtil.java new file mode 100644 index 0000000..ddb3c4b --- /dev/null +++ b/src/main/java/vip/fuck/sm/common/utils/AssertUtil.java @@ -0,0 +1,110 @@ +package vip.fuck.sm.common.utils; + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import vip.fuck.sm.common.exception.BusinessException; + +import java.util.Collection; + +/** + * 断言工具类 + */ +public class AssertUtil { + + /** + * true不报错 + * + * @param expression + * @param message + */ + public static void isTrue(boolean expression, String message) { + if (!expression) { + throw new BusinessException(message); + } + } + + /** + * true不报错 + * + * @param expression + */ + public static void isTrue(boolean expression) { + if (!expression) { + throw new BusinessException("参数无效/数据异常"); + } + } + + /** + * string为空报错 + * 不为空不报错 + * + * @param s + * @param message + */ + public static void isStringNotBlank(String s, String message) { + isTrue(StringUtils.isNotBlank(s), message); + } + + public static void isStringNotBlank(String s) { + isTrue(StringUtils.isNotBlank(s)); + } + + + /** + * string为空不报错 + * 不为空报错 + * + * @param s + * @param message + */ + public static void isStringBlank(String s, String message) { + isTrue(StringUtils.isBlank(s), message); + } + + public static void isStringBlank(String s) { + isTrue(StringUtils.isBlank(s)); + } + + /** + * 对象为null, 不报错 + * 不为null, 报错 + * @param obj + * @param errorMessage + */ + public static void isNull(Object obj, String errorMessage) { + isTrue(obj == null, errorMessage); + } + + public static void isNull(Object obj) { + isTrue(obj == null); + } + + /** + * 对象不为null, 不报错 + * 为null, 报错 + * @param obj + * @param errorMessage + */ + public static void isExists(Object obj, String errorMessage) { + isTrue(obj != null, errorMessage); + } + + public static void isExists(Object obj) { + isTrue(obj != null); + } + + /** + * list或者map 不能为空 + * @param collection + * @param errorMessage + */ + public static void hasElements(Collection collection, String errorMessage) { + isTrue(CollectionUtils.isNotEmpty(collection), errorMessage); + } + + public static void hasElements(Object[] array, String errorMessage) { + isTrue(array != null && array.length != 0, errorMessage); + } + + +} \ No newline at end of file diff --git a/src/main/java/vip/fuck/sm/common/utils/Constant.java b/src/main/java/vip/fuck/sm/common/utils/Constant.java new file mode 100644 index 0000000..2d37002 --- /dev/null +++ b/src/main/java/vip/fuck/sm/common/utils/Constant.java @@ -0,0 +1,38 @@ +package vip.fuck.sm.common.utils; + +/** + * Constant + * + * @author xian.zi.ming@qq.com fuck.vip + * @version V1.0 + * @date 2020年3月18日 + */ +public class Constant { + + /** + * 未删除值 + */ + public static final Integer DATA_NOT_DELETED = 0; + + /** + * 数据库类型 + */ + public static final String DB_TYPE_MYSQL = "mysql"; + public static final String DB_TYPE_ORACLE = "oracle"; + public static final String DB_TYPE_SQL_SERVER = "sqlServer"; + + /** + * 定时任务状态 + */ + public static final Integer SCHEDULER_STATUS_NORMAL = 0; + public static final Integer SCHEDULER_STATUS_PAUSE = 1; + + /** + * 数据范围类型 1:所有/2:自定义/3:本部门及一下/4:仅本部门/5:自己 + */ + public static final Integer DATA_SCOPE_ALL = 1; + public static final Integer DATA_SCOPE_CUSTOM = 2; + public static final Integer DATA_SCOPE_DEPT_AND_CHILD = 3; + public static final Integer DATA_SCOPE_DEPT = 4; + public static final Integer DATA_SCOPE_DEPT_SELF = 5; +} diff --git a/src/main/java/vip/fuck/sm/common/utils/DataResult.java b/src/main/java/vip/fuck/sm/common/utils/DataResult.java new file mode 100644 index 0000000..2964ca3 --- /dev/null +++ b/src/main/java/vip/fuck/sm/common/utils/DataResult.java @@ -0,0 +1,112 @@ +package vip.fuck.sm.common.utils; + +import vip.fuck.sm.common.exception.code.BaseResponseCode; +import vip.fuck.sm.common.exception.code.ResponseCodeInterface; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 返回值DataResult + * + * @author xian.zi.ming@qq.com fuck.vip + * @version V1.0 + * @date 2020年3月18日 + */ +@Data +public class DataResult { + + /** + * 请求响应code,0为成功 其他为失败 + */ + @ApiModelProperty(value = "请求响应code,0为成功 其他为失败", name = "code") + private int code; + + /** + * 响应异常码详细信息 + */ + @ApiModelProperty(value = "响应异常码详细信息", name = "msg") + private String msg; + + @ApiModelProperty(value = "需要返回的数据", name = "data") + private Object data; + + public DataResult(int code, Object data) { + this.code = code; + this.data = data; + this.msg = null; + } + + public DataResult(int code, String msg, Object data) { + this.code = code; + this.msg = msg; + this.data = data; + } + + public DataResult(int code, String msg) { + this.code = code; + this.msg = msg; + this.data = null; + } + + + public DataResult() { + this.code = BaseResponseCode.SUCCESS.getCode(); + this.msg = BaseResponseCode.SUCCESS.getMsg(); + this.data = null; + } + + public DataResult(Object data) { + this.data = data; + this.code = BaseResponseCode.SUCCESS.getCode(); + this.msg = BaseResponseCode.SUCCESS.getMsg(); + } + + public DataResult(ResponseCodeInterface responseCodeInterface) { + this.data = null; + this.code = responseCodeInterface.getCode(); + this.msg = responseCodeInterface.getMsg(); + } + + public DataResult(ResponseCodeInterface responseCodeInterface, Object data) { + this.data = data; + this.code = responseCodeInterface.getCode(); + this.msg = responseCodeInterface.getMsg(); + } + + /** + * 操作成功 data为null + */ + public static DataResult success() { + return new DataResult(); + } + + /** + * 操作成功 data 不为null + */ + public static DataResult success(Object data) { + return new DataResult(data); + } + + /** + * 操作失败 data 不为null + */ + public static DataResult fail(String msg) { + return new DataResult(BaseResponseCode.OPERATION_ERRO.getCode(), msg); + } + + /** + * 自定义返回 data为null + */ + public static DataResult getResult(int code, String msg) { + return new DataResult(code, msg); + } + + /** + * 自定义返回 入参一般是异常code枚举 data为空 + */ + public static DataResult getResult(BaseResponseCode responseCode) { + return new DataResult(responseCode); + } + + +} diff --git a/src/main/java/vip/fuck/sm/common/utils/DateUtils.java b/src/main/java/vip/fuck/sm/common/utils/DateUtils.java new file mode 100644 index 0000000..893cce3 --- /dev/null +++ b/src/main/java/vip/fuck/sm/common/utils/DateUtils.java @@ -0,0 +1,30 @@ +package vip.fuck.sm.common.utils; + +import java.text.SimpleDateFormat; +import java.util.Date; + +/** + * 日期处理 + * + * @author xian.zi.ming@qq.com fuck.vip + * @version V1.0 + * @date 2020年3月18日 + */ +public class DateUtils { + /** + * 时间格式(yyyy-MM-dd HH:mm:ss) + */ + public final static String DATE_TIME_PATTERN = "yyyy-MM-dd HH:mm:ss"; + /** + * 时间格式(yyyyMMdd) + */ + public final static String DATEPATTERN = "yyyyMMdd"; + + public static String format(Date date, String pattern) { + if (date != null) { + SimpleDateFormat df = new SimpleDateFormat(pattern); + return df.format(date); + } + return null; + } +} diff --git a/src/main/java/vip/fuck/sm/common/utils/GenUtils.java b/src/main/java/vip/fuck/sm/common/utils/GenUtils.java new file mode 100644 index 0000000..86fe468 --- /dev/null +++ b/src/main/java/vip/fuck/sm/common/utils/GenUtils.java @@ -0,0 +1,244 @@ +package vip.fuck.sm.common.utils; + +import com.baomidou.mybatisplus.core.toolkit.IdWorker; +import vip.fuck.sm.common.exception.BusinessException; +import vip.fuck.sm.entity.ColumnEntity; +import vip.fuck.sm.entity.TableEntity; +import org.apache.commons.configuration.Configuration; +import org.apache.commons.configuration.ConfigurationException; +import org.apache.commons.configuration.PropertiesConfiguration; +import org.apache.commons.io.IOUtils; +import org.apache.commons.lang.StringUtils; +import org.apache.velocity.Template; +import org.apache.velocity.VelocityContext; +import org.apache.velocity.app.Velocity; + +import java.io.File; +import java.io.IOException; +import java.io.StringWriter; +import java.util.*; +import java.util.zip.ZipEntry; +import java.util.zip.ZipOutputStream; + +/** + * 代码生成器 工具类 + * + * @author xian.zi.ming@qq.com fuck.vip + * @version V1.0 + * @date 2020年3月18日 + */ +public class GenUtils { + + public static List getTemplates() { + List templates = new ArrayList<>(); + templates.add("template/Entity.java.vm"); + templates.add("template/Dao.java.vm"); + templates.add("template/Dao.xml.vm"); + templates.add("template/Service.java.vm"); + templates.add("template/ServiceImpl.java.vm"); + templates.add("template/Controller.java.vm"); + templates.add("template/menu.sql.vm"); + templates.add("template/list.html.vm"); + + return templates; + } + + /** + * 生成代码 + */ + public static void generatorCode(Map table, + List> columns, ZipOutputStream zip) { + //配置信息 + Configuration config = getConfig(); + boolean hasBigDecimal = false; + //表信息 + TableEntity tableEntity = new TableEntity(); + tableEntity.setTableName(table.get("tableName")); + tableEntity.setComments(table.get("tableComment")); + //表名转换成Java类名 + String className = tableToJava(tableEntity.getTableName(), config.getStringArray("tablePrefix")); + tableEntity.setClassName(className); + tableEntity.setClassname(StringUtils.uncapitalize(className)); + tableEntity.setClassNameLower(className.toLowerCase()); + + //列信息 + List columsList = new ArrayList<>(); + List htmlColumsList = new ArrayList<>(); + for (Map column : columns) { + ColumnEntity columnEntity = new ColumnEntity(); + columnEntity.setColumnName(column.get("columnName")); + columnEntity.setDataType(column.get("dataType")); + columnEntity.setComments(column.get("columnComment")); + columnEntity.setExtra(column.get("extra")); + + //列名转换成Java属性名 + String attrName = columnToJava(columnEntity.getColumnName()); + columnEntity.setAttrName(attrName); + columnEntity.setAttrname(StringUtils.uncapitalize(attrName)); + + //列的数据类型,转换成Java类型 + String attrType = config.getString(columnEntity.getDataType(), "unknowType"); + columnEntity.setAttrType(attrType); + if (!hasBigDecimal && "BigDecimal".equals(attrType)) { + hasBigDecimal = true; + } + //是否主键 + if ("PRI".equalsIgnoreCase(column.get("columnKey")) && tableEntity.getPk() == null) { + tableEntity.setPk(columnEntity); + } + + columsList.add(columnEntity); + if (!Arrays.asList("deleted", "create_id", "create_by", "update_id", "update_by", "create_time", "create_date", "update_time", "update_date").contains(column.get("columnName"))) { + htmlColumsList.add(columnEntity); + } + } + tableEntity.setColumns(columsList); + tableEntity.setHtmlColumns(htmlColumsList); + + //没主键,则第一个字段为主键 + if (tableEntity.getPk() == null) { + tableEntity.setPk(tableEntity.getColumns().get(0)); + } + + //设置velocity资源加载器 + Properties prop = new Properties(); + prop.put("file.resource.loader.class", "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader"); + Velocity.init(prop); + String mainPath = config.getString("mainPath"); + mainPath = StringUtils.isBlank(mainPath) ? "com.company" : mainPath; + //封装模板数据 + Map map = new HashMap<>(15); + map.put("tableName", tableEntity.getTableName()); + map.put("comments", tableEntity.getComments()); + map.put("pk", tableEntity.getPk()); + map.put("className", tableEntity.getClassName()); + map.put("classname", tableEntity.getClassname()); + map.put("pathName", tableEntity.getClassname().toLowerCase()); + map.put("columns", tableEntity.getColumns()); + map.put("htmlColumns", tableEntity.getHtmlColumns()); + map.put("classNameLower", tableEntity.getClassNameLower()); + map.put("hasBigDecimal", hasBigDecimal); + map.put("mainPath", mainPath); + map.put("package", config.getString("package")); + map.put("author", config.getString("author")); + map.put("email", config.getString("email")); + map.put("datetime", DateUtils.format(new Date(), DateUtils.DATE_TIME_PATTERN)); + map.put("identity", IdWorker.getId()); + map.put("addId", IdWorker.getId()); + map.put("updateId", IdWorker.getId()); + map.put("deleteId", IdWorker.getId()); + map.put("selectId", IdWorker.getId()); + map.put("identityJoinId", IdWorker.getId()); + map.put("addIdJoinId", IdWorker.getId()); + map.put("updateIdJoinId", IdWorker.getId()); + map.put("deleteIdJoinId", IdWorker.getId()); + map.put("selectIdJoinId", IdWorker.getId()); + VelocityContext context = new VelocityContext(map); + + //获取模板列表 + List templates = getTemplates(); + for (String template : templates) { + //渲染模板 + StringWriter sw = new StringWriter(); + Template tpl = Velocity.getTemplate(template, "UTF-8"); + tpl.merge(context, sw); + + try { + //添加到zip + zip.putNextEntry(new ZipEntry(Objects.requireNonNull(getFileName(template, tableEntity.getClassName(), config.getString("package"))))); + IOUtils.write(sw.toString(), zip, "UTF-8"); + IOUtils.closeQuietly(sw); + zip.closeEntry(); + } catch (IOException e) { + throw new BusinessException("渲染模板失败,表名:" + tableEntity.getTableName()); + } + } + } + + + /** + * 列名转换成Java属性名 + */ + public static String columnToJava(String field) { + String[] fields = field.split("_"); + StringBuilder sbuilder = new StringBuilder(fields[0]); + for (int i = 1; i < fields.length; i++) { + char[] cs = fields[i].toCharArray(); + if (cs[0] >= 'a') { + cs[0] -= 32; + } + sbuilder.append(String.valueOf(cs)); + } + return sbuilder.toString().substring(0, 1).toUpperCase() + sbuilder.toString().substring(1); + } + + + /** + * 表名转换成Java类名 + */ + public static String tableToJava(String tableName, String[] tablePrefixArray) { + tableName = tableName.toLowerCase(); + if (null != tablePrefixArray && tablePrefixArray.length > 0) { + for (String tablePrefix : tablePrefixArray) { + tablePrefix = tablePrefix.toLowerCase(); + tableName = tableName.replace(tablePrefix, ""); + } + } + return columnToJava(tableName); + } + + /** + * 获取配置信息 + */ + public static Configuration getConfig() { + try { + return new PropertiesConfiguration("generator.properties"); + } catch (ConfigurationException e) { + throw new BusinessException("获取配置文件失败"); + } + } + + /** + * 获取文件名 + */ + public static String getFileName(String template, String className, String packageName) { + String packagePath = "main" + File.separator + "java" + File.separator; + if (StringUtils.isNotBlank(packageName)) { + packagePath += packageName.replace(".", File.separator) + File.separator; + } + + if (template.contains("Entity.java.vm")) { + return packagePath + "entity" + File.separator + className + "Entity.java"; + } + + if (template.contains("Dao.java.vm")) { + return packagePath + "mapper" + File.separator + className + "Mapper.java"; + } + + if (template.contains("Service.java.vm")) { + return packagePath + "service" + File.separator + className + "Service.java"; + } + + if (template.contains("ServiceImpl.java.vm")) { + return packagePath + "service" + File.separator + "impl" + File.separator + className + "ServiceImpl.java"; + } + + if (template.contains("Controller.java.vm")) { + return packagePath + "controller" + File.separator + className + "Controller.java"; + } + + if (template.contains("Dao.xml.vm")) { + return "main" + File.separator + "resources" + File.separator + "mapper" + File.separator + className + "Mapper.xml"; + } + + if (template.contains("menu.sql.vm")) { + return className.toLowerCase() + "_menu.sql"; + } + + if (template.contains("list.html.vm")) { + return "main" + File.separator + "resources" + File.separator + "templates" + File.separator + className.toLowerCase() + File.separator + "list" + ".html"; + } + + return null; + } +} diff --git a/src/main/java/vip/fuck/sm/common/utils/PasswordEncoder.java b/src/main/java/vip/fuck/sm/common/utils/PasswordEncoder.java new file mode 100644 index 0000000..c356b97 --- /dev/null +++ b/src/main/java/vip/fuck/sm/common/utils/PasswordEncoder.java @@ -0,0 +1,117 @@ +package vip.fuck.sm.common.utils; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.nio.charset.StandardCharsets; +import java.security.MessageDigest; + +/** + * 密码加密 + * + * @author xian.zi.ming@qq.com fuck.vip + * @version V1.0 + * @date 2020年3月18日 + */ +public class PasswordEncoder { + + private static Logger logger = LoggerFactory.getLogger(PasswordEncoder.class); + + + private final static String[] HEX_DIGITS = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", + "e", "f"}; + + private final static String MD5 = "MD5"; + + private Object salt; + private String algorithm; + + public PasswordEncoder(Object salt) { + this(salt, MD5); + } + + public PasswordEncoder(Object salt, String algorithm) { + this.salt = salt; + this.algorithm = algorithm; + } + + /** + * 密码加密 + * + * @param rawPass 密码 + * @return 加密后 + */ + public String encode(String rawPass) { + String result = null; + try { + MessageDigest md = MessageDigest.getInstance(algorithm); + // 加密后的字符串 + result = byteArrayToHexString(md.digest(mergePasswordAndSalt(rawPass).getBytes(StandardCharsets.UTF_8))); + } catch (Exception e) { + logger.error(e.toString(), e); + } + return result; + } + + /** + * 密码匹配验证 + * + * @param encPass 密文 + * @param rawPass 明文 + * @return 是否匹配 + */ + public boolean matches(String encPass, String rawPass) { + String pass1 = "" + encPass; + String pass2 = encode(rawPass); + + return pass1.equals(pass2); + } + + private String mergePasswordAndSalt(String password) { + if (password == null) { + password = ""; + } + + if ((salt == null) || "".equals(salt)) { + return password; + } else { + return password + "{" + salt.toString() + "}"; + } + } + + /** + * 转换字节数组为16进制字串 + * + * @param b 字节数组 + * @return 16进制字串 + */ + private String byteArrayToHexString(byte[] b) { + StringBuilder resultSb = new StringBuilder(); + for (byte value : b) { + resultSb.append(byteToHexString(value)); + } + return resultSb.toString(); + } + + /** + * 将字节转换为16进制 + * + * @param b 字节 + * @return 16进制 + */ + private static String byteToHexString(byte b) { + int n = b; + if (n < 0) { + n = 256 + n; + } + int d1 = n / 16; + int d2 = n % 16; + return HEX_DIGITS[d1] + HEX_DIGITS[d2]; + } + + public static void main(String[] args) { + + } + + +} \ No newline at end of file diff --git a/src/main/java/vip/fuck/sm/common/utils/PasswordUtils.java b/src/main/java/vip/fuck/sm/common/utils/PasswordUtils.java new file mode 100644 index 0000000..80bf808 --- /dev/null +++ b/src/main/java/vip/fuck/sm/common/utils/PasswordUtils.java @@ -0,0 +1,47 @@ +package vip.fuck.sm.common.utils; + +import java.util.UUID; + + +/** + * 密码工具类 + * + * @author xian.zi.ming@qq.com fuck.vip + * @version V1.0 + * @date 2020年3月18日 + */ +public class PasswordUtils { + + /** + * 匹配密码 + * + * @param salt 盐 + * @param rawPass 明文 + * @param encPass 密文 + * @return 是否匹配 + */ + public static boolean matches(String salt, String rawPass, String encPass) { + return new PasswordEncoder(salt).matches(encPass, rawPass); + } + + /** + * 明文密码加密 + * + * @param rawPass 明文 + * @param salt 盐 + * @reture 加密后 + */ + public static String encode(String rawPass, String salt) { + return new PasswordEncoder(salt).encode(rawPass); + } + + /** + * 获取加密盐 + * + * @return 盐值 + */ + public static String getSalt() { + return UUID.randomUUID().toString().replaceAll("-", "").substring(0, 20); + } + +} diff --git a/src/main/java/vip/fuck/sm/controller/DeptController.java b/src/main/java/vip/fuck/sm/controller/DeptController.java new file mode 100644 index 0000000..97c8262 --- /dev/null +++ b/src/main/java/vip/fuck/sm/controller/DeptController.java @@ -0,0 +1,96 @@ +package vip.fuck.sm.controller; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.dev33.satoken.annotation.SaMode; +import vip.fuck.sm.common.aop.annotation.LogAnnotation; +import vip.fuck.sm.common.exception.BusinessException; +import vip.fuck.sm.common.utils.AssertUtil; +import vip.fuck.sm.entity.SysDept; +import vip.fuck.sm.service.DeptService; +import vip.fuck.sm.vo.resp.DeptRespNodeVO; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.noear.solon.annotation.*; +import org.noear.solon.validation.annotation.Valid; +import org.noear.solon.validation.annotation.Validated; + + +import javax.annotation.Resource; +import java.util.List; + +/** + * 部门管理 + * + * @author xian.zi.ming@qq.com fuck.vip + * @version V1.0 + * @date 2020年3月18日 + */ +@Mapping("/sys") +@Controller +@Api(tags = "组织模块-机构管理") +@Valid +public class DeptController { + @Inject + private DeptService deptService; + + @Post + @Mapping("/dept") + @ApiOperation(value = "新增组织接口") + @LogAnnotation(title = "机构管理", action = "新增组织") + @SaCheckPermission("sys:dept:add") + public void addDept( @Validated SysDept vo) { + deptService.addDept(vo); + } + + @Delete + @Mapping ("/dept/{id}") + @ApiOperation(value = "删除组织接口") + @LogAnnotation(title = "机构管理", action = "删除组织") + @SaCheckPermission("sys:dept:deleted") + public void deleted(@Path("id") String id) { + deptService.deleted(id); + } + + @Put + @Mapping ("/dept") + @ApiOperation(value = "更新组织信息接口") + @LogAnnotation(title = "机构管理", action = "更新组织信息") + @SaCheckPermission("sys:dept:update") + public void updateDept( SysDept vo) { + AssertUtil.isStringNotBlank(vo.getId(), "id不能为空"); + deptService.updateDept(vo); + } + + @Get + @Mapping ("/dept/{id}") + @ApiOperation(value = "查询组织详情接口") + @LogAnnotation(title = "机构管理", action = "查询组织详情") + @SaCheckPermission("sys:dept:detail") + public SysDept detailInfo(@Path("id") String id) { + return deptService.getById(id); + } + + @Get @Mapping ("/dept/tree") + @ApiOperation(value = "树型组织列表接口") + @LogAnnotation(title = "机构管理", action = "树型组织列表") + @SaCheckPermission(value = {"sys:user:list", "sys:user:update", "sys:user:add", "sys:dept:add", "sys:dept:update"}, mode = SaMode.OR) + public List getTree( String deptId) { + return deptService.deptTreeList(deptId, false); + } + + @Get @Mapping ("/depts") + @ApiOperation(value = "获取机构列表接口") + @LogAnnotation(title = "机构管理", action = "获取所有组织机构") + @SaCheckPermission("sys:dept:list") + public List getDeptAll() { + List deptList = deptService.list(); + deptList.stream().forEach(entity -> { + SysDept parentDept = deptService.getById(entity.getPid()); + if (parentDept != null) { + entity.setPidName(parentDept.getName()); + } + }); + return deptList; + } + +} diff --git a/src/main/java/vip/fuck/sm/controller/IndexController.java b/src/main/java/vip/fuck/sm/controller/IndexController.java new file mode 100644 index 0000000..a178c6f --- /dev/null +++ b/src/main/java/vip/fuck/sm/controller/IndexController.java @@ -0,0 +1,145 @@ +package vip.fuck.sm.controller; + +import cn.dev33.satoken.stp.StpUtil; +import io.swagger.annotations.Api; +import org.noear.solon.annotation.Controller; +import org.noear.solon.annotation.Get; +import org.noear.solon.annotation.Mapping; +import org.noear.solon.core.handle.ModelAndView; +import org.noear.solon.validation.annotation.Valid; + + +/** + * 视图 + * + * @author xian.zi.ming@qq.com fuck.vip + * @version V1.0 + * @date 2020年3月18日 + */ +@Api(tags = "视图") +@Controller +@Mapping("") +@Valid +public class IndexController { + + @Get @Mapping ("/index/login") + public ModelAndView login1(){ + return this.loginIndex(); + } + @Get @Mapping ( "/login") + public ModelAndView login2(){ + return this.loginIndex(); + } + @Get @Mapping ( "/") + public ModelAndView login3(){ + return this.loginIndex(); + } + + public ModelAndView loginIndex() { + if (StpUtil.isLogin()) { + return new ModelAndView("/home.html"); + } + return new ModelAndView("login.html"); + } + + @Get @Mapping ("/index/home") + public ModelAndView home() { + return this.loginIndex(); + } + + @Get @Mapping ("/index/users/password") + public ModelAndView updatePassword() { + return new ModelAndView("users/update_password.html"); + } + + @Get @Mapping ("/index/users/info") + public ModelAndView userDetail() { + return new ModelAndView("users/user_edit.html"); + } + + @Get @Mapping ("/index/menus") + public ModelAndView menusList() { + + return new ModelAndView("menus/menu_list.html"); + } + + @Get @Mapping ("/index/roles") + public ModelAndView roleList() { + return new ModelAndView("roles/role_list.html"); + } + + @Get @Mapping ("/index/users") + public ModelAndView userList() { + return new ModelAndView("users/user_list.html"); + } + + @Get @Mapping ("/index/logs") + public ModelAndView logList() { + return new ModelAndView("logs/log_list.html"); + } + + @Get @Mapping ("/index/depts") + public ModelAndView deptList() { + return new ModelAndView("depts/dept_list.html"); + } + + @Get @Mapping ("/index/403") + public ModelAndView error403() { + return new ModelAndView("error/403.html"); + } + + @Get @Mapping ("/index/404") + public ModelAndView error404() { + return new ModelAndView("error/404.html"); + } + + @Get @Mapping ("/index/500") + public ModelAndView error405() { + return new ModelAndView("error/500.html"); + } + + @Get @Mapping ("/index/main") + public ModelAndView indexHome() { + return new ModelAndView( "main.html"); + } + + @Get @Mapping ("/index/about") + public ModelAndView about() { + return new ModelAndView("about.html"); + } + + @Get @Mapping ("/index/build") + public ModelAndView build() { + return new ModelAndView("build.html"); + } + + @Get @Mapping ("/index/sysContent") + public ModelAndView sysContent() { + return new ModelAndView("syscontent/list.html"); + } + + @Get @Mapping ("/index/sysDict") + public ModelAndView sysDict() { + return new ModelAndView("sysdict/list.html"); + } + + @Get @Mapping ("/index/sysGenerator") + public ModelAndView sysGenerator() { + return new ModelAndView("generator/list.html"); + } + + @Get @Mapping ("/index/sysJob") + public ModelAndView sysJob() { + return new ModelAndView("sysjob/list.html"); + } + + @Get @Mapping ("/index/sysJobLog") + public ModelAndView sysJobLog() { + return new ModelAndView("sysjoblog/list.html"); + } + + @Get @Mapping ("/index/sysFiles") + public ModelAndView sysFiles() { + return new ModelAndView("sysfiles/list.html"); + } +} diff --git a/src/main/java/vip/fuck/sm/controller/PermissionController.java b/src/main/java/vip/fuck/sm/controller/PermissionController.java new file mode 100644 index 0000000..4f1cd08 --- /dev/null +++ b/src/main/java/vip/fuck/sm/controller/PermissionController.java @@ -0,0 +1,148 @@ +package vip.fuck.sm.controller; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.dev33.satoken.annotation.SaMode; +import cn.hutool.core.util.StrUtil; +import vip.fuck.sm.common.aop.annotation.LogAnnotation; +import vip.fuck.sm.common.exception.BusinessException; +import vip.fuck.sm.common.exception.code.BaseResponseCode; +import vip.fuck.sm.common.utils.AssertUtil; +import vip.fuck.sm.entity.SysPermission; +import vip.fuck.sm.service.PermissionService; +import vip.fuck.sm.vo.resp.PermissionRespNode; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.noear.solon.annotation.*; +import org.noear.solon.validation.annotation.Valid; +import org.noear.solon.validation.annotation.Validated; + + +import java.util.List; + +/** + * 菜单权限管理 + * + * @author xian.zi.ming@qq.com fuck.vip + * @version V1.0 + * @date 2020年3月18日 + */ +@Mapping("/sys") +@Controller +@Api(tags = "组织模块-菜单权限管理") +@Valid +public class PermissionController { + + @Inject + private PermissionService permissionService; + + @Post @Mapping ("/permission") + @ApiOperation(value = "新增菜单权限接口") + @LogAnnotation(title = "菜单权限管理", action = "新增菜单权限") + @SaCheckPermission("sys:permission:add") + public void addPermission( @Validated SysPermission vo) { + verifyFormPid(vo); + permissionService.save(vo); + } + + @Delete @Mapping ("/permission/{id}") + @ApiOperation(value = "删除菜单权限接口") + @LogAnnotation(title = "菜单权限管理", action = "删除菜单权限") + @SaCheckPermission("sys:permission:deleted") + public void deleted(@Path("id") String id) { + permissionService.deleted(id); + } + + @Put + @Mapping ("/permission") + @ApiOperation(value = "更新菜单权限接口") + @LogAnnotation(title = "菜单权限管理", action = "更新菜单权限") + @SaCheckPermission("sys:permission:update") + public void updatePermission( @Validated SysPermission vo) { + AssertUtil.isStringNotBlank(vo.getId(), "id不能为空"); + SysPermission sysPermission = permissionService.getById(vo.getId()); + if (null == sysPermission) { + throw new BusinessException(BaseResponseCode.DATA_ERROR); + } + // 只有类型变更或者所属菜单变更 + if (sysPermission.getType().equals(vo.getType()) || !sysPermission.getPid().equals(vo.getPid())) { + verifyFormPid(vo); + } + permissionService.updatePermission(vo); + } + + @Get + @Mapping ("/permission/{id}") + @ApiOperation(value = "查询菜单权限接口") + @LogAnnotation(title = "菜单权限管理", action = "查询菜单权限") + @SaCheckPermission("sys:permission:detail") + public SysPermission detailInfo(@Path("id") String id) { + return permissionService.getById(id); + + } + + @Get @Mapping ("/permissions") + @ApiOperation(value = "获取所有菜单权限接口") + @LogAnnotation(title = "菜单权限管理", action = "获取所有菜单权限") + @SaCheckPermission("sys:permission:list") + public List getAllMenusPermission() { + return permissionService.selectAll(null); + } + + @Get @Mapping ("/permission/tree") + @ApiOperation(value = "获取所有目录菜单树接口") + @LogAnnotation(title = "菜单权限管理", action = "获取所有目录菜单树") + @SaCheckPermission(value = {"sys:permission:update", "sys:permission:add"}, mode = SaMode.OR) + public List getAllMenusPermissionTree( String permissionId) { + return permissionService.selectAllMenuByTree(permissionId); + } + + @Get @Mapping ("/permission/tree/all") + @ApiOperation(value = "获取所有目录菜单树接口") + @LogAnnotation(title = "菜单权限管理", action = "获取所有目录菜单树") + @SaCheckPermission(value = {"sys:role:update", "sys:role:add"}, mode = SaMode.OR) + public List getAllPermissionTree() { + return permissionService.selectAllByTree(1); + } + + /** + * 操作后的菜单类型是目录的时候 父级必须为目录 + * 操作后的菜单类型是菜单的时候,父类必须为目录类型 + * 操作后的菜单类型是按钮的时候 父类必须为菜单类型 + */ + private void verifyFormPid(SysPermission sysPermission) { + SysPermission parent; + parent = permissionService.getById(sysPermission.getPid()); + switch (sysPermission.getType()) { + case 1: + if (parent != null) { + if (parent.getType() != 1) { + throw new BusinessException(BaseResponseCode.OPERATION_MENU_PERMISSION_CATALOG_ERROR); + } + } else if (!"0".equals(sysPermission.getPid())) { + throw new BusinessException(BaseResponseCode.OPERATION_MENU_PERMISSION_CATALOG_ERROR); + } + break; + case 2: + if (parent == null || parent.getType() != 1) { + throw new BusinessException(BaseResponseCode.OPERATION_MENU_PERMISSION_MENU_ERROR); + } + if (StrUtil.isEmpty(sysPermission.getUrl())) { + throw new BusinessException(BaseResponseCode.OPERATION_MENU_PERMISSION_URL_NOT_NULL); + } + + break; + case 3: + if (parent == null || parent.getType() != 2) { + throw new BusinessException(BaseResponseCode.OPERATION_MENU_PERMISSION_BTN_ERROR); + } + if (StrUtil.isEmpty(sysPermission.getPerms())) { + throw new BusinessException(BaseResponseCode.OPERATION_MENU_PERMISSION_URL_PERMS_NULL); + } + if (StrUtil.isEmpty(sysPermission.getUrl())) { + throw new BusinessException(BaseResponseCode.OPERATION_MENU_PERMISSION_URL_NOT_NULL); + } + break; + default: + } + } +} diff --git a/src/main/java/vip/fuck/sm/controller/RoleController.java b/src/main/java/vip/fuck/sm/controller/RoleController.java new file mode 100644 index 0000000..127335d --- /dev/null +++ b/src/main/java/vip/fuck/sm/controller/RoleController.java @@ -0,0 +1,141 @@ +package vip.fuck.sm.controller; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.dev33.satoken.annotation.SaMode; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import vip.fuck.sm.common.aop.annotation.LogAnnotation; +import vip.fuck.sm.common.exception.BusinessException; +import vip.fuck.sm.common.utils.AssertUtil; +import vip.fuck.sm.entity.SysRole; +import vip.fuck.sm.entity.SysRoleDeptEntity; +import vip.fuck.sm.service.RolePermissionService; +import vip.fuck.sm.service.RoleService; +import vip.fuck.sm.service.SysRoleDeptService; +import vip.fuck.sm.vo.req.RolePermissionOperationReqVO; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.noear.solon.annotation.*; +import org.noear.solon.validation.annotation.Valid; +import org.noear.solon.validation.annotation.Validated; + + + +import java.util.ArrayList; +import java.util.List; + +/** + * 角色管理 + * + * @author xian.zi.ming@qq.com fuck.vip + * @version V1.0 + * @date 2020年3月18日 + */ +@Mapping("/sys") +@Controller +@Api(tags = "组织模块-角色管理") +@Valid +public class RoleController { + @Inject + private RoleService roleService; + @Inject + private SysRoleDeptService sysRoleDeptService; + @Inject + private RolePermissionService rolePermissionService; + + @Post @Mapping ("/role") + @ApiOperation(value = "新增角色接口") + @LogAnnotation(title = "角色管理", action = "新增角色") + @SaCheckPermission("sys:role:add") + public void addRole( @Validated SysRole vo) { + roleService.addRole(vo); + } + + @Delete @Mapping ("/role/{id}") + @ApiOperation(value = "删除角色接口") + @LogAnnotation(title = "角色管理", action = "删除角色") + @SaCheckPermission("sys:role:deleted") + public void deleted(@Path("id") String id) { + roleService.deletedRole(id); + } + + @Put + @Mapping ("/role") + @ApiOperation(value = "更新角色信息接口") + @LogAnnotation(title = "角色管理", action = "更新角色信息") + @SaCheckPermission("sys:role:update") + public void updateDept( SysRole vo) { + AssertUtil.isStringNotBlank(vo.getId(), "id不能为空"); + roleService.updateRole(vo); + } + + @Post @Mapping ("/role/bindDept") + @ApiOperation(value = "绑定角色部门接口") + @LogAnnotation(title = "角色管理", action = "绑定角色部门信息") + @SaCheckPermission("sys:role:bindDept") + public void bindDept( SysRole vo) { + AssertUtil.isStringNotBlank(vo.getId(), "id不能为空"); + AssertUtil.isExists(vo.getId(), "获取角色失败"); + + //先删除所有绑定 + sysRoleDeptService.remove(Wrappers.lambdaQuery().eq(SysRoleDeptEntity::getRoleId, vo.getId())); + //如果不是自定义 + if (vo.getDataScope() != 2) { + vo.setDepts(null); + } + if (!ObjectUtil.isEmpty(vo.getDepts())) { + List list = new ArrayList<>(); + for (String deptId : vo.getDepts()) { + SysRoleDeptEntity sysRoleDeptEntity = new SysRoleDeptEntity(); + sysRoleDeptEntity.setDeptId(deptId); + sysRoleDeptEntity.setRoleId(vo.getId()); + list.add(sysRoleDeptEntity); + } + sysRoleDeptService.saveBatch(list); + } + roleService.updateById(new SysRole().setId(vo.getId()).setDataScope(vo.getDataScope())); + } + + @Get + @Mapping ("/role/{id}") + @ApiOperation(value = "查询角色详情接口") + @LogAnnotation(title = "角色管理", action = "查询角色详情") + @SaCheckPermission("sys:role:detail") + public SysRole detailInfo(@Path("id") String id) { + return roleService.detailInfo(id); + } + + @Post @Mapping ("/roles") + @ApiOperation(value = "分页获取角色信息接口") + @LogAnnotation(title = "角色管理", action = "分页获取角色信息") + @SaCheckPermission("sys:role:list") + @SuppressWarnings("unchecked") + public Page pageInfo( SysRole vo) { + LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery(); + if (!StrUtil.isEmpty(vo.getName())) { + queryWrapper.like(SysRole::getName, vo.getName()); + } + if (!StrUtil.isEmpty(vo.getStartTime())) { + queryWrapper.gt(SysRole::getCreateTime, vo.getStartTime()); + } + if (!StrUtil.isEmpty(vo.getEndTime())) { + queryWrapper.lt(SysRole::getCreateTime, vo.getEndTime()); + } + if (!ObjectUtil.isEmpty(vo.getStatus())) { + queryWrapper.eq(SysRole::getStatus, vo.getStatus()); + } + queryWrapper.orderByDesc(SysRole::getCreateTime); + return roleService.page(vo.getQueryPage(), queryWrapper); + } + + @Post @Mapping ("/role/permission") + @ApiOperation(value = "修改或者新增角色菜单权限接口") + @LogAnnotation(title = "角色和菜单关联接口", action = "修改或者新增角色菜单权限") + @SaCheckPermission(value = {"sys:role:update", "sys:role:add"}, mode = SaMode.OR) + public void operationRolePermission( @Validated RolePermissionOperationReqVO vo) { + rolePermissionService.addRolePermission(vo); + } +} diff --git a/src/main/java/vip/fuck/sm/controller/SysContentController.java b/src/main/java/vip/fuck/sm/controller/SysContentController.java new file mode 100644 index 0000000..1454915 --- /dev/null +++ b/src/main/java/vip/fuck/sm/controller/SysContentController.java @@ -0,0 +1,75 @@ +package vip.fuck.sm.controller; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import vip.fuck.sm.common.utils.AssertUtil; +import vip.fuck.sm.entity.SysContentEntity; +import vip.fuck.sm.service.SysContentService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import org.noear.solon.annotation.Inject; +import org.noear.solon.annotation.Mapping; +import org.noear.solon.annotation.*; +import org.noear.solon.validation.annotation.Valid; + + + +import javax.annotation.Resource; +import java.util.List; + + +/** + * 文章管理 + * + * @author xian.zi.ming@qq.com fuck.vip + * @version V1.0 + * @date 2020年3月18日 + */ +@Api(tags = "文章管理") +@Controller +@Mapping("/sysContent") +@Valid +public class SysContentController { + @Inject + private SysContentService sysContentService; + + + @ApiOperation(value = "新增") + @Post @Mapping ("/add") + @SaCheckPermission("sysContent:add") + public void add( SysContentEntity sysContent) { + sysContentService.save(sysContent); + } + + @ApiOperation(value = "删除") + @Delete @Mapping ("/delete") + @SaCheckPermission("sysContent:delete") + public void delete( @ApiParam(value = "id集合") List ids) { + sysContentService.removeByIds(ids); + } + + @ApiOperation(value = "更新") + @Put + @Mapping ("/update") + @SaCheckPermission("sysContent:update") + public void update( SysContentEntity sysContent) { + AssertUtil.isStringNotBlank(sysContent.getId(), "id不能为空"); + sysContentService.updateById(sysContent); + } + + @ApiOperation(value = "查询分页数据") + @Post @Mapping ("/listByPage") + @SaCheckPermission("sysContent:list") + public IPage findListByPage( SysContentEntity sysContent) { + LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery(); + //查询条件示例 + if (!StrUtil.isEmpty(sysContent.getTitle())) { + queryWrapper.like(SysContentEntity::getTitle, sysContent.getTitle()); + } + return sysContentService.page(sysContent.getQueryPage(), queryWrapper); + } +} diff --git a/src/main/java/vip/fuck/sm/controller/SysDictController.java b/src/main/java/vip/fuck/sm/controller/SysDictController.java new file mode 100644 index 0000000..d17fbda --- /dev/null +++ b/src/main/java/vip/fuck/sm/controller/SysDictController.java @@ -0,0 +1,89 @@ +package vip.fuck.sm.controller; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import vip.fuck.sm.common.exception.BusinessException; +import vip.fuck.sm.common.utils.AssertUtil; +import vip.fuck.sm.entity.SysDictDetailEntity; +import vip.fuck.sm.entity.SysDictEntity; +import vip.fuck.sm.service.SysDictDetailService; +import vip.fuck.sm.service.SysDictService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import org.noear.solon.annotation.Inject; +import org.noear.solon.annotation.*; +import org.noear.solon.annotation.Put; +import org.noear.solon.validation.annotation.Valid; + + + +import javax.annotation.Resource; +import java.util.List; + + +/** + * 字典管理 + * + * @author xian.zi.ming@qq.com fuck.vip + * @version V1.0 + * @date 2020年3月18日 + */ +@Api(tags = "字典管理") +@Controller +@Mapping("/sysDict") +@Valid +public class SysDictController { + @Inject + private SysDictService sysDictService; + @Inject + private SysDictDetailService sysDictDetailService; + + + @ApiOperation(value = "新增") + @Post @Mapping ("/add") + @SaCheckPermission("sysDict:add") + public void add( SysDictEntity sysDict) { + AssertUtil.isStringNotBlank(sysDict.getName(), "字典名称不能为空"); + SysDictEntity q = sysDictService.getOne(Wrappers.lambdaQuery().eq(SysDictEntity::getName, sysDict.getName())); + AssertUtil.isNull(q, "字典名称已存在"); + sysDictService.save(sysDict); + } + + @ApiOperation(value = "删除") + @Delete @Mapping ("/delete") + @SaCheckPermission("sysDict:delete") + public void delete( @ApiParam(value = "id集合") List ids) { + sysDictService.removeByIds(ids); + //删除detail + sysDictDetailService.remove(Wrappers.lambdaQuery().in(SysDictDetailEntity::getDictId, ids)); + } + + @ApiOperation(value = "更新") + @Put + @Mapping ("/update") + @SaCheckPermission("sysDict:update") + public void update( SysDictEntity sysDict) { + AssertUtil.isStringNotBlank(sysDict.getName(), "字典名称不能为空"); + sysDictService.updateById(sysDict); + } + + @ApiOperation(value = "查询分页数据") + @Post @Mapping ("/listByPage") + @SaCheckPermission("sysDict:list") + public IPage findListByPage( SysDictEntity sysDict) { + LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery(); + //查询条件示例 + if (!StrUtil.isEmpty(sysDict.getName())) { + queryWrapper.like(SysDictEntity::getName, sysDict.getName()); + queryWrapper.or(); + queryWrapper.like(SysDictEntity::getRemark, sysDict.getName()); + } + queryWrapper.orderByAsc(SysDictEntity::getName); + return sysDictService.page(sysDict.getQueryPage(), queryWrapper); + } + +} diff --git a/src/main/java/vip/fuck/sm/controller/SysDictDetailController.java b/src/main/java/vip/fuck/sm/controller/SysDictDetailController.java new file mode 100644 index 0000000..23b033c --- /dev/null +++ b/src/main/java/vip/fuck/sm/controller/SysDictDetailController.java @@ -0,0 +1,88 @@ +package vip.fuck.sm.controller; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import vip.fuck.sm.common.exception.BusinessException; +import vip.fuck.sm.common.utils.AssertUtil; +import vip.fuck.sm.entity.SysDictDetailEntity; +import vip.fuck.sm.service.SysDictDetailService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import org.noear.solon.annotation.*; +import org.noear.solon.annotation.Inject; +import org.noear.solon.annotation.Mapping; +import org.noear.solon.annotation.Put; +import org.noear.solon.validation.annotation.Valid; + + + +import javax.annotation.Resource; +import java.util.List; + + +/** + * 字典明细管理 + * + * @author xian.zi.ming@qq.com fuck.vip + * @version V1.0 + * @date 2020年3月18日 + */ +@Api(tags = "字典明细管理") +@Controller +@Mapping("/sysDictDetail") +@Valid +public class SysDictDetailController { + @Inject + private SysDictDetailService sysDictDetailService; + + @ApiOperation(value = "新增") + @Post @Mapping ("/add") + @SaCheckPermission("sysDict:add") + public void add( SysDictDetailEntity sysDictDetail) { + AssertUtil.isStringNotBlank(sysDictDetail.getValue(), "字典值不能为空"); + LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery(); + queryWrapper.eq(SysDictDetailEntity::getValue, sysDictDetail.getValue()); + queryWrapper.eq(SysDictDetailEntity::getDictId, sysDictDetail.getDictId()); + SysDictDetailEntity q = sysDictDetailService.getOne(queryWrapper); + AssertUtil.isNull(q, "字典名称-字典值已存在"); + sysDictDetailService.save(sysDictDetail); + } + + @ApiOperation(value = "删除") + @Delete @Mapping ("/delete") + @SaCheckPermission("sysDict:delete") + public void delete( @ApiParam(value = "id集合") List ids) { + sysDictDetailService.removeByIds(ids); + } + + @ApiOperation(value = "更新") + @Put + @Mapping ("/update") + @SaCheckPermission("sysDict:update") + public void update( SysDictDetailEntity sysDictDetail) { + AssertUtil.isStringNotBlank(sysDictDetail.getValue(), "字典值不能为空"); + LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery(); + queryWrapper.eq(SysDictDetailEntity::getValue, sysDictDetail.getValue()); + queryWrapper.eq(SysDictDetailEntity::getDictId, sysDictDetail.getDictId()); + SysDictDetailEntity q = sysDictDetailService.getOne(queryWrapper); + + sysDictDetailService.updateById(sysDictDetail); + } + + + @ApiOperation(value = "查询列表数据") + @Post @Mapping ("/listByPage") + @SaCheckPermission("sysDict:list") + public IPage findListByPage( SysDictDetailEntity sysDictDetail) { + if (StrUtil.isEmpty(sysDictDetail.getDictId())) { + return new Page<>(); + } + return sysDictDetailService.listByPage(sysDictDetail.getQueryPage(), sysDictDetail.getDictId()); + } + +} diff --git a/src/main/java/vip/fuck/sm/controller/SysFilesController.java b/src/main/java/vip/fuck/sm/controller/SysFilesController.java new file mode 100644 index 0000000..7feba05 --- /dev/null +++ b/src/main/java/vip/fuck/sm/controller/SysFilesController.java @@ -0,0 +1,67 @@ +package vip.fuck.sm.controller; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.dev33.satoken.annotation.SaMode; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import vip.fuck.sm.common.exception.BusinessException; +import vip.fuck.sm.entity.SysFilesEntity; +import vip.fuck.sm.service.SysFilesService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import org.noear.solon.annotation.*; +import org.noear.solon.core.handle.Context; +import org.noear.solon.core.handle.UploadedFile; +import org.noear.solon.validation.annotation.Valid; +import org.smartboot.http.server.HttpRequest; +import org.smartboot.http.server.HttpResponse; + +import java.util.List; + + +/** + * 文件上传 + * + * @author xian.zi.ming@qq.com fuck.vip + * @version V1.0 + * @date 2020年3月18日 + */ +@Controller +@Mapping("/sysFiles") +@Api(tags = "文件管理") +@Valid +public class SysFilesController { + + @Inject + private SysFilesService sysFilesService; + + @ApiOperation(value = "新增") + @Post + @Mapping("/upload") + @SaCheckPermission(value = {"sysFiles:add", "sysContent:update", "sysContent:add"}, mode = SaMode.OR) + public String add(UploadedFile file, HttpRequest request) { + //判断文件是否空 + if (file == null || file.getName() == null || "".equalsIgnoreCase(file.getName().trim())) { + throw new BusinessException("文件为空"); + } + return sysFilesService.saveFile(file, request); + } + + @ApiOperation(value = "删除") + @Delete + @Mapping ("/delete") + @SaCheckPermission("sysFiles:delete") + public void delete( @ApiParam(value = "id集合") List ids) { + sysFilesService.removeByIdsAndFiles(ids); + } + + @ApiOperation(value = "查询分页数据") + @Post @Mapping ("/listByPage") + @SaCheckPermission("sysFiles:list") + public IPage findListByPage( SysFilesEntity sysFiles) { + return sysFilesService.page(sysFiles.getQueryPage(), Wrappers.lambdaQuery().orderByDesc(SysFilesEntity::getCreateDate)); + } + + +} diff --git a/src/main/java/vip/fuck/sm/controller/SysGeneratorController.java b/src/main/java/vip/fuck/sm/controller/SysGeneratorController.java new file mode 100644 index 0000000..44cc15d --- /dev/null +++ b/src/main/java/vip/fuck/sm/controller/SysGeneratorController.java @@ -0,0 +1,58 @@ +package vip.fuck.sm.controller; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import com.baomidou.mybatisplus.core.metadata.IPage; +import vip.fuck.sm.entity.SysGenerator; +import vip.fuck.sm.service.ISysGeneratorService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.io.IOUtils; +import org.noear.solon.annotation.Controller; +import org.noear.solon.annotation.Get; +import org.noear.solon.annotation.Inject; +import org.noear.solon.annotation.*; +import org.noear.solon.validation.annotation.Valid; +import org.smartboot.http.server.HttpResponse; + +import java.io.IOException; + +/** + * 代码生成 + * + * @author xian.zi.ming@qq.com fuck.vip + * @version V1.0 + * @date 2020年3月18日 + */ +@Api(tags = "系统模块-代码生成") +@Slf4j +@Controller +@Mapping("/sysGenerator") +@Valid +public class SysGeneratorController { + @Inject + private ISysGeneratorService sysGeneratorService; + + /** + * 生成代码 + */ + @ApiOperation(value = "生成") + @Get + @Mapping ("/gen") + @SaCheckPermission("sysGenerator:add") + public void code(String tables, HttpResponse response) throws IOException { + byte[] data = sysGeneratorService.generatorCode(tables.split(",")); + response.setHeader("Content-Disposition", "attachment; filename=\"manager.zip\""); + response.addHeader("Content-Length", "" + data.length); + response.setContentType("application/octet-stream; charset=UTF-8"); + + IOUtils.write(data, response.getOutputStream()); + } + + @ApiOperation(value = "查询分页数据") + @Post @Mapping ("/listByPage") + @SaCheckPermission("sysGenerator:list") + public IPage findListByPage( SysGenerator vo) { + return sysGeneratorService.selectAllTables(vo.getQueryPage(), vo); + } +} diff --git a/src/main/java/vip/fuck/sm/controller/SysLogController.java b/src/main/java/vip/fuck/sm/controller/SysLogController.java new file mode 100644 index 0000000..5bf0139 --- /dev/null +++ b/src/main/java/vip/fuck/sm/controller/SysLogController.java @@ -0,0 +1,64 @@ +package vip.fuck.sm.controller; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import vip.fuck.sm.common.aop.annotation.LogAnnotation; +import vip.fuck.sm.entity.SysLog; +import vip.fuck.sm.service.LogService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.noear.solon.annotation.*; +import org.noear.solon.validation.annotation.Valid; + + +import javax.annotation.Resource; +import java.util.List; + +/** + * 系统操作日志 + * + * @author xian.zi.ming@qq.com fuck.vip + * @version V1.0 + * @date 2020年3月18日 + */ +@Mapping("/sys") +@Api(tags = "系统模块-系统操作日志管理") +@Controller +@Valid +public class SysLogController { + @Inject + private LogService logService; + + @Post @Mapping ("/logs") + @ApiOperation(value = "分页查询系统操作日志接口") + @LogAnnotation(title = "系统操作日志管理", action = "分页查询系统操作日志") + @SaCheckPermission("sys:log:list") + public Page pageInfo( SysLog vo) { + LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery(); + if (!StrUtil.isEmpty(vo.getUsername())) { + queryWrapper.like(SysLog::getUsername, vo.getUsername()); + } + if (!StrUtil.isEmpty(vo.getOperation())) { + queryWrapper.like(SysLog::getOperation, vo.getOperation()); + } + if (!StrUtil.isEmpty(vo.getStartTime())) { + queryWrapper.gt(SysLog::getCreateTime, vo.getStartTime()); + } + if (!StrUtil.isEmpty(vo.getEndTime())) { + queryWrapper.lt(SysLog::getCreateTime, vo.getEndTime()); + } + queryWrapper.orderByDesc(SysLog::getCreateTime); + return logService.page(vo.getQueryPage(), queryWrapper); + } + + @Delete @Mapping ("/logs") + @ApiOperation(value = "删除日志接口") + @LogAnnotation(title = "系统操作日志管理", action = "删除系统操作日志") + @SaCheckPermission("sys:log:deleted") + public void deleted( List logIds) { + logService.removeByIds(logIds); + } +} diff --git a/src/main/java/vip/fuck/sm/controller/UserController.java b/src/main/java/vip/fuck/sm/controller/UserController.java new file mode 100644 index 0000000..285b371 --- /dev/null +++ b/src/main/java/vip/fuck/sm/controller/UserController.java @@ -0,0 +1,217 @@ +package vip.fuck.sm.controller; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.dev33.satoken.stp.StpUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import vip.fuck.sm.common.aop.annotation.LogAnnotation; +import vip.fuck.sm.common.exception.BusinessException; +import vip.fuck.sm.common.exception.code.BaseResponseCode; +import vip.fuck.sm.common.utils.AssertUtil; +import vip.fuck.sm.common.utils.DataResult; +import vip.fuck.sm.entity.SysUser; +import vip.fuck.sm.entity.SysUserRole; +import vip.fuck.sm.service.HomeService; +import vip.fuck.sm.service.UserRoleService; +import vip.fuck.sm.service.UserService; +import vip.fuck.sm.vo.req.UserRoleOperationReqVO; +import vip.fuck.sm.vo.resp.HomeRespVO; +import vip.fuck.sm.vo.resp.LoginRespVO; +import vip.fuck.sm.vo.resp.UserOwnRoleRespVO; +import com.wf.captcha.ArithmeticCaptcha; +import com.wf.captcha.utils.CaptchaUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import lombok.extern.slf4j.Slf4j; +import org.noear.solon.annotation.*; +import org.noear.solon.boot.smarthttp.http.SmHttpContext; +import org.noear.solon.core.handle.Context; +import org.noear.solon.validation.annotation.Valid; +import org.noear.solon.validation.annotation.Validated; + + + + +import java.io.IOException; +import java.util.List; + +/** + * 用户管理 + * + * @author xian.zi.ming@qq.com fuck.vip + * @version V1.0 + * @date 2020年3月18日 + */ +@Controller +@Api(tags = "组织模块-用户管理") +@Mapping("/sys") +@Slf4j +@Valid +public class UserController { + @Inject + private UserService userService; + @Inject + private UserRoleService userRoleService; + @Inject + private HomeService homeService; + + /** + * 获取验证码图片 + * Gets captcha code. + * + * @param ctx the request + * @throws IOException the io exception + */ + @Mapping("/getVerify") + public void getCaptchaCode(Context ctx ) throws IOException { + ArithmeticCaptcha captcha = new ArithmeticCaptcha(130, 48); + captcha.setLen(2); + ctx.sessionSet("captcha",captcha.text().toLowerCase()); + captcha.out(ctx.outputStream()); + } + + + @Post @Mapping (value = "/user/login") + @ApiOperation(value = "用户登录接口") + public LoginRespVO login(@Validated SysUser vo, Context ctx) { + //判断验证码 + if (!ObjectUtil.equal(vo.getCaptcha(),""+ctx.session("captcha") )) { + // 清除session中的验证码 + ctx.sessionRemove("captcha"); + throw new BusinessException("验证码错误!"); + } + LoginRespVO login = userService.login(vo); + ctx.sessionSet("currentUserName",login.getUsername()); + return login; + } + + @Get + @Mapping ("/home") + @ApiOperation(value = "获取首页数据接口") + public HomeRespVO getHomeInfo() { + //通过access_token拿userId + String userId = StpUtil.getLoginIdAsString(); + DataResult result = DataResult.success(); + return homeService.getHomeInfo(userId); + } + + @Post @Mapping ("/user/register") + @ApiOperation(value = "用户注册接口") + public void register( @Validated SysUser vo) { + userService.register(vo); + } + + @Get @Mapping ("/user/unLogin") + @ApiOperation(value = "引导客户端去登录") + public void unLogin() { + throw new BusinessException(BaseResponseCode.TOKEN_ERROR); + } + + @Put + @Mapping ("/user") + @ApiOperation(value = "更新用户信息接口") + @LogAnnotation(title = "用户管理", action = "更新用户信息") + @SaCheckPermission("sys:user:update") + public void updateUserInfo( SysUser vo) { + AssertUtil.isStringNotBlank(vo.getId(), "id不能为空"); + + userService.updateUserInfo(vo); + } + + @Put @Mapping ("/user/info") + @ApiOperation(value = "更新用户信息接口") + @LogAnnotation(title = "用户管理", action = "更新用户信息") + public void updateUserInfoById( SysUser vo) { + userService.updateUserInfoMy(vo); + } + + @Get @Mapping ("/user/{id}") + @ApiOperation(value = "查询用户详情接口") + @LogAnnotation(title = "用户管理", action = "查询用户详情") + @SaCheckPermission("sys:user:detail") + public SysUser detailInfo(@Path("id") String id) { + return userService.getById(id); + } + + @Get @Mapping ("/user") + @ApiOperation(value = "查询用户详情接口") + @LogAnnotation(title = "用户管理", action = "查询用户详情") + public SysUser youSelfInfo() { + String userId = StpUtil.getLoginIdAsString(); + return userService.getById(userId); + } + + @Post @Mapping ("/users") + @ApiOperation(value = "分页获取用户列表接口") + @SaCheckPermission("sys:user:list") + @LogAnnotation(title = "用户管理", action = "分页获取用户列表") + public IPage pageInfo( SysUser vo) { + return userService.pageInfo(vo); + } + + @Post @Mapping ("/user") + @ApiOperation(value = "新增用户接口") + @SaCheckPermission("sys:user:add") + @LogAnnotation(title = "用户管理", action = "新增用户") + public void addUser( @Validated SysUser vo) { + userService.addUser(vo); + } + + @Get @Mapping ("/user/logout") + @ApiOperation(value = "退出接口") + public void logout() { + StpUtil.logout(); + } + + @Put @Mapping ("/user/pwd") + @ApiOperation(value = "修改密码接口") + @LogAnnotation(title = "用户管理", action = "更新密码") + public void updatePwd( SysUser vo) { + if (StrUtil.isEmpty(vo.getOldPwd()) || StrUtil.isEmpty(vo.getNewPwd())) { + throw new BusinessException("旧密码与新密码不能为空"); + } + vo.setId(StpUtil.getLoginIdAsString()); + userService.updatePwd(vo); + } + + @Delete @Mapping ("/user") + @ApiOperation(value = "删除用户接口") + @LogAnnotation(title = "用户管理", action = "删除用户") + @SaCheckPermission("sys:user:deleted") + public void deletedUser( @ApiParam(value = "用户id集合") List userIds) { + //删除用户, 删除redis的绑定的角色跟权限 + LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery(); + queryWrapper.in(SysUser::getId, userIds); + userService.remove(queryWrapper); + } + + @Get @Mapping ("/user/roles/{userId}") + @ApiOperation(value = "赋予角色-获取所有角色接口") + @LogAnnotation(title = "用户管理", action = "赋予角色-获取所有角色接口") + @SaCheckPermission("sys:user:role:detail") + public UserOwnRoleRespVO getUserOwnRole(@Path("userId") String userId) { + DataResult result = DataResult.success(); + return userService.getUserOwnRole(userId); + } + + @Put @Mapping ("/user/roles/{userId}") + @ApiOperation(value = "赋予角色-用户赋予角色接口") + @LogAnnotation(title = "用户管理", action = "赋予角色-用户赋予角色接口") + @SaCheckPermission("sys:user:role:update") + public void setUserOwnRole(@Path("userId") String userId, List roleIds) { + + LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery(); + queryWrapper.eq(SysUserRole::getUserId, userId); + userRoleService.remove(queryWrapper); + if (!ObjectUtil.isEmpty(roleIds)) { + UserRoleOperationReqVO reqVO = new UserRoleOperationReqVO(); + reqVO.setUserId(userId); + reqVO.setRoleIds(roleIds); + userRoleService.addUserRoleInfo(reqVO); + } + } +} diff --git a/src/main/java/vip/fuck/sm/controller/UserRoleController.java b/src/main/java/vip/fuck/sm/controller/UserRoleController.java new file mode 100644 index 0000000..b692caf --- /dev/null +++ b/src/main/java/vip/fuck/sm/controller/UserRoleController.java @@ -0,0 +1,36 @@ +package vip.fuck.sm.controller; + +import vip.fuck.sm.common.aop.annotation.LogAnnotation; +import vip.fuck.sm.service.UserRoleService; +import vip.fuck.sm.vo.req.UserRoleOperationReqVO; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.noear.solon.annotation.*; +import org.noear.solon.validation.annotation.Valid; +import org.noear.solon.validation.annotation.Validated; + + + + +/** + * 用户和角色关联 + * + * @author xian.zi.ming@qq.com fuck.vip + * @version V1.0 + * @date 2020年3月18日 + */ +@Mapping("/sys") +@Controller +@Api(tags = "组织管理-用户和角色关联接口") +@Valid +public class UserRoleController { + @Inject + private UserRoleService userRoleService; + + @Post @Mapping("/user/role") + @ApiOperation(value = "修改或者新增用户角色接口") + @LogAnnotation(title = "用户和角色关联接口", action = "修改或者新增用户角色") + public void operationUserRole( @Validated UserRoleOperationReqVO vo) { + userRoleService.addUserRoleInfo(vo); + } +} diff --git a/src/main/java/vip/fuck/sm/controller/api/TestController.java b/src/main/java/vip/fuck/sm/controller/api/TestController.java new file mode 100644 index 0000000..402a23a --- /dev/null +++ b/src/main/java/vip/fuck/sm/controller/api/TestController.java @@ -0,0 +1,44 @@ +package vip.fuck.sm.controller.api; + +import cn.dev33.satoken.stp.SaTokenInfo; +import cn.dev33.satoken.stp.StpUtil; +import cn.dev33.satoken.util.SaResult; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.noear.solon.annotation.Get; +import org.noear.solon.annotation.*; + + +/** + * api test示例 + * + * @author xian.zi.ming@qq.com fuck.vip + * @version V1.0 + * @date 2020年5月11日 + */ +@Controller +@Mapping("/app/api") +@Api(tags = "test") +public class TestController { + + + @Post @Mapping ("/login") + @ApiOperation(value = "登录接口") + public SaResult login() { + // 第1步,先登录上 + StpUtil.login(10001); + // 第2步,获取 Token 相关参数 + SaTokenInfo tokenInfo = StpUtil.getTokenInfo(); + // 第3步,返回给前端 + return SaResult.data(tokenInfo); + } + + + @Get + @Mapping ("/getCurUserInfo") + @ApiOperation(value = "获取当前登录人信息示例") + public void getAppUserInfo() { + //拿userId与userName + String userId = StpUtil.getLoginIdAsString(); + } +} diff --git a/src/main/java/vip/fuck/sm/entity/BasePageEntity.java b/src/main/java/vip/fuck/sm/entity/BasePageEntity.java new file mode 100644 index 0000000..d6004a4 --- /dev/null +++ b/src/main/java/vip/fuck/sm/entity/BasePageEntity.java @@ -0,0 +1,38 @@ +package vip.fuck.sm.entity; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; + +/** + * BaseEntity + * + * @author xian.zi.ming@qq.com fuck.vip + * @version V1.0 + * @date 2020年3月18日 + */ +@Data +@JsonIgnoreProperties(value = { "getQueryPage"}) +public class BasePageEntity { + @TableField(exist = false) + @JsonProperty(access = JsonProperty.Access.WRITE_ONLY) + private Integer page; + + @TableField(exist = false) + @JsonProperty(access = JsonProperty.Access.WRITE_ONLY) + private Integer limit; + + /** + * page条件 + * + * @param + * @return + */ + @JsonIgnore + public Page getQueryPage() { + return new Page(page == null ? 1 : page, limit == null ? 10 : limit); + } +} diff --git a/src/main/java/vip/fuck/sm/entity/ColumnEntity.java b/src/main/java/vip/fuck/sm/entity/ColumnEntity.java new file mode 100644 index 0000000..f4b6623 --- /dev/null +++ b/src/main/java/vip/fuck/sm/entity/ColumnEntity.java @@ -0,0 +1,104 @@ +package vip.fuck.sm.entity; + +import lombok.Data; + +/** + * 代码生成 列属性 + * + * @author xian.zi.ming@qq.com fuck.vip + * @version V1.0 + * @date 2020年3月18日 + */ +@Data +public class ColumnEntity { + /** + * 列名 + */ + private String columnName; + + /** + * 列名类型 + */ + private String dataType; + + /** + * 列名备注 + */ + private String comments; + + /** + * 属性名称(第一个字母大写),如:user_name => UserName + */ + private String attrName; + + /** + * 属性名称(第一个字母小写),如:user_name => userName + */ + private String attrname; + + /** + * 属性类型 + */ + private String attrType; + + /** + * auto_increment + */ + private String extra; + + public String getColumnName() { + return columnName; + } + + public void setColumnName(String columnName) { + this.columnName = columnName; + } + + public String getDataType() { + return dataType; + } + + public void setDataType(String dataType) { + this.dataType = dataType; + } + + public String getComments() { + return comments; + } + + public void setComments(String comments) { + this.comments = comments; + } + + public String getAttrname() { + return attrname; + } + + public void setAttrname(String attrname) { + this.attrname = attrname; + } + + public String getAttrName() { + return attrName; + } + + public void setAttrName(String attrName) { + this.attrName = attrName; + } + + public String getAttrType() { + return attrType; + } + + public void setAttrType(String attrType) { + this.attrType = attrType; + } + + public String getExtra() { + return extra; + } + + public void setExtra(String extra) { + this.extra = extra; + } +} diff --git a/src/main/java/vip/fuck/sm/entity/SysContentEntity.java b/src/main/java/vip/fuck/sm/entity/SysContentEntity.java new file mode 100644 index 0000000..65deaef --- /dev/null +++ b/src/main/java/vip/fuck/sm/entity/SysContentEntity.java @@ -0,0 +1,78 @@ +package vip.fuck.sm.entity; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; +import java.util.Date; + +/** + * 内容管理 + * + * @author xian.zi.ming@qq.com fuck.vip + * @version V1.0 + * @date 2020年3月18日 + */ +@EqualsAndHashCode(callSuper = true) +@Data +@TableName("sys_content") +public class SysContentEntity extends BasePageEntity implements Serializable { + private static final long serialVersionUID = 1L; + + /** + * 主键id + */ + @TableId("id") + private String id; + + /** + * 主题 + */ + @TableField("title") + private String title; + + /** + * 内容 + */ + @TableField("content") + private String content; + + /** + * 单个图片url + */ + private String oneImg; + + /** + * 多个图片url + */ + private String multipleImg; + + /** + * 关键字 + */ + private String keywords; + + /** + * 类型(数据字典) + */ + @TableField("type") + private String type; + + /** + * 创建人 + */ + @TableField(value = "create_id", fill = FieldFill.INSERT) + private String createId; + + /** + * 创建时间 + */ + @TableField(value = "create_time", fill = FieldFill.INSERT) + private Date createTime; + + +} diff --git a/src/main/java/vip/fuck/sm/entity/SysDept.java b/src/main/java/vip/fuck/sm/entity/SysDept.java new file mode 100644 index 0000000..7262073 --- /dev/null +++ b/src/main/java/vip/fuck/sm/entity/SysDept.java @@ -0,0 +1,54 @@ +package vip.fuck.sm.entity; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import lombok.Data; +import org.noear.solon.validation.annotation.NotBlank; + +import java.io.Serializable; +import java.util.Date; + +/** + * 部门 + * + * @author xian.zi.ming@qq.com fuck.vip + * @version V1.0 + * @date 2020年3月18日 + */ +@Data +public class SysDept implements Serializable { + @TableId + private String id; + + private String deptNo; + + @NotBlank(message = "机构名称不能为空") + private String name; + + @NotBlank(message = "父级不能为空") + private String pid; + + @TableField(exist = false) + private String pidName; + + private Integer status; + + private String relationCode; + + private String deptManagerId; + + private String managerName; + + private String phone; + + @TableField(fill = FieldFill.INSERT) + private Date createTime; + + @TableField(fill = FieldFill.INSERT_UPDATE) + private Date updateTime; + + @TableField(fill = FieldFill.INSERT) + private Integer deleted; + +} \ No newline at end of file diff --git a/src/main/java/vip/fuck/sm/entity/SysDictDetailEntity.java b/src/main/java/vip/fuck/sm/entity/SysDictDetailEntity.java new file mode 100644 index 0000000..94497de --- /dev/null +++ b/src/main/java/vip/fuck/sm/entity/SysDictDetailEntity.java @@ -0,0 +1,68 @@ +package vip.fuck.sm.entity; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; +import java.util.Date; + +/** + * 字典明细 + * + * @author xian.zi.ming@qq.com fuck.vip + * @version V1.0 + * @date 2020年3月18日 + */ +@EqualsAndHashCode(callSuper = true) +@Data +@TableName("sys_dict_detail") +public class SysDictDetailEntity extends BasePageEntity implements Serializable { + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId("id") + private String id; + + /** + * 字典标签 + */ + @TableField("label") + private String label; + + /** + * 字典值 + */ + @TableField("value") + private String value; + + /** + * 排序 + */ + @TableField("sort") + private Integer sort; + + /** + * 字典id + */ + @TableField("dict_id") + private String dictId; + + /** + * 创建日期 + */ + @TableField(value = "create_time", fill = FieldFill.INSERT) + private Date createTime; + + /** + * 字典name + */ + @TableField(exist = false) + private String dictName; + +} diff --git a/src/main/java/vip/fuck/sm/entity/SysDictEntity.java b/src/main/java/vip/fuck/sm/entity/SysDictEntity.java new file mode 100644 index 0000000..59ff5e9 --- /dev/null +++ b/src/main/java/vip/fuck/sm/entity/SysDictEntity.java @@ -0,0 +1,51 @@ +package vip.fuck.sm.entity; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; +import java.util.Date; + +/** + * 字典管理 + * + * @author xian.zi.ming@qq.com fuck.vip + * @version V1.0 + * @date 2020年3月18日 + */ +@EqualsAndHashCode(callSuper = true) +@Data +@TableName("sys_dict") +public class SysDictEntity extends BasePageEntity implements Serializable { + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId("id") + private String id; + + /** + * 字典名称 + */ + @TableField("name") + private String name; + + /** + * 备注 + */ + @TableField("remark") + private String remark; + + /** + * 创建时间 + */ + @TableField(value = "create_time", fill = FieldFill.INSERT) + private Date createTime; + + +} diff --git a/src/main/java/vip/fuck/sm/entity/SysFilesEntity.java b/src/main/java/vip/fuck/sm/entity/SysFilesEntity.java new file mode 100644 index 0000000..5c4f1ac --- /dev/null +++ b/src/main/java/vip/fuck/sm/entity/SysFilesEntity.java @@ -0,0 +1,51 @@ +package vip.fuck.sm.entity; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; +import java.util.Date; + +/** + * 文件上传 + * + * @author xian.zi.ming@qq.com fuck.vip + * @version V1.0 + * @date 2020年3月18日 + */ +@EqualsAndHashCode(callSuper = true) +@Data +@TableName("sys_files") +public class SysFilesEntity extends BasePageEntity implements Serializable { + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId("id") + private String id; + + /** + * URL地址 + */ + @TableField("url") + private String url; + + /** + * 创建时间 + */ + @TableField(value = "create_date", fill = FieldFill.INSERT) + private Date createDate; + + @TableField("file_name") + private String fileName; + + @TableField("file_path") + private String filePath; + + +} diff --git a/src/main/java/vip/fuck/sm/entity/SysGenerator.java b/src/main/java/vip/fuck/sm/entity/SysGenerator.java new file mode 100644 index 0000000..cfc75c0 --- /dev/null +++ b/src/main/java/vip/fuck/sm/entity/SysGenerator.java @@ -0,0 +1,30 @@ +package vip.fuck.sm.entity; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; + +/** + * 代码生成 + * + * @author xian.zi.ming@qq.com fuck.vip + * @version V1.0 + * @date 2020年3月18日 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +public class SysGenerator extends BasePageEntity implements Serializable { + + private static final long serialVersionUID = 1L; + + private String tableName; + + private Date createTime; + + private String tableComment; + +} diff --git a/src/main/java/vip/fuck/sm/entity/SysLog.java b/src/main/java/vip/fuck/sm/entity/SysLog.java new file mode 100644 index 0000000..d444de1 --- /dev/null +++ b/src/main/java/vip/fuck/sm/entity/SysLog.java @@ -0,0 +1,48 @@ +package vip.fuck.sm.entity; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; +import java.util.Date; + +/** + * 操作日志 + * + * @author xian.zi.ming@qq.com fuck.vip + * @version V1.0 + * @date 2020年3月18日 + */ +@EqualsAndHashCode(callSuper = true) +@Data +public class SysLog extends BasePageEntity implements Serializable { + @TableId + private String id; + + private String userId; + + private String username; + + private String operation; + + private Integer time; + + private String method; + + private String params; + + private String ip; + + @TableField(fill = FieldFill.INSERT) + private Date createTime; + + @TableField(exist = false) + private String startTime; + + @TableField(exist = false) + private String endTime; + +} \ No newline at end of file diff --git a/src/main/java/vip/fuck/sm/entity/SysPermission.java b/src/main/java/vip/fuck/sm/entity/SysPermission.java new file mode 100644 index 0000000..3127fa9 --- /dev/null +++ b/src/main/java/vip/fuck/sm/entity/SysPermission.java @@ -0,0 +1,63 @@ +package vip.fuck.sm.entity; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import lombok.Data; +import org.noear.solon.validation.annotation.NotBlank; +import org.noear.solon.validation.annotation.NotNull; + +import java.io.Serializable; +import java.util.Date; + +/** + * 权限菜单 + * + * @author xian.zi.ming@qq.com fuck.vip + * @version V1.0 + * @date 2020年3月18日 + */ +@Data +public class SysPermission implements Serializable { + + + @TableId + private String id; + + @NotBlank(message = "菜单权限名称不能为空") + private String name; + + private String perms; + + private String url; + + private String icon; + + private String target; + + @NotNull(message = "所属菜单不能为空") + private String pid; + + private Integer orderNum; + + @NotNull(message = "菜单权限类型不能为空") + private Integer type; + + /** + * 1正常 2禁用 + */ + private Integer status; + + @TableField(fill = FieldFill.INSERT) + private Date createTime; + + @TableField(fill = FieldFill.INSERT_UPDATE) + private Date updateTime; + + @TableField(fill = FieldFill.INSERT) + private Integer deleted; + + @TableField(exist = false) + private String pidName; + +} \ No newline at end of file diff --git a/src/main/java/vip/fuck/sm/entity/SysRole.java b/src/main/java/vip/fuck/sm/entity/SysRole.java new file mode 100644 index 0000000..5c1eff9 --- /dev/null +++ b/src/main/java/vip/fuck/sm/entity/SysRole.java @@ -0,0 +1,66 @@ +package vip.fuck.sm.entity; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import vip.fuck.sm.vo.resp.DeptRespNodeVO; +import vip.fuck.sm.vo.resp.PermissionRespNode; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +import org.noear.solon.validation.annotation.NotBlank; + +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +/** + * 角色 + * + * @author xian.zi.ming@qq.com fuck.vip + * @version V1.0 + * @date 2020年3月18日 + */ +@EqualsAndHashCode(callSuper = true) +@Data +@Accessors(chain = true) +public class SysRole extends BasePageEntity implements Serializable { + @TableId + private String id; + + @NotBlank(message = "名称不能为空") + private String name; + + private String description; + + private Integer status; + + private Integer dataScope; + + @TableField(fill = FieldFill.INSERT) + private Date createTime; + + @TableField(fill = FieldFill.INSERT_UPDATE) + private Date updateTime; + + @TableField(fill = FieldFill.INSERT) + private Integer deleted; + + @TableField(exist = false) + private List permissionRespNodes; + @TableField(exist = false) + private List deptRespNodes; + + @TableField(exist = false) + private String startTime; + + @TableField(exist = false) + private String endTime; + + @TableField(exist = false) + private List permissions; + + @TableField(exist = false) + private List depts; + +} \ No newline at end of file diff --git a/src/main/java/vip/fuck/sm/entity/SysRoleDeptEntity.java b/src/main/java/vip/fuck/sm/entity/SysRoleDeptEntity.java new file mode 100644 index 0000000..5f2c854 --- /dev/null +++ b/src/main/java/vip/fuck/sm/entity/SysRoleDeptEntity.java @@ -0,0 +1,49 @@ +package vip.fuck.sm.entity; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + * 角色部门 + * + * @author xian.zi.ming@qq.com fuck.vip + * @email *****@mail.com + * @date 2020-09-27 17:30:15 + */ +@Data +@TableName("sys_role_dept") +public class SysRoleDeptEntity extends BasePageEntity implements Serializable { + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId("id") + private String id; + + /** + * 角色id + */ + @TableField("role_id") + private String roleId; + + /** + * 菜单权限id + */ + @TableField("dept_id") + private String deptId; + + /** + * 创建时间 + */ + @TableField(value = "create_time", fill = FieldFill.INSERT) + private Date createTime; + + +} diff --git a/src/main/java/vip/fuck/sm/entity/SysRolePermission.java b/src/main/java/vip/fuck/sm/entity/SysRolePermission.java new file mode 100644 index 0000000..6e76d9f --- /dev/null +++ b/src/main/java/vip/fuck/sm/entity/SysRolePermission.java @@ -0,0 +1,30 @@ +package vip.fuck.sm.entity; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + * 角色权限 + * + * @author xian.zi.ming@qq.com fuck.vip + * @version V1.0 + * @date 2020年3月18日 + */ +@Data +public class SysRolePermission implements Serializable { + @TableId + private String id; + + private String roleId; + + private String permissionId; + + @TableField(fill = FieldFill.INSERT) + private Date createTime; + +} \ No newline at end of file diff --git a/src/main/java/vip/fuck/sm/entity/SysUser.java b/src/main/java/vip/fuck/sm/entity/SysUser.java new file mode 100644 index 0000000..44194a0 --- /dev/null +++ b/src/main/java/vip/fuck/sm/entity/SysUser.java @@ -0,0 +1,88 @@ +package vip.fuck.sm.entity; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.noear.solon.validation.annotation.NotBlank; + +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +/** + * 用户 + * + * @author xian.zi.ming@qq.com fuck.vip + * @version V1.0 + * @date 2020年3月18日 + */ +@EqualsAndHashCode(callSuper = true) +@Data +public class SysUser extends BasePageEntity implements Serializable { + @TableId + private String id; + + @NotBlank(message = "账号不能为空") + private String username; + + private String salt; + + @NotBlank(message = "密码不能为空") + private String password; + + @TableField(exist = false) + private String oldPwd; + + @TableField(exist = false) + private String newPwd; + + private String phone; + + private String deptId; + + @TableField(exist = false) + private String deptName; + + @TableField(exist = false) + private String deptNo; + + + private String realName; + + private String nickName; + + private String email; + + private Integer status; + + private Integer sex; + + @TableField(fill = FieldFill.INSERT) + private Integer deleted; + + private String createId; + + private String updateId; + + private Integer createWhere; + + @TableField(fill = FieldFill.INSERT) + private Date createTime; + + @TableField(fill = FieldFill.INSERT_UPDATE) + private Date updateTime; + + @TableField(exist = false) + private String startTime; + + @TableField(exist = false) + private String endTime; + + @TableField(exist = false) + private List roleIds; + + @TableField(exist = false) + private String captcha; +} \ No newline at end of file diff --git a/src/main/java/vip/fuck/sm/entity/SysUserRole.java b/src/main/java/vip/fuck/sm/entity/SysUserRole.java new file mode 100644 index 0000000..8f5a752 --- /dev/null +++ b/src/main/java/vip/fuck/sm/entity/SysUserRole.java @@ -0,0 +1,31 @@ +package vip.fuck.sm.entity; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + * 用户角色 + * + * @author xian.zi.ming@qq.com fuck.vip + * @version V1.0 + * @date 2020年3月18日 + */ +@Data +public class SysUserRole implements Serializable { + @TableId + private String id; + + private String userId; + + private String roleId; + + @TableField(fill = FieldFill.INSERT) + private Date createTime; + + +} \ No newline at end of file diff --git a/src/main/java/vip/fuck/sm/entity/TableEntity.java b/src/main/java/vip/fuck/sm/entity/TableEntity.java new file mode 100644 index 0000000..b8dd062 --- /dev/null +++ b/src/main/java/vip/fuck/sm/entity/TableEntity.java @@ -0,0 +1,93 @@ +package vip.fuck.sm.entity; + +import java.util.List; + +/** + * 代码生成 表数据 + * + * @author xian.zi.ming@qq.com fuck.vip + * @version V1.0 + * @date 2020年3月18日 + */ +public class TableEntity { + //表的名称 + private String tableName; + //表的备注 + private String comments; + //表的主键 + private ColumnEntity pk; + //表的列名(不包含主键) + private List columns; + private List htmlColumns; + + //类名(第一个字母大写),如:sys_user => SysUser + private String className; + //类名(第一个字母小写),如:sys_user => sysUser + private String classname; + //类名(都小写),如:sys_user => sysuser + private String classNameLower; + + public List getHtmlColumns() { + return htmlColumns; + } + + public void setHtmlColumns(List htmlColumns) { + this.htmlColumns = htmlColumns; + } + + public String getTableName() { + return tableName; + } + + public void setTableName(String tableName) { + this.tableName = tableName; + } + + public String getComments() { + return comments; + } + + public void setComments(String comments) { + this.comments = comments; + } + + public ColumnEntity getPk() { + return pk; + } + + public void setPk(ColumnEntity pk) { + this.pk = pk; + } + + public List getColumns() { + return columns; + } + + public void setColumns(List columns) { + this.columns = columns; + } + + public String getClassName() { + return className; + } + + public void setClassName(String className) { + this.className = className; + } + + public String getClassname() { + return classname; + } + + public void setClassname(String classname) { + this.classname = classname; + } + + public String getClassNameLower() { + return classNameLower; + } + + public void setClassNameLower(String classNameLower) { + this.classNameLower = classNameLower; + } +} diff --git a/src/main/java/vip/fuck/sm/mapper/GeneratorMapper.java b/src/main/java/vip/fuck/sm/mapper/GeneratorMapper.java new file mode 100644 index 0000000..24fe714 --- /dev/null +++ b/src/main/java/vip/fuck/sm/mapper/GeneratorMapper.java @@ -0,0 +1,28 @@ +package vip.fuck.sm.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import vip.fuck.sm.entity.SysGenerator; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + * 代码生成 Mapper + * + * @author xian.zi.ming@qq.com fuck.vip + * @version V1.0 + * @date 2020年3月18日 + */ +@Mapper +public interface GeneratorMapper extends BaseMapper { + + IPage selectAllTables(Page page, @Param(value = "vo") SysGenerator vo); + + Map queryTable(String tableName); + + List> queryColumns(String tableName); +} diff --git a/src/main/java/vip/fuck/sm/mapper/SysContentMapper.java b/src/main/java/vip/fuck/sm/mapper/SysContentMapper.java new file mode 100644 index 0000000..593d76a --- /dev/null +++ b/src/main/java/vip/fuck/sm/mapper/SysContentMapper.java @@ -0,0 +1,17 @@ +package vip.fuck.sm.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import vip.fuck.sm.entity.SysContentEntity; +import org.apache.ibatis.annotations.Mapper; + +/** + * 内容管理 Mapper + * + * @author xian.zi.ming@qq.com fuck.vip + * @version V1.0 + * @date 2020年3月18日 + */ +@Mapper +public interface SysContentMapper extends BaseMapper { + +} diff --git a/src/main/java/vip/fuck/sm/mapper/SysDeptMapper.java b/src/main/java/vip/fuck/sm/mapper/SysDeptMapper.java new file mode 100644 index 0000000..2b7ae28 --- /dev/null +++ b/src/main/java/vip/fuck/sm/mapper/SysDeptMapper.java @@ -0,0 +1,16 @@ +package vip.fuck.sm.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import vip.fuck.sm.entity.SysDept; +import org.apache.ibatis.annotations.Mapper; + +/** + * 部门 Mapper + * + * @author xian.zi.ming@qq.com fuck.vip + * @version V1.0 + * @date 2020年3月18日 + */ +@Mapper +public interface SysDeptMapper extends BaseMapper { +} \ No newline at end of file diff --git a/src/main/java/vip/fuck/sm/mapper/SysDictDetailMapper.java b/src/main/java/vip/fuck/sm/mapper/SysDictDetailMapper.java new file mode 100644 index 0000000..ef503dd --- /dev/null +++ b/src/main/java/vip/fuck/sm/mapper/SysDictDetailMapper.java @@ -0,0 +1,17 @@ +package vip.fuck.sm.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import vip.fuck.sm.entity.SysDictDetailEntity; +import org.apache.ibatis.annotations.Mapper; + +/** + * 字典详情 Mapper + * + * @author xian.zi.ming@qq.com fuck.vip + * @version V1.0 + * @date 2020年3月18日 + */ +@Mapper +public interface SysDictDetailMapper extends BaseMapper { + +} diff --git a/src/main/java/vip/fuck/sm/mapper/SysDictMapper.java b/src/main/java/vip/fuck/sm/mapper/SysDictMapper.java new file mode 100644 index 0000000..270b5fa --- /dev/null +++ b/src/main/java/vip/fuck/sm/mapper/SysDictMapper.java @@ -0,0 +1,17 @@ +package vip.fuck.sm.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import vip.fuck.sm.entity.SysDictEntity; +import org.apache.ibatis.annotations.Mapper; + +/** + * 字典 Mapper + * + * @author xian.zi.ming@qq.com fuck.vip + * @version V1.0 + * @date 2020年3月18日 + */ +@Mapper +public interface SysDictMapper extends BaseMapper { + +} diff --git a/src/main/java/vip/fuck/sm/mapper/SysFilesMapper.java b/src/main/java/vip/fuck/sm/mapper/SysFilesMapper.java new file mode 100644 index 0000000..9859cf7 --- /dev/null +++ b/src/main/java/vip/fuck/sm/mapper/SysFilesMapper.java @@ -0,0 +1,17 @@ +package vip.fuck.sm.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import vip.fuck.sm.entity.SysFilesEntity; +import org.apache.ibatis.annotations.Mapper; + +/** + * 文件上传 Mapper + * + * @author xian.zi.ming@qq.com fuck.vip + * @version V1.0 + * @date 2020年3月18日 + */ +@Mapper +public interface SysFilesMapper extends BaseMapper { + +} diff --git a/src/main/java/vip/fuck/sm/mapper/SysLogMapper.java b/src/main/java/vip/fuck/sm/mapper/SysLogMapper.java new file mode 100644 index 0000000..2a4fbfa --- /dev/null +++ b/src/main/java/vip/fuck/sm/mapper/SysLogMapper.java @@ -0,0 +1,16 @@ +package vip.fuck.sm.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import vip.fuck.sm.entity.SysLog; +import org.apache.ibatis.annotations.Mapper; + +/** + * 操作日志 Mapper + * + * @author xian.zi.ming@qq.com fuck.vip + * @version V1.0 + * @date 2020年3月18日 + */ +@Mapper +public interface SysLogMapper extends BaseMapper { +} \ No newline at end of file diff --git a/src/main/java/vip/fuck/sm/mapper/SysPermissionMapper.java b/src/main/java/vip/fuck/sm/mapper/SysPermissionMapper.java new file mode 100644 index 0000000..1214e16 --- /dev/null +++ b/src/main/java/vip/fuck/sm/mapper/SysPermissionMapper.java @@ -0,0 +1,17 @@ +package vip.fuck.sm.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import vip.fuck.sm.entity.SysPermission; +import org.apache.ibatis.annotations.Mapper; + +/** + * 菜单权限 Mapper + * + * @author xian.zi.ming@qq.com fuck.vip + * @version V1.0 + * @date 2020年3月18日 + */ +@Mapper +public interface SysPermissionMapper extends BaseMapper { + +} \ No newline at end of file diff --git a/src/main/java/vip/fuck/sm/mapper/SysRoleDeptMapper.java b/src/main/java/vip/fuck/sm/mapper/SysRoleDeptMapper.java new file mode 100644 index 0000000..60daf8b --- /dev/null +++ b/src/main/java/vip/fuck/sm/mapper/SysRoleDeptMapper.java @@ -0,0 +1,17 @@ +package vip.fuck.sm.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import vip.fuck.sm.entity.SysRoleDeptEntity; +import org.apache.ibatis.annotations.Mapper; + +/** + * 角色部门 + * + * @author xian.zi.ming@qq.com fuck.vip + * @email *****@mail.com + * @date 2020-09-27 17:30:15 + */ +@Mapper +public interface SysRoleDeptMapper extends BaseMapper { + +} diff --git a/src/main/java/vip/fuck/sm/mapper/SysRoleMapper.java b/src/main/java/vip/fuck/sm/mapper/SysRoleMapper.java new file mode 100644 index 0000000..cf47ea6 --- /dev/null +++ b/src/main/java/vip/fuck/sm/mapper/SysRoleMapper.java @@ -0,0 +1,17 @@ +package vip.fuck.sm.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import vip.fuck.sm.entity.SysRole; +import org.apache.ibatis.annotations.Mapper; + +/** + * 角色 Mapper + * + * @author xian.zi.ming@qq.com fuck.vip + * @version V1.0 + * @date 2020年3月18日 + */ +@Mapper +public interface SysRoleMapper extends BaseMapper { + +} \ No newline at end of file diff --git a/src/main/java/vip/fuck/sm/mapper/SysRolePermissionMapper.java b/src/main/java/vip/fuck/sm/mapper/SysRolePermissionMapper.java new file mode 100644 index 0000000..acd1810 --- /dev/null +++ b/src/main/java/vip/fuck/sm/mapper/SysRolePermissionMapper.java @@ -0,0 +1,17 @@ +package vip.fuck.sm.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import vip.fuck.sm.entity.SysRolePermission; +import org.apache.ibatis.annotations.Mapper; + +/** + * 角色权限 Mapper + * + * @author xian.zi.ming@qq.com fuck.vip + * @version V1.0 + * @date 2020年3月18日 + */ +@Mapper +public interface SysRolePermissionMapper extends BaseMapper { + +} \ No newline at end of file diff --git a/src/main/java/vip/fuck/sm/mapper/SysUserMapper.java b/src/main/java/vip/fuck/sm/mapper/SysUserMapper.java new file mode 100644 index 0000000..7ea2cf6 --- /dev/null +++ b/src/main/java/vip/fuck/sm/mapper/SysUserMapper.java @@ -0,0 +1,16 @@ +package vip.fuck.sm.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import vip.fuck.sm.entity.SysUser; +import org.apache.ibatis.annotations.Mapper; + +/** + * 用户 Mapper + * + * @author xian.zi.ming@qq.com fuck.vip + * @version V1.0 + * @date 2020年3月18日 + */ +@Mapper +public interface SysUserMapper extends BaseMapper { +} \ No newline at end of file diff --git a/src/main/java/vip/fuck/sm/mapper/SysUserRoleMapper.java b/src/main/java/vip/fuck/sm/mapper/SysUserRoleMapper.java new file mode 100644 index 0000000..fc207d7 --- /dev/null +++ b/src/main/java/vip/fuck/sm/mapper/SysUserRoleMapper.java @@ -0,0 +1,17 @@ +package vip.fuck.sm.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import vip.fuck.sm.entity.SysUserRole; +import org.apache.ibatis.annotations.Mapper; + +/** + * 用户角色 Mapper + * + * @author xian.zi.ming@qq.com fuck.vip + * @version V1.0 + * @date 2020年3月18日 + */ +@Mapper +public interface SysUserRoleMapper extends BaseMapper { + +} \ No newline at end of file diff --git a/src/main/java/vip/fuck/sm/service/DeptService.java b/src/main/java/vip/fuck/sm/service/DeptService.java new file mode 100644 index 0000000..2170f7b --- /dev/null +++ b/src/main/java/vip/fuck/sm/service/DeptService.java @@ -0,0 +1,47 @@ +package vip.fuck.sm.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import vip.fuck.sm.entity.SysDept; +import vip.fuck.sm.vo.resp.DeptRespNodeVO; + +import java.util.List; + +/** + * 部门 + * + * @author xian.zi.ming@qq.com fuck.vip + * @version V1.0 + * @date 2020年3月18日 + */ +public interface DeptService extends IService { + + /** + * 添加部门 + * + * @param vo vo + */ + void addDept(SysDept vo); + + /** + * 更新部门 + * + * @param vo vo + */ + void updateDept(SysDept vo); + + /** + * 删除部门 + * + * @param id id + */ + void deleted(String id); + + /** + * 部门树形列表 + * + * @param deptId deptId + * @param disabled 最顶级是否可用 + * @return 树形列表 + */ + List deptTreeList(String deptId, Boolean disabled); +} diff --git a/src/main/java/vip/fuck/sm/service/HomeService.java b/src/main/java/vip/fuck/sm/service/HomeService.java new file mode 100644 index 0000000..7a83cbf --- /dev/null +++ b/src/main/java/vip/fuck/sm/service/HomeService.java @@ -0,0 +1,21 @@ +package vip.fuck.sm.service; + +import vip.fuck.sm.vo.resp.HomeRespVO; + +/** + * 首页 + * + * @author xian.zi.ming@qq.com fuck.vip + * @version V1.0 + * @date 2020年3月18日 + */ +public interface HomeService { + + /** + * 获取首页信息 + * + * @param userId userId + * @return HomeRespVO + */ + HomeRespVO getHomeInfo(String userId); +} diff --git a/src/main/java/vip/fuck/sm/service/ISysGeneratorService.java b/src/main/java/vip/fuck/sm/service/ISysGeneratorService.java new file mode 100644 index 0000000..6f69bee --- /dev/null +++ b/src/main/java/vip/fuck/sm/service/ISysGeneratorService.java @@ -0,0 +1,32 @@ +package vip.fuck.sm.service; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import vip.fuck.sm.entity.SysGenerator; + +/** + * 代码生成 + * + * @author xian.zi.ming@qq.com fuck.vip + * @version V1.0 + * @date 2020年3月18日 + */ +public interface ISysGeneratorService { + + /** + * 获取所有表 + * + * @param page page + * @param vo vo + * @return IPage + */ + IPage selectAllTables(Page page, SysGenerator vo); + + /** + * 生成代码 + * + * @param tables tables + * @return byte[] + */ + byte[] generatorCode(String[] tables); +} diff --git a/src/main/java/vip/fuck/sm/service/LogService.java b/src/main/java/vip/fuck/sm/service/LogService.java new file mode 100644 index 0000000..31b2b29 --- /dev/null +++ b/src/main/java/vip/fuck/sm/service/LogService.java @@ -0,0 +1,14 @@ +package vip.fuck.sm.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import vip.fuck.sm.entity.SysLog; + +/** + * 系统日志 + * + * @author xian.zi.ming@qq.com fuck.vip + * @version V1.0 + * @date 2020年3月18日 + */ +public interface LogService extends IService { +} diff --git a/src/main/java/vip/fuck/sm/service/PermissionService.java b/src/main/java/vip/fuck/sm/service/PermissionService.java new file mode 100644 index 0000000..05c1196 --- /dev/null +++ b/src/main/java/vip/fuck/sm/service/PermissionService.java @@ -0,0 +1,86 @@ +package vip.fuck.sm.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import vip.fuck.sm.entity.SysPermission; +import vip.fuck.sm.vo.resp.PermissionRespNode; + +import java.util.List; + +/** + * 菜单权限 + * + * @author xian.zi.ming@qq.com fuck.vip + * @version V1.0 + * @date 2020年3月18日 + */ +public interface PermissionService extends IService { + + /** + * 根据userId获取权限 + * + * @param userId userId + * @return 权限 + */ + List getPermission(String userId); + + /** + * 删除权限 + * + * @param permissionId 权限id + */ + void deleted(String permissionId); + + /** + * 获取所有 + * + * @return List + */ + List selectAll(Integer status); + + /** + * 根据userId获取权限标志 + * + * @param userId userId + * @return Set + */ + List getPermissionsByUserId(String userId); + + /** + * 根据userId获取权限树 + * + * @param userId + * @return List + */ + List permissionTreeList(String userId); + + /** + * 根据权限树 + * + * @return List + */ + List selectAllByTree(Integer status); + + /** + * 根据目录树 + * + * @param permissionId permissionId + * @return List + */ + List selectAllMenuByTree(String permissionId); + + + /** + * 根据权限id获取绑定的userId + * + * @param permissionId permissionId + * @return List + */ + List getUserIdsById(String permissionId); + + /** + * 更新 + * + * @param vo vo + */ + void updatePermission(SysPermission vo); +} diff --git a/src/main/java/vip/fuck/sm/service/RolePermissionService.java b/src/main/java/vip/fuck/sm/service/RolePermissionService.java new file mode 100644 index 0000000..278211d --- /dev/null +++ b/src/main/java/vip/fuck/sm/service/RolePermissionService.java @@ -0,0 +1,22 @@ +package vip.fuck.sm.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import vip.fuck.sm.entity.SysRolePermission; +import vip.fuck.sm.vo.req.RolePermissionOperationReqVO; + +/** + * 角色权限关联 + * + * @author xian.zi.ming@qq.com fuck.vip + * @version V1.0 + * @date 2020年3月18日 + */ +public interface RolePermissionService extends IService { + + /** + * 角色绑定权限 + * + * @param vo vo + */ + void addRolePermission(RolePermissionOperationReqVO vo); +} diff --git a/src/main/java/vip/fuck/sm/service/RoleService.java b/src/main/java/vip/fuck/sm/service/RoleService.java new file mode 100644 index 0000000..05f0427 --- /dev/null +++ b/src/main/java/vip/fuck/sm/service/RoleService.java @@ -0,0 +1,53 @@ +package vip.fuck.sm.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import vip.fuck.sm.entity.SysRole; + +import java.util.List; + +/** + * 角色 + * + * @author xian.zi.ming@qq.com fuck.vip + * @version V1.0 + * @date 2020年3月18日 + */ +public interface RoleService extends IService { + + /** + * 添加角色 + * + * @param vo SysRole + */ + void addRole(SysRole vo); + + /** + * 更新角色 + * + * @param vo SysRole + */ + void updateRole(SysRole vo); + + /** + * 根据id获取角色详情 + * + * @param id id + * @return SysRole + */ + SysRole detailInfo(String id); + + /** + * 根据id删除 + * + * @param id id + */ + void deletedRole(String id); + + /** + * 根据userId获取绑定的角色 + * + * @param userId userId + * @return List + */ + List getRoleInfoByUserId(String userId); +} diff --git a/src/main/java/vip/fuck/sm/service/SysContentService.java b/src/main/java/vip/fuck/sm/service/SysContentService.java new file mode 100644 index 0000000..4a10a05 --- /dev/null +++ b/src/main/java/vip/fuck/sm/service/SysContentService.java @@ -0,0 +1,16 @@ +package vip.fuck.sm.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import vip.fuck.sm.entity.SysContentEntity; + +/** + * 内容 服务类 + * + * @author xian.zi.ming@qq.com fuck.vip + * @version V1.0 + * @date 2020年3月18日 + */ +public interface SysContentService extends IService { + +} + diff --git a/src/main/java/vip/fuck/sm/service/SysDictDetailService.java b/src/main/java/vip/fuck/sm/service/SysDictDetailService.java new file mode 100644 index 0000000..a7f3f1e --- /dev/null +++ b/src/main/java/vip/fuck/sm/service/SysDictDetailService.java @@ -0,0 +1,26 @@ +package vip.fuck.sm.service; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import vip.fuck.sm.entity.SysDictDetailEntity; + +/** + * 数据字典 服务类 + * + * @author xian.zi.ming@qq.com fuck.vip + * @version V1.0 + * @date 2020年3月18日 + */ +public interface SysDictDetailService extends IService { + + /** + * 分页 + * + * @param page page + * @param dictId dictId + * @return IPage + */ + IPage listByPage(Page page, String dictId); +} + diff --git a/src/main/java/vip/fuck/sm/service/SysDictService.java b/src/main/java/vip/fuck/sm/service/SysDictService.java new file mode 100644 index 0000000..1d5af2e --- /dev/null +++ b/src/main/java/vip/fuck/sm/service/SysDictService.java @@ -0,0 +1,16 @@ +package vip.fuck.sm.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import vip.fuck.sm.entity.SysDictEntity; + +/** + * 数据字典 服务类 + * + * @author xian.zi.ming@qq.com fuck.vip + * @version V1.0 + * @date 2020年3月18日 + */ +public interface SysDictService extends IService { + +} + diff --git a/src/main/java/vip/fuck/sm/service/SysFilesService.java b/src/main/java/vip/fuck/sm/service/SysFilesService.java new file mode 100644 index 0000000..a95e696 --- /dev/null +++ b/src/main/java/vip/fuck/sm/service/SysFilesService.java @@ -0,0 +1,36 @@ +package vip.fuck.sm.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import vip.fuck.sm.entity.SysFilesEntity; +import org.noear.solon.core.handle.Context; +import org.noear.solon.core.handle.UploadedFile; +import org.smartboot.http.server.HttpRequest; + +import java.util.List; + +/** + * 文件上传 服务类 + * + * @author xian.zi.ming@qq.com fuck.vip + * @version V1.0 + * @date 2020年3月18日 + */ +public interface SysFilesService extends IService { + + /** + * 保存图片返回url + * + * @param file + * @param request + * @return + */ + String saveFile(UploadedFile file, HttpRequest request); + + /** + * 删除图片 + * + * @param ids + */ + void removeByIdsAndFiles(List ids); +} + diff --git a/src/main/java/vip/fuck/sm/service/SysRoleDeptService.java b/src/main/java/vip/fuck/sm/service/SysRoleDeptService.java new file mode 100644 index 0000000..1b4d0cb --- /dev/null +++ b/src/main/java/vip/fuck/sm/service/SysRoleDeptService.java @@ -0,0 +1,16 @@ +package vip.fuck.sm.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import vip.fuck.sm.entity.SysRoleDeptEntity; + +/** + * 角色部门 + * + * @author xian.zi.ming@qq.com fuck.vip + * @email *****@mail.com + * @date 2020-09-27 17:30:15 + */ +public interface SysRoleDeptService extends IService { + +} + diff --git a/src/main/java/vip/fuck/sm/service/UserRoleService.java b/src/main/java/vip/fuck/sm/service/UserRoleService.java new file mode 100644 index 0000000..7ca2b14 --- /dev/null +++ b/src/main/java/vip/fuck/sm/service/UserRoleService.java @@ -0,0 +1,32 @@ +package vip.fuck.sm.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import vip.fuck.sm.entity.SysUserRole; +import vip.fuck.sm.vo.req.UserRoleOperationReqVO; + +import java.util.List; + +/** + * 用户角色 服务类 + * + * @author xian.zi.ming@qq.com fuck.vip + * @version V1.0 + * @date 2020年3月18日 + */ +public interface UserRoleService extends IService { + + /** + * 根据userId获取绑定的角色id + * + * @param userId userId + * @return List + */ + List getRoleIdsByUserId(String userId); + + /** + * 用户绑定角色 + * + * @param vo vo + */ + void addUserRoleInfo(UserRoleOperationReqVO vo); +} diff --git a/src/main/java/vip/fuck/sm/service/UserService.java b/src/main/java/vip/fuck/sm/service/UserService.java new file mode 100644 index 0000000..fc09156 --- /dev/null +++ b/src/main/java/vip/fuck/sm/service/UserService.java @@ -0,0 +1,76 @@ +package vip.fuck.sm.service; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.IService; +import vip.fuck.sm.entity.SysUser; +import vip.fuck.sm.vo.resp.LoginRespVO; +import vip.fuck.sm.vo.resp.UserOwnRoleRespVO; + +/** + * 用户 服务类 + * + * @author xian.zi.ming@qq.com fuck.vip + * @version V1.0 + * @date 2020年3月18日 + */ +public interface UserService extends IService { + + /** + * 注册 + * + * @param vo vo + */ + void register(SysUser vo); + + /** + * 登陆 + * + * @param vo vo + * @return LoginRespVO + */ + LoginRespVO login(SysUser vo); + + /** + * 更新用户信息 + * + * @param vo vo + */ + void updateUserInfo(SysUser vo); + + /** + * 分页 + * + * @param vo vo + * @return IPage + */ + IPage pageInfo(SysUser vo); + + /** + * 添加用户 + * + * @param vo vo + */ + void addUser(SysUser vo); + + /** + * 修改密码 + * + * @param vo vo + */ + void updatePwd(SysUser vo); + + /** + * 根据userid获取绑定角色 + * + * @param userId userId + * @return UserOwnRoleRespVO + */ + UserOwnRoleRespVO getUserOwnRole(String userId); + + /** + * 修改自己信息 + * + * @param vo vo + */ + void updateUserInfoMy(SysUser vo); +} diff --git a/src/main/java/vip/fuck/sm/service/impl/DeptServiceImpl.java b/src/main/java/vip/fuck/sm/service/impl/DeptServiceImpl.java new file mode 100644 index 0000000..375cfba --- /dev/null +++ b/src/main/java/vip/fuck/sm/service/impl/DeptServiceImpl.java @@ -0,0 +1,214 @@ +package vip.fuck.sm.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import vip.fuck.sm.common.exception.BusinessException; +import vip.fuck.sm.common.exception.code.BaseResponseCode; +import vip.fuck.sm.entity.SysDept; +import vip.fuck.sm.entity.SysUser; +import vip.fuck.sm.mapper.SysDeptMapper; +import vip.fuck.sm.mapper.SysUserMapper; +import vip.fuck.sm.service.DeptService; +import vip.fuck.sm.vo.resp.DeptRespNodeVO; +import lombok.extern.slf4j.Slf4j; +import org.apache.ibatis.solon.annotation.Db; +import org.noear.solon.annotation.Inject; +import org.noear.solon.annotation.Component; +import org.noear.solon.data.annotation.Tran; + + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.atomic.AtomicReference; + +/** + * 部门 + * + * @author xian.zi.ming@qq.com fuck.vip + * @version V1.0 + * @date 2020年3月18日 + */ +@Component +@Slf4j +public class DeptServiceImpl extends ServiceImpl implements DeptService { + + @Db + private SysDeptMapper sysDeptMapper; + @Db + private SysUserMapper sysUserMapper; + + @Override + public void addDept(SysDept vo) { + String relationCode; + String deptCode = this.getNewDeptCode(); + SysDept parent = sysDeptMapper.selectById(vo.getPid()); + if ("0".equals(vo.getPid())) { + relationCode = deptCode; + } else if (null == parent) { + throw new BusinessException(BaseResponseCode.DATA_ERROR); + } else { + relationCode = parent.getRelationCode() + deptCode; + } + vo.setDeptNo(deptCode); + vo.setRelationCode(relationCode); + sysDeptMapper.insert(vo); + } + + @Override + @Tran + public void updateDept(SysDept vo) { + + SysDept sysDept = sysDeptMapper.selectById(vo.getId()); + if (null == sysDept) { + throw new BusinessException(BaseResponseCode.DATA_ERROR); + } + sysDeptMapper.updateById(vo); + //说明层级发生了变化 + if (!StrUtil.isEmpty(vo.getPid()) && !vo.getPid().equals(sysDept.getPid())) { + SysDept parent = sysDeptMapper.selectById(vo.getPid()); + if (!"0".equals(vo.getPid()) && null == parent) { + throw new BusinessException(BaseResponseCode.DATA_ERROR); + } + SysDept oldParent = sysDeptMapper.selectById(sysDept.getPid()); + String oldRelationCode; + String newRelationCode; + //根目录降到其他目录 + if ("0".equals(sysDept.getPid())) { + oldRelationCode = sysDept.getDeptNo(); + newRelationCode = parent.getRelationCode() + sysDept.getDeptNo(); + } else if ("0".equals(vo.getPid())) { // 其他目录升级到跟目录 + oldRelationCode = sysDept.getRelationCode(); + newRelationCode = sysDept.getDeptNo(); + } else { + oldRelationCode = oldParent.getRelationCode(); + newRelationCode = parent.getRelationCode(); + } + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); + wrapper.likeLeft(SysDept::getDeptNo, sysDept.getDeptNo()); + List list = sysDeptMapper.selectList(wrapper); + list.stream().forEach(entity -> { + String relationCode = entity.getRelationCode().replace(oldRelationCode, newRelationCode); + entity.setRelationCode(relationCode); + sysDeptMapper.updateById(entity); + }); + } + } + + @Override + public void deleted(String id) { + SysDept sysDept = sysDeptMapper.selectById(id); + if (null == sysDept) { + throw new BusinessException(BaseResponseCode.DATA_ERROR); + } + List deptIds = sysDeptMapper.selectObjs(Wrappers.lambdaQuery().select(SysDept::getId).likeRight(SysDept::getRelationCode, sysDept.getRelationCode())); + List list = sysUserMapper.selectList(Wrappers.lambdaQuery().in(SysUser::getDeptId, deptIds)); + if (!ObjectUtil.isEmpty(list)) { + throw new BusinessException(BaseResponseCode.NOT_PERMISSION_DELETED_DEPT); + } + sysDeptMapper.deleteById(id); + } + + @Override + public List deptTreeList(String deptId, Boolean disabled) { + List list; + if (ObjectUtil.isEmpty(deptId)) { + list = sysDeptMapper.selectList(Wrappers.emptyWrapper()); + } else { + SysDept sysDept = sysDeptMapper.selectById(deptId); + if (sysDept == null) { + throw new BusinessException(BaseResponseCode.DATA_ERROR); + } + LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery().likeRight(SysDept::getRelationCode, sysDept.getRelationCode()); + List childIds = sysDeptMapper.selectObjs(queryWrapper); + list = sysDeptMapper.selectList(Wrappers.lambdaQuery().notIn(SysDept::getId, childIds)); + } + // 默认加一个顶级方便新增顶级部门 + DeptRespNodeVO respNodeVO = new DeptRespNodeVO(); + respNodeVO.setTitle("默认顶级部门"); + respNodeVO.setId("0"); + respNodeVO.setSpread(true); + respNodeVO.setDisabled(disabled); + respNodeVO.setChildren(getTree(list)); + List result = new ArrayList<>(); + result.add(respNodeVO); + return result; + } + + private List getTree(List all) { + List list = new ArrayList<>(); + for (SysDept sysDept : all) { + if ("0".equals(sysDept.getPid())) { + DeptRespNodeVO deptTree = new DeptRespNodeVO(); + BeanUtil.copyProperties(sysDept, deptTree); + deptTree.setTitle(sysDept.getName()); + deptTree.setSpread(true); + deptTree.setChildren(getChild(sysDept.getId(), all)); + list.add(deptTree); + } + } + return list; + } + + private List getChild(String id, List all) { + List list = new ArrayList<>(); + for (SysDept sysDept : all) { + if (sysDept.getPid().equals(id)) { + DeptRespNodeVO deptTree = new DeptRespNodeVO(); + BeanUtil.copyProperties(sysDept, deptTree); + deptTree.setTitle(sysDept.getName()); + deptTree.setChildren(getChild(sysDept.getId(), all)); + list.add(deptTree); + } + } + return list; + } + + //获取新的部门编码 + public String getNewDeptCode() { + LambdaQueryWrapper lambdaQueryWrapper = Wrappers.lambdaQuery(); + lambdaQueryWrapper.select(SysDept::getDeptNo); + //获取所有的deptCode + List deptCodes = sysDeptMapper.selectObjs(lambdaQueryWrapper); + AtomicReference maxDeptCode = new AtomicReference<>(0); + + //遍历获取最大的DeptCode + deptCodes.forEach(o -> { + String str = String.valueOf(o); + if (str.length() >= 7) { + Integer one = Integer.parseInt(str.substring(str.length() - 5)); + if (one > maxDeptCode.get()) { + maxDeptCode.set(one); + } + } + }); + + return padRight(maxDeptCode.get() + 1, 6, "0"); + } + + + /** + * 右补位,左对齐 + * + * @param len 目标字符串长度 + * @param alexi 补位字符 + * @param oriStr 原字符串 + * @return 目标字符串 + * 以alexin 做为补位 + */ + public static String padRight(int oriStr, int len, String alexi) { + StringBuilder str = new StringBuilder(); + int strlen = String.valueOf(oriStr).length(); + if (strlen < len) { + for (int i = 0; i < len - strlen; i++) { + str.append(alexi); + } + } + str.append(oriStr); + return "D" + str.toString(); + } +} diff --git a/src/main/java/vip/fuck/sm/service/impl/HomeServiceImpl.java b/src/main/java/vip/fuck/sm/service/impl/HomeServiceImpl.java new file mode 100644 index 0000000..a53eb69 --- /dev/null +++ b/src/main/java/vip/fuck/sm/service/impl/HomeServiceImpl.java @@ -0,0 +1,59 @@ +package vip.fuck.sm.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import vip.fuck.sm.entity.SysDept; +import vip.fuck.sm.entity.SysUser; +import vip.fuck.sm.service.DeptService; +import vip.fuck.sm.service.HomeService; +import vip.fuck.sm.service.PermissionService; +import vip.fuck.sm.service.UserService; +import vip.fuck.sm.vo.resp.HomeRespVO; +import vip.fuck.sm.vo.resp.PermissionRespNode; +import vip.fuck.sm.vo.resp.UserInfoRespVO; +import org.noear.solon.annotation.Inject; +import org.noear.solon.annotation.Component; + +import javax.annotation.Resource; +import java.util.List; + +/** + * 首页 + * + * @author xian.zi.ming@qq.com fuck.vip + * @version V1.0 + * @date 2020年3月18日 + */ +@Component +public class HomeServiceImpl implements HomeService { + @Inject + private UserService userService; + @Inject + private DeptService deptService; + @Inject + private PermissionService permissionService; + + @Override + public HomeRespVO getHomeInfo(String userId) { + + + SysUser sysUser = userService.getById(userId); + UserInfoRespVO vo = new UserInfoRespVO(); + + if (sysUser != null) { + BeanUtil.copyProperties(sysUser, vo); + SysDept sysDept = deptService.getById(sysUser.getDeptId()); + if (sysDept != null) { + vo.setDeptId(sysDept.getId()); + vo.setDeptName(sysDept.getName()); + } + } + + List menus = permissionService.permissionTreeList(userId); + + HomeRespVO respVO = new HomeRespVO(); + respVO.setMenus(menus); + respVO.setUserInfo(vo); + + return respVO; + } +} diff --git a/src/main/java/vip/fuck/sm/service/impl/LogServiceImpl.java b/src/main/java/vip/fuck/sm/service/impl/LogServiceImpl.java new file mode 100644 index 0000000..d509d1e --- /dev/null +++ b/src/main/java/vip/fuck/sm/service/impl/LogServiceImpl.java @@ -0,0 +1,18 @@ +package vip.fuck.sm.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import vip.fuck.sm.entity.SysLog; +import vip.fuck.sm.mapper.SysLogMapper; +import vip.fuck.sm.service.LogService; +import org.noear.solon.annotation.Component; + +/** + * 系统日志 + * + * @author xian.zi.ming@qq.com fuck.vip + * @version V1.0 + * @date 2020年3月18日 + */ +@Component +public class LogServiceImpl extends ServiceImpl implements LogService { +} diff --git a/src/main/java/vip/fuck/sm/service/impl/PermissionServiceImpl.java b/src/main/java/vip/fuck/sm/service/impl/PermissionServiceImpl.java new file mode 100644 index 0000000..a59dc5a --- /dev/null +++ b/src/main/java/vip/fuck/sm/service/impl/PermissionServiceImpl.java @@ -0,0 +1,263 @@ +package vip.fuck.sm.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import vip.fuck.sm.common.exception.BusinessException; +import vip.fuck.sm.common.exception.code.BaseResponseCode; +import vip.fuck.sm.entity.SysPermission; +import vip.fuck.sm.entity.SysRolePermission; +import vip.fuck.sm.entity.SysUserRole; +import vip.fuck.sm.mapper.SysPermissionMapper; +import vip.fuck.sm.service.PermissionService; +import vip.fuck.sm.service.RolePermissionService; +import vip.fuck.sm.service.UserRoleService; +import vip.fuck.sm.vo.resp.PermissionRespNode; +import lombok.extern.slf4j.Slf4j; +import org.apache.ibatis.solon.annotation.Db; +import org.noear.solon.annotation.Inject; +import org.noear.solon.annotation.Component; +import org.noear.solon.data.annotation.Tran; + + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +/** + * 菜单权限 + * + * @author xian.zi.ming@qq.com fuck.vip + * @version V1.0 + * @date 2020年3月18日 + */ +@Component +@Slf4j +public class PermissionServiceImpl extends ServiceImpl implements PermissionService { + @Inject + private UserRoleService userRoleService; + @Inject + private RolePermissionService rolePermissionService; + @Db + private SysPermissionMapper sysPermissionMapper; + + /** + * 根据用户查询拥有的权限 + * 先查出用户拥有的角色 + * 再去差用户拥有的权限 + * 也可以多表关联查询 + */ + @Override + public List getPermission(String userId) { + List roleIds = userRoleService.getRoleIdsByUserId(userId); + if (ObjectUtil.isEmpty(roleIds)) { + return null; + } + List permissionIds = rolePermissionService.listObjs(Wrappers.lambdaQuery().select(SysRolePermission::getPermissionId).in(SysRolePermission::getRoleId, roleIds)); + if (ObjectUtil.isEmpty(permissionIds)) { + return null; + } + + LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery().in(SysPermission::getId, permissionIds).eq(SysPermission::getStatus, 1).orderByAsc(SysPermission::getOrderNum); + return sysPermissionMapper.selectList(queryWrapper); + } + + /** + * 删除菜单权限 + * 判断是否 有角色关联 + * 判断是否有子集 + */ + @Tran + @Override + public void deleted(String permissionId) { + //获取关联userId + List userIds = getUserIdsById(permissionId); + SysPermission sysPermission = sysPermissionMapper.selectById(permissionId); + if (null == sysPermission) { + log.error("传入 的 id:{}不合法", permissionId); + throw new BusinessException(BaseResponseCode.DATA_ERROR); + } + //获取下一级 + List childs = sysPermissionMapper.selectList(Wrappers.lambdaQuery().eq(SysPermission::getPid, permissionId)); + if (!ObjectUtil.isEmpty(childs)) { + throw new BusinessException(BaseResponseCode.ROLE_PERMISSION_RELATION); + } + sysPermissionMapper.deleteById(permissionId); + //删除和角色关联 + rolePermissionService.remove(Wrappers.lambdaQuery().eq(SysRolePermission::getPermissionId, permissionId)); + + + } + + @Override + public void updatePermission(SysPermission vo) { + sysPermissionMapper.updateById(vo); + } + + /** + * 获取所有菜单权限 + */ + @Override + public List selectAll(Integer status) { + List result = sysPermissionMapper.selectList(Wrappers.lambdaQuery().eq(status != null, SysPermission::getStatus, status).orderByAsc(SysPermission::getOrderNum)); + if (!ObjectUtil.isEmpty(result)) { + for (SysPermission sysPermission : result) { + SysPermission parent = sysPermissionMapper.selectById(sysPermission.getPid()); + if (parent != null) { + sysPermission.setPidName(parent.getName()); + } + } + } + return result; + } + + /** + * 获取权限标识 + */ + @Override + public List getPermissionsByUserId(String userId) { + + List list = getPermission(userId); + Set permissions = new HashSet<>(); + if (ObjectUtil.isEmpty(list)) { + return null; + } + for (SysPermission sysPermission : list) { + if (!ObjectUtil.isEmpty(sysPermission.getPerms())) { + permissions.add(sysPermission.getPerms()); + } + + } + return new ArrayList(permissions); + } + + /** + * 以树型的形式把用户拥有的菜单权限返回给客户端 + */ + @Override + public List permissionTreeList(String userId) { + List list = getPermission(userId); + return getTree(list, true); + } + + /** + * 递归获取菜单树 + */ + private List getTree(List all, boolean type) { + + List list = new ArrayList<>(); + if (ObjectUtil.isEmpty(all)) { + return list; + } + for (SysPermission sysPermission : all) { + if ("0".equals(sysPermission.getPid())) { + PermissionRespNode permissionRespNode = new PermissionRespNode(); + BeanUtil.copyProperties(sysPermission, permissionRespNode); + permissionRespNode.setTitle(sysPermission.getName()); + + if (type) { + permissionRespNode.setChildren(getChildExcBtn(sysPermission.getId(), all)); + } else { + permissionRespNode.setChildren(getChildAll(sysPermission.getId(), all)); + } + list.add(permissionRespNode); + } + } + return list; + } + + /** + * 递归遍历所有 + */ + private List getChildAll(String id, List all) { + + List list = new ArrayList<>(); + for (SysPermission sysPermission : all) { + if (sysPermission.getPid().equals(id)) { + PermissionRespNode permissionRespNode = new PermissionRespNode(); + BeanUtil.copyProperties(sysPermission, permissionRespNode); + permissionRespNode.setTitle(sysPermission.getName()); + permissionRespNode.setChildren(getChildAll(sysPermission.getId(), all)); + list.add(permissionRespNode); + } + } + return list; + } + + /** + * 只递归获取目录和菜单 + */ + private List getChildExcBtn(String id, List all) { + + List list = new ArrayList<>(); + for (SysPermission sysPermission : all) { + if (sysPermission.getPid().equals(id) && sysPermission.getType() != 3) { + PermissionRespNode permissionRespNode = new PermissionRespNode(); + BeanUtil.copyProperties(sysPermission, permissionRespNode); + permissionRespNode.setTitle(sysPermission.getName()); + permissionRespNode.setChildren(getChildExcBtn(sysPermission.getId(), all)); + list.add(permissionRespNode); + } + } + return list; + } + + /** + * 获取所有菜单权限按钮 + */ + @Override + public List selectAllByTree(Integer status) { + + List list = selectAll(status); + return getTree(list, false); + } + + /** + * 获取所有的目录菜单树排除按钮 + * 因为不管是新增或者修改 + * 选择所属菜单目录的时候 + * 都不可能选择到按钮 + * 而且编辑的时候 所属目录不能 + * 选择自己和它的子类 + */ + @Override + public List selectAllMenuByTree(String permissionId) { + + List list = selectAll(1); + if (!ObjectUtil.isEmpty(list) && !ObjectUtil.isEmpty(permissionId)) { + for (SysPermission sysPermission : list) { + if (sysPermission.getId().equals(permissionId)) { + list.remove(sysPermission); + break; + } + } + } + List result = new ArrayList<>(); + //新增顶级目录是为了方便添加一级目录 + PermissionRespNode respNode = new PermissionRespNode(); + respNode.setId("0"); + respNode.setTitle("默认顶级菜单"); + respNode.setSpread(true); + respNode.setChildren(getTree(list, true)); + result.add(respNode); + return result; + } + + @Override + public List getUserIdsById(String id) { + //根据权限id,获取所有角色id + //根据权限id,获取所有角色id + List roleIds = rolePermissionService.listObjs(Wrappers.lambdaQuery().select(SysRolePermission::getRoleId).eq(SysRolePermission::getPermissionId, id)); + if (!ObjectUtil.isEmpty(roleIds)) { + //根据角色id, 获取关联用户 + return userRoleService.listObjs(Wrappers.lambdaQuery().select(SysUserRole::getUserId).in(SysUserRole::getRoleId, roleIds)); + } + return null; + } + + +} diff --git a/src/main/java/vip/fuck/sm/service/impl/RolePermissionServiceImpl.java b/src/main/java/vip/fuck/sm/service/impl/RolePermissionServiceImpl.java new file mode 100644 index 0000000..2f034c9 --- /dev/null +++ b/src/main/java/vip/fuck/sm/service/impl/RolePermissionServiceImpl.java @@ -0,0 +1,36 @@ +package vip.fuck.sm.service.impl; + +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import vip.fuck.sm.entity.SysRolePermission; +import vip.fuck.sm.mapper.SysRolePermissionMapper; +import vip.fuck.sm.service.RolePermissionService; +import vip.fuck.sm.vo.req.RolePermissionOperationReqVO; +import org.noear.solon.annotation.Component; + +import java.util.ArrayList; +import java.util.List; + +/** + * 角色权限关联 + * + * @author xian.zi.ming@qq.com fuck.vip + * @version V1.0 + * @date 2020年3月18日 + */ +@Component +public class RolePermissionServiceImpl extends ServiceImpl implements RolePermissionService { + @Override + public void addRolePermission(RolePermissionOperationReqVO vo) { + List list = new ArrayList<>(); + for (String permissionId : vo.getPermissionIds()) { + SysRolePermission sysRolePermission = new SysRolePermission(); + sysRolePermission.setPermissionId(permissionId); + sysRolePermission.setRoleId(vo.getRoleId()); + list.add(sysRolePermission); + } + this.remove(Wrappers.lambdaQuery().eq(SysRolePermission::getRoleId, vo.getRoleId())); + this.saveBatch(list); + } + +} diff --git a/src/main/java/vip/fuck/sm/service/impl/RoleServiceImpl.java b/src/main/java/vip/fuck/sm/service/impl/RoleServiceImpl.java new file mode 100644 index 0000000..dcb115d --- /dev/null +++ b/src/main/java/vip/fuck/sm/service/impl/RoleServiceImpl.java @@ -0,0 +1,147 @@ +package vip.fuck.sm.service.impl; + +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import vip.fuck.sm.common.exception.BusinessException; +import vip.fuck.sm.common.exception.code.BaseResponseCode; +import vip.fuck.sm.entity.SysRole; +import vip.fuck.sm.entity.SysRoleDeptEntity; +import vip.fuck.sm.entity.SysRolePermission; +import vip.fuck.sm.entity.SysUserRole; +import vip.fuck.sm.mapper.SysRoleMapper; +import vip.fuck.sm.service.*; +import vip.fuck.sm.vo.req.RolePermissionOperationReqVO; +import vip.fuck.sm.vo.resp.DeptRespNodeVO; +import vip.fuck.sm.vo.resp.PermissionRespNode; +import lombok.extern.slf4j.Slf4j; +import org.apache.ibatis.solon.annotation.Db; +import org.noear.solon.annotation.Component; +import org.noear.solon.annotation.Inject; +import org.noear.solon.data.annotation.Tran; + +import javax.annotation.Resource; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +/** + * 角色 + * + * @author xian.zi.ming@qq.com fuck.vip + * @version V1.0 + * @date 2020年3月18日 + */ +@Component +@Slf4j +public class RoleServiceImpl extends ServiceImpl implements RoleService { + @Db + private SysRoleMapper sysRoleMapper; + @Inject + private UserRoleService userRoleService; + @Inject + private RolePermissionService rolePermissionService; + @Inject + private PermissionService permissionService; + @Inject + private DeptService deptService; + @Inject + private SysRoleDeptService sysRoleDeptService; + + @Tran + @Override + public void addRole(SysRole vo) { + vo.setStatus(1); + sysRoleMapper.insert(vo); + if (!ObjectUtil.isEmpty(vo.getPermissions())) { + RolePermissionOperationReqVO reqVO = new RolePermissionOperationReqVO(); + reqVO.setRoleId(vo.getId()); + reqVO.setPermissionIds(vo.getPermissions()); + rolePermissionService.addRolePermission(reqVO); + } + } + + @Tran + @Override + public void updateRole(SysRole vo) { + SysRole sysRole = sysRoleMapper.selectById(vo.getId()); + if (null == sysRole) { + log.error("传入 的 id:{}不合法", vo.getId()); + throw new BusinessException(BaseResponseCode.DATA_ERROR); + } + sysRoleMapper.updateById(vo); + //删除角色权限关联 + rolePermissionService.remove(Wrappers.lambdaQuery().eq(SysRolePermission::getRoleId, sysRole.getId())); + if (!ObjectUtil.isEmpty(vo.getPermissions())) { + RolePermissionOperationReqVO reqVO = new RolePermissionOperationReqVO(); + reqVO.setRoleId(sysRole.getId()); + reqVO.setPermissionIds(vo.getPermissions()); + rolePermissionService.addRolePermission(reqVO); + } + } + + @Override + public SysRole detailInfo(String id) { + SysRole sysRole = sysRoleMapper.selectById(id); + if (sysRole == null) { + log.error("传入 的 id:{}不合法", id); + throw new BusinessException(BaseResponseCode.DATA_ERROR); + } + List permissionRespNodes = permissionService.selectAllByTree(1); + LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery().select(SysRolePermission::getPermissionId).eq(SysRolePermission::getRoleId, sysRole.getId()); + Set checkList = + new HashSet<>(rolePermissionService.listObjs(queryWrapper)); + setChecked(permissionRespNodes, checkList); + sysRole.setPermissionRespNodes(permissionRespNodes); + + LambdaQueryWrapper queryWrapperDept = Wrappers.lambdaQuery().select(SysRoleDeptEntity::getDeptId).eq(SysRoleDeptEntity::getRoleId, sysRole.getId()); + List deptRespNodes = deptService.deptTreeList(null, true); + Set checkDeptList = + new HashSet<>(sysRoleDeptService.listObjs(queryWrapperDept)); + setCheckedDept(deptRespNodes, checkDeptList); + sysRole.setDeptRespNodes(deptRespNodes); + return sysRole; + } + + private void setCheckedDept(List deptRespNodes, Set checkDeptList) { + for (DeptRespNodeVO node : deptRespNodes) { + if (checkDeptList.contains(node.getId())) { + node.setChecked(true); + } + setCheckedDept((List) node.getChildren(), checkDeptList); + } + } + + + private void setChecked(List list, Set checkList) { + for (PermissionRespNode node : list) { + if (checkList.contains(node.getId()) + && ObjectUtil.isEmpty(node.getChildren())) { + node.setChecked(true); + } + setChecked((List) node.getChildren(), checkList); + } + } + + @Tran + @Override + public void deletedRole(String id) { + //删除角色 + sysRoleMapper.deleteById(id); + //删除角色权限关联 + rolePermissionService.remove(Wrappers.lambdaQuery().eq(SysRolePermission::getRoleId, id)); + //删除角色用户关联 + userRoleService.remove(Wrappers.lambdaQuery().eq(SysUserRole::getRoleId, id)); + } + + @Override + public List getRoleInfoByUserId(String userId) { + + List roleIds = userRoleService.getRoleIdsByUserId(userId); + if (ObjectUtil.isEmpty(roleIds)) { + return null; + } + return sysRoleMapper.selectBatchIds(roleIds); + } +} diff --git a/src/main/java/vip/fuck/sm/service/impl/SysContentServiceImpl.java b/src/main/java/vip/fuck/sm/service/impl/SysContentServiceImpl.java new file mode 100644 index 0000000..348e6fe --- /dev/null +++ b/src/main/java/vip/fuck/sm/service/impl/SysContentServiceImpl.java @@ -0,0 +1,20 @@ +package vip.fuck.sm.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import vip.fuck.sm.entity.SysContentEntity; +import vip.fuck.sm.mapper.SysContentMapper; +import vip.fuck.sm.service.SysContentService; +import org.noear.solon.annotation.Component; + +/** + * 内容 服务类 + * + * @author xian.zi.ming@qq.com fuck.vip + * @version V1.0 + * @date 2020年3月18日 + */ +@Component(value = "share:sysContentService",typed = true) +public class SysContentServiceImpl extends ServiceImpl implements SysContentService { + + +} \ No newline at end of file diff --git a/src/main/java/vip/fuck/sm/service/impl/SysDictDetailServiceImpl.java b/src/main/java/vip/fuck/sm/service/impl/SysDictDetailServiceImpl.java new file mode 100644 index 0000000..fa6315c --- /dev/null +++ b/src/main/java/vip/fuck/sm/service/impl/SysDictDetailServiceImpl.java @@ -0,0 +1,53 @@ +package vip.fuck.sm.service.impl; + +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import vip.fuck.sm.common.exception.BusinessException; +import vip.fuck.sm.entity.SysDictDetailEntity; +import vip.fuck.sm.entity.SysDictEntity; +import vip.fuck.sm.mapper.SysDictDetailMapper; +import vip.fuck.sm.mapper.SysDictMapper; +import vip.fuck.sm.service.SysDictDetailService; +import org.apache.ibatis.solon.annotation.Db; +import org.noear.solon.annotation.Component; +import org.noear.solon.annotation.Inject; + +import javax.annotation.Resource; + +/** + * 数据字典 服务类 + * + * @author xian.zi.ming@qq.com fuck.vip + * @version V1.0 + * @date 2020年3月18日 + */ +@Component(value = "share:sysDictDetailService",typed = true) +public class SysDictDetailServiceImpl extends ServiceImpl implements SysDictDetailService { + @Db + private SysDictDetailMapper sysDictDetailMapper; + @Db + private SysDictMapper sysDictMapper; + + + @Override + public IPage listByPage(Page page, String dictId) { + + SysDictEntity sysDictEntity = sysDictMapper.selectById(dictId); + if (sysDictEntity == null) { + throw new BusinessException("获取字典数据失败!"); + } + + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); + wrapper.eq(SysDictDetailEntity::getDictId, dictId); + wrapper.orderByAsc(SysDictDetailEntity::getSort); + IPage result = sysDictDetailMapper.selectPage(page, wrapper); + if (!ObjectUtil.isEmpty(result.getRecords())) { + result.getRecords().stream().forEach(entity -> entity.setDictName(sysDictEntity.getName())); + } + return result; + } +} \ No newline at end of file diff --git a/src/main/java/vip/fuck/sm/service/impl/SysDictServiceImpl.java b/src/main/java/vip/fuck/sm/service/impl/SysDictServiceImpl.java new file mode 100644 index 0000000..0e4fbd4 --- /dev/null +++ b/src/main/java/vip/fuck/sm/service/impl/SysDictServiceImpl.java @@ -0,0 +1,57 @@ +package vip.fuck.sm.service.impl; + + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.json.JSONArray; +import cn.hutool.json.JSONUtil; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import vip.fuck.sm.entity.SysDictDetailEntity; +import vip.fuck.sm.entity.SysDictEntity; +import vip.fuck.sm.mapper.SysDictDetailMapper; +import vip.fuck.sm.mapper.SysDictMapper; +import vip.fuck.sm.service.SysDictService; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.jsonFormatVisitors.JsonArrayFormatVisitor; +import com.fasterxml.jackson.databind.util.JSONPObject; +import org.apache.ibatis.solon.annotation.Db; +import org.noear.solon.annotation.Component; +import org.noear.solon.annotation.Inject; + +import javax.annotation.Resource; +import java.util.List; + +/** + * 数据字典 服务类 + * + * @author xian.zi.ming@qq.com fuck.vip + * @version V1.0 + * @date 2020年3月18日 + */ +@Component(value = "share:sysDictService",typed = true) +public class SysDictServiceImpl extends ServiceImpl implements SysDictService { + + @Db + private SysDictDetailMapper sysDictDetailMapper; + + /** + * 根据字典类型查询字典数据信息 + * + * @param name 字典名称 + * @return 参数键值 + **/ + public JSONArray getType(String name) { + if (ObjectUtil.isEmpty(name)) { + return new JSONArray(); + } + //根据名称获取字典 + SysDictEntity dict = this.getOne(Wrappers.lambdaQuery().eq(SysDictEntity::getName, name)); + if (dict == null || dict.getId() == null) { + return new JSONArray(); + } + //获取明细 + List list = sysDictDetailMapper.selectList(Wrappers.lambdaQuery().eq(SysDictDetailEntity::getDictId, dict.getId())); + return JSONUtil.parseArray(list); + } + +} \ No newline at end of file diff --git a/src/main/java/vip/fuck/sm/service/impl/SysFilesServiceImpl.java b/src/main/java/vip/fuck/sm/service/impl/SysFilesServiceImpl.java new file mode 100644 index 0000000..72b2e93 --- /dev/null +++ b/src/main/java/vip/fuck/sm/service/impl/SysFilesServiceImpl.java @@ -0,0 +1,123 @@ +package vip.fuck.sm.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import vip.fuck.sm.common.exception.BusinessException; +import vip.fuck.sm.common.utils.DateUtils; +import vip.fuck.sm.entity.SysFilesEntity; +import vip.fuck.sm.mapper.SysFilesMapper; +import vip.fuck.sm.service.SysFilesService; +import org.noear.solon.annotation.Component; +import org.noear.solon.annotation.Inject; +import org.noear.solon.core.handle.UploadedFile; +import org.smartboot.http.server.HttpRequest; + +import java.io.File; +import java.util.Date; +import java.util.List; +import java.util.UUID; + +/** + * 文件上传 服务类 + * + * @author xian.zi.ming@qq.com fuck.vip + * @version V1.0 + * @date 2020年3月18日 + */ +@Component(value = "share:sysFilesService",typed = true) +public class SysFilesServiceImpl extends ServiceImpl implements SysFilesService { + @Inject("${server.contextPath}") + private String contextPath; + @Inject("${file.path}") + private String filePath; + + @Override + public String saveFile(UploadedFile file, HttpRequest request) { + //存储文件夹 + String createTime = DateUtils.format(new Date(), DateUtils.DATEPATTERN); + String newPath = filePath + File.separator + createTime + File.separator; + File uploadDirectory = new File(newPath); + if (uploadDirectory.exists()) { + if (!uploadDirectory.isDirectory()) { + uploadDirectory.delete(); + } + } else { + uploadDirectory.mkdir(); + } + try { + String fileName = file.getName(); + //id与filename保持一直,删除文件 + String fileNameNew = UUID.randomUUID().toString().replace("-", "") + getFileType(fileName); + String newFilePathName = newPath + fileNameNew; + String url = this.getRootDir(request) + ("/" + contextPath + "/files/" + createTime + "/" + fileNameNew).replaceAll("/+", "/"); + //创建输出文件对象 + File outFile = new File(newFilePathName); + //拷贝文件到输出文件对象 +// FileUtils.copyInputStreamToFile(file.getInputStream(), outFile); + file.transferTo(outFile); + //保存文件记录 + SysFilesEntity sysFilesEntity = new SysFilesEntity(); + sysFilesEntity.setFileName(fileName); + sysFilesEntity.setFilePath(newFilePathName); + sysFilesEntity.setUrl(url); + this.save(sysFilesEntity); + return url; + } catch (Exception e) { + throw new BusinessException("上传文件失败"); + } + } + + @Override + public void removeByIdsAndFiles(List ids) { + List list = this.listByIds(ids); + list.forEach(entity -> { + //如果之前的文件存在,删除 + File file = new File(entity.getFilePath()); + if (file.exists()) { + file.delete(); + } + }); + this.removeByIds(ids); + + } + + /** + * 获取文件后缀名 + * + * @param fileName 文件名 + * @return 后缀名 + */ + private String getFileType(String fileName) { + if (fileName != null && fileName.contains(".")) { + return fileName.substring(fileName.lastIndexOf(".")); + } + return ""; + } + + /** + * 获取跟路径 + * + * @param request + * @return + */ + private String getRootDir(HttpRequest request) { + // 获取协议 (http 或 https) + String scheme = request.getScheme(); + + // 获取域名 + String serverName = ""; // = request.getServerName(); + + // 获取端口号 + int serverPort = request.getLocalAddress().getPort(); + + // 构建根路径 + StringBuilder rootURL = new StringBuilder(); + rootURL.append(scheme).append("://").append(serverName); + + // 仅当端口不是默认端口时,才包括端口号 + if ((scheme.equals("http") && serverPort != 80) || (scheme.equals("https") && serverPort != 443)) { + rootURL.append(":").append(serverPort); + } + + return rootURL.toString(); + } +} \ No newline at end of file diff --git a/src/main/java/vip/fuck/sm/service/impl/SysGeneratorServiceImpl.java b/src/main/java/vip/fuck/sm/service/impl/SysGeneratorServiceImpl.java new file mode 100644 index 0000000..bdadf7c --- /dev/null +++ b/src/main/java/vip/fuck/sm/service/impl/SysGeneratorServiceImpl.java @@ -0,0 +1,64 @@ +package vip.fuck.sm.service.impl; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import vip.fuck.sm.common.utils.GenUtils; +import vip.fuck.sm.entity.SysGenerator; +import vip.fuck.sm.mapper.GeneratorMapper; +import vip.fuck.sm.service.ISysGeneratorService; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.io.IOUtils; +import org.apache.ibatis.solon.annotation.Db; +import org.noear.solon.annotation.Component; + +import java.io.ByteArrayOutputStream; +import java.util.List; +import java.util.Map; +import java.util.zip.ZipOutputStream; + +/** + * 代码生成 + * + * @author xian.zi.ming@qq.com fuck.vip + * @version V1.0 + * @date 2020年3月18日 + */ +@Component +@Slf4j +public class SysGeneratorServiceImpl implements ISysGeneratorService { + @Db + private GeneratorMapper generatorMapper; + + + @Override + public IPage selectAllTables(Page page, SysGenerator vo) { + return generatorMapper.selectAllTables(page, vo); + } + + @Override + public byte[] generatorCode(String[] tableNames) { + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + ZipOutputStream zip = new ZipOutputStream(outputStream); + + for (String tableName : tableNames) { + //查询表信息 + Map table = queryTable(tableName); + //查询列信息 + List> columns = queryColumns(tableName); + //生成代码 + GenUtils.generatorCode(table, columns, zip); + } + IOUtils.closeQuietly(zip); + return outputStream.toByteArray(); + } + + public Map queryTable(String tableName) { + return generatorMapper.queryTable(tableName); + } + + public List> queryColumns(String tableName) { + return generatorMapper.queryColumns(tableName); + } + + +} diff --git a/src/main/java/vip/fuck/sm/service/impl/SysRoleDeptServiceImpl.java b/src/main/java/vip/fuck/sm/service/impl/SysRoleDeptServiceImpl.java new file mode 100644 index 0000000..1190493 --- /dev/null +++ b/src/main/java/vip/fuck/sm/service/impl/SysRoleDeptServiceImpl.java @@ -0,0 +1,14 @@ +package vip.fuck.sm.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import vip.fuck.sm.entity.SysRoleDeptEntity; +import vip.fuck.sm.mapper.SysRoleDeptMapper; +import vip.fuck.sm.service.SysRoleDeptService; +import org.noear.solon.annotation.Component; + + +@Component(value = "share:sysRoleDeptService",typed = true) +public class SysRoleDeptServiceImpl extends ServiceImpl implements SysRoleDeptService { + + +} \ No newline at end of file diff --git a/src/main/java/vip/fuck/sm/service/impl/UserRoleServiceImpl.java b/src/main/java/vip/fuck/sm/service/impl/UserRoleServiceImpl.java new file mode 100644 index 0000000..ff3d07e --- /dev/null +++ b/src/main/java/vip/fuck/sm/service/impl/UserRoleServiceImpl.java @@ -0,0 +1,55 @@ +package vip.fuck.sm.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import vip.fuck.sm.entity.SysUserRole; +import vip.fuck.sm.mapper.SysUserRoleMapper; +import vip.fuck.sm.service.UserRoleService; +import vip.fuck.sm.vo.req.UserRoleOperationReqVO; +import org.apache.ibatis.solon.annotation.Db; +import org.noear.solon.annotation.Component; +import org.noear.solon.annotation.Inject; +import org.noear.solon.data.annotation.Tran; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.List; + +/** + * 用户角色 服务类 + * + * @author xian.zi.ming@qq.com fuck.vip + * @version V1.0 + * @date 2020年3月18日 + */ +@Component +public class UserRoleServiceImpl extends ServiceImpl implements UserRoleService { + @Db + private SysUserRoleMapper sysUserRoleMapper; + + @Override + public List getRoleIdsByUserId(String userId) { + LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery().select(SysUserRole::getRoleId).eq(SysUserRole::getUserId, userId); + return sysUserRoleMapper.selectObjs(queryWrapper); + } + + @Tran + @Override + public void addUserRoleInfo(UserRoleOperationReqVO vo) { + if (CollectionUtils.isEmpty(vo.getRoleIds())) { + return; + } + List list = new ArrayList<>(); + for (String roleId : vo.getRoleIds()) { + SysUserRole sysUserRole = new SysUserRole(); + sysUserRole.setUserId(vo.getUserId()); + sysUserRole.setRoleId(roleId); + list.add(sysUserRole); + } + sysUserRoleMapper.delete(Wrappers.lambdaQuery().eq(SysUserRole::getUserId, vo.getUserId())); + //批量插入 + this.saveBatch(list); + } +} diff --git a/src/main/java/vip/fuck/sm/service/impl/UserServiceImpl.java b/src/main/java/vip/fuck/sm/service/impl/UserServiceImpl.java new file mode 100644 index 0000000..a757cce --- /dev/null +++ b/src/main/java/vip/fuck/sm/service/impl/UserServiceImpl.java @@ -0,0 +1,237 @@ +package vip.fuck.sm.service.impl; + +import cn.dev33.satoken.stp.StpUtil; +import cn.hutool.core.bean.BeanUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import vip.fuck.sm.common.exception.BusinessException; +import vip.fuck.sm.common.exception.code.BaseResponseCode; +import vip.fuck.sm.common.utils.PasswordUtils; +import vip.fuck.sm.entity.SysDept; +import vip.fuck.sm.entity.SysRole; +import vip.fuck.sm.entity.SysUser; +import vip.fuck.sm.mapper.SysDeptMapper; +import vip.fuck.sm.mapper.SysUserMapper; +import vip.fuck.sm.service.PermissionService; +import vip.fuck.sm.service.RoleService; +import vip.fuck.sm.service.UserRoleService; +import vip.fuck.sm.service.UserService; +import vip.fuck.sm.vo.req.UserRoleOperationReqVO; +import vip.fuck.sm.vo.resp.LoginRespVO; +import vip.fuck.sm.vo.resp.UserOwnRoleRespVO; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang.StringUtils; +import org.apache.ibatis.solon.annotation.Db; +import org.noear.solon.annotation.Inject; +import org.noear.solon.annotation.Component; + +import javax.annotation.Resource; +import java.util.List; + +/** + * 用户 服务类 + * + * @author xian.zi.ming@qq.com fuck.vip + * @version V1.0 + * @date 2020年3月18日 + */ +@Component +@Slf4j +public class UserServiceImpl extends ServiceImpl implements UserService { + + @Db + private SysUserMapper sysUserMapper; + @Inject + private RoleService roleService; + @Inject + private PermissionService permissionService; + @Inject + private UserRoleService userRoleService; + @Db + private SysDeptMapper sysDeptMapper; + + @Inject("${solon.env}") + private String env; + + @Override + public void register(SysUser sysUser) { + SysUser sysUserOne = sysUserMapper.selectOne(Wrappers.lambdaQuery().eq(SysUser::getUsername, sysUser.getUsername())); + if (sysUserOne != null) { + throw new BusinessException("用户名已存在!"); + } + sysUser.setSalt(PasswordUtils.getSalt()); + String encode = PasswordUtils.encode(sysUser.getPassword(), sysUser.getSalt()); + sysUser.setPassword(encode); + sysUserMapper.insert(sysUser); + } + + @Override + public LoginRespVO login(SysUser vo) { + SysUser sysUser = sysUserMapper.selectOne(Wrappers.lambdaQuery().eq(SysUser::getUsername, vo.getUsername())); + if (null == sysUser) { + throw new BusinessException(BaseResponseCode.NOT_ACCOUNT); + } + if (sysUser.getStatus() == 2) { + throw new BusinessException(BaseResponseCode.USER_LOCK); + } + if (!PasswordUtils.matches(sysUser.getSalt(), vo.getPassword(), sysUser.getPassword())) { + throw new BusinessException(BaseResponseCode.PASSWORD_ERROR); + } + LoginRespVO respVO = new LoginRespVO(); + BeanUtil.copyProperties(sysUser, respVO); + + if (StringUtils.isNotBlank(sysUser.getDeptId())) { + SysDept sysDept = sysDeptMapper.selectById(sysUser.getDeptId()); + if (sysDept != null) { + sysUser.setDeptNo(sysDept.getDeptNo()); + } + } + //saToken + StpUtil.login(sysUser.getId()); + + return respVO; + } + + @Override + public void updateUserInfo(SysUser vo) { + + + SysUser sysUser = sysUserMapper.selectById(vo.getId()); + if (null == sysUser) { + throw new BusinessException(BaseResponseCode.DATA_ERROR); + } + + //如果用户名变更 + if (!sysUser.getUsername().equals(vo.getUsername())) { + SysUser sysUserOne = sysUserMapper.selectOne(Wrappers.lambdaQuery().eq(SysUser::getUsername, vo.getUsername())); + if (sysUserOne != null) { + throw new BusinessException("用户名已存在!"); + } + } + + //如果用户名、密码、状态 变更,删除redis中用户绑定的角色跟权限 + if (!sysUser.getUsername().equals(vo.getUsername()) + || (!StringUtils.isEmpty(vo.getPassword()) + && !sysUser.getPassword().equals(PasswordUtils.encode(vo.getPassword(), sysUser.getSalt()))) + || !sysUser.getStatus().equals(vo.getStatus())) { + } + + if (!StringUtils.isEmpty(vo.getPassword())) { + String newPassword = PasswordUtils.encode(vo.getPassword(), sysUser.getSalt()); + vo.setPassword(newPassword); + } else { + vo.setPassword(null); + } + sysUserMapper.updateById(vo); + + } + + @Override + public void updateUserInfoMy(SysUser vo) { + SysUser user = sysUserMapper.selectById(StpUtil.getLoginIdAsString()); + if (null == user) { + throw new BusinessException(BaseResponseCode.DATA_ERROR); + } + if (!StringUtils.isEmpty(vo.getPassword())) { + String newPassword = PasswordUtils.encode(vo.getPassword(), user.getSalt()); + vo.setPassword(newPassword); + } else { + vo.setPassword(null); + } + vo.setUpdateId(StpUtil.getLoginIdAsString()); + sysUserMapper.updateById(vo); + + } + + @Override + public IPage pageInfo(SysUser vo) { + LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery(); + if (!StringUtils.isEmpty(vo.getUsername())) { + queryWrapper.like(SysUser::getUsername, vo.getUsername()); + } + if (!StringUtils.isEmpty(vo.getStartTime())) { + queryWrapper.gt(SysUser::getCreateTime, vo.getStartTime()); + } + if (!StringUtils.isEmpty(vo.getEndTime())) { + queryWrapper.lt(SysUser::getCreateTime, vo.getEndTime()); + } + if (!StringUtils.isEmpty(vo.getNickName())) { + queryWrapper.like(SysUser::getNickName, vo.getNickName()); + } + if (null != vo.getStatus()) { + queryWrapper.eq(SysUser::getStatus, vo.getStatus()); + } + if (!StringUtils.isEmpty(vo.getDeptNo())) { + LambdaQueryWrapper queryWrapperDept = Wrappers.lambdaQuery(); + queryWrapperDept.select(SysDept::getId).like(SysDept::getRelationCode, vo.getDeptNo()); + List list = sysDeptMapper.selectObjs(queryWrapperDept); + queryWrapper.in(SysUser::getDeptId, list); + } + queryWrapper.orderByDesc(SysUser::getCreateTime); + IPage iPage = sysUserMapper.selectPage(vo.getQueryPage(), queryWrapper); + if (!CollectionUtils.isEmpty(iPage.getRecords())) { + for (SysUser sysUser : iPage.getRecords()) { + SysDept sysDept = sysDeptMapper.selectById(sysUser.getDeptId()); + if (sysDept != null) { + sysUser.setDeptName(sysDept.getName()); + } + } + } + return iPage; + } + + @Override + public void addUser(SysUser vo) { + + SysUser sysUserOne = sysUserMapper.selectOne(Wrappers.lambdaQuery().eq(SysUser::getUsername, vo.getUsername())); + if (sysUserOne != null) { + throw new BusinessException("用户已存在,请勿重复添加!"); + } + vo.setSalt(PasswordUtils.getSalt()); + String encode = PasswordUtils.encode(vo.getPassword(), vo.getSalt()); + vo.setPassword(encode); + vo.setStatus(1); + vo.setCreateWhere(1); + sysUserMapper.insert(vo); + if (!CollectionUtils.isEmpty(vo.getRoleIds())) { + UserRoleOperationReqVO reqVO = new UserRoleOperationReqVO(); + reqVO.setUserId(vo.getId()); + reqVO.setRoleIds(vo.getRoleIds()); + userRoleService.addUserRoleInfo(reqVO); + } + } + + @Override + public void updatePwd(SysUser vo) { + + SysUser sysUser = sysUserMapper.selectById(vo.getId()); + if (sysUser == null) { + throw new BusinessException(BaseResponseCode.DATA_ERROR); + } + if ("test".equals(env) && "guest".equals(sysUser.getUsername())) { + throw new BusinessException("演示环境禁止修改演示账号密码"); + } + + if (!PasswordUtils.matches(sysUser.getSalt(), vo.getOldPwd(), sysUser.getPassword())) { + throw new BusinessException(BaseResponseCode.OLD_PASSWORD_ERROR); + } + if (sysUser.getPassword().equals(PasswordUtils.encode(vo.getNewPwd(), sysUser.getSalt()))) { + throw new BusinessException("新密码不能与旧密码相同"); + } + sysUser.setPassword(PasswordUtils.encode(vo.getNewPwd(), sysUser.getSalt())); + sysUserMapper.updateById(sysUser); + } + + @Override + public UserOwnRoleRespVO getUserOwnRole(String userId) { + List roleIdsByUserId = userRoleService.getRoleIdsByUserId(userId); + List list = roleService.list(); + UserOwnRoleRespVO vo = new UserOwnRoleRespVO(); + vo.setAllRole(list); + vo.setOwnRoles(roleIdsByUserId); + return vo; + } +} diff --git a/src/main/java/vip/fuck/sm/vo/req/RolePermissionOperationReqVO.java b/src/main/java/vip/fuck/sm/vo/req/RolePermissionOperationReqVO.java new file mode 100644 index 0000000..3bbafb4 --- /dev/null +++ b/src/main/java/vip/fuck/sm/vo/req/RolePermissionOperationReqVO.java @@ -0,0 +1,25 @@ +package vip.fuck.sm.vo.req; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.noear.solon.validation.annotation.NotBlank; +import org.noear.solon.validation.annotation.NotEmpty; + +import java.util.List; + +/** + * RolePermissionOperationReqVO + * + * @author xian.zi.ming@qq.com fuck.vip + * @version V1.0 + * @date 2020年3月18日 + */ +@Data +public class RolePermissionOperationReqVO { + @ApiModelProperty(value = "角色id") + @NotBlank(message = "角色id不能为空") + private String roleId; + @ApiModelProperty(value = "菜单权限集合") + @NotEmpty(message = "菜单权限集合不能为空") + private List permissionIds; +} diff --git a/src/main/java/vip/fuck/sm/vo/req/UserRoleOperationReqVO.java b/src/main/java/vip/fuck/sm/vo/req/UserRoleOperationReqVO.java new file mode 100644 index 0000000..8837be3 --- /dev/null +++ b/src/main/java/vip/fuck/sm/vo/req/UserRoleOperationReqVO.java @@ -0,0 +1,25 @@ +package vip.fuck.sm.vo.req; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.noear.solon.validation.annotation.NotBlank; +import org.noear.solon.validation.annotation.NotEmpty; + +import java.util.List; + +/** + * UserRoleOperationReqVO + * + * @author xian.zi.ming@qq.com fuck.vip + * @version V1.0 + * @date 2020年3月18日 + */ +@Data +public class UserRoleOperationReqVO { + @ApiModelProperty(value = "用户id") + @NotBlank(message = "用户id不能为空") + private String userId; + @ApiModelProperty(value = "角色id集合") + @NotEmpty(message = "角色id集合不能为空") + private List roleIds; +} diff --git a/src/main/java/vip/fuck/sm/vo/resp/DeptRespNodeVO.java b/src/main/java/vip/fuck/sm/vo/resp/DeptRespNodeVO.java new file mode 100644 index 0000000..708f2f1 --- /dev/null +++ b/src/main/java/vip/fuck/sm/vo/resp/DeptRespNodeVO.java @@ -0,0 +1,53 @@ +package vip.fuck.sm.vo.resp; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * DeptRespNodeVO + * + * @author xian.zi.ming@qq.com fuck.vip + * @version V1.0 + * @date 2020年3月18日 + */ +@Data +public class DeptRespNodeVO { + @ApiModelProperty(value = "组织id") + private String id; + + @ApiModelProperty(value = "组织编码") + private String deptNo; + + @ApiModelProperty(value = "组织名称") + private String title; + + @ApiModelProperty(value = "组织名称") + private String label; + + @ApiModelProperty(value = "组织父级id") + private String pid; + + @ApiModelProperty(value = "组织状态") + private Integer status; + + @ApiModelProperty(value = "组织关系id") + private String relationCode; + + @ApiModelProperty(value = "是否展开 默认不展开(false)") + private boolean spread = true; + + @ApiModelProperty(value = "是否选中") + private boolean checked = false; + + private boolean disabled = false; + + @ApiModelProperty(value = "子集") + private List children; + + public String getLabel() { + return title; + } + +} diff --git a/src/main/java/vip/fuck/sm/vo/resp/HomeRespVO.java b/src/main/java/vip/fuck/sm/vo/resp/HomeRespVO.java new file mode 100644 index 0000000..fe21f85 --- /dev/null +++ b/src/main/java/vip/fuck/sm/vo/resp/HomeRespVO.java @@ -0,0 +1,22 @@ +package vip.fuck.sm.vo.resp; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * HomeRespVO + * + * @author xian.zi.ming@qq.com fuck.vip + * @version V1.0 + * @date 2020年3月18日 + */ +@Data +public class HomeRespVO { + @ApiModelProperty(value = "用户信息") + private UserInfoRespVO userInfo; + @ApiModelProperty(value = "目录菜单") + private List menus; + +} \ No newline at end of file diff --git a/src/main/java/vip/fuck/sm/vo/resp/LoginRespVO.java b/src/main/java/vip/fuck/sm/vo/resp/LoginRespVO.java new file mode 100644 index 0000000..23f07ce --- /dev/null +++ b/src/main/java/vip/fuck/sm/vo/resp/LoginRespVO.java @@ -0,0 +1,27 @@ +package vip.fuck.sm.vo.resp; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * LoginRespVO + * + * @author xian.zi.ming@qq.com fuck.vip + * @version V1.0 + * @date 2020年3月18日 + */ +@Data +public class LoginRespVO { + @ApiModelProperty(value = "token") + private String accessToken; + @ApiModelProperty(value = "用户名") + private String username; + @ApiModelProperty(value = "用户id") + private String id; + @ApiModelProperty(value = "电话") + private String phone; + @ApiModelProperty(value = "用户所拥有的菜单权限(前后端分离返回给前端控制菜单和按钮的显示和隐藏)") + private List list; +} diff --git a/src/main/java/vip/fuck/sm/vo/resp/PermissionRespNode.java b/src/main/java/vip/fuck/sm/vo/resp/PermissionRespNode.java new file mode 100644 index 0000000..a96cd19 --- /dev/null +++ b/src/main/java/vip/fuck/sm/vo/resp/PermissionRespNode.java @@ -0,0 +1,53 @@ +package vip.fuck.sm.vo.resp; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * PermissionRespNode + * + * @author xian.zi.ming@qq.com fuck.vip + * @version V1.0 + * @date 2020年3月18日 + */ +@Data +public class PermissionRespNode { + @ApiModelProperty(value = "id") + private String id; + @ApiModelProperty(value = "菜单权限名称") + private String title; + + @ApiModelProperty(value = "菜单权限标识,shiro 适配restful") + private String perms; + + @ApiModelProperty(value = "接口地址") + private String url; + + @ApiModelProperty(value = "icon") + private String icon; + + private String target; + + @ApiModelProperty(value = "父级id") + private String pid; + + @ApiModelProperty(value = "父级名称") + private String pidName; + + @ApiModelProperty(value = "菜单权限类型(1:目录;2:菜单;3:按钮)") + private Integer type; + + @ApiModelProperty(value = "排序码") + private Integer orderNum; + + @ApiModelProperty(value = "是否展开 默认不展开(false)") + private boolean spread = true; + + @ApiModelProperty(value = "是否选中 默认false") + private boolean checked; + private List children; + + +} diff --git a/src/main/java/vip/fuck/sm/vo/resp/UserInfoRespVO.java b/src/main/java/vip/fuck/sm/vo/resp/UserInfoRespVO.java new file mode 100644 index 0000000..daea99d --- /dev/null +++ b/src/main/java/vip/fuck/sm/vo/resp/UserInfoRespVO.java @@ -0,0 +1,30 @@ +package vip.fuck.sm.vo.resp; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * UserInfoRespVO + * + * @author xian.zi.ming@qq.com fuck.vip + * @version V1.0 + * @date 2020年3月18日 + */ +@Data +public class UserInfoRespVO { + @ApiModelProperty(value = "用户id") + private String id; + @ApiModelProperty(value = "账号") + private String username; + @ApiModelProperty(value = "手机号") + private String phone; + @ApiModelProperty(value = "昵称") + private String nickName; + @ApiModelProperty(value = "真实姓名") + private String realName; + @ApiModelProperty(value = "所属机构id") + private String deptId; + @ApiModelProperty(value = "所属机构名称") + private String deptName; + +} diff --git a/src/main/java/vip/fuck/sm/vo/resp/UserOwnRoleRespVO.java b/src/main/java/vip/fuck/sm/vo/resp/UserOwnRoleRespVO.java new file mode 100644 index 0000000..2c227bf --- /dev/null +++ b/src/main/java/vip/fuck/sm/vo/resp/UserOwnRoleRespVO.java @@ -0,0 +1,22 @@ +package vip.fuck.sm.vo.resp; + +import vip.fuck.sm.entity.SysRole; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * UserOwnRoleRespVO + * + * @author xian.zi.ming@qq.com fuck.vip + * @version V1.0 + * @date 2020年3月18日 + */ +@Data +public class UserOwnRoleRespVO { + @ApiModelProperty("所有角色集合") + private List allRole; + @ApiModelProperty(value = "用户所拥有角色集合") + private List ownRoles; +} diff --git a/src/main/resources/app.yml b/src/main/resources/app.yml new file mode 100644 index 0000000..f6c3eb8 --- /dev/null +++ b/src/main/resources/app.yml @@ -0,0 +1,80 @@ +server.port: 8080 +server.contextPath: '/' +solon.env: 'dev' + +solon.app: + name: 'solon-manager' + group: 'vip.fuck' + +solon.logging: + appender: + console: + level: INFO + file: + level: INFO + +solon.dataSources: + master!: + class: "com.zaxxer.hikari.HikariDataSource" + username: root + password: 123456 + driverClassName: com.mysql.cj.jdbc.Driver + jdbcUrl: jdbc:mysql://localhost:3306/company_project?useUnicode=true&useSSL=false&characterEncoding=utf8&serverTimezone=GMT%2b8 + + + +mybatis.master: + typeAliases: #支持包名 或 类名(大写开头 或 *)//支持 ** 或 * 占位符 + - "vip.fuck.sm.entity" + typeHandlers: #支持包名 或 类名(大写开头 或 *)//支持 ** 或 * 占位符 + - "vip.fuck.sm.entity.handler" + mappers: #支持包名 或 类名(大写开头 或 *)或 xml(.xml结尾)//支持 ** 或 * 占位符 + - "vip.fuck.sm.mapper.*" #这个表达式同上效果 + - "classpath:mapper/${project.database}/**/*.xml,classpath:mapper/*.xml" + - "classpath:mapper/*.xml" + configuration: #扩展配置(要与 MybatisConfiguration 类的属性一一对应) + cacheEnabled: false + mapperVerifyEnabled: false #如果为 true,则要求所有 mapper 有 @Mapper 主解 + mapUnderscoreToCamelCase: true + log-impl: org.apache.ibatis.logging.stdout.StdOutImpl + globalConfig: #全局配置(要与 GlobalConfig 类的属性一一对应) + banner: true + metaObjectHandler: "vip.fuck.sm.common.config.MetaObjectHandlerConfig" + dbConfig: + logicDeleteField: "deleted" + logicDeleteValue: 1 + logicNotDeleteValue: 0 + +############## Sa-Token 配置 (文档: https://sa-token.cc) ############## +sa-token: + # token 名称(同时也是 cookie 名称) + token-name: satoken + # token 有效期(单位:秒) 默认30天,-1 代表永久有效 + timeout: 2592000 + # token 最低活跃频率(单位:秒),如果 token 超过此时间没有访问系统就会被冻结,默认-1 代表不限制,永不冻结 + active-timeout: -1 + # 是否允许同一账号多地同时登录 (为 true 时允许一起登录, 为 false 时新登录挤掉旧登录) + is-concurrent: true + # 在多人登录同一账号时,是否共用一个 token (为 true 时所有登录共用一个 token, 为 false 时每次登录新建一个 token) + is-share: true + # token 风格(默认可取值:uuid、simple-uuid、random-32、random-64、random-128、tik) + token-style: uuid + # 是否输出操作日志 + is-log: true + +knife4j.enable: true +knife4j.basic.enable: true +knife4j.basic.username: admin +knife4j.basic.password: 123456 +knife4j.setting.enableOpenApi: false +knife4j.setting.enableSwaggerModels: false +knife4j.setting.enableFooter: false + +#使用代码生成模块时 指定要生成的表存在于哪种数据库,可选值有【mysql、oracle、sqlServer】 +project: + database: mysql + +file: + #文件上传目录 绝对路径 末尾不需要加 / + path: D:/files #windows + #path: /data/files #linux \ No newline at end of file diff --git a/src/main/resources/generator.properties b/src/main/resources/generator.properties new file mode 100644 index 0000000..8b42514 --- /dev/null +++ b/src/main/resources/generator.properties @@ -0,0 +1,61 @@ +#\u4EE3\u7801\u751F\u6210\u5668\uFF0C\u914D\u7F6E\u4FE1\u606F + +mainPath=com.company +#\u5305\u540D +package=vip.fuck.sm +#\u4F5C\u8005 +author=Rish +#Email +email=xian.zi.ming@qq.com +#表前缀 +tablePrefix= + +#\u7C7B\u578B\u8F6C\u6362\uFF0C\u914D\u7F6E\u4FE1\u606F +tinyint=Integer +smallint=Integer +mediumint=Integer +int=Integer +integer=Integer +bigint=Long +float=Float +double=Double +decimal=BigDecimal +bit=Boolean + +char=String +varchar=String +tinytext=String +text=String +mediumtext=String +longtext=String + +date=Date +datetime=Date +timestamp=Date + +NUMBER=Integer +INT=Integer +INTEGER=Integer +BINARY_INTEGER=Integer +LONG=String +FLOAT=Float +BINARY_FLOAT=Float +DOUBLE=Double +BINARY_DOUBLE=Double +DECIMAL=BigDecimal +CHAR=String +VARCHAR=String +VARCHAR2=String +NVARCHAR=String +NVARCHAR2=String +CLOB=String +BLOB=String +DATE=Date +DATETIME=Date +TIMESTAMP=Date +TIMESTAMP(6)=Date + +int8=Long +int4=Integer +int2=Integer +numeric=BigDecimal \ No newline at end of file diff --git a/src/main/resources/mapper/mysql/SysGeneratorMapper.xml b/src/main/resources/mapper/mysql/SysGeneratorMapper.xml new file mode 100644 index 0000000..c4c12ff --- /dev/null +++ b/src/main/resources/mapper/mysql/SysGeneratorMapper.xml @@ -0,0 +1,39 @@ + + + + + + + id, table_name, menu_name, pid, gen_time + + + + + + + + + diff --git a/src/main/resources/mapper/oracle/SysGeneratorMapper.xml b/src/main/resources/mapper/oracle/SysGeneratorMapper.xml new file mode 100644 index 0000000..4fa5780 --- /dev/null +++ b/src/main/resources/mapper/oracle/SysGeneratorMapper.xml @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + id, table_name, menu_name, pid, gen_time + + + + + + + + + + diff --git a/src/main/resources/mapper/sqlServer/SysGeneratorMapper.xml b/src/main/resources/mapper/sqlServer/SysGeneratorMapper.xml new file mode 100644 index 0000000..8142722 --- /dev/null +++ b/src/main/resources/mapper/sqlServer/SysGeneratorMapper.xml @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + id, table_name, menu_name, pid, gen_time + + + + + + + + + diff --git a/src/main/resources/static/css/403.css b/src/main/resources/static/css/403.css new file mode 100644 index 0000000..fe360a5 --- /dev/null +++ b/src/main/resources/static/css/403.css @@ -0,0 +1,9 @@ +#banner { + background: url("images/403.png") no-repeat; + background-size: 100%; + overflow: hidden; +} + +h1 { + font-size: 40px; +} \ No newline at end of file diff --git a/src/main/resources/static/css/404.css b/src/main/resources/static/css/404.css new file mode 100644 index 0000000..5276f2f --- /dev/null +++ b/src/main/resources/static/css/404.css @@ -0,0 +1,9 @@ +#banner { + background: url("images/404.png") no-repeat; + background-size: 100%; + overflow: hidden; +} + +h1 { + font-size: 40px; +} \ No newline at end of file diff --git a/src/main/resources/static/css/500.css b/src/main/resources/static/css/500.css new file mode 100644 index 0000000..13400d3 --- /dev/null +++ b/src/main/resources/static/css/500.css @@ -0,0 +1,9 @@ +#banner { + background: url("images/500.png") no-repeat; + background-size: 100%; + overflow: hidden; +} + +h1 { + font-size: 40px; +} \ No newline at end of file diff --git a/src/main/resources/static/css/build.css b/src/main/resources/static/css/build.css new file mode 100644 index 0000000..2fba99e --- /dev/null +++ b/src/main/resources/static/css/build.css @@ -0,0 +1,111 @@ +@charset "UTF-8"; + +/*元素面板*/ +.element-panel{ + padding-top: 10px; +} +.element-panel .layui-form-item, +.element-panel .layui-form-item .layui-form-label, +.build-panel .build-item, +.build-panel .build-item .layui-form-label +{ + cursor: move; +} +.drag-box{ + position: absolute; + top: 100px; + left: 100px; + background-color: #FFFFFF; + box-shadow: 0 0 2px 1px rgba(0,0,0,.12); + opacity: 0.6; +} +.drag-box .layui-form-item{ + margin-bottom: 10px; +} + +/*构建面板*/ +.build-card{ + overflow: hidden; +} +.build-panel{ + min-height: 500px; + overflow: hidden; + padding: 0; + margin: 15px; +} +.build-panel.active{ + background-color: #fdffcd; +} +.build-panel #shell-item{ + background-color: #eeeeee; + border: 1px dashed #c3c3c3; +} +.build-panel .build-item{ + position: relative; +} +.build-panel .build-item:hover{ + padding-top: 10px; + border: 1px dashed #ffc664; +} +.build-panel .build-item:hover .control{ + display: block; +} +.build-panel .build-item .control{ + position: absolute; + top: 0; + right: 6px; + font-size: 12px; + color: #009688; + display: none; + z-index: 999999; +} +.build-panel .build-item .control a{ + color: #009688; +} +.build-item-edit .build-edit-box{ + position: relative; + width: 500px; + height: 317px; + display: block; +} +.build-item-edit .build-edit{ + display: block; + width: 460px; + height: 287px; + border: 10px solid #F8F8F8; + border-top-width: 0; + padding: 10px; + line-height: 20px; + overflow: auto; + background-color: #3F3F3F; + color: #eee; + font-size: 12px; + font-family: Courier New, serif; +} +.build-item-edit .build-edit-btn{ + position: absolute; + z-index: 99999; + right: 34px; + bottom: 26px; + width: 58px; + height: 30px; + border: none; + color: #ffffff; + border-radius: 2px; + background-color: #009688; + cursor: pointer; +} +.build-item-edit .build-edit-btn:hover{ + background-color: #007c6e; +} +.build-generate{ + float: right; + margin-top: 6px; + margin-right: 2px; + color: #009688; + border-color: #009688; +} +.build-generate:hover{ + background-color: #009688; + color: #FFFFFF; +} \ No newline at end of file diff --git a/src/main/resources/static/css/custom.form.css b/src/main/resources/static/css/custom.form.css new file mode 100644 index 0000000..e1de6be --- /dev/null +++ b/src/main/resources/static/css/custom.form.css @@ -0,0 +1,38 @@ +.panel-heading{ + padding:10px 10px; + border-bottom:1px solid transparent; + border-radius:2px 2px 0 0; + font-size:14px; + background: #eeeeee +} +.panel{ + margin-bottom:20px; + background-color:#fff; + border:1px solid transparent; + border-radius:4px; + -webkit-box-shadow:0 1px 1px rgba(0,0,0,.05); + box-shadow:0 1px 1px rgba(0,0,0,.05) +} +.panel-default{ + border-color:#ddd; +} + +.layui-input, .layui-textarea { + display: block; + width: 96%; + padding-left: 10px; +} + +.layui-form-pane .layui-form-label { + width: 125px; + padding: 8px 15px; + height: 38px; + line-height: 20px; + border-width: 1px; + border-style: solid; + border-radius: 2px 0 0 2px; + text-align: center; + background-color: #FBFBFB; + overflow: hidden; + box-sizing: border-box; +} \ No newline at end of file diff --git a/src/main/resources/static/css/home.css b/src/main/resources/static/css/home.css new file mode 100644 index 0000000..692175f --- /dev/null +++ b/src/main/resources/static/css/home.css @@ -0,0 +1,110 @@ +.layui-tab-title .layui-this { + background-color: #009688; + color: #eee; +} + +.first-tab i.layui-tab-close { + display: none !important; +} + +.layui-layout-admin .layui-header { + background-color: #1aa094 !important; +} + +.layui-layout-admin .layui-logo { + background-color: #0c0c0c !important; +} + +.layuimini-color .color-title { + padding: 10px 0 10px 20px; + border-bottom: 1px solid #d9dada; + margin-bottom: 8px; +} + +.layuimini-color .color-content { + padding: 0 5px 0 5px; +} + +.layuimini-color .color-content ul { + list-style: none; + text-align: center; +} + +.layuimini-color .color-content ul li { + position: relative; + display: inline-block; + vertical-align: top; + width: 80px; + height: 50px; + margin: 0 15px 15px 0; + padding: 2px 2px 4px 2px; + background-color: #f2f2f2; + cursor: pointer; + font-size: 12px; + color: #666; +} + +.layuimini-color .color-content li.layui-this:after, .layuimini-color .color-content li:hover:after { + width: 100%; + height: 100%; + padding: 4px; + top: -5px; + left: -5px; + border-color: #d8d8d8; + opacity: 1; +} + +.layuimini-color .color-content li:after { + content: ''; + position: absolute; + z-index: 20; + top: 50%; + left: 50%; + width: 1px; + height: 0; + border: 1px solid #f2f2f2; + transition: all .3s; + -webkit-transition: all .3s; + opacity: 0; +} + +.layuimini-tool-left { + position: absolute !important; + top: 0; + left: 200px; + width: 60px; + height: 100%; + line-height: 60px; + text-align: center; + color: #ffffff !important; +} + +.closeBox { + height: 35px !important; +} + +.closeBox > li { + line-height: 35px !important; +} + +.closeBox { + position: absolute; + right: -10px; + top: 16px; + background-color: #fff !important; + color: #000; + border-bottom: 1px solid #e2e2e2; + padding: 0 10px !important; +} + +.closeBox .layui-nav-item { + line-height: 40px; +} + +.closeBox .layui-nav-item > a, .closeBox .layui-nav-item > a:hover { + color: #000; +} + +.closeBox .layui-nav-child { + top: 40px; +} \ No newline at end of file diff --git a/src/main/resources/static/css/images/403.png b/src/main/resources/static/css/images/403.png new file mode 100644 index 0000000000000000000000000000000000000000..afa0a3b38d676f703b5642f5284633f6cb1d659a GIT binary patch literal 147566 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 z

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 YjIDG$+(8?3k_`Nm^;xTe6Yf#}2V@A7_5c6? literal 0 HcmV?d00001 diff --git a/src/main/resources/static/css/images/404.png b/src/main/resources/static/css/images/404.png new file mode 100644 index 0000000000000000000000000000000000000000..44447757c2241ba33a468e32f489735a84875ecd GIT binary patch literal 147186 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 z

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≠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 bJu8;NKcinLQV+D2wEWbGa~4I%uH5}!go{Y~ literal 0 HcmV?d00001 diff --git a/src/main/resources/static/css/images/500.png b/src/main/resources/static/css/images/500.png new file mode 100644 index 0000000000000000000000000000000000000000..bc467d425803231c681fefcb29a98a4cf23f7dc9 GIT binary patch literal 147716 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 z

J2sPoSY>wLov7z@7Esm)wC$OsZWcFR?VA*HF>U_7V-=pRw>#%5>co4=$)k~9JD z4{CuX)P=$B5t@{h6l}HNTP1-jcW@kuybV$u_xUxkU*@40u;SQ3fQP%`((OiA=|c!& z#H^QXXpKeFHoY*Ga|+yu|3P$Stdz0;kVT&{#bHDL`HGTjx4_Pp9V6~1Sol5pP&0W< zMn&|Bupqp9oz)2glD>%}VWsz>GrxgIiSg=aAM>l$1^uEF=`J5u1fb(DaFG-h9f|V z(Ojwlo$<9bZQDtU*m+JcaZuVSWVdp?P;HuKg#V|jASdAnuk@KID!#^5iKdDf#*+k? z+i5~){V4E~D`Lm%;k7<0B$l5uTWxu#Eu{*ns%)@WlKu3{hk-DFL8HZN>VYvo=7u+4-pg%1Kz_IVi!>xdpIkdIJI~n( zFHvwmcP;~6gY|QRM{9Op^!uyU78Bx9$6_!ws4o_jxl&5qTG93BMei6PPF)ZW9+g(p zRIXN$$IRrs!J}0{(sfk%^jqjFR6!lN?{HR^<;~rHZ8g6L1tBV35Yu59CW)PcU91DN zzo2EgiWNh4Ot9DJF|gGskSfoLvw6aqCkuZLS~eS?+rqjC60*?mjM{ZsejlX@^D=th zV)O6aWO}6Qi?7E>m;IE(&_M^}%0weo9MHQ!0UO1pLZBo@oXR;okXpJo2)jpVUs$Ou z^c838`es|`dJR0F_>0o7e?fVd;Jl5v&){^I#5Q-PINBLJC)Is&^Mto7wMXN>e+c}xcg8>D&BgV0XTM2iA6p$%MU@$S^9 z;JZQdD3v1hU;hH*Zt_-{^s{XctV;WvK}7!MDs`SLEuO^=8Z{0z?mh2-+bviFNo&Cn+5cOL#uj$(Yj!( z<=gzwa`->|@LRuPg2|Cbz6Wiu7(7e*Cx*RaI5}(W=K`@EbO3TL3gfY%FE)c6Fl$T{ z7M;o}|3y_{>=0M>jSrGcZjfDoX}Gz*Svbg*`LEGM3=%{$;y{sDHbR}Z5}w*#488-L z6Px|z-96#yaV)!xwt##l>bP?WXp*9Xy7e8VU)Ia{FFn)Lyf3|&|0;b=^t-b4Wog|5 zAwL+?ANLvNgM1#0cR8@J_n!0*teF!Ebi+}Bpt;Bj%B|1NwF}u|lGQZXTP~N^l3bp^1%$!wX{DO z@dqFY1}AcE>~z&bd&I|GVVg3V1Vh1A`g2FeZb;y^*qm)NtEmdodD0eZ1r-(n7t-F3 zx-{H1AM3|<<+81kSsB|tczvf1Fr~489hc`Iza_{8Ud-cCtvf*eHed~^pxQTL|52|h z1Tls=5C8{X*XdTAi#h{%*wwEMp1~CFQj2vd^mHBEwZ)fPdY0EZEMk{=VU#S7${CdQ znTx>MWb?;PZ-`^7wtkPb#LS9nx&}874!NQUgPZyNRy_%g!LDRN0IjMBm2+@y>9^Ir zr#P2tn@GOb7dc|=udIy8JQL!`E^67=G2h-k`zQ8d)Z>xRsM)f`? zbUce$<vJ{t95imnI%m)x&wt9;F}sIw zzW+DUUDZ6W0WY|c`0|BS#~YRRe24FyJL%Z5n3k06^D_J6`<&dg$aeQ!Nh$pMj&$0o zl-+(y)S~Q@@3g=96k@d|+OHs@jiof$l>84>E*?N^=rphlfCMTEk9eheDZ;Er|Y%f18lPj+SwGNNV#Qj zerM5zEqD7weYX;c>o(3e>*?_J8Hv;zd3o-y$mz(7^2Z%U7Ax;m9}aI8ITn>~E#jQ* zA$vJpt-$_@?IrgtGm*$iUvZluA1i&FrramVsUHRDIIltjuQnF3pvKunv!35uU&csZ zL4VdhNvQYcWz*8&X}?itP|MV>?L*E3FIl|OyG7OuD+U%^n{P!S{shq{@%!@0_t1nh z1I@CJRok`n@#iUi@E*gM^;J#WO%gB|)qg7MdcmqD#o73sT6WRq33DG(a@1{dNt};h z?C0dFcMT{1*ekc_UK*_a*hw(K@`@BKeb!A%wFyt*+QB@f5uQ#FX$1OgNvVHbqeBC= zyOd=>e(Ex5=j$*-utK@5=@b;B|F?+S#C3oP0Plp^C|Uh5Q&8X|7#W-9vAnPwP~|VD z-?aI=v?OY&;#EFMl-QCEjGQ~#JWHdt&0nu|n{;(FPtV@7Hm;eDbBWaJczIq|Bw5Y3 zap-xM=6(6ePoH|eXHDYgTiuSRo{Sj(obJ@np~;R-0PHmOHYgj3}S<0rl#S_`Eu zGPTm=@Hf8zZ_qjUc&EOg>1{;415i3+3MmA`fY@XJv0G0#$PZ4yd9q@?N}sg<&bTQh za(Se}qh;IM?yA7f*NmO}E15yjOoWfdiE9_u2C6HX&&EA*tQlcBARn)u|3GFbf7`+T z>RHp4WA1Ss(?xDFMe17j)LT9h%4hm)FFfG+Wot`#dUNu7yY2$Qg5;n*s29DFV3tK& z@RZ+&Ah=ERarkZjX2#lFY2700KNsbwl^dzuOb2=m_XdD%aq?Lhpi?wKx9zeZ@~j{R zvsJtly?ZzXWUHPWh7ft6EE&g)$PuefDEHP0t`R&fgJWK z7$92|Tqr-7YQ^;D9JY``Vmt+jgv|MI!(Q_LAI0`6JZ(Qoz3!?%#fQVN;9-6Wdv49lRdgbJfzZ z(i6W7qAvR!2e556KPc*H~px(YXtvmv)zMb zcw5u>tkIF;+r7_y`bJvyn%Tm$Djc)1jUPL!n@5mGGx5}gybiIsN0FVKYR+pjpb_q| z8$Qw-Ex~|WOv?DRukv3{2g7Q}zB#TFY}mU{NCJ4`!aiwrPkUtBonU5c1=X~KD~8Fs zsVqn_6mjP|ff2Yp8n6I!J4%V^~DD+q^QFiW9U z19RbT6d*-gAiIJW?7!Di(~EE}p@tjP6<0NMobd*Nu|N6vd7t=u{E}T+`swi`XYTp6 zaNfd$?~J7ls9hPtrQ)=$@<~^EQ|(4y)NLmCnY2FGv<53UMhCk~WrH0v*4smhYI4Jl(X_@QkR5=2DE9Bj;g(gnz#BYS zJiR*%af`a+8!T~7u++h3ZXE3mI(=XgJEHMk&whNdkK5)3>?VamXpl!#I-Lgmt^k4n z-LxME?3PN2NAIR9xiZ2G_eB*<)*YWLi7x#?`-Bmwa3!Y+mwhWie}S_c1`&B zo~a_e#x#9AtK@aLg;Y73Q@-BjcfH3|0gwD(zBn+eGEj|^Kws@lK$8__@yIQ%E}x21 zFm|qM=k6cDQfgdA&%}iU^)C@+v0}c=V3O)EO)-D}GMKa2|AD;o#foX-*7QCPr5^h4 z^oNCGyaLs|swt=LT;JU0hHZKlj!Lv&;@}_;e%3;lcw}ft>Y21z%d_}M##{@Q_y5^7 zP$?0(WAEqhFmn0q>85})e(3J5@c?2un5is2_2xny0WaXjnE9}+Bk%ZVo{m?aQ=Hm- zYCGEO6sP{RQNNzAOl`IUx`3^?k<>3X$Y=%%)oe?P?-R5Uh$L2g`=}ufpMsauIjh#Tu$;l*ZnDe=Cx+= zld940bA&H69RK#y_QKnG-g>nE6YWWVTZ0A5fm=<#Vw+8W-)*nl>}?A3r^##TDnPKPkPXKy>m zL2mp)iNKXbnAsG^oW+)^YJ-^=h9nR{uTD{(8`Si!EQ*knMVxKc{8GvqHdMmHJ9D+t zmq${;$jl?Z%f7vKI;*{KGOW@5>e_;IBWed!f_0rrR;N5&bf2dHMzhW_6PegBKYvw+ ztmmbL$mDl>pzLxYCT+~?#I@KApK<8sqZ?lIf>c~-15fkq-;K~n7x&B0m{w0K`o}6= zkra{6PBFeJ@%E29L;92=Ps5ttQ>UUj_;B?_feu|hfJ_~e^*wiv68-G;8z#>D$~gQ| zr8kDdniHf5kyff2b&Ez&6Dk~J=I1eR(qeo>n{*@P&a7~NfNNibUt#wvxJl=K^>4#w zvy|kEl{L>HWl+u=J7Tw}9Lfaow8ejDn2|NC|45bt3WKCY?_oi$Lf**85K$+=%Pl`58*haH0Oj zPxB!HvztC;qq{Z1Foo;*#;gHo7QGI7!ed6-WS7BV*N#ezpkFDJYG(aXWr6U%}zWm&H#uORi{P(_nh8 z#Zcda*fPG?N42x{0_>U!NAE5+{(2Y(KT7U(t@ZgC^JTk$OWN|inR)yT>+#b9r{WMu zH&wr>b)!kRMHH62!d?(~Ascl>GTMDM?x(WOVTD5d;AxR>KBOB_ZBJ>%ql83!5c}6K z@Bp7=|BMLQrHXLdI~?DOD${7Nojkbc$K|8%$1(bLg0I+a?7+KdZoaydlhv)U%-?+2 zqjGgbMu!N~i%=+{``7%l7j{+3h-DhE?$wy+pdS&`B^~kktQ{(SoG?w2;b~r*jr;RJ znX!XRyQ-HL-qm%kq|~UN_oe#+Ly`qg3CZv>Swh`<&Tq#HE7Z~~DN)-P6Ht-}ZBHV% zHP;Df3Oq)D-f#C2M;ptyYcYVX?x0E(Vp&^$FaBJ0&tSo-{`lw(d-23FfDv!ldP_e1 zDAE(PJFj!86wYGLJ|5S;vWA0ut7yU4wfgsCXTVRmVk}Rwmr3 z3FFfj)8$JmubPVU9T@cfX%f0Q6HuxbN~!_Px38y8hwPEOPY$_xZkFUGU@}4cZt}?v z`5uq+Xov_jY4t=iq{i4POK^?{s6=*#Mqx74$p(s}y@NV(H;1TnS^|unI+m&mJ7n`t zS1Ksui6zR}SjWiQ(&$R*?3YB(rMCX;`N(^mGh9@x>D=FR(cvJHFkW+e=fhH64YF(p zt8nM)X$}P{mK3;A8u+u9+As?HGv-bz3F)3t>JPTKm*G?F6V=9m`Rm}pmNRo-c=q;b z^3G7{F8O2J8;3cJg#_hik(OkoMZ?;~Bcpef6<1)c%wn6aNnSd%Id-~kUbSjg_p8jC zH6oXkOm1uffAFpjT5XZ4Nw|L1sTWavgrhp;JbbPk@1_=@q*vzN&Zl@m+LbbS63iUd8KB^vlgN#`FcN)*R#SMHGPEGNulSQQ{E2C`SCQG> z44(#Il6R=4H9>lavr2sj<|;XqF2^wd*iQ}A892M*7%WR*w=Ku8XdGu);mPe}+n;>Z z=saZcMw-}o^-|JYi&#+q0GP;?(@r)|bMy@C3;&GyG(Sl*72~Z^T*J|8a||xK?)2%m z1cd)p*-xnL3FRXNM;*KJ$kt&*Hh5}YCx6M|ynEs2zY1^7dVeO*bc0cf>B0=Eu485# z?ZPRLj-=q039FOgY>T1?iZSnkYy{)t%`gW#X2J;;;^zdVKacSBg*BWFv8`)25i-1T zGRxG_x~58{XS@6#9~3Y2uB) zOxHk(Ea)U{D8ut`I57N45UDqycO?FNjIXBtTIWVA?@G`5rx)vp(h)F*(+Or)C1{DM zfG}Fi*e;7JUESeq{57z~J6e7oS5;nKkXD9uyrE`OMF{}&ANwD^#vg`0$PMwFde@;n zSV$hh78i7~SfV1@@?(A$G!il!DCX&Bde86mhQ0Fa*_Y{k+H%a>ek7HMn)B+$RTNB6 zzbYJio#&+JYGM@S`Ca!?Tq1YP4^>qKbQhK_Tu+im_m7*h;OE40{M+*84f7#QZ7sQM z4`cQIe(~$Fg!ef)X%2?lfGH{R!B~p^E_AFLs?4BwD8SsxM`34cu>MiAq*jf2(;AgV zKTL)xW^4=I*;;s${duY6PQCc)sC%;={3ETtxK>7{buMm@z^F|^L!*SCr!jck>dE|P z_z|(hbVZ+UwX`~TjYR&`$EuyV+M~yl>#+-G(7jGYL8$5*GbZJ1XzZ9^ew`6x0#_4(2U$ zzMbbK%5To43o%X_(jXL~l*m=x`!l#{{kK@U7lZvWaf96i#Bwl^o&IzOihkVs;unhlj$T%s-xaW^DUFvSlY4NK2?g{!5Z ziUKj}aqS2ms^X!%)QI{|ZtXvWqZR7xK<*WSCh_#73lnyZp zdxFWDVI7^JPBbYTd3_C_Y6^F`)Rc|q$6}_*5^by%J(-nrp$6`~T>EHSH2@<=q)ts| z(^tqPtNp^aSHH)U1=7X?$-)%>)C6<69PxJd^Mc1-zn|JHh3oNWY+B^-MXKnPRD7+? z>iwPhR>wxwHs?asGeV^D?d;JtAJfL>m*@X>unmup{QkHZwZz_w>#!|WJNGfiF6Siu zI8=z0a!^}toXVkWH^9I#1@xsdoIB%BaFsm#e2%pD+Sm}#WdJzktRv_G?sUy@9)OH` z#4Ra-CZupi#4T?8prJr66zUNR_RDHHrMd=t`5JW9H}d_KTpPFFZ+u433#n^i3O%Zd zYxTbx?zr34mLkCui4~%AH*?0fG7DdJ1~srfk5f1+&tu8I{jm0mYKEeoNcVBR7&(+R z=33b{6zdxaxr zl-NG>9>NB0Typdsh)3>V-sg^VWJ$|`LAU>uC8sC5ski*~ zL}JRch6RrS+Q$yl@jx)m$Gcw_yYxT}xbBHJDue6mQ}2pxeOu@H>S+Wxu(V^W!@C{! zaX?hq&^A=*7dUnM2?9rhGnHqsr{k;|;oi)E%uWvd$`?ZX0(QqTkz{knr9h6PWUuhU zJmc%Dpz2TkY^tB0`Ze4-$*MZ|dp>6Eox1c&HXmDlbx&xTvtx}W+eq&Tws3us*s3ep z0|Qgvzct@MB3>u=iJlR?65HMX&`@q6^o+YWCp4;uGTgEoWdzpuJ9 zwZ*vWFg)-aaoNI#2W3JW^i5jy_s1fDflZpfcPUPt1D^|LqZ+fnOsbBBV z(3f;@K`!csZL;%({q{dlL?f%Y&o0J`18Xc7Hgjiq>LN2%`KOCE=)z*q(p$Hl@fkz zBG6!VE^wm)>A>iXh;_xq^jocN*HCM~qsU+i^+58`YNnAgJ^woPdC~pX_%6SPwrBT6VI+uYT=+WMA2IOTB5{s)5tflVkIs=?Uh}2@V7R)eol%Xf7`eFcz1-1$K&@I z!kpDi{Fkv$5B~Yc9I|2pCcL@6ay|rQ+8cLFE09{-0B@$MX(BzSZd`eZ|?F}om`5!(^@lx@$= zOU`P`{9oPIj{L9?uxd>o#5Wn>MM$#h$|G_tK6S;fr$6ePLi>tmcS!V$OGs3#bAbmi z2NG!nVCam-;Kf+ZSP#%8vR}^${FB{lh@owF24XQ(Dc%c%)i`SYg6Y~T(AI9ydSF-^ zZgqXWe&XAsM&B#vE(nTUGAmz+YURgDfacLxWiy#Q*M^*a2S-O(OC>yBZ+VYOxWDXj z4KRp8tqT1^F5#aZ3OTA;J-cIhN?t)npGS6dF@r1~t)u=o|GkKQu-n5H=|fGZldQ&g zQNfP{f$iEc6lKrsVCff~q%ll`1nvSFwIQ|8o|_(@0i$VPrzOYWXyS)KU753jf@d#Z zCf!W@Wv{dxaV0|$#M3wp9*UB2CC{;bbDKD(B9%7NP2osUPF?*Tcyx*>R*^It6`)msY8+hD)Z|6wJJ_05A2%qjc9PFR z9rx8uh%ob5`l$d1eey><;Bn0#EB3z?;ch*@di~q?6Av;xdFOX)?4`^94^v+qR%QA{ zdq5-=1q77TBOyIXr-~pA(hbr`cb9>b!qB30cXNv_L!;2W4$QH zoGbNQe0bYGRz&||B&K&m;)ckAkoVTR9S5B+4b{+qM!_UiHNiVZARY#_G>RQ($^R#DNUPVB_)+e z64GFe?r-pAHt^h*rxDZwl&|2-FGt5!@Tqrhwe6mg3M9)7eQ{`qY5g(-C0&n!bmItd_w`=}01ZgZe$I;dorpuD$&%I9+&9A*0U8lvG(JK* zLSG-}pJ#BX)LUjq8#}c1i1LbUIdh_T!bK|2@rL3NNnnX%7|BO-%em=foR)K6g=_r(Y;yzv=mL2bLPT zgT}o-z}69st||0)^#A@dxN*Jc7q9wx_Uz@7Oak0@ZoiyIkkc{hRehvem5L$2m$TUI zqkaZAz3dZcM}7Y3`Xscmt^(OX9z!@KqxZu%0FZ<@k73$Y1x{9S;53k~s2Fg_mfsgs zl2Ztk$x+GOrhLVj7Jkmd`Plb&>_HXBMP#IO%QAe%*|FYF5b>j{BtM(}tad6~ZqF{K zOQ_fQdMjv!Qgd_+bNJ*ImKN7lkePc!n5KZm=|p=>#5Gc-+i>(__0l^Sqw4(BHNUJg zR=C4%p3eevu;Nm3Ej}dbWo29mn|4!4Hfd0+>H{jZc@0_3lt6s{X6HH-Aj_>eK@RpF zZA_$Q#tv5HLY(}n?9rAwY*j*w?K3YX+R(YnZ%83J=Y-PQ6{6ZDB)a@n$=|mah8y3P z{qQ#^S*TYJvNe1<_;uFlZ+&Lz(yM4=orl+rJf}SFY;5-TTgUe48XN1)+4+uCfv&(DY2cr_A2XyEA7`K0-rl85ve?(sA(`_UqxPZE zE+-r9iIa9sLf5jSvVCICzP*HIjF{oWW1Qc}BYaPYsSJI0XVC*+$pdH)K<5JKk zcCIdH=dA2vBxH0~|G-k@{3A=ewQpIIV?|B4WCj`wI-WFt2dmW(Rx7~Nm~Ny=_c7-* z0o_j`3+LS^OuOpkzHm;y%Xe$0c<0~cs7d3K=1#}LCl}ME3{-e|DyUwY-3>xBb*BL0 zxP0m$MphP;S>|I84OBr>$tO~Ui~^_n`%$u4*4?F0(3P%Q61izUyxHguphDGgt+l@u zio1^lKOmYK{~<30D{;ukX#a%{noQ#Ddy?XPzFZ_yIq1H!X0PenDc&}t!40jljj9}q z08~<17I+BEPRCm$$+E` zg~*#73YvQ2bA*kNrp?EdYlUg8UXIwcsJv{EKZ&&O#l?PkC}<|lR^)Pt)O{D#yu{i? znaDi)Qg%4a(j3=U_<}Xg;#Ffk70WHP5@Xn|%iC3Zb$s00s2jCrdin@%=Pm2*2q%$# zcjR|bX(qgY`;SCCsvqWA0H4KyygDSFx>n!q8~$*d?chb~#-qn>VPmM@3qe`sCvKPB zt`|<@m90ZgI@5m?uFmG$^}C*AOGYWsr=)lg#99eC!=-QnWTQPKdpg1mX;G&iKg6w@6=t+Mb{XA+)?n~3W+0_ z9Xtzt!AGSCA)qod*|bpls(zUQxAl}!&{tBKOmoI7<)5hWnX=B6}TLM0ipR{Kr$X&Zv(aNq;W1^s#oJxM6aT@Vt-GZAJz^*6Q~{iNwh@^b4YI zy~GG~Hcxbxz9S&iI2O5pt~apOb=A#t)X*D|%h2Ud1sA@U4318*1E#>U$ElQ|t@*}< z)1i!!YOhSSf;l;D*x7rjunxJsrXu6=A*vrw^urFn&oc&%S28d5%xTG4FltvIJmnxYLCt~P6`{;bfHYjY&FSd&0DsARe57VT_{IP zjF6hGqo7iM$Ljox&1zBo$TpRr-oJmil`Yuae1V!KWZ$yo889e~Ek{NYK4TQNbCwF% zC%S|>cc;wYJj;1>{$X1JweQ+5vnKU?K`*sZy=mr?Gmi0^Z=PIa%G3~=a#H)h;9E#~ z@`F%9<JYHI$Ajvr^7n>ST257lHkP(%H+mnOu~lC>SKxLlsa^K12#DO@ z{YbMoFR5X2a8)q8_v%8xFiG0|Wo3!5TV|PfGuM|qwrWOoZn>P_MojTLti@*h_>kwK z->p<{{>dP&Ay_6jxSX&NEiC4^Q{HtB^Q5Cu1_sFr!!B1>n4~`R}PlnxB~jGL#g7vjHbZLeBqX7gboJ(Dg4t!7KYxgpHe8C0*Wx zpqo?p=7c`1g#5&*n?>KD%40l)J^GKcrOK=TCt1o45GuFa_lQ<;Zv6Q&RcY42UpSAQ z#}L90k^8;u^C3t1kK(}m@fyeWV%RwxFLACt`O@=?O>?Vd7{+S2MAE-W!oS{mx%NNn z5sj@@(>L}{dpK=!*A2Q(dKQ|<{dnSjY9Du4jTKTIOR$%FZBbBHU;erD8SgQ3U6!u! zHCvqQ8H-_~&QtThzfbpi5i?ksq_3>O!=g>x)|II5aUZaf3fu&&B@9b4!(^cPFZJ#EV*-0<| z*t!gpsZv4HL(EJ)q)izZ;vI5ApK)yrfnrK`73AHB1!)_1>H2P`@HS=jC=|g*Kg|hKgye)0jEcP(%c~<>cF>fk65-;s|5ZMz za<_QbeX^7;ymvfDwv9~g(AvyS#tDkREvn7fAv3h0G>Ir2hU53_tz=jQ>ALQpzqh!Rm1Sb; z&=f}@y!|08F=jmoPwO?8&f#QF<716!!Z7o+Siv`;Gvx>^<}#mdZLuX^)-&G99lPcz#R`N+%_h7;4GhjNUgas~3hU#lUEbl2H({Ok0g*(J@{jf?X057q+Rod{22qi*A z&X%06uv2OC*lOQ{G(*Qsy(8-8WRw5~iH4e_3LWyEAZsXTPbFm5;VNcNGXw~_m|~2* zjK}U!^NXMARaViC3{lsfZ`_`gg(@k0Nc{Fx7`G}{xYNa_0kMNAdvz$J1V@rQ;uKz% z{TSBSvlPXt9ACJ(U$#wcrS2vU>Lbj^O2ELr`!`ZQ88jKO)nr4~h|y{98u8^iyneE$ z7n`ZCqx;=GKeN3){iK-w;5S+AQB`SQLm{J;ZT<_cLi{{+US=oq94oH0*vL>g#iy(P^|sY@yqS+8Z9Jc?$BE_W zRD_~q%#kTt&V!1Rr7iMw^q(bjRSI>*#G-?t3M8H9qg8;8o$TtXZJy9S9+ zybAUfO|M?AiL`$`@#L8`V0?6E<@U{+YJAKt4_Jd|I=R2VDJL)NIdn(ZK0Zlq$e)Mv zXDOTZLe7Wa3?*WP3}Hb+lC-RZ&H+XE232dG=>^|2l&W0%>#?y$Hc$RiWQhC-zrDJP z`y`e_`famIcvtXAmFjM`=CgL|;oux`g&kk#e8+*+>IL^f3U>Tk2A+}rsrJ#@1H)@A zokVZRf>s0w?lrmGMX+jbN$R9_=D#zvZ#ow6U$h@Cv8br1zI3QDG6^FME;ltP@zq#3 zD4oeRvbz7y=wYX8feH(|Mtz=JLJ&IetkbP=+-vS#1#C6Kv%oNO6}imsa2ib}l~ zmbq>>XQfRhR6IweS-$M5%$v(YUi2BIRQc@Y;YYGf>j42-esw)-nmNd-FY)tj*XIEWJmr-= ztP018y(@xNO)iZMtb(j5c4Bl?0H^Nu{`5$qpmvrQIxOep7NE!`9ozZ3vAfg#B{%bt zHS=J&t)~95T43L?cfZq;YSqw>pDa%bW|)s0BoJpCPw*Ql;RLA_7yF|&dPq`RqjWeX zeAYT$GPsCm)=oZ3`nZOr((0=KdF|zf`AF5T8%eVff*ImQ5AznAW&%yZ{ZSJo`ZS;7 zsAz3hqLUeCcBk%=?s0VE10Q|h(ewLnPCTyGG}O?(b!mL^3=MjTx)MFfyW@?xIwuUl z1$$(doKjh}z*DCiLucB@sYMT-YVLm1|Wb`l^N~}umE0#3BbJlzK(4mX}PhM76>w3)Z+8K#A zq_q+xQqj8`4CXksM!ho$f*?hSX-@9}B+5_dXpN{!U+5+(1ovWkI?rN@W`Z`)y<+^d zoZi!i#c5Vv-Po$@2+sP^ zgV*Q@${mRB7VqGJ%l+a@kEX?0-_K2xD(Jst0~}&_rY?eqmL{Cd$v?G3Bai)!_9L@J zfPCcW_+l}=8cRiqL$l~^g@iQYsC`HlMJ=fvYmn!Az9yB+7&GU#cV0UfayQ_+6)xIu z!7^GUIzE+$vzL1vs1iT_&UdIJLZ>@__5ehQLUsglpRVl$D;kZW985laN%xSk5m(RK zp4Ofpmqzk2hkRdvC1 zX7sg}Jl%vc55kFAM9*(OmUJc?>T>2N*4)<1dylotHmbI!bQYZllB1uDBGJFQu!fav z^LNoov)s84?J5iFbHX)-SG#WsGebHx?qOp*Qp|4&WZy@3ViYm43B(tPrRl_pM$V)k z5EH4@jCO<0F~BrHDvIu^IDAXm$O@z{L^-k9J;cVNU4|SMr_qJaxxaIN2MD-XOgSVZ zz#-PV-EE_3mpw(#+7R->%)n+NLR>ceaNI3R3DAn$b}}v zD3xT_P`&L*yj9cR_r<~H_J6P{3$a4E$4kUlauztREYUc*7;slu>`HKx^=i;E4oHfi z;T`A09t+pWQq@wn{tcHf8PxK&9bNu84!3i^wp!&CQ+$6T;!s9$jWa6T6iG3)LeJO0 zy)f;LIp<>V@tkmiZDo~W z?wvD7%as7r&EXEPKv*5 zax151g~K$#mZZ>5^kS&NQGp8xZhD#g9pHQ_(UW0Q+Xzq(rDg+hwMs1>oAJ<4fX@~z zdhW)UbhoUnS9?|k+&3T%YRiAYmrr({5hYora;VJ8XA6`flZnH4L5%ms&xr8aiIF@3 z*nt`-wj8S(=IG!@!VgnwsIFAhHwYRC&Iy*F5eNaGN1!_udfTL*AXMY(q&6x+^fn}| zMUgPYlX|7F>$8YUz74Me@=IAj62B5_w2X{T0)#434Eg4)HsU0BCjLm~TZPunUiPMK zOypS!0Iix?IHU>*^XTagosYIIK&a{7{vPwrxsA^t;2J4Q{`O&>; z-d&y{om1VDJ$|KD_j@odZA!7FHT=bivrsqNj0t8$sWBrA$Q)KRC77cq&x6? zR8lf0^as2Tqh?DyKN$e#NEyH2XGx6|Y^>=NI}ItmeB^$5y4mA-_4v^KM#W$~r~xrLxrwB%E8D=~3!t4i9NbtR}LbV`{yIOqgNM)nPz zepO~3rAV*Y`H==BM!@RFKg?g5yZ-n7HRREmWsQD$A{-Qi z+zl7FZ!7^TQOZ$?5)*j#8OQB|i9a2cLa>qjZ9hRheDv&y@nl7ef54Y8O#C$EIDdYc zGf$ybul{%3(fU=vB99PS29nJ4=Lz{<5@l`+bJrU^Ap-J}5!0JLFu<${y9ZhHMoCDU zp<2oba>6T_zKfGniJg4<@lC(?cdaDS)(PRT%kEm5P(?=mJW8jbQ5AuIQG z*7CCxy9daGI`Z)&YnE`P#l@QD152N!RJR$JdX(xgM`x(S+jnt_o0(da3Mt3iW8UoI;MbeB zWDk9xI?&j|=Js}xPbo2usD1y>^<%_iq?JTj1+&wQ_SD=0BY*p+=T+$8MD~j)j|M~i zM{ij`y||p(PkoE*jVqVm0FDddBcx3x6)H9nS_-qr7H2jMByx0HZbAnBM)rb2l%6>q-Wr>yfcrK<~U7(wBNFAg9Yy~#teTgKdu+Vs| z&-w1{#mpo@o=Eg|Yc)867``vT7*3vI}b*O1tjO zbV1yD=fP>m`VYuIBNUok>5)I`Q(5AzEE%0&yU6FzWh|8MJVMNd(ER{$`l{#t5LZa~ zn1q>loPV-Fla|_(M9M)QN{l(F<$+P2DAl$?#BvG-;e@tYL?J`MgJ|WFhmjH~9++q(4-o0u|Lv+hd z%=Hd#c2Kx-A14k?QH_Z{GFqvsFuGoMxc(EoKa4;{Z!I&Ig`>Iy^{h4vcFU-b65j1a*9Yx=s(Zr&GUhb;#=z z`+u)s%07ejS>ZKn3>}{dmIRDHG-vZoi$<1O+}yp4)A>Xka_z56=iQWIV4cLzF=wq_ zb12H`%yG!kagrucme288!MOrO183bMA&%ew;_`Jbon~{o|8g2sI+5hcjWWrTWX;SM z*RqU~p^pQCn{?})thF#6rQVy_7qy)c<2})#LJpJ ztJW{J$uJz?cm6#dXNt88LlY;FVxdqNn>YS}AJD{YJL^!j1#m}n7DHP%5((6Rseecl zosQ-f2jM2Kz?vqgr?u*ik$hwTe~OH2@uUhS6o2ZOVr3q|EW3L-r3($TM4!H&_ZoZ4IvKOGT6gzWu-KT$-mNT+ zh%6fK^ztz|6;M>a`wty{s0YN%VBKSUIC`X)e65hliDuXE*JufZ?Vy{le6qQbxLpj6UepmfD3wIOM zjH%l?kqu2a+thdWoF;}0zj3*d zPpjg8-(Yyg`)NmB5_a7G5MIL<6Fm^pml#g~630xXpiw>fsYg~8qNaUCGmE2gPEKL! zPd5|mxBvO5%-R`w`A0G*&y3VS5b;tHclu#SB<9__*S0713J#A=@-1u=;o0+&VkNoM z8Z&^Jxb5iS?mJCb?C#)sf`pbKl!N<%^e;;JxcS$+i+N!x#2C!zAMrye$n%%iS3cow z*^h}XZ4&bQkw#hFJ~k4{YjtCxW~DPej)>I<3jKk~xxZpSG2FMt5jYaO>+G1n+<#$S zd9sMUX;MCo!^Z00?kCQPN?>u4&={W4k!B(a3wZBGF01e%I?4TDPPVY@CV=Q4tK;@M z?<BO+oyCdji*_Y;kkTtyTtp1edXqQ{8^H?_~CKS@G45|*J_{R z$e73=NJ2E;n5l$t5^O~<>TuKi5FL>5n;{QCsJ&bi9w28nso^{=8e&NFqpi9ptIta+rR_Z??g+Y1-EluQ?`%=sEsuE35!I#iIdMq$ zDx#5+P@3L}c0?EV=;a-}IU{&LDY8^X%&^+>RVLh=0L-^Po5v;JtmcznX8ihY$BzR* z$-gCzwO9Rx=_o7hQh#>AhFsn#i|$Duoq_rmOZ5_977*yV0KpsPUjRo3@;W`D-0e-QGa^b z+6~Ism-y|5(p@HTpFi!XeC8rAcP-Q+2{m~XL%O&4lrHfFOsa|WUj0IZJ|w|NjSC64{7N{{(59_18Xk@o*Em}e~uzSdBzeGNxVzk@l$}3 zj^)8ojzd*ChoeHpY5{4TWpjyao6>JTTPa7D8S6#M~HC#J?PN|+RxCscP&&Y-wDSnmydg%N@TA^ zHZO@cMp|=wI&aHPsE^-@I^IwU(qBl<1amJ)@ZrL(Z@aF7fiSxk(m`R9Ou-tzg!$(X zvnFzff4j(_F+%Vs?-eB6b;k_Pxf zOH`zZP|c%OGA#?uO9%u}&eRjI6#MopcbZ%{OMX!ALD82ED3Ky? z>I@FmM66N9V0okKYwEocd}Pp!L>0dsV2JY}{PitUVm{n~Oh zM{>VwWQ)?P=$@tgoS=tUDy*nAer4v$)GwAdPZO1Lf3#1}5Bk8+iTK4iPUhw|uI`03 z0Iec0kZoZs`okc3YS25mF&mzVZp5Fcj+J~3+zdfSjtY^?1BjmNaMRw?j>-VZfe za>6PO6yq_2OJel=6@1e)GiUhm0MhTDTR1iIYJzxGddaG*j-SjGcTpq$xxuS&9ar81 z<4|~1+LVa_dv|-9Tx|PAVDYqVmx-urqgjOYj#dLmwLs&ZfL4dwlLy3#x|SpUO4nz| zf@DL7w{hvv+ka(!d$!v8Ei4ExogoCarFO&e734v%R(*Taobae-V9NrY8vifS0uzM3 zl&PchZqa?X8}-iL*nO4C%T*L4h2E;N2^(Ym6Q>Z5mMeNK%&v$=A#@?8w>^mCWi|>R zc#`l-z1g$E@8kZUVZ8?k2gyw&;LP?VeBlhB&NU7m0q0 zQA$Qo%FuY!dPC)=Mwb$j?3^Fr7x=wh_$D-HI$l&v;_NM;p+uF!@4a$LSNwn|`3EX) zmiQ{l+wLs0WddSjJJy}YwaYwC3d`oCSY!DPI0%*RY77Xzv#Zy*CZ$(Op9?3(zBxJG zAxNE~1SXl>#QQS3s zg8rFBRCJG$Q^3wT>i8e;$+rO`kNh6LYce1WeHSYi2}?f8s$W}|yntYsqPnIog?*0k z2nNwJ0m6}7fwU%r9{FZl@0v7{~nBm=o4sOO2NG8_>eu3ovJ`U-OACo~B)h zvl1G(McgC`2i?9Whae8IVs60_x6H-j1c}wMfSQ2Ck?ghjiPHRDd+^q}>&f#9u$+$*FoPanvF+t}h<-8C+2L8h< z-CAYNa^>{dz%}}<5C^3ub;?Q@H;8`2F-yl!J54=2hb$5`Om?YHzM2ks&miV29z7otJkJwlB}qf`(Y zNhol5PhMfJNu5N;t1+_s&8#o)bd`!R&4BRxDbZ{4xu<^*QHm+)Ho|}cK(vwj@7REh z*}BbnNmjD;VlAKZk5b86lxZg9fy)l#adC;vg3G0xoZOm;aq+CN-OCxze$uPeW=&4u zDV5}FJhC1iQB>73Eqp50ht-Zz=b*lT6ufad#;s-}?ix5V{S5{8o{m0ZxYR0~I1g?0 zLn$AK5%vlWGEt&4zsdF>24WYw#NxD)uhtSqY6ZNE70>RO1oW{gexO%2yYS4>ae??B z5MAZv&Vj+!xSX7;UtX{e%?gKG8_m8o8IQ>Tp^+5j_N0UX-H@l4R5bl{#^48Im=hJf z^8nB%M6L-5nA6TlywmeL`Ta4_*z$s*yHtfWfv}aBNias1`=ZWTJEk-;2QdE#Cv6cW z=GcVwl7SyXOKz_Yj@B1`lkOd=*D#ijzbKf0{DvjGa{_C}8PCpb>fbqGzr~eMlgWtP z_2pV(gvHD8m=AIvC{LtBOmtd(nl3EA-<~(O>L}edn09{Rf!?C%Y+lWOO9n8x*1@HygA{<$HmzSnQ1ri#gQM#5kq2~d;3Pq>p?*t$|?otx-bu2Hne_= z++t$#V5aet8I)suTHAdv!pyaSy@1pw4IgvRw+v`j%PkO|8u5P08ZI3G-Jq*BepI2) z3&fa7pkKitBMP`c@h|8MGbRO*)s}BHSxs{G2L|aCADz=~-1=T(+0jk7Hm1r*6_njK z6LMz2j2KGc5~hz_G_pyv6mDmd@8OE8c~zVDsyXwSEp(*NxCIOPSi z2lzzerDF|~^Ti;FC5SToDUL@1d^~D!$GdS*%H8Zb*Kc*KFt4PjC+`T+i~syX^4-Cf;`|xOnvY z|LoV2Bm$}YM@cTPjm39DF40E`dUk(Es%wbnN*uvV*FZpFvWq5E4l(xze;nHUDDS9R z-k3>wOOLgiJy-!ky=aox@Ar+=-**8=p6B;n6(hm(6yI&_goSFTO_o)NTW&{ZIzGSm zX7>tIIf?f|SVqB6Qpg1fc}?#}C5*;8Nuhxc-c0ZxbMAc;e6v~xzZ#DoCY0v5EMOBV z5uNQGUiOu;MsKr<9kQsmLX4uU`ce%Ut#|Nz7HhWl)u%h$pOM zwjBu z5KLE^>7h>|cIC50&Y|2Pra@pkD;P|!S@tXOcd-YS#LI9(LVndNej6Eu_Vqj#5 zSE_Q@;N}+4y2Nle*8EzMOBnO@YmNoX`IYti@HRD|OCpdB%jpJ09&!_q>4qT>4yqo* zmbDYm5Bwp5t)amhm-~vlAg$$|Q;~LZ(_$Hu{hjK5;lQGjYH9=pBZam34Ob!}JaHs* zjC7s`EBm~gsCb%vhG@lhb=fLaKSckTnGEr9LH2R+@z99cX5wL(y74wM4R`wIC+%+W zy-*WxH8H&m;OO2MGr*)MFKA$3Sr9@ZHHpHl%rwA#rrz#zL5%b_%>I7bKG3EC`l(^!5JMGg40*2() zi4pxne4;aDIBM(7RFR)058iSlONRzhJQgmsqCFAsouO5>4}VeQ7y4zBGEe$GO(OyN z$Yye~|AULTt`;BvZ|8nV?!u}VL)O7G`50s(<$%AJHXHO)8ErvJ^N%~x+YdDMRkVVL z;}Sn<{HE-S|B{li(r10jMcYS05*QIK-=eeQbC zFGoX@p!~(;FUy%%nj^ zA)q0TvX;@7_|~;VpqBTmlvfMrcw50X(VgU5;foSbWual?7%EES;S{KK!6fcW0P#6lg|%y~bJ0w^7mkjKQr80NZsVxZp4kiL?g$O$g3|4T7!ys40n!U-c>yy` zH+gk<#T<~dqx}vIfJn8k&FYYH!A*nMIff+sIWQB__ zIyQgxHa0@e$!@o~^>?rh3-CdPFcbb3M--@aihFygL_u!NyLhN584rn(glhy5(NXvnk3eN=n!p4MbiP;cl%JNBDQ6;^>oqb!*c zz)B?yuQ%LfBMs?WYSDOQ;Z)AWEdqYkl%sVFFEPDB=NsmP2Q`Z)t36MR=@49s_8wZI z;V=JK4Kl?nt)(z_FWzsKp%DY$38dSNVsdnFPz<+1Wbxoz#$MF>Dn&7rv^a2$r)QpCy(R<%&KEuI;ja>#R--k))gi6_2TxGYt<9?DQvq6I&ck{1 zesuJ1WpGEI$7CP+7_CXIJi!yZ^=kCO5CKJPvV{F`<&1$y#$bY*aqTE$<0|zEDo(0mb=#}oVxkj#A=+U2)~`UB zgpnae*pIk&Q|wC|;tpAONY!iR7u4FW7`Q0-A)vQHff0i!XuZ&k=wZ%Ln6Jcq#K(Rr zC@{T zGTnFsksMpf+PNgCYHz9qLI^Qu3tdHsL>)Ij;z)ARWQK=Cai0ZHmmPqGG}^3XSt^=fi%S7qr1~pi*vQ3aU|ha7J7Y-5TCPQ z=>0SzT*93E%N{`rh^wdZEj6^QnZAOEMizNt$1(o>p83yxB^rNy7rnPsVV^4QtXe^$HHtw<>Biwh1S$lm5ljxO9TIlvvb$J|~G|m3d=H4mTtyukc!LrRLls zuSGzgP~nagaKEo!S+HgvS%r`CVZm` z;u;3WRi2p(F4~QV5YV&a20hCw=w_wh1hUV$FfW2)O9j=N<|zgS&VqiLkw$45B>hxS zo?ZJ#ISY}L<+j-5^wWgn!v+mFL-+m6)Bjy7B>Yfu^jien5Cf)d67Mq{t_-8eM|xs1 zcevybU@rg$zlSXmOf_X@szasxQzJ}`w2ULOrVPYkjs{?|mmX~i;%SoUg}cxMEMI7o zPce5Ws?ZhG0kYE=ZlrjK&&Xt`bi_mCuj!alllE0ITiK7Jm;$yA{jE@9@L?8`^0!*o z@-C@in1_}WFm`3M={&lAgkDQXOjj;+22D#2qi~bwBQ7gV@GlMwgdh#LpnmPWs(X5) z{;%k0R)vTVbDDp#mMwele5BK8>#&6@(HqyIIqcj<%&-57KKp4qeXK_0UIdPljg}GX zR@vU-qmD`53=r)#aujNfnzn_GoG5z3{-vK*d;zGbvoZLMCBQ(RCCU9S%&vtn`}$ym z^Q0+J)iYOW&`9lc;)&`oedg$ET2aG-K{%s5IGccWb|tyxp{Cu1qCC(5M{9VemteGq znB)G)&wOtWRz!DD2Mv1XUq#fihRcqlKa^6A(@N?~p2w=}%0qqxb7NJ6GbTAW9R+KI znkec<`>TjgV$dIJWX~<&RcilwGtQB-JU#;37+8uU8^JDx-VPgMe?U1F)9os(;|KcD zUAnm#i0(DOCnsW@XZ%6WMHdf1g{%h82gLJ+q==XA+!*pwb5xqcw4vk9|IZHgFUh~6 z=D3Y4xKs05Fzvgf;l0(H;7SGZF;MYoBDkQ0NCfY+Rdw@M4W!H5{)sc0OO$ZggFzJb zI%zmq31PT_v9iwkY;}RU7z%AhEF0N}@=pzFNiCQLk`6j41|^1Yw|H|5#LK7`bVzGz z|4ixz@c04C$9pqiA(ITsBR1YT=JZz(&Yk4d_q)BX19u*ShS&95&2aLUehkES>2Xol zW}D<{@RHFr=QQ#IFCsCxD9LYrO|wDoV6t%71u$;Nhovhk0&>r^pylD}?}cD71mY$Y zz(3j&DfIj}DK+d^yELvcXfHze>o!HT88FD@&* z(tmoYwW{bP&I@NYgrb{^kI-MCz7YxLz^5`ok*X<@#_Udve@%wXQB0tTUjUaUH4HYd zpqc=IXpml>u&8$5P(pw8y{}+n4t6`yy}ggKUqSkM;iJYbS1_Y z-c#hy*7Pd<^mW3)IJzgci*2l3ck*H4@DA)D-N+f)Sp+{ZCg{Paez9gO(?kzX9c99u zUeHqo1`^VD-=6$9a+=fQ1VR3${Zk$7IDb%L23yj?Z*UqR$|+t8T9kkxB4W-pNM%vI zsvk&P^e@OYI6*A~krbHmLq>dZVzLK95O858GmI8QKdNHRlpI9D=QV0yy*`HkP5rhY zxN%2xE#(H4SK#b^2Zd}lK+Li5(Let5?~j+brP8;XqI2!QkUS(B&l0&QlWq}IhL+er zaz3vJFEq)r(EIYzd*zUmcprk8%JNy=`qAcZy?3eObt61EiZBb zZ!-Vk9l7Jgzs4@0CI{b^8NJ#^z@7)opPI1p_oEOXY3qk-+naX977-wB3UwdZ>t6$H z)dADYAP1yF2#`3{?%GLI0MZ1;;zW2AB6dkIZCF~YJ2s4dPt7;yFlppbA7#2vd{kQX;mamFG!A9n`3GYubeh|f` z`&Co(FA4m)_P>9w7nbY86--Ny2oxOSDpLPBN1JmhGr}LK6s;!kdpN@=va=|{?eVK= zAbh^T;zzUNgi&UrO{J2bzUNyki{DiAp$>0;ex~do3hR%}85l&bE`3RcK??}LNx!X3 zIhymg2}+Ay<*pyLV0S7yAClUv9iU^3R^6!tO-A$byLI8O#Va5ODH2=imGi=noV8>a zWoIWRxcz5hQ(|pL`ei#PqLKE8PG5~Zl6V##XtoKq<`h|p{5m2K+NfRL)!f{VoC6Uo zWj4uG-Daf2{$HzF0t||vm`Av^sGp-c4|=apiue5a^r^EVq}!3SS>N-*im07%&C=Gd zv5yi^fQ4~)PJWRtCk4xe|89bwJ|4N+Q<+m`yi)^Y0rX69y+59#7Wk^Q&2H%PzBnGeRlx2TK@rqQ{q!VBoGx#@N>0T5 zvrf&|Yctn*0J z^z02%l86-)WclPf1CwYiCy%>q_X`wtygz+cI1l-Mxe9tgBDmbk+<2|X`6KB*xy^A^ z9lM*1I-_2}LuRL>U4fyE|K%aID2}S zc^=L}cmh{8{cSCdMn^Tlwi&eLUzN>R3OOVOEPK|b?BMTc^+OkHF6LW1ZL)~X}7=#(HHv%e1qa^vEPg+BGzMLEtt$G`sBF)OhZ{+xdxqR6CE8-ex%U^JU+czXm7G zH@3eCI+;uE*`&&W(cSvB$18}6SK7Y4WDjkf&#PqXpFFB^F(5VZM&Bgxb^lu#^N~{M zANkL9=KnKpEX+9%p@c*9tHEgrc6J<7-DIA@!c#||ZR}BnPs%qS0>BisMc;f||A(=w z42yDWyGTg4f;57NK`AKW&>;pLf;1v69W!);fD$4iBB@f6N;9+wN`rKVgfPsIL-Xwi z^c>H5-|xG=Kj-{7*Lm2p_r2G>*1GS#Hxl{;3Fb|2#9t3@4QW9yB-3PG7Zf(zISH`% z#P^m76Ec+qurtA9HwJl?5hn#vDdj5r!4FTHRvmq&3^-805uT2@16?@$=Q~E7`Z1Cl z@WUtIEQLFR=i?Jrvl-APTS!^R7z)ySvBBw_pD>ALpyz+nyKD97twk%f1WYJb$O_2}vI6W<#!()hXkd)|;8tU1-}_Yknnz$d7n#d2%l zj(H01t^V~s5J-0jM}PP;&zhlqx={k04S_8L?)RCR1-_IU z7}eJ8;x!fyt{-YVT zg}{IR#w3jd`?XUh`Nz-X96zfCUWcwG8*}1t1gykYhrx3XCwnuwF@Z4R{*~?G1iec8 zPt`lre?bTMO_;Ce-u^Kwsl-r9gYS=)yIp!}vQ>ze`3*L^?-RvOqu`AKa2zPI0kOkl z*gKjMrf`S;Ki?1nVrJW{*uyT}&R26;Agr#5%*gFH^dHf0apyDNa2D7u_E<kDFqns!Lfp)6YV7~RX_Eyyx z#loH%Z>^lr?uJ?I?XV|X{1mr8S?qeYHS6!3a6Gpr1c-L4rsJoi{(8^!%Ez|WXYq&0 zRUVO%X-F*LL1K#;t?Q>jDrp*`NxD-+)GCrvr|L-QQ`0!!Yp&=-Ch1%@@Yc{hZCz!r z)2O4XyZFAixT()tH@xxEx2(8JMgION?7_QS($dntrf_p_pTHo+j|ofdf`T2QyPjkD zJ^giU21#zNu4bE`#<$x$FYez!@=5mLkMZNYqt8n;kdvL$L1ZowzUJVstVOeAU&xil zw95{GWoeh4a%+gc<6l3r7T`utD=tWP7GaKX2wZ+cG&sJ0HO`Q-mc|cDh?DrbqpauU zwxs&HDLrB-Gpz_5jWA8~85^WyO|8^a%NO4A)6jke7cXcJCq*a7`G@d~h=0m-ox78H zuq<4*rGxX5xSAhl{(>H?>Pdt~>2Lw~*ggN|7QWR1V&jNwnXcv>DE9y>`1$TU;TwW? zz^A+gun+5Z&7voImt`#kIWL}tP7umuq=4e1Hv=>=ZKLg!rPZo zjcN?=p{r~bVbx2xkt}tUM;`$gHyVFi6h4pUyU;2o@d|!rQqTm*?qGWP`S#F^-AYPI z^2Dok8y8PB`_~S8`bN|j_jGWjW#=u2TnEP`Dw|EXHB@y%I!CY8NeGgWMp(h=z%R?i z;AN!FLLW!|^GNR8V|e9h-1@T?UL$T`3laMK5821xSJ+Q+l_hK!GMkjY`32 z*D5J!xi(IkpC=|=Yo|Q^LDI#rhHy^AT(eW}a$Hcb(n6EXO`HmLj4NwOu03k~5(i^4 zYP$32Q(O0N>zO}LA%B1Bc+H=?>du|`^Os@TL+6HCp&7n6fr3dAGH8`%_*=m(=!>R_~%bL7y%qq)ya5~@iVFK^c(!Gb5s5sfhzFsFjsLW#%hCd6oQ7A%m2I7T60 z92^`w1k^tS#k!*Rx`X#iS}VPy1 zL^)4|)_VOF0)Eo*F;_uWyM` z@T`#YH~X=Bl$}Yn!}h-SCx;fMLo@rn_DdE+Egy{3Ri5wVj-s$3t&Q2MIQ{QG zegzo#Vc;{zvGK17B4$N8<-5vb+QY$14)wCmtY|KR+vhQxjJ{9wvTc=v95Q%!{nEiE z#(0EW0_Ops_yQ>uG+2*;VWkLQ_l(9G13RAn6&-o&N0ENYue1k8_PcwbM)V&$PxHn7 zv(BXo>m9J+dQRukyFWKhN<@)>cqi<0bC~q{bQ>c;*t@LeSX8rXuP1sMDT}cYYF=t? zRQvGUmc}iEcP$PdMAl3pZ9VgUOi_UVde3ONF%a9v0X7u!hCe)lc@Z6P363H2D{aHM zIQ;cV^%1X6~Y$qb+z0EQtAS9**>vz~{(B0XVq&A?~womxO8`sszUetmU*yoohqtb8Vm+Z3i%(Ck|O`TUc~63t`EE@_JlH(Cyb1y z@_Nf|IP{hOMA(U=?cfhLHXhrq8wn={SPifj;ed~3z7n#`Ju#IvL4a%LBLzio@%PP# zS@ASpU}}$7ISxNiymh{i;|S>-0ScoeY<`;`{5U+e=&@dQls zzN9)7HdQjG-~W+-R*;je=l;Fm{&1zM2G-nx5L$!p@cWhKvL_sYb+*fvX&Jgmjs<3( z29mUiJoGW}(_nC-QC?avi8>;%?j%kfgtPj3N7?KQ%{EL_`=u(z8xO7OkHjC(^MCXP z>`J*A!*8Ys&)HW$Lciu9+F|9W)^a4F&k*5=n~V+Fh37 z=wD@(eAECXPC4$*vW6^@u6g1b@T%$(gSp>li^$N%y*d9=^PxW52! ze>7LB_~@4$^C^(%q#KZHelEw<5IK~1dkKw+8tX?KedIcoCyTIX^y``qtiJUI_GvY7rq(0eW;tyC4h^*>Hjb zM6pEYDYroaZ?p>F0?-V#Gl757bT9$n0>6o^_0MoAWx|EqgH0gX>@c^=>f7+2@W4yE zzt&!YAsWqn?p{?#`3_nn@SBbS!WRMvWq%X^j51vw7Y z`2L?Mv+l!a=;s3p%3PHn6cMzZFhY?_TEk!8HSEVZuEXOT2MG?I`vO$|znMh%0gHia z8RF6nr3n<%jKG8J;bB@Ro$yMQ6_y&-eG?=U;)8f&ZF`N%Pf@N_mO)Tvaht@=V4KAz6 zH?5ubPcn0DT_<-`+5PDnPpJ*~Lc6^dWPM<%Cioo+5;gHEX!1Xe82?GAu+GrDa$+_~9PgC5-qJ!n>W<#_m0M3N$w4PTD{M{y5xjqq2axv( z|1mA{ssGh_m)GzHor@J>jvMcKT+Tn*D8EVF95^` zQC+EOlnfA=oJ6z^gI)iB;!Lv(^URZk{{F=9`DTKw;jiq+UkCGbGy-I-evsAO%N85Js7k#?WO!e~fA`kqP$CV?> zKB2#k#&Afn!3$z*hgq7b=|HByH&y_9ZrY1BuGXY!^UD!#BnksgcrFRH4yXSY4z^HN zB!g{l#O+rq9L1?*>T$zgKsAoV#_XLQ!~(%=Lh5k$w`A)7?PKSYqIZ~&GV0uP`WNM~?BjS!lR ze*pV0^k`@LEfO74fs*nB9|^*?A2IAC-BgboLe7js-+X!T$I^Y9>x%`0qiw*BlRElA z|LfNGC;JBrhzi|f8M{YS7Ql-?p5$9wJvnyoEEMq6NU*jXk%?e!e>pP8>@S5~=HL4s zVT+Fj(z%2R0mJoo%1l%+|2x7UDEt>APGy%-dFA2#hg#rs#f*UrHDo^)fU`o3+{aN3 zvNqSCRz01pB~Nw!=f}50kQMUFaf0jzXt9s%2WX8w#0AjDOg}XqFnu=&$0R-d?O>8B z>Y=-JjQ#@DN0FlcD^h;Zyk7#EfZ@Mz0MV3OG67o8gcJUEZMiueF??$$NRL>+t#79E zdx9YXO(cKjIVq{&f^!DuZY0}pOazr0K>CpXWrCFE53Y^j;S>@hpW#TkxD;xrei)@SiQDj% zn@PMrChS1`|A7QaMIaJOp`S+Wxr>8)^IE_zB4vn0>Xk)H#KCg+kze&U%>M!fu-t!n zFx1(j3_FdUmM zf8abT`554_;M7_RAb!3UQ2bJ>MhAt28KC$UPlN-#fV7*UK`af79iz){Qh+M@*H&1r z>SXbQX`jcq;^2SRJlt%DewC&o8IW~HI{erWC=u?1oCQn=S%d%Ep~N7-ivfrHQz#lI zWCl68$^e*Bz}Vmr1#{UeQ;8trAZ3?W(uz*}w^8}O$!I%#v={hgpbpUkgTaVq(i+SHW_MNXdu;@|3V<~%;Ovah*Hmz^Hg2QZakNt+?y7| zY4!rh-|%E!hl0ON1TlAb&VTCDlKf3qf$AI3KDyyOdtDHCk_n#|km-Rfww&9u%LCrh z)uyE(@7By(N_4u**YI1#*j~XMCaYT19`YNjSr1fi36mD9D>3#Nv+f^=-n3h_{JFz_ zJwDmHFbG?q&U-Rh%VngNBDbPk63?}pZJ)*eL+0~K1t%OM;wS!g`tfv8qKnpBW(y0+%Xe`OfAf3 zJeJ|+cQlvCItNYU5gQ7)(KQY5bUTarB5&kN^3Q>_EX=)CAedRojV{f_w&B%PW}3`F zHoeg%4oH|&S`%wer1}aVXLdyfP5tM^C3lYJH9~+ z{zK^r3MJUJZ3!ALCy}YL6?x5=%$D}Do-e!S`G9GFdiD=f9%9tL(?~iky@I&rgQAJx zoQKcbhT&_huII~qLP`hw5xk^Ni2YzUP~SC#-OnNB@TFd5wgArupxtkK1=3HpUcZdB z^wSZff6IkpC$%=o#=FX!riVIQ-Fjg8Xh_76MlWB?BIdTe8Owp`EDlfM@yDg zXE~H-xOt$-CbBVQH^KE0m%^FO5d}^CRDoA`Dxbh?mQCgqj&)V|#sjDr0<45z1r4d- zU$%9e5PF!FawIKL&{(0*cz0WCoKCs-?k$Xpa#6hq{&LinI*Eh{hYXsAlc&HD9)aK= zb8Gd0!7l!j!Tu`wOz8hgS>Lv?s4tiKRLm8VUu~S+&m&A0I;ffrFLDBmCYZis73K*< zdf;*twVy=Hgz2cY`TE&3aruK7%jpHb>w@6>tf{U;mS6ZUgADTToCZ}-qWphXPkzjp z&xSpS=_L?0jCDa4PSkNf%P`b__{h-^azm50;Rx^}z@G`9a6s*r3fhQ@6--kV4~bpb zd;>G0HXc+(0XF{2{sG1hYUIcS{|5qytW_s!2&$A1OAj2>f3S_V>^#$lvk_!_HSe?e6t2j9xaVacI#bpxK_qw&#FjTq*n*ApWsj1Q@kW_voBEZ#{A#irIOQzO@Pj2Hy1e*7B=7ipwlR8DF?XIE zDw$W)<=8gfP%Ah-`XxwC=dwqEp8#y?287-#L`vY=m&9M9gm}9;HV}8cQruw~^xAp`o1!yfuBP0WWl~{Yvw7V4c8q+? zhS=$O@@+FAa9E)IoGGkBsv6-pHs^g*mE*)%)se`2&&cOq4+@$~jo2KU97 zh-H~t6{m{(YL?4fzv*OkGL=zx6nC1am7$} zos*POE`g!N{$}A52=K-pxN-+RbSjaBStpS4cFb;0}WzXI;aZ#)uBP}OyH zeRuOSUa7^Wbmi8Yk0lO&4o@8#tOezYwZfQM`dBuc2cKa-#|`hjrkLJm@z(6g2v?pG zBc8Cyv?t_#W3}SYYGd}Ki~tR=OPMwJ{fftqZ==-6%hB}ff}gGT-aOE8<;P!Km|1xD zM#t?&4Tq71-Q#xHXAjYZ$tA|i|E_KQD%{Kr9&hJQxW*JJhO+d9w2ESw5P>0KFUEW=+RGU4@y@ z2eYH=lAqWWGSJ}4Q3yEvG=2Gy*mmfnsp2vF`lpE**+zPo*AuK#J2YDSgIU)Z?y`5Z z?y&dsRisC!Uz+K;)-9B%@nb-j=9%0==j55jsYLoHvI`O0?HnBFkY$J|hXFq^Dc1DT zBMv}z0rB1+4Fdj({1hsvv&_d#DVrg4#A{9Sfe)qIWN)cLk}-_B>w9R%1?B33&$(G2 zY4fpOxYTFuLy7>O7|kh(xg$R_Ax1ycYR@d8H4*?XieH$&-RRDt-S00h^MfJBI{R)# zIxBhKHO;g7JvY6cD)(pVimQ$Y%-7b*IAiR0Tv2#oCe`W`muG8ScQ}wQuQ*v)o5lhb z;#_*pywpXX@5WGT0dVO=N(O+H6IHZ(yB#zSgtwT_zI*NWtwnhx|8Hc`@?`_8u=2%2rW=0!R${@pvUahPNEIS z`ZP7UYLq!OdvB}j%DDE;@sK&c_4Ikeh%Jq>O!t1Pd?9?+W<3APb#y=eLe>+Y@cvPB z|0|2fd_e00wi!7lsN8n_vElA^+^kFKAXAAh@qXx&&1-Dz9LoUugva6d%bgeTmyLuo zaIyI5I4{=tOIV4@c_cxY|gO=DU4m{Zn0i{4^Uouh>Ku{{1un=VhDPWr$n^T21c1DlC$XO&phUuB6~vurc-2f}%K(Rn?%2I& z_CO~gCg|=RC4Dp90ox7fT;gHZ?>&YFKHR3VQ+|7aK|RS2)*X&QGVx8Gt)24B#3)|x z^4Ep}A@2v2LgiI(13SU#Vk3Q39gplaqP|M^Jlk!zQ@zv96BCnfO~?sIGE+rdJmTxP zRL8&NdxlUp=J;4_*Ma(ov=6)mctw9(0WsUJ-f)A$;l~X@r+)IdYzX~!wgJ}kY}NF8 z8n-xzSr3eTACY#lLuRyK*!D-&rF9u@lls91EYD>0%VBI8`~^;SZ^E%w1 ziro6@yg`$)vf}#1T-xXz7onf`qu@f${nwuP6L?#R+h;a-tvRa&(>1LheqRi^Gtj{d zid&M$b&6x%qY`!YcZK2O4=quptsh^6c#>_eXh;+%DMYcvZ7qrkuDs>a@_h9(mts&9j=S zy2iQ!w9DaCkf2XK_2yVl28AVnV-rhc-Yb4Q*(H z2{5^UPKo?HOqzPd%goz(vG+j;N?8n>y|PYv?{O%LcEe_IvX7+>>TKl1ex|)~ThSzd z#Qdo$l?gGxrRf0mIz?SWf_=mR?iu*P|FGC&70*<3V1^a>DR5cd-z8V8vopXgou*l^ z_oL*S;e)gE0UPaGYtCV}Oil^wjDMDt62Df=Ja1nknUwYN^qHZ&0IRgF%38x^sKRpG z_5q|8FkMQ{f}xTg7f@eDP<})WA8{$+{rM}inW=y_ONhE>xUPmalm()`I;OOdQSX|& z9swc+m_>agRS7q(2m&h!1}MPu%&-qnQMok!PM$X9j^ecmnS$lh-Zf|o>-arUwqj-t z_50;miW1_H&@wxIZBUx{jVQ-!3kIS%YvPy$@a}6D)&?T#YiJLi_8n2KRGg}vgrEn8 z@2(A!=2x2<>{lfVL~_;P$%W@=m&S4;_;C=lV84>0LG4+95bX$tz#4oT2r-Xhj~gAj zbvLP_mHY2#od)seS%J3jalY)V$)!mzsI4p^!DyN7SoCca-LoJ$V;{1+aWQN+qA1o< z8FL(W$1O%+RRKu{Bm8Y_U-ce;{aW{e#+mt5;!;#5H!SEwp{CwmTU9%`+<1V{qGkWPRA58&i-c#PZF}@Osa*-0|Bm2#0=E!TJQON}bA9I&PXaMe*IBKN%l zc!DGT&QrtBR@fQBZ-|1g$fd7!?x`Ir;iL+@dQ|;;muj|U3v4Bl^HgVUPb~MS8zx*= z=H@cw{-Ki7LizSrcmdUZeodSN6c=OMs~{)v-Ke}{FsQ#-N(fSl?s!ZCPvRzdU4Gd@ z^$~{bTj@Sh9uT*y<1Eq7xu*Vn1D-4?>oY56fuRHC?i>%)Q)5|;&mPPVfcNxAptbSE zvD8(JXcVJ{bF#8_%doAH)(KeaLb4<^3_lzcC4WK2U&`tiX?n5hHC*75;danl+L-LN zMUe}avrHfqx>nlxjMSUaXKg=L!Fc!dr}H1e=|+sUN!0=G9Nn0R$qPY&3bD?kSWE9K zZ>Y*-U|^e4aA=ff)So&?tASPPJ<#9uOw`CHSghz9k{QXcerI{p(rS@FF}G7ANJCMs zAc;%P5+!H%DwmB~{~k*j_JTlf+wLcKD?bS*FxVqvb%Y-OjI*0aJBVdIaN7J)2xYAA ztP+xEId*0~J)6CEZ_JcrD0GQR4i z_aGFJP*wU#|8z0PEqzFAywmBbHnbg{edna->lMOZEoCV%b z1Up&X%^MfXBP-L>4{p35nBwvC@SiYT20p*vap&dVK0h#iTc4|_Fg#HAa$atV%qw356(7}E9%6jQsf|sWF~BD7+pEn8fA^y9 zjc9vnF77n=k6J2`s>TGF2+38)C}5IiBwlk394dt~Y%FM|lZjQ=sA-&0x#Y3&ZtTbV zh>i`y!v{7r)KxVPiwD1tJoHA|z73TeyRMKNf6UXRA*sciPngfY+lgE*NhYE$;ciKt z05?=xG>eNJ_nQy3PEkulII0Y5 z7B9ZORfs?~?1y=#SMWbvoRyo9!~+Ff3&94cbrU3D+U-{ZC(Bi%&Yo?plH*Ecf0mPV zzbR5&ioxB}=l$%~K^Rl2ySb9M!>i|ehcRB56B+fL?81@cI^<2Q|~vP;x#|4!nU9w;H;Z)rCrqRoB;NN`?LT zD_#E4q04dlktAXFLG!CDKg}QC7)*jMPv7dzmWf2?lQDc(&fLDa{n_}gBh@&dOV<59 zmepVxw%b>gp9+r|#;={&yK@aMc6ZkBEmudw(1yz_%i-E$S1dO3bc zJg0*)DrUcOiK(1I&hJhg%pcx3b_-}0`HJa+B(t7>m~-Wzc#3w7{}9p9T6|r|{25EC z=td{Xy<%c_mLT$TvZrxqZ~iK{zZ}GuxXx-(J55OkqyvjK98BL=eAJ8g-n?NtlBx3^ zF!TF9C0%=?;rGb6bq9#fAd`EMW-C`g{mZU-Arbe+2e4^4ICMHNr#SL`I6{_Nr_D{2 zsb-HjF8}?Xe^ASiNpXF-0=_Jn=nHZbrF8l7X;+3yYo?`^^5}RE=E%KE8HGrYQ()&G zmzyc-DovkvfPNFHJ0jRm0AZC9Z`>F2s6P|Sb>Z|Vv=B81RYQCGE%{7orQrPq(=k(w znAJDUD___chdj-eD<;)k0Qux8z3L+PSXsC)eU`4mp-y?4pVzIw%cT}?`%e0@rNO7I z5KwX+^L=@>mZJx1kn_~ZY_>6@nWj%`Qy8$zG)~TnC7gD@5KA-&W4xM~ zeD#rv#E&qMo?aW+&$j+JFQbD!VSc7G&FZ*7|8<}hAARrsF&vki-@e;r!sFFF%*@uB ziVgyp>0+IQ#uA2LBF+!1x~Vnto}m&CnExs>aIpu#B+$PJyo zzQ8qg4xcNhL3-Bk!Oj>}2}FKR>G{l^8J*WBVM%*KWd&lSeB;UuGG`P`|vIHo_W$+gZ1J&m(byf?)vC3HR#vGUY=FZ z>d(s;Oh#<-f4Q7rW4&ZK)Zt;FuY=ev)51W6zXp3q?pzpA;br!BjE$lHQxoEB&s@lq=m zZ(GV4a`Q%xo@)^+$z=3#5cYNTY=#416+NNo25P6-tYpA0}D8I%edV0-mc7XaDrvy^9Ws}ekQ{be( zZvf=rxx{Xe+L+uZakpfGUIem29 za9o9Lr}vPg$2Pqx`Eb@$wPT@??k9~3I_a*cnc6Jr)`+v>2M9IIE7nO`h zxe4eh(TE>VLoP~y4sv|1)8RJZ{xFTz@xjU#jJ>Vx#1)r885sSPBXDTTU-j^z%8|(f z%q#86baRahN0@V&axIe|EE?l?vYz?3(|4>lpia7uc9_4bxVzSiOO$+NQk9FdABr*# zu=!s)yw@Dxm}3sU>|SmInDgxs3u0?!?r{zK66w9MYv~G}_u{X4JsdLGp*QeqLGE}+ zIOGVsyO@?cj@ul*PZBgH>zP{z_Ozo7(+r6HNAuGZvY?oi^J&pPD;~2{r$aYgD(YJ5 zQ)ok?_i!U)Y`wCzCLs<)3` zT#b*R?8fI4wlEI63}UD~4CDpShbRs8A+qrK@(S=dMY5vCif!bpwmb6=;_gLapQ}U} z?4zW;np3oigFgs@hAgPko zvl}sFvcFA>AkTJdo66yPLRwA?V=92Cp-;>wu@S+ut2>KUm@)n{*dNXXd6(W1A6I^+|c|zNTc|$Bw1%p9+VI_8sohAK)?bzj;j@UD^{kG0J${Mh=`3&^UyT_II=y zlkeBKEb-dsnfGewHAKFcEo$fHTEyYD3sQezDU3i^FI!(|TH!rhZjtgTFq#rN4mT8g zvc9>JK7QbXhVq*M{ptO9cdx;aSrqp0+va_k>-4D#C_!J@DZ57jV>uf4D6+{uaDK5M zx6Y%+XhdsXxK|n^HG(PkT5}80T~QD`1-3pdsc-3(MoVkBegvsYjQt4Tv(Dguj&gEh z$CNPsZtH_Xd|MPgaG&&Bp&LIj!2%&P!Yk$#{W=&adIQ7;ugQT|&CJmFXakSek%0@T zZWlmZZL+Lte&^mEDGv`mLbR}O{)0UtwCTy}&IXo`eV}ZSg=~uYtS)wfH$q~uQ0uHV zVY6FyHZ%E%SH;V#_LS~(^;!B*OoQx{`geA6hy*>I^e;GvD;~rsYqIHJ^jW-y8ilNP zWFaIk!-D6|bHoLKPoeL#O;Dm)Tmyo6c5jz89BpYeDMtCgsk{cZQ-%kW$Gc!GjvCc= zxaClx2d{R&My$qPF0AJ2LZAOeA3Gpxk~d$cs|uMhZ35b{)K~qs_Ykrk$>HM6J~1+t zY?bAwkk}tpZ)({n&a+zsmr7Jx)(H{$mQ*@-*p$GbN?urRIL0XUGlWSvWJ|8 z8-RC#$V}c*g#_Mp>z&Up#)lyekYRXTVpiJv&GjSoQti{AxA9G+$L1?-lKZme^q73o z71;EB)4$tJ!N+3c;|8C-LXE|z7W&tfT8o|7R{_7H@h93-H zonH?eDRlKpbX$Nghk8tMB+9p^cUIg?m;zYK2ugvax)P@@K(%={z^1Ojyb(H(VZH(9 zxr+33_0wl28I!-3{{R_={dhtGT+nd;2~`QLgDCH*x|=u!R^t!v^b3VG!dUa^w-sCr z10SBVy}*vSxCc1k=^bz)t^(L|{_t>M;GQY%?Y7MjOKB-*(^t?`G-zpb`>y1{dCZ7Ylku5RrAbO%yMx=yERKU2MGT_4@AX^yhgC@2s@1Q-weL;qB#b+=`#MiQQxf3+ourS>HGyVB=&&U46>?rU`Sj*|{i!c( z7({pVIWg##sUr}!Fp=-Qw1(a_9SL&fW#K{Y>+mM9xtYBYQQF78=4bxkShEmD`kg61 z-sGODxIbq_}itu+*~a^kXgfdw}0P-k21_Ir$RrS;6>s_fwyXAv$qv z_0BcRDV*@-zjo0c3t1qA6jZs#wr$^f zs8!p_e(a(TCh7yd1}`yz>~4%N|l5-*xHdpOYMMBr54?`r?iVJ0v@^*a|Vs&|Hi+zc$wnw&XVTvXJVDid;n zF1))gfN*$k6pdA9r%F-De4^1y%V49#0CdCZDlN8h=%Lvo#bWNhsu-)2m-r-8k5S#2`OTxtk9V#sWw+sY2RPe;rrx|i+skfaIoi)!Y zs(;Pcjo6eY#IfMtCVSCdLTgG8T(X!lG#Ez~Epy^mPc7tE>A}@X)>8-%ZFWEQ}`OtekHXARDTLQ)+6gPhCIIgHK;``kvZEnX+i>(b-kK z{7jMefz5?J0Az;Rt9iM-N7{2U?}F*j7-Zx^^>>=_p6~UmLTZKG<5j@G3Ir@aZiN+w z0R{MvvCC;$dXz$IN37Txe-S6@o=`68dPBzIsb?-r(*_{@>Jwg!$!0wsJ9I|l&k71S zU?dEUdUL{`sq6<`u(67a3?6E@zj<90HQeUA-wslU*G4I6>_S{yq{!)tnw5jQpTPWH z-CoH6|H?b8lPS>}rG$C={;+8+VcD34qdjjxT=YHfypeG#=r&xYkpUeTP?cHlB;09T zQjj_a&M&Z@GTs@spG$vbBWur<4j@GB9i8qVbr;Q4i?H4GX5k|8cXFQ)I?W8~p z(_gG-op*wKAi~p)9-+mm8Lnp}d-QH~an{@u$CDhI#=HLjAH9!=JiR3~K`}TV)94j{ zeXN`{XEFP3Sl4l1=)laKkI}MVBHk}CbTbby-sSOJrCGs{F$}uL2?3Fo* z4s)?=`t4Ve;6SKMN(>%2DF_%YID31X%$&@)S4K=D%?HK?1|&VO%f+R~h{dW1Nb16u(j@l51<*63_n5`F($1ZF7x_~3N6Wk1 zHYj;Na=Y^2@duu}Yw31Y2A|4aV+VXGJzue#0QP`Xkc}^jy_01qkQCQbSCJi+4h&F| ztgz=LG^cUcnYy&!P%w)s$jUl2q=@alRv$yJXpU|Uu0Q8sVuw`8LCD6@tPOIUo!U-#I%_ZgnGRA=(3%%4{wOKRKOy*CGU;nB zmet<{hw6c-ZRY`Alal4wXw*%u!?n5XT{w#dszM-UzKIaDGXKG9d1E}G6Tq~HAQV71 z*QJ4F?R-~F&8+Nf{;V54@d*j^qBQV|)e#$Lg7?-#gsnhDKhjnm6q@EIo07vN*4OX3 z@?I{{qT{MMVGhxRr&vU-*Zd^KpapFSAlNwe2D>(q%KaA^!(GY@Q^z&nEaxh5;awgg zBqJXfK|!Ybi2^tcbO-bx)*SbXgG1q?U^u+Iyc&iz!(F6r>FDV>AI~j8NjIScb=4`W zd;b|$>-9BrL)H&@JX$*&7c+v>%^Xv_B8r*_b2M%;R$zaK(M{m_!JI7*8e`fA*i@Ca z91Vpgf{gUlHPtj@_r#xRXmToQe$CKjQnHSUFk-<$Dr#wlv21f>ejt%kAIXrfPPJj@ zeLX4&zcZr(1*QpxZ|kFONO<;Da60`;Y@ew-#ugk`f2JrAbzUO62#mL_t?g*M{g~Z- z3$AHuWijVU6MD6_`#|8XRxR?Y?yldwpJ-crxEq`cYa`c%-xSdUA$apS4>%=AF@eW+ z=7tp*?JcS*brb7L3f4{FjTIB{^s;1iw3VYjB`54@givORS! z>*zbrTd{TT@I*)m$LcNhi9&Fm=(q**mu3N%(={q;>7|Uit!d`b<5p0Ye8|2V8|!tu zUv+N&w36ZNYqX@cWg3+$uSG6?*!$%ujMEPH6eW+Jb5R@u+r4Eo_kkxJIQ_Sak&5n& zHmYJP4qj}CIcOsQ(dOGON6|E|@~#*m#u%XM?E8r4l>*&PT z=+!LfzM>;z6RYqW==GG}CN2*qsocM>&MpG#Bsh|`Pa3DbJ7NT=sT;`yHkYiG+-jP%T!!P? z)~?dH1zbM9xZ?K_T}a1m`4wG;0=gQr=;38slLz*v+uHf2hRyEoBn@rt`OPV*;1X1( zuyPH?z5mkJ55F4dLP!L6Pndmw@!=s;$@0wD&UrkMn%s{K)z`xH$NNtB+$g$78~u`l{JTz@2v1TV^Y1Dtyp8_r5ED7NsKMVZH$;gP9Lu!_1XrrH2GOm+;r^PLYzQn64k9k?qO5$oZ(q@OxvQX|ajaL6gYD7r z;cOSiXz<5r{=6fkiB5Nn?Kb`X#LfK~TI(|A4?@DiB7Jwi01g|;`hEtx>&C+4=%j%;o$s$^y1=0Y}T zHF~a$WkE&S2IXbH`w4gn&YO2xm*gUy!&iQh?OO9y&_X3kK>$uweq{ycyZ)>VHoKd3 zYkoR!t<@Tzx8lCPzni$wqpxu)eQN5V8n1WUNxL%0w~MtFegzeCIi;|RE#g8~Z7w_Y zD|@3tC&o`o+kRla`UZqRsoW(%Mx>3mvCuK3upk$#sBTYeVFMY0Y89Gt-}NKa*F zMe2r=lGz$Q>Y*yHkelEqb_^DAmHewyAsS2jbVfwb(pj zP&qG!vB=On4-RI^ADG{**t;I(H1^{2p`YCI_C(%r)Izz(%8JM8rOWP)OeW`OQfFt+ z4=3ekUQjSKHMKY!V{-Ri{kN!})!){_;|9H%s~i@Uvd61J&L=xKe(T(a1h^pIp~2F4 z@=bMP^p&JB1CetQYBdL}pvVL^FE$gzM8%sYbk449$$9Dp?8#yNqf{VLXKrY!UU0nO zx?V%sGuzeqUc;WD)m# zRe~B&Jlw%DuC=pCP#bQ2kYFU_3~}SHPI$MA^8?Gg9(Q|xM<3aAVmaEDi@pv3&jx2& zs8CfJ*ufy&O;NbXMTZXDE-EJNmarC8Njc_gNXsYy#_Cc+) zOo{c8J@F*tzzoFKNRS|x9(S4rhZZ@33ws~~5nSzJK5NrAvjS13S&%$A(%KS))p_WO z*9YqBse+`>Y82f|1CpSZq_$3D3yRuGY}e2`kX&2=!h@Hk~C_2E)AS2ezF4z!O9(n7>3ROP#M5 z!lWC6PIMQW*y(Z@@i$|OOJ1xjykpBUQ--UGf!kzbj9;A!=dNhH;5={Nq^^7|=!J6i zYN)GHb~B7estL3e-%o8L6BL=FurbrVa}z#Q62CnvQ@R_>+}|OHPRLt4MMhV`dap6< z(Q6w)aZSyO5)#Q_VPTmbSei>0FQ)G8`R7QxH?zFwGUhVue^Dy2rTtQ1fK>ETm3?zI zSnqyNM0)Z&=u&p+M71LXv z@ob`-l7t@L8|Nl4bX}y0T?QNlkSWEqZg5zX2M{dd5hZSk&f@ZfYi>yQzQC>|7;BeH z;@x}qvWkjckTs+LEuNj7=FXy40a(jV!*S0JNo$7wnH^W}8|V|hm7=AzF9xH>Q0DJ; zbcKCbx1SFYI$v&<0atsoGjLtB*E+?8BB%rn#j0>Bj^z8706(xX%aKZ8fNGb=O#olg zUm8WM>0FL?2D`-HA2$%yd9mo_B!^b%nlU)y2W`!lE$XA07f1+5RwEBeJ2Hxi$H5h! z6sY{V=#hs!4^j=AFM&=ukix)qSAgaId5hPYs}J_Dd|yXQUnP#86>Bah?o zoaF3}xU4$K$Iw+1HTQZ=ZS)noC-VN4>@aBp?+$u0@TP^#`n%52xb$3wROPMO#M^ry zO*iq~I{lvhUl;Ox373dU0-mb-{RWI{FWiKG-P9MhOmYr@glHa*I4M5<_a(>{Nfu9b~g>PS3Ex+S=xNx=X0QC`K|Y znl?}9ysoX{v6xZgifHx=1Eogee2=?%7H!Rar1N?bVlO!UuNa;if`WSH%OL_(aX2adW7 zAdIT6&kH&_9P+J7mDC#2AWzRe!9T7`9d}_O?ajI&vP;hJy`$@!K!bqAa7k{FouSFl zE=bO*_wI$qG~f^?f~tpU-;BD`%9f5$n%x|jaq7ncNE6v?rkDm-P1T$0Xpq>-E$+}O z_4a6#5w1F>fj%^dkBGYBqmOH-zwZ868B_x0YiD4jFz4Hj7n;E2IHLK`{oji^7E*l! zm#cs1mb-iMa;QdL-dzFwhmeU3O_Wj5m8{W~X9-;|%?>*bNSlPhY@?Cbo(d7_4R+o2 z!WjDO3v$ru@jnTNs5iUIv~%7XXQz#X~o z_T!blnoDzCUY~m$>v1(2?=<8Txt9JqQ+s@Mio<0Dn}%lI4X@Pi+B~;_u69}F!nx}B zL)a`6G`ygVC3QJ$=BUf=$p-UJ*$LtV!G#4#$-cF8}24eXr1 z`@}-$+6Dz4X)!zZJ({HP)okPXC_1Hr+bI$K~lN%}6Yeh)`WVwvisKt(j{Awf zEDOfiRxKw)9G0<#$~Fr;&0(b_x-qQGI^of8$g${9a$B@Kkv}`0ZdUB1J>hklv94D? zzuXq`ULWt$b|qxQ!HG(6R#e}YnQ<3Rp4O&PytZ`$&E7A z(IlJy;p)BOn(DUhVH6RSE&|fQhN6JdivbiYbdcUfM0)Q;x`;|sktQY5rAx1&DFo?7 zY9N4s)Fku(A@E<@=Q-y)?|0#a7y8?KXRW!$9CM7Zz$tKnIs+vxX%7h6uWl@%EY(|I z-4afLHE)o#(!NW1@%3`0BUpbm0=3zZ8P~I}=fw~TLN*ll>$_#>J|s*qKnR)ItgJubL9)vK_{i_B#C zlWp^1*uzs$LF92Eyb0?Qbj%WUw8|*8bhLWr3W5>H$SxrQ99VEFLwY&=);R~E-Rb`( z3I6|MUVgri!M^aUpT_s?UHWQewUD)%cB>(r!;?LK^1+o2FRsZ~QK8j^s-Bi^arG9L zTqwzcsvNBsX9 z#aW=FON3L%TWeg*jDHmZsRr9u{T1lEmB4$%$K^SRMp`oApfGAO@X{Y&&i?vU>(_7X zQHe;{rwV~GGWI~A{{O}y)c-=S*e~|}Dhm`850(#7R)Oa@2x%K!%m8Qn5}MWoXgju3 zyM!LUymkd+cBThA*Lev;MU9i6!3iWknY#Fvi)u3Sjt;ba0WQ69oOL9`9aZh5aY8y*dr9*m%$CeE+e_PA2d5Q^4xN1KtNp zoF;k{bK{~SasN%_8OHtJV3D`nkA-B9IRq`>A)w>Z)Rdofxx;kf0*?))#*(R7zKNK< z8!=7`^0Q3(O!q%|cz#U5x2sb}q8&{E1^AJX+0_S`jy?&b6x_BpSx8g;!x;sP+v^E3 z6-ob-%m6yh;uH~1{VNoYEp|tHRSA}#KB3=n@L;{T)4^Nu<4m=moxi|x(Cer{aI5w-N zy1sSf7YAZ)TK(yO>+6Wn0KORfJ}|Ix5=|DI5}|DFFOJ|8(lGVVV;1#@z0vgP;NRS~ zw|9J4UXG9R{A1^V3XGxipYFsTm8sN0qo#6%!{SXb+bR~R4je(C8y?*3D|xjWu6KTb z73(Y-Dao+^=8S+98QGV({I4Kv@ARkmoEY00o?-@utM|Rz4g{}kJg(X^Q~hfamJ?p< z)t^|&KUW!Og~~6>(3EHOIt&sd&j5mptyoWXZ9S30Ib_UlQy3=Vd^+4@jF5Ws?->$s z#Y10pKYr@86cR(7&#&K}Vi5Wa7NlrfQ$d}p+H`Z+y=m<0Fj(U%yuL1<)B zT9Vgx=(bAh{{2sCn)GAH&h@n~vWNuh(*&A#Lk(dL>ZDXH z@_i5|it_TCC7}kEQz>Dbxdc!qG6!(2d9Q7~YMyeDk#$_H&8F6}kAoAb92psQ{?%m9 zqg5$}aUTWi`5GtVUWInPRiMm!EAPLiB*w-tu=GIzhA#VZ`=Vz1l_-4o&?7K%txDbb z1I7yNz*qNY1X~|DjBpfPsag}&D;#eYh#dV(WBUFU`EJ$1B+O7}eCZ${Ba|vPb#~lQ zBq%{ORZ={;IrTbaHOu)AyL)89p>f|s|CrysVRh;W8|??TE6?e?wqkQ;3uQq^jkTBc z*`B895x5Z5COv7rAKegooHu%TIW3geNABQ4!(#Ada1LxhB2h@mxtn)g7s-(?nsl)-A#*etNM<;h6+UP|} zXkYO(XX}zRVD%P$1r*%ZEN9H>wcV5hE3e=jaZ5=UheLpUY zYC6Vi{6-X_Z6sYc^Z>e4JZdNx0CAMetwj=7)4#awE@x)LZk}y^_mfe>;_M{jE3_FI z!z_^=&=WYdt~X1OyAthlsH*XtmVhHUvYLVlyW2bY#o4%pI31Ib+dz4yR{=b=XP#5!H45C@U2r{xBl$!1FO3T7S+b$8 zKlCA-m!-fXf32wqIZe&}AhWOWeN~~k+VK%;>z7Vb9N~8`<&qM%?Y#B9%0+#ppQB1r z7cwI)J(4H7>3{A+iCxYjyN25BtGUs|!i?N#vw8U=oU zl9HeR-us0TL%os|!&oxr?$0mns#r9zk@RS)r7z`B`E;4NdkTlqNmyw&XuyvDcy0SJ z|7kMSj9B`hvUI@q6*ghNkcIa!PJ|o+dRFq+Q5jJM`u*_0fb&fFk19?#6n+^ka7jpW zP5;N9p^A_IJzCP4>a}5Arj=K*;r6k7X=^g86p+HgaI?YvR5udy4?AM z1d7tzir_N<+@+a0_kO<3CRcIN;I`*)0~vC{DGg^K9)SkukFD%Dtu3LnPr?(|X~G{% zoiC%T-*=tWA*0)%yf2DtD6nb%rnROKpKdcxkK9VIwwZg>9#uU*gAs@YF|TzZ8^0!dKEKT0{SjKd?-N5VuZZ>v=dbbi8 zRConbuLU-~SsVQJ42O=OuRdpXgG;_^g_Zm*Cm^z4e={2^m@%8HR*K9(-jofLRclyc z0*)l4rdEuL=xg1c4REyo$k7K>Y-%GW-fI7JGvW!$F3 zKckukz)4ucA7g3?;h6Pbej=WO1}_Iref#R|nEsoMi6&LD|E9>v9OWSrkFYqKW@UnD}c#pNt=C;UM}?kP!4-MBZA zmygv`Q<+&3tHSb^@V&3lWeK3jcbB79_5I!bxbAyNRnSeF8y$MxLRX3WZTcOdfn%D1 zv$|B?>0lYM(4qE}FM{UfyuC-NshdB*)BO2GcV~w8%p}sDl_7QDsNDxliK7yg<`-eA zWWI5FG&y2`wDmdN$f$5z1<2PH5*ccJ#iBVVq6`^t<_jd`i>@& ze3yO-Rzu&%VYjxi>jh#JT~&^Gc@St0J4}$k^z4NcK!uzA4bV`uI&w>aZ-X^8dqF878PdTlli~lYBw|^TuQfvUAzl|luKTY4A%6480_9fm`tef?)Apa^qBo?C z66fcWZjg)6mYhMGmodHms>$w$ISttpL>jV(d}i%gs2irS@R!4LE2yfa3~WYc~>8c*AIb=(SwTE6sd z8JPJP(ea$aYwwFhG`O=7z6aMy#mTEZEav_<4~PloF;-7@KnxNX7Zxdif}uZ}oM)X9 zDU?VC+NrfOJ76qWXL{oXHsEx#%D2lqUqMIWFEfnIvHfVvr6QtAUW6c<^y)Rizs8=0 zmP}meqYbXpHHumnp2S(Ae%XEIeg+>KL%}$;rI;Iy{m*@@E=kX}5;{v6M=_ncYEFvD z4UIYW36OY&efj|UOi&5)->c@UgO#q29G0V^*4*If;EuZnguWgy`l^O?EAG)6x?3Sx z-7g(flaI~5Y9aS|jTyvQpJMm}cn)T-EQ}sh#-11_NuKm3(~n9MPask}5fNKn9R+9F zZy2@9+Z;}rGy?I-;`1=s@0FxR2x|!&?E(O}^E0ga!r@{iUx{|D|O%Vt3q)#NY7 z8~Owwh}-O|H}xF2V6IO9snCiO@(@je`hx|giElzDzWuzBX@}IbipCa7fCMDyNpk*q zl0yTDAW5JKthuIRq@?grV+Ix(xqrCt(LP$T2%bjCO}9QjhjuaonB<-5hH<+>#PPX@ zD}e`Xrc<(q=((1yT(xzk)8uA*!jw`rE}rH)C~q_T@jSN%CG$&fCo?6tR=@xly>y8*1i{!!>I-UUn$B}%xHOa0HA}1!@2FF=^8{<^r zal>MwPv=if>@f%irLBUJm|I`k4*ub{Un3 z0A=Fm{oi>-#K8R+R>id_jpxs~>#Pu#T`iwx`I`ETCLEAw_< zF*Q`mL`9~XA^kSEUg-HHB=AGt0U>exwzA7*Xk|Kr3Q{CE95s;D410afoBpxw@Y79i zDz6%(ZJ)Yb{&XkYC-q#M-e8c$vt32*{iTm2-IAk`7-~0DmS;+lEi;wUwVM| zkzn$KSaOK>awCt46kHiIJe`;(QBx-r;x&_h`=TUU!|~j)-Vg4*eLQV$eKS8qMx4F` zipp3S#wR5AydpHkh9%K3yUH=&PBQ%%t&P1KJf1Ho3?oskjB{k^?ugMBXeF z?N;A>cRzd9QYPVPGotDf+xphIPD^(D*V`~Yno@=x`xtffr;cQF$!*b(qnWg&Hf~*kwz1f2oJoY3Bm7{4xED?+^2l_V(NdX(HP_2K#>L5V+^}cYdlgUdLcLYJotVO_ z{?rf94og+ibC>R`CjcNQsp!R3qqus_?P zG6l$gzkVxmzJ^uUiH%0e_oE{(ysUGDEx)iheacvTu#6?3P2d)nu+wKt3wTC;VBlO@ zW;Mn4s{jR~ccoyLK} z`X&E5@$H+A#UYTB5pa>*n}$^)>NO%jkmA0@sF`~kdr5zOc3*vCVQfi5Du02!1H2J> z(bu|o?{RTHP&X~DyDN7pwHDIQv=1^aNKLYp{bTsb{_gKpX;Z4-xGv$nDQY7!R|b{w zDrfUGxxk52Yu&tj4roJX*~2|CDtAI_S_{q-~LjRbRxB61aEh0I|KZKLyH< zwQAy1l`#w^G=iDegYZ6#F!iYEXs5(65Hm4h!2SOVfxar*L)oPty7xDJt^c_>>U-Ow#4i!i<(Eb_GAwJaOmKqFY3q z8To1LzQ$17)y0DATv6ZTEMBXVCKj@m*AS)gIS>6-V`2v0HOZ-%gIK`@VMSWe0Tymj z>@Idn0Tk-0$n-DY5?5sR6YSk7al)#x&q@`iy<%w}N^_x!9@>VrXz%NxxpVICiz<#{ zHrm4WLNw3Q@^6)-#vcFBXdHC}`Z>vKp(zaKPJeR07C9hPJL53@T1cFoy*jJWAjNM! zFoy?WNcYhlb3w+7@rjCzHyvhUT9%8v?qH?Bmb8eF*_^vAkLB-*V0~5HR7II3PL)+X9v+hqAlil=EWPlLf!XVhOsQid6&pf6X_GtE!2}U2B z(Kd%;Ve8Ls2)?77d8I8>6MwBQb!ax=X*LcuO~wB;-J{LbdLZ(VJ; z@~CMe(`tKSNG`|bN^E3>JJgG4+GbyNr#QT7E^j>gWU(4xvTxHJ&ySr4OSM%@t;;wu z?ws&z#VN3>c)1domd|%xmVMtCisl&t^Fh4Q}zOW-PsKOC4 za&#`7d&g#?Qja+C6hJp3pakzQJHtP$f-4VP-h;lHb#zK0^pS7ovoAFjt(E;qeNTZc zchO(?FIP3DMs10S#lM`*9;qDfB?@$T94;wU_0ai5}XWT&=^2ZEQDK{%72cEjtGtg4qhR~Js2>TJG8Xd@b$f%^BYm%m zv|6oW+TM^+Nkmw8ES)V*%x5F3CAEJC_a3P4W8joE%@$S|HO+w8{C0H$NLDO4t#zOH3&YNc7`xmlRQ9yIyWE=hf&(q}O&_2!X^X?>nC~4OXXp5|K{>3F6IyM108q-9 z(Nx+u}0HPXb0l4~~wi@przw^YT@?5W`9(!k>a|C#l{%hVY&EN)@OAEV21Fnu_e zF|)*=fK9XyO3}GUeH~m-6n2bE2*fz*sEOrIrSdxRgv`KX!0tAsne;W8beqaW)E#}6 zuXuqq(l^J)YRJwaJ2+EbK2sB9F@qj?iTa-RjQn`Rx0w+|@2OcTLTvH!0 z{Ed#zy(IlHOu}8AC%xNyrpe-xRSghT)7|Gf`Bj92oqIj=sxH9IHv9})W6ooq)bFWU z>K)JPV!bDQd}Z?|P6&(C)Ri0@xYKzXuTRycR+;`C@qr!!KKjsmGgM#DRc0?t4^eD} zJ+SvHjj2Bcmg?h>{F`@vW!K$di>Tbk*H~1XHInB51u^f@0@;e0*@LMrzv^1~`s+fWBV-ts*98zXdEj;zFn0>SNRpPdH*r?6xr zlP)`J4eq^?hE21S5wt}H<-FKkrOU!|DOF-p%~zBbdv!W=RHYJ-Hy@;bSuNRTZFRP- z8E=B6=hY?=o_XK?mT$8EY^&FVF1t2>n{563Dcnf|sGw{KsZTjeNj;aKVO+d*h6fz? zNXpdr!X_HoGII}PiY^8m)HdXV|D4gv9ay}H$vNoR)e+U9zSz0F_Xk$bVTuvMBYQ8@ zP~Nv-yX|(;@z5qIbMBNku)OAHytk<0!b6tVXkQuNylw>O_EuMJ->K@`d|JymuXTv{ zIXc9!Q-N&|G&Qr*xDuf;X}msUe!RS{pn<%o=G~;2EfeCcl0~BkL=|T+Xg1mBWQ`9_ zN)`q>-v9|$wgeHw&+>|db*@vAG+O8F-E!Q>%s zXThIR%eBvJerwTshr^U&(~BKEFn~b%=0obaDeya_ol+Sey3jWrRWov_MXP$6D%zKa zh{N6;Z_iA+zt6ex{D)DDyMNuo4>l+h`OEKgbXeO-#O_e!zx*1Z>VDY0(Z$(4UIiZ^@tP|fwDo2SnEGns1N-+M zA>=k+{`+g@g68RnY+Cv67)JU`Jw%^ zaX0*Wu>o-wExJ;e6wf_v-G3VsK}OsEf4#5Pby_{w+}1J6V=Arp76P5>#g7kd88^#( z)X6$p6F(?a9yjbhuTI7v8P10_H4QDZNc#6bEyVsgVtwObdh7ksg!0q8ax4nr zG?}2bqlQP!=xZV@nHYK;0xjpJXpVK_G*yp`N$?5XQ z4HQl_e+OgcH}$^M%`l(p@}BOc2|Mg^c;j@DzAs%$2;Iy#aPs;dqNcm#Jh!Jaws5|; z28T%yC6`w~Z-vL3U0C}Q5JsG7Db|;zrZLAgD?nGJYi zF)ZnRb{vEfJX-gDRy8>BT=-+Qz!k;ew&1x|z>F_@Q9)xj8pY?uUP8C1U3{lX zEm4EeVKA|pDrI|~7%M+=E!AHf2$q_>usiBf3l}gEDNnxklOh=5pTJsrPj%AU^>6*M zhkH5Rb$XwZKGVxD^lCM)#&h;pe#>PC-!wqg79A{3+YS#diqr*alk|)l_gM3dNxZ3E zv%^(74O_)-&SS`_%F&4ir>ojCW+T-Tm8Bsv6L?AwwM>JCxj60bvf7T3@6k;oZs7i} zPFWvkM_zZ+mi;01M^vn2>HtOPf)hi7O4#;}0=T^DLq+hL$QB~7$<@3JZkTDMGNqc# z1-)5|<{Q*AW#{ds0Ucf42gwr7UJE;d$U`?w1a;B}0Ds)%X9S^fys6aj?_W(o0vIY< zxpVR7ZMDHN-)C?4$$3}&Cm;8P{qt&NvgApK%WP7LB`}hu3e(U|^60=c*D)`Il)BSp z@ciBqLSFT*!!n{y2W|1(<|an>(g!=$`|gu%*yP{exNLpT_W#tZg!DLtS7(92SI<7? zaJ}6LrB7h;Vqt%)xU@d|{Xz`t`uVr-Km0DN0W93oasHJZ*K-7>=4t0<1lIe2ZA7od0Q6q&>yFB| zz?9bJN@bkVk%UKaMW3taMuz>;tBu$^Ys85(8gxu_wcWS5zCLNnTNd#9S=n!ocK7HU zZGS$2y)49T%|G}Mf6eaebjvmesO8P@JIybC`cE>lj5?Lv?qfuqxW-8}Jr%eiNQ)Qx zER7+w&dHs7$6WR362nAw$p_$>P-mA2xQDKC%sx1ns_@2}+1c8rhf>mc?M-8laNE)1 zR2_Z7)#1_6TdKJnVs5C0+WPb|fDbwQ#=7x++_?bu;Uic zF8;)Oqxt3lj6#QUjI#C39IVgL!m-alyx9zRMWX{0DiM(jK8cQ$&nJPcIZyM#gP`RN zuS&*~`2LT6)%Hd!j1wnihg47}OcV$@EyO8_-k#&(<8HbOr^)Z@O#OIv2NG~OVj7aF z9MQ_~-8JYvjr@v%>UE;Qm+`?RRwjCK7ig4*#V!Vp0F2|=ju!q0(ia9lR;Pq?FfBU< zPk$#_5B|#2=7b-)NUGA^GU;$^n>#LkO$gmM%b0^g52&AM zxLVt4s;#})27+lvjk;V*yd>gA0LdQ=8{F~azgPB(0u>$`t@l{1XX_?DEs>x zsiQ;|z`~BOh&}v|#H!@!bw!8}aip8#HmNvM^!zTkV^swF&AKm1fiM*)hkrm$R3gp^ z&Yu-u49MODJsTEF+Ox+){0%?2Z{5WzmC?U|0b zxdy0b8Av#xZqOQ8Tl<#qjQsgL#I!>sdtsmIU(X-}_t7^Q>d*sb*End0rUA9nn=BPe zcy{mH+kO}at%%%cb>oh}D{QUC1c~}hPnUUFdMZ>9lW@)(SwfSq-#TjLWP}&)R4ugq zJU9P)@LX4nm^E}k3c3)rB7)=U@6SPIOV7KwCV<&?WM zsUg5Qsxd;KP0_Tq8i|p4`7LbOld7KJ;btT~R&`{VgUXD7$@>_ggb# z_jaoVKYt|1dB3br*8jc>?2M*GHk9;#@uoS#%;0@bn@%hwq;cfA1kxaK^^+E($)S%Q zFKGObPSEI+R&r8)KL5c;b>o9$0v-6mY=BVTh!dEYH<-6i6ZX?-H22J zA&1Yj_6vuz3X~kCI8W|d>0mU;iwDPt2{!Dr)lH$rPX$f^Rn|koJ{|g zjp93~iSW8-@mOO>^j*6Vxe)?)IV0M?ksRZ6BUbr04?5oEa8~B1ex@uU=fGD;ho6#; zD+{bc$q@u6PXbLbuAp)62aL#hw%;=npaZ zvklf7F|bJ|YqLcF(*w;C3{tB{ux5^uE{BL~Lg4C;0}dRfq>ZYbI33Y-J4@3F>GYg( z&(ECndi-LQaDt4FCyuF)|I+92qxShmEU0}n0%}pezQNhCQ?+qk4u_vss$b#^(9D6= zJVSHd4u`)6YTs0d4#e*i*f!r@g$)on68r-<4+Ib*Q8GeJ$(dUpJBxeR6aPRR*(sdV z6;K(~hMwfyqG#DL2$JgdwVN%P>P7hZjj$Mc82!GVP23gR0iyv_3AL7^XQsFSEO{8i71gYJ5=F-q$*sx54r+KaQIYgf zpd1h}kypdkTuZ({=u#TrKgTOhe+Ejn0?Hg&PB^0V1r3Rk} zniK0pnD2Qq`Gj+!Cl+Fw>T+jBxMkUVH}{*2kDmUsbVFu1$(os3an`^twKG-yqSSyT zCNz@Ag{2Ru)E-)viXU^vuxHtReYmQ;g_$aDy4LDxzamj$X_s(c@mE2e`05JQX8!$x zo_KHu&Pkntfx*Ah^YYMKgw)|OJ?)7EAa1sTBR)=%G4Bf{!!SMU-l;aR%RGrIp zhRb|Pe|4qNY4e#b{5}u;4D1xy3%SNEKRE^ll_hn6`xqv=0cR1bIN7&-`4af4&IH## zg~V=<3+Ks^0CP-iapfOMAbiOEcuI-aqxWXwQ_#ZvZxQiZj1|{w1Scq z7`gyyECJH++1JiZz3rb)4gRM4rW=xGkdaA1B!n~Y;N(=l{VQ^ziH$aqVDg_7`7x0x zV+go3HZSMg)Z~$&G|uFuf+BNGfRlImUS~G`?N*RLLUI_asVC>h5zXV^c{QAOJ7-qz${rSEmiTG0fzoDt!0lgVz?zpQEF-b(xrO z@3q%xr`~E}od8S*S`0EN8d#&8>=y1LK){%wW>ZyY7LKx1lqGdEf%;Kxe{1*;&5n#s zmo@ig6K^f>SPLMJm>-oVj2v7cl`b}LrIQy3T@uS!@b^B()ZH@{l%%RM1kBm zC;+0MOwJ;(#=b8WhEs^0*1Ef` z_9J>qZ7|o_UnUv+sK!V3sXF`#Ec0ed0a<0petQcdWHZRl4kKvR>6n;Au6T9WLc?h^ zXB{JFflqj$68oFPb4d*$gp8+Posr>U-M|gkP_^*iW4@YG2b7|}H=sQTFXwhB?zq`} z!{Y80!E<(TeFzP}DTxHa+SjEue@#`^DuI%xrJ|j=bH}}A?51R{|Fjn(t!~Po17YlF z)o}4IN-wpnw-$>2+zpI*T3U(F_wa71ID4SWqP8(kYJl<*9eG+sd??9Afv#YStQ#gt ztJX+Su|A&d2?=;MolAXEJc`7OZ>z@MjTQD8JMxDM?9>Yaj)YzAH_Xr3g@_6lSk)f_ z@`hV-jryLB?f%1;1=KD?aa=-78=c@#Y4T+TAMy^xA{Z|@{q@TgoXf6z@|18`qn>rg zT(O_3fujn(^ZV;hU^n4{DFg9#vzV9J<4PEap$j>}ffSNdEV_Eg+J1C!qSD@WwaT%= z(;hXF9Tyj;GhQzdCA6WT0Z~_p zkH+<%5->*fa`~~|;;bx65P$)sWG-W84^ySDLs(1YQFuG z5AmF|2S!qLE+e--dyE+VD$p0gM39g0`hbgsX`?&xhEP|v!GOi*Zu~ahC#R2sd49or z4t5IttxC-mUA4mv)?Hy=b0MzDdsIAU^yV67XhX_2W(R5k-mY4nUc5qZA}r_0@SWOp z%gpXRmUYXe6nbB$lK2hz?KUKeZU{fo+!ljxz~B|(NvA+)+$HStv5iP3 z)rdZH3tzdXeUX8HIE!|A1S}j3esXOUGiNaF?bfR!1CuI3+0NZ*YS6%^sE?Gpm?p#4 zfOmdIjHWdCcTJC-46d)ir~|6|#`75VYf0Ct7-t%I!l^=W6Ai)38_0Znkw$zP)?66L z9J4Mx0LSG2PLt#mOSlfY6%eZmXQFtRA#74Z-jmCWVUrA8S@vx}eQ*GU=DrC}+*dJ& zlCMh-^4}>axbz`!dJW2$bAGAUTg$2~@xN!^DBS^ntf;s>V>-PNlb`2x_&o?B__kip zm^wfccxmqy9dzjK?$P$7yGQ%0v)f=uw`unL>E+2gzO*e3P8i8^k2jwkP(!JMMi0n2zXezfEb0m2@0TRH&6DC17^egDb z{ry&c_uLN*m&M)Zn4f+*92QU#hW)35MKW-CU3LAS^9nmtrGyN5bc|e&igAz9l-S2+01i^%#k)LAdY2=K>s9)T*fQ*$BPkqdbNThb~qb4(f1SN%HtZeKVP zX38z(&P~W)Da7>+w!VH-W@llU08Y~KsM>w_o35v3p{q!s!#3Z^F&1C5AGqoqKf0}>lQ zCzzk7t#e}#gTkoA>F-t6Uxda_g2?&vsDg>1{UP_hfqio#n^E^0jlXvz;&|-=-M8xn zOj791FRh%ym4VY{IjC@Dk&=tm2;j~~JO$x|<{QmsBto9N=Ak$}TcXG))#%Sjd&L3Bbgc<_*KoIdPRHy^h(MklAf zwn+&%TIQ;ojgro{pC664h4e%v8bY^RZhG*6iA0Ax@x~}KM@zl6KTz$M9!5DEH1gz| z%I?oI)@^@Op|4v!{r4*4+VDu=gEs~XXl`R{Adnp(=`$)aaV9N(7X6w^wX2pdK!^~x zgzy{@2Oz+5Whapn-R1&cIJx2Sy)lPF@YuMriGA7~BW>W{}+`3XV71p6ELqEiuZyY(@+vVFh zvun3>eiYTs7Lq{V{Iub}TK%$j+o&y@skmDSe#_B&^N=E*n+lV8C2Y-zj|EkDy@TI_ z@3+gB{ic{n*1L^$&Q)_BlW8yq>vOf~fExsMmf4eeGpwZ6eby=G;l?vldx3vTVol^0 z#H1D1*}RJ(C6$Fk-gijcw13c+8RIADps@$7U}NXTpYV%Mh5lU#pVl2!8~`j-Z3MHg zgBt6Qo!=j8zX078C?71}Lh2zw5}w`G_F1Eg9hm$%sj9FGP$T!S+cfrz)TEO%aa7 zrRk%r4<+mW;=@e4{96AY$cYDb-a4+aZ=@&_lHL$*OM9*gRDVI#cd5&kwnve||G8yQ zfqk$2>Nh}O6sZuZ=lfxT@FZtO!KhTF`%9Wl+KBLKIW zCMUc?){h-bDmV?qhUmf6jFWKt@n8=0h;Fka4G0Vl^KuuZb`Ec`v9bBk@d|+0mx>C$ zxKA~K*UrmddtxeCDWXz^&&3O%TeI7`!K`U@<$;d&f7fvu9FI&O(ANRN>G5Bt$Rfy{ z9^7i}8=eV>E<9F8qRRGW=sAL*A=W(2o+a)%O$jOZJ<;+7^{4XMv71|A+T}K&zI_j; zy$zF1DAp!Zd>8*q@1ctS8Ooh#bO~U7acXNUF?8wW#SF$)1R7Tk^PLYQRo740J`nG7m+)ElD9E3_;s#_525p= z!k_2`kc%}`mjUZ9c{;d$4S23Ma69YXm|f^5XdgByNH(f zwqr5x%G?Z^nnW&y%IFQqfcDaFMeoN6bGI-V?R6(~@Czl$uMK+za9Hw1{B#q7K>tL! z;(be-7O(zQqwc$vol|o)EyMo9e9V~7hFiYj;HKJtROE|yNy*deT=(_3NaKAzbSF~y zuvNX}w+SGwO0e;ht&wQ_uP4`{`>M4!H|saJLW(A-OR#0u#01qCyjhyBO432k>UB1$ z=lhi}k6w=6Y^URPaNXHyMptBs3;TUONBDiH!=h$Y>}5T{K*C@4K1~%mRa51%)Sa$C z=}VVRV@l9^@IVMyz3(-7(YH3=M#tQ5n(CkNGyhu;d`%U_m>_d4jiPFpYL)5TD@4Fq zSmdJ_p|82LAV>#ot^VW=85&K+k6nlzGE+feOQ&zJn5afRPHC;xen7eWR3b?1~ zIa1_cne%w6CxS&ujrncO^dsrijEvj5dU{Xp1@lRp0h4JW>L~8Y!01#@KdCplxMR+j zVOR$!-&-b6#7-aWRyTw{{h6$iu*r3@hN?w|`^KXG^yfAQUTUBC+@|LH4oqu^41kh1M?{3gu@XVFJKKUmAB4Ns$g*c-*vXC;>gJ40} zpclENWE)?B0WVk^jy{eFK!E{N8Wzi?RoBYYbO%C2^+gQt@_CW3v^&Tl;Wgznc)>7WCVE4gNa*4kZ z9Rd@6a7VAlIsxb_Dc4q5fPUNYD3kKw_0ZJ40; z1%c$u1tOpm-%;AWO>=oQh2DC>U~DJL)~c^J%7H|t2T=N#u8-KBix(#xZ}>$dz4Wd2|;EQz{kJUxf0 zzuR9}oUa+^wz!kl@HjtVsV?SSM1-rBPS9nx4A;7i6;n2Ow`T4()aPR!WLd7xKe)UTpf$$+&eX~A$(j-~|M5jy1IRhO?X-Q?v zCY{_o>{Qi;ka;isOf$IJi);)MUIK&g!|!kSNa&93S{@aklEvF};2wq%K;yZT;Y($^ zT~Rwv_sSvgh(z2KhBbmF4z>8@FJZv${$LukP(YcMGrB7Ci^P4kP`N@rWb(tL-ow!+ zh$ZHARzoiCG4wPkT*6Gx<)x>2)af9VK5&#_~c`fjDGJkJboeLY5)E?cTl~Ql+K2D1>LG;s^dGT-7>=zf0;-< z8{+-gK58b|Q=74vIRAP;Z1_@&R)`~K5Y4)yfW%)Tv2MM^=jWftUU|5i&@a+W`-i&tqsfEGn3yL5+qHhzc6D|F-82Z*XgxD=;#Q4)o4V1~@I92dH3Sa_ zI7iRAE<6J@mj2e(9&e5_eSE`p#p^|j-mz(|25Fnw5v6Z zRrRM`B!=8OORcYUr2zft|Vr#PPm#CmKLO4WhUokQY|8lcr8(`1R;uz;EMSW`|Rd12TM55hP`F9+EjLWsyoi}(Js z7rW`xM-wqP_#_|nl@t`?sbZO{vcN^EWoxSeJu3(Rd~4_RUb)L+F-D7#hS2B-(X@wEMeHM2hQg_(d47Gi?Ufl6%9hpO0PQVU_2IyHbgLIp710PDk3vJD5&-YR|z+({1eE5hBsSF zdPMeb>>cV8rp{ld_Ug(b_ck59L4QV5(nJ;b!ojN2wzXXzI2OEh3o_on!jcI>9g;@T z1a@!r&4|%8R&e{*y|((S*R<^M!z3!*s7AfX(13wspSmVH9yMC;K7K&VtmNc-Jp1Q_O#E9ae?j4 zKY0@%Bk8%-Q4ttQ-?)gNz}MNxSI0@q?EvbxQpu5_+>6n8p+qzHjzp1^l=H@GQk!bGFaEVsfQRl$mnC&)?A{qd6PsK$p>R{k8s zj$E4HvR0aBN1D2XZuUm{ZSbhB(4#WtkCQMG&zCeYLnoizU#ES4`XpfzlFt0p#R4AR z;+gUFP#~HIny`=s)F@bTCP-7MF~54In+C>X^9$C~l&)KKajGS(fFwxbi|3Z7<(8h= z+iUiJ=eI_z{F@TdJy$L=#HK2)l?ZEf_EEXdQCmcxrA#v(Y4^N}Mcf`}ZJ-WQ-^ zZ@r}V{M~Oie?lCHd$PKS)Y~lmQ~n1-fpI%IPPA#WBWw-a8o8$;gacHsKko~hzGsw% z89A{Y#OZ+h8&SccEH;2bY8SFl?R>lwYb^pxtMo%Fx7FB)7yE_phrhkYm-c7rq9K~< zp3{@RITLl~^7{w)y)(?Gyxn^%Kb{C$bCjl^+x%SOWaDz^spupSOAW+3cexwL>oIY0 zsYj%4%{x$wpvbf?Ko!Rf+t_9TI$6cDsgioX(9oCn5A zS5gf){3m4?Ve^N}ZBA!jwTc4CX;;j2eJu7_+5%}3Ki9h%`Zlg{3+Nyw$^yiO5-EW> z6j(-c7ME0Q5p#)Lfs)~}jQ#N%a$aX<=KA$sY}R~`g?{lgh=e%Ezq+!wde?(Mv)_;~ zEC}i#Ph_VBF#0GFs|%FjQXq=BcTY1Bw=&e!)$b34ImIz*5BaFMcofplR(X-|#S23-r2eVt*$L%qpnh0dl4Hk8kv+#Cm-srfd(#9n+1}pw30QO!U`#Yhl+_!Q^XzY$8Qt*fgWj&{CYko9vGXM)m;OPID@lJ#8CDV~c}`l^|~dX2{i zZ*&iyIT3S!ARPYY+&Q6|0La`NxDf1P#^YT zo@JfLLg&g=_mj^w-0$dc~m<+m!u;hKB@vx z$rIBx;ot**{JguCm2>b5YY4>Qal2B{%6>b!`Ewdi>uRi|ziY@Pj5Jn{4O&8W9U%3O zH?M!ztodg~mL2ZxRC(775f+hi?IlpSL4r0_OKurUK>^we_sCN)7dg@0jF)ink z@Hf+A?XgPIk9%bTOj0Oa-LKQNZt**GDGxw2)5T9Z*DH5t>U(uqpM0=l47rIaIwwH76VMd_3y9iV4iNB_#&L@&%FXt zl(`it5i~9p3*|AksCJEVT0StusDSj&bxssTMhADply5F)l?#DxV6A|f?p3Rfkys)a zigq28%B+rvP~iNd<$~jlyADiI=T!r%Ufyt@F*7t(0AP8X%_SzqhYQf-ciG7&6DFTL z1RdUmFx7I)6UxxV4AtflAJr&3V~&>Ezo5I=-YSBqHLRh2A&^+v+1Pvm@T5ANnoQ8I zvNyHazq=!SqVUGt4$IMzy814Zto7px?Uvp!Rd9W3H22*^J9~Ru!bIQFllBaj+?0#A zvPzf;Uz$WK0`RFoTS1|~i}`-im&b?F_RI5|egeto-;nDO7~C#bQc`m}6Ayg`4vr6F_obji6ToyJ1OhU5 z(StRrBviR~uE?r{PdKQO7ia#B^-=y^PD`QOde5pwP2bDi{r^$*mSItTU)1m*DoBce zC|wGOgmeucAt)s!N+TlO%`lWS0ul<+-7P&dN=m0NbTcq?NWN$M{h#-F-w#}uUVPx( z_kGSjd#}CrT7N-4v;F6Q+>r~AM~>@+tswJ;eOfrW?#Vy|qQ{jJ(GrEP2D<}hp`Y(^ zmK}WT&jL)%a*3$+D@2B1UkY!K$I<357%M%O6^cHW!EWIHBfv6}Kez85G%Zk~|6C#E zoy-7q*IG{c_?QvoH#ME!W(wH|5Sf5*LD}IX=*RIkx{S?}5dDrgvC^yYbFux?bs+}Q ze8u$h-Io+YqwF@1Kql?}R8+vr;#|zPhPmeJ(C|&PiLaX}`Nl&!Rs=jqH)u({jK#1SDgm(9#_HC81jfj<6FlDy?XJk_A_tUMZs*!JH$$3?3w2&nA z_1+J>#*ryAo@9!99w^E`{p-Esmj|VNjz_nI0mtoUxjU7IuEa7HQ5R}1vVare5AaF; z`EjZtMDiyvc-IoCyU|VEAWhUJtM2%Jv|?PCH-kG~FU)>_G_Z?5sh&UA5HVhS%0fu% zOgVA@$o%8OOPDkPR50=X_M3|39O?3AKEXXrbW!6-h&Gpts5@G0s?mhW`t6Z8$iR&g z@#g~nqosrQ;(tc1rQrK|a@^!k)e3%1F0s&HOu-ar?zFH2`}x21`P89odNh#SM%-aA ztx}uDJ=s^q^#EYrPP=K1nj3*eUp5!KiXe>m%fi=xHc1ah?lgw6MpfBbipliW2+~}h z=U}7t3m1Uo%LZm-=@O%*vo-LTD7@>ZtR_cm!0lTjON*r=)!t1Cd*KHAw6AbX)ce!t z*;o!}17q><^|nhu+^2}TT}A~GydNOJ+b+By7}>IG6*F7OE`u8Vik28`nHp03+Uxr| z9;MpgTAyR*pD5M7e&R-3?MyEgYq1g!kZH`I{WdmPZMtw_GFrK2P;j zn%;|Y-zlEMtF2S)>+2&6GdY`CK1U#RWX2=*XgU??hdtnbCf4YtYcoQd6 zZ#3YEP9iZPB4%5Y4-3nMrh0-`W4xPsE~r7z_9@h6`YiIh!TIS>j8$q(M6W4y)b>x! zM78||%634csYqEHK|Ns;6$0WQ>%7W{oN&81nkLC{Q+^H%`{+Uw(Jj9Bk6ExFT1V^- z=zGNNJ@_M6#VxtfpsIFW2Mz$t9(8LDX@hLQ7>V1JR?8hpzv*>N+|A0qA`&4pS#nFa z_!Fc|LHYI$P~~_rpVAKQ>;G60odqrgq`nBVgv}Z?Oi{hYiqf(ETLtoy_QNS`6}u)C z!?ZlaQfX9(%p9CVmMLg`$)ps_PuH@77FIz{{}_TI9`pcot}P=9O%{O3f)j7k6h9HkIS@nCLes@bUkpAZ{$rReNbbF}F z;OcW5Q;?(kWd++Bz12xD!za7+_b(>LeYtmy29(%()t6psZkw?&<#4@$w;Z1SBU+kR zvyQ*_^>D3hTLyo&?Soq#DnsIuIQoNzKhO zT=m_j%2%AFz|cd%^dlgYrM|n7-wZp~RNHsv1=hWN=i^&8He3pP9+OdPgtr@qVC3|1 z;V6^qwIbGL)EwT4oQ@8sh$`@1oLzyA?&!Ka*AJC=N%aIUi2U3S%4jLPlh3XfjXDcw zdUKMbrD+DxdvY#oyX(z8r3wJ_pH=CWhH zVUH<(YCUd^Sc<+|nRR8=nMeDB$sOD=?bY^2-crs8|7e|_yV<1BT^Wt1c%eP zHuFrDUWD%KxIJ_8e)sTiuZP-Iingksl>OWLzqrudnf=rPbsbaf zX@R=%*$FBh+EWar&{&z$uKfMOiCevSef44~$KdzjKOrBGkG;~FD6h(6V8qB^?2hDc zOQ-;{-s+k>%kZ$wwddZQ1PnwaK`?2(v`KzAPIn)uxY&IINVcZ>+U5-Y@6R_}Q^vM8 z3J!`vS8Jh)6{1$Kp(?oqbINpW5;5#O*tQW?9LuKplxLP?wo+}}dUZ-WlPA|QW+|2% zo9AG#J7UWC5UDry8VgL{$3*;|9$Y$G`5C!X*D>)U7Q6{Ix1R0~mkl2v8zE(py1#(c z?bEFfj#@plclWaJb2G9($NvMC8n{w9?B;-=#j5zej7&_E7Y)z|`shIfl#5LD9GDz~ z8)3aKR#!G&U9LJ~X2h#a&|4K?jDe&Yn*ejIal7mR*{-d`KQpMgoh;E#+H0~q$6(XA!ex)0~k!jdi}Gg>9v7epk-ts z?8H?}skr97=A|=LxrMAu`76w$3WgFc_gD^UPn;rO5Dn=JNJI$m*l9R)r3m2{Kry0# zHZIza_K!A5>-3!mZATt5do|MmA+MxE+|%`G>Fx6ij=5Qx!fO7Zz_a^jPHSEs#_d{_ z=aPr(bDbyaFZiL8p(I z>8aX;#^eZc)SHW#tJ4_wTFEDs=>^u2=OdbRacflO>|6uF&RMpj!3?@E9x^hrFC{++ zTLFg)w0e)D_urp4A5@ z;51-93i?&pcM$h6p(4eAFBKCmQcj0%H^^eNj+VvI`NYH?WDm@_s^BQ^zCD=`Gkg2; zl}=zXu^X`yiIQy(OM;rOo@e$zhY*d>uz#VwMQ%6cdz3VeksMA-+(etfcQ+ICAI^T9 zl%TMj)oPJf?h6{2SXXQG{t-k$T>lu4@FBFdI?U%b78v!lvIQnHUJzYfq6HiTcPn9he`s_=_Jln&_B~H7S-bBqSr`zK*Qx&ld9} zL5-t#y4T{UH{ix>6n7W=>?4MP6?HZE8w+|;;;A6Yp;Erf1F56a7X1e9U{f>DAP!3?|KX^_n83>^YkpI)H5v+~K6@~iJI(X2&#{*^`}HFd-*i|~ zU>~o66c668MNa9~)?Iz1=BfkI$^uZeop1-QcM(6>;m83b{KpyNbZ;=wSi{8)aCyCS zzlxXYeS2CH`R4EZT*t<@7EiLXv&jf<=jWT# z0VlOeoi|@WRg$Mu1G;1P_i3L%oH7zsGGQ!-=@P}4p;u*1QJ~@5J1|z0s4PLP^YXGS zW%@(*;n6|=VbyK4OlJk;=FT6f-PxhZ7z?0B=|);m^4AVdS7+O|sM$b43FOD1HDiFD znLt+C2{N~&&?{*-;)OgA+TgXzDwwfAH{xH>Rdi2Rp#GIWd}qPK*8Pjl|H2nwUN+f0 z33}f%^m8rxV4%8&B03zi*tE2x&H^Ah530w3H732z1!5mF%;AqI2wf+(JQ)m2tYF7u zKQ=$?dv25f&BEFF)zx!r+k13*3mn^>1&JB;6q1-TimuisU+rKC>&zrNaOrVBL zy{RPydD_l*+sc=PT#3-WAHFaiK>`U5ZHFb_Sxn$#SwseD$Q=ZEUKpj1X zu@8=+|39kw8bWnCq(R2SlG1rWeNKam1fb?& zzd_2vvq#^GboNv#EwSXE166#LGkAV;Bo4e|NJ5tn{@#XJ8$w^{Wh60n$SQQ!tb1oV zBp5>iEeLyjF49b)UL_j!Q!|$5O@o%^v5Xx~%b&D@eJhC|jKd|wk@y?E-N3)U|I1kJ zI{X{Y`#cb~F{lDdl^=>h@M}CD=E9J^V@3gIryxPZj*F9< zpD|;o>eHbrQ{X8N>>~tHwpn1?-_^U7QhjqrEt<`#ltv5!^o~v8Fs-*UZ<#JuI{V${ ze!`4e+$aC6Hkp8j|4%%vw6UKKcL<{hv9AkqtIbKFIm~T=u?kg|WS%feWH9DVR}gW(p0z6?WHQsp0e=V>clg&?ocKoHZ65qH^=&h`(L8B~K&mFr+l30# z$Az&%QoiXfD94IBrSe+qVsU=MgUqM=0D>YqFlIm3LWgH=bjf4i??L8ifyqeav^jB^ z$Vs6aF?CW9jZFlGEmNaDW0Uas`)c{NUkHA#hcX}uV&J$M4$z^*Ks4;eD*k9Ht%GLn zjn18?=>S3Y>v8cR02Uqv4qJu>>gsf-kq_P`iE1(5gxr<<2!u@u3RsJKvIj2@V}dg4 zXO_D5hmpU;sMqMi`aU3Ptg}R+cY$kI~m07+%#C?mycmT(3y= z#Hc2^wa$O$)VJ!b*6yWoY8;L?UIaIteq;t`KIE&ajj-1S-g?Mu%oF6IktebqBsbpp_4R`F$A;`imnJ(GTn(yo(N?eh0gjK4-tUS7rS%Ox{U^WOupHjyaew*MNZv-A zCDn#hAo4{}W7rwrMqfMza(-H;|4r9p6f{6Tr1fj4ZN~Vf3)jsdAU>gp`2l%pCXf^O z2lqK{13r<9jkbz&p~TN$;GIAu@w7aR>j#=zpuTKwaU!n=gB4Y!PVTJF5zVvxvn<=Y z>LK{_0NAjX9ZM*KIq7@2$d%U^80+cyYV%T{uSJJ45b^oUaUXH`A)tIV$QsE7UJPcb0Pmj&1^LFYSjHF1F8 zln(krLs~k5jD|SCSb^<`b0_{Zd6+woknjo8(ERpp^5gt( z=I4)gn1-75?oDpIG6c!3R)4dbT2J$%psgIEMV|WPbyeXnkM*4hcZ@z*k4apkLpG0{ zz+LR?g@Vw&kMHD3dMnnks|bP2`-gD}P1n5d3k>ERhj#rwIMw^N6A9jfh$TQg2|L)`knjT;;NdN7c#&FZi3 zDDO1;owV%F%;4-Ztpq%bE~MxasxH?vpKMG%xywUkdP#H!AOXc`Q(6f9S2ML1T0w%) zU*LR^Yht?-lS3peC=BeX2WGTn;*A5e{7yiK3&+p7;WqfQyxscuGH`sPw;R#`ZU=D~ z0!T;nRM$@c*=K_u?*Xk;8~|K>$aBnx7uq{Ls^y62fS;b9O@M|fzt4#scwei^I^U0h z`!M;y{N-lYW0V;S_PmlhOSm(AO#Anj5Pfhm|9d@C`gghXn)S`9OoM8str@IvAcaJ7 zOV%YT_T2ZB+?x}CW;MwFd=8P;>?5>bD=m`Ld&4`J0kXH7r>$5lkKuu446hCIws(^0ybtvM>EtEF~;s$0KXsT!(0=RT`M>fX~r%i8CyY-oocxf;vGULhk{2tg5~M z$uzfiw?St`V^?3BOoKDYB@o9e7R#qUiPz|J*tES>uCV1YPM3xN0+-WRYA+rGQhtbg zx@}IW>?I%6`QK-lBK|fE)C_=`#g}+cl0SG1TqOzGncKN5@Wx}nzcb2(s;CvceMkL& znCd+TCl1JVLm-uo`&|sQg?1`|+?`Lx|2r9Adu1mILR7{T4wsbx0-S~ z@poFA9wRRDQ3c?!u&)6xfR(w$z~>25loeDtFKNXc);NJ&c&fzQ&;&*Xh$GcoDz(&& z%Gwyh9P{LDWTz63q9sn-(A$eH$6svs!qtH?R%HV8Pu`u8_21v)c2n*_AoA%LnRr0m zJMVwKBLqhw^{WhD z#$|Y*ky=I`4IGIWFN295Z5ex4tzDb$^e<)R?Ogjdn;y$|$;R?N$7Ynjk&$ux>0*d! zaj2VyrDc`Hd11!4sr#jGrafXyH7k$I8d0h$1W$0ucV%v>`aPDsD-(Q!6bm7pr;g|@Ssd#IrgwQd1W;Mn&!(}E;ZP= zo2|{W^NDsn$8boi7zf$PaL21IB}qk(ACliX{lC>OdpKpWc(2Ydd;5O~2(YMNEXIEeBI6bw7sY6wQVh5M;#hRP)g7j1Fs?{j;%nXxge`7;N% z8nWAS2yWkTAteJd)41I?xZSKNMgHUebE=9M+{WE8GL4)nOG|*h+>%< zr8y?CFmK~@hQ!Hhmd!T7^jKt9ED_V-4a^j$$UDcdTxfo(neNnz6mPhR!1(gnTW!b; zSSq}ck)M>r{N>=8ZLi)ci6diIQ6FA0=j*n56$ z_awk|qOb07x%N88g3^8Y_>10%^S&JgKIF>_WukE=%8esy+LiPBDp|se`5X){XYTLH zc${C2L?ru{(Lf~W)gzMb>eb`Zni*1Llb9+dGY?!Wgb3B(*abHrtF9g7-J7!l@AB{T zym}oKoiJaX9kk$Q34z>TqvahQ$&5s_EbzLhK1N+h7^HUVVME>)e%N9)U+}(KZQcqL zZBGPZv=0X7V_v>&BXW%cMik1^i*Qvmq}rGY048(0uV)cqn$%8df$(AK8)Z3@mY zwhS3+@}iT~_{ViyHKk*0~i;nJ3Bj< z&gp1q$dEo(Ok?Y$mS#zHzypwxLmaUom2b{t?JG2*(&NZts@4mtsiARr*7*1DU%snB z>5X_c^*pB@vL_rIE1YvKL^Oi+HTb!Bv}W|bH~NN1JGv$eoJqvL-kvvfulvJy9fG)U zMP6$x=WAVe)-2_!oPJRArknr=*_H5%egvFHdS_MFV?RXZP=BBl2Bn>n;L1JN!FI&4 zi^GEqc6YamkPM;04iRUTy}|HKL92{bW#ec0>?1B@4IL`kNE)ov&bdS{Y?3azZn+|Tox^mD?k3rFQQx823wHe*S8nAa=U=fq@KL=cYa zFh*12_F5=OM)1jesA6FLHC^21@cC+6lY*f3=&aY__gplu%%|hr6whcdF!mHNb8+E$ z_Uo(GF#nH__9`Uw*0XQRd}xyd2SyX$?CCn~{o+H_qwY444qcHB*u2`+xg|j?6Ytnb z827gvLDK>ku$j#<@SesdIj@cnX`{+|CT^vBeQb`DmGltaxI^$V-f^Sb-r(|hpqHVv zQ(8vm9rnfYfk&;vEl5x(;W&RI{KP}%S+&jR(ebpZMgW;CImg=_g{jC9mCLyu#{uY) zkgjKVaEkZwI}gKIF@;aZDS&=&hMv2QIDRm11|~7qOAzRcuk3HKoRa2d-7-;gKSeHC ze&~#ASiM|*%XIoTP4v@ACd=ojIrk0Ur)Uv~j~sAp?}J^Kn9Qn|9;ECt14Vrj=xFWL z_MANh)6`Tc8z~ZzWY*t1aA;U@*@mhgf(YKnu>ZUXqK@c0Y>J+x;C(*_5$(hBFEt?~m zCd>W6rihU)TE=YT%I!+mq3jh8f;e?)CV)NOP6=V2* zH_PEHVrMw(WsKSGd@EAjbZ_OXbZnn6&;^P|Y4%pF`n4lnY$_9n+h$5pLy}ec=4}Y- z!-vz2pLB}Rkty77^qUqPi#f!i!oEPONMI3N)@i=KZ_gY@KW+#gmjr}>eQ;fI-F_Bbr>)cxBXB^^e*e>W=Xs_BM7 zS-&0y>U=`4x%UBxSa+*#NLnO2NabHFpso)MyxR3{RK}MtS80z{Tc|1QGumRN?ls;Mt?i}2+ub$K<{D))N0F7IU=&vt!p z#-pso4i!NwKBCZ*Iq6H3 zTkDT+g==Mvot9_*_VRl-FWLUrsNdGxzRC7%Pi~2t79tY4-tK!bI-Vtg)ek<6Yq7=aN zqShi8wvn~>rjmf1e{fy3I{j0n^_th_=*yJpj|Ne#dN`0t6@43l8SiuFrjTEmD}TJ< zqg}a4!@u=X6)kkH1#Y-fIBbXT|FmVx%$u3JJI0qRM$4ez4rxi#xP?l{QDe=hp3|p< z6`YJRy^TD)S48EJZcH@GVPHn<(e=DUm*QqZ!g`Lxg)h`9vLG)n&9bENTM8U4j8=n0 z3jl>FYw#*B&*GZ1DD*v}I>;#;{qgvYSCaH%aETjJpkR6rS)|wS4z;*YO+AG_M>X~MnO-|v= zy?PYNNAqp@kchj4}=(Ai+&c8Oz`cTd_F32h&=Ygj4rsf8j;RH=8 z7QK6>T=*AGA=J%*gaI%XcCtlI@5EBEUNu$HnWrKR6KL)Mr#6+{wc>g1Nyz%o6ax+Z zsZbA#libwt-@^+%Q3bJy%^<7H)_ zbKilV(*%~uq2CaX_*{!_-Vsmm>R~IH`i{Sd2SU`2_lYQ)XA$#lgXlbhSCJ0*u59M^ zh6{rlw|+2gF>eLLBUo`(*5qxWP*+KC^MMuzy%AF&an!e_3!iJ>PJ=gSx7|8_?T=HR z9L2wrE#aeY_ynPpi_#OV_nPtw@S;jD^V6RNT0jPy&B{v5Me+-#hA2BG8D&*9)ij3u zj%If`#$~K|)kW-!P~$gUh;TE}^(fBDZ&(as7lYE(=DlPCOCW^ue(ZPpMfFxf$igo! zScTCS|l4ds)62p_e1SAWx`_#8MxxU(_o;zlp=X{widl*ihq0k-#tE-d$sVqV(Q z+qtq)x6EwA8S8-yg|W1l(!|RN=V)fp24yUv)ZR}=v+-i(D|$s6_h5h>f+DE4 z3;3U><%gtr?7u|w+}odTaK}Zqj?8vqD$(h8FIP9M^LuI z`3g(`8CJ1-d45~Fpi5b=Te`|+RB1euXo_je3OVY|O2MRG3=@+r_&D~i)Ax76pxDAn zBi&0RPBesu>f6wv4@IgAmV+`_*<>E#O3aCYV|e)l5~SYp;GU`@(_mFv52JOV2}PQAVeLN~3^qIuNN zqxmrn3R>TC3vIbzX+{x^E~=m{?xWG&+m~~0+uZNERLXfgy9+D_d&S?e$R|EzBmr9v z$E61GfM}Uh0F)Fp|0^l-p14D||AZBoFYl!})BBJV&nKa$@l(&-03#ZQQ`Xi5ZuO>sFFDoMTsl3q)cqdSD359V|!2ZGPOjnbVlUF9++sT zgGu+W1w*18(xDJ&bDo8WyJ!YQ-+YM@F*QZnN*|V-fyYeBdTa;I~}Q+8C)*c$trl zALM}kMk3_4_KuFAXCP|U!vhV`r6-3Bo9{=FE@yK|%%?W5!;frWI9C&5EZ4_CNvNS2&^2*&I7ko}2vPPooN?K@+YnYe4RskFo{YLxGBwk*I-&x$ znKmEuPfpjeM3Bna#eJ#F?)@e#Zbv84f8V+dIXeeUucLz+eHH_0{_W+}5BMGiSU&6h z5-6F0{LVO!6c6+C{ej$GjdIQ+3)BpHasmAw7s-Iemz3GCP){%LYZ$-rR(`~JSfelM zU!wm;rS=hHexK31V)H%!gtm%$LFRnst&s9RF&?fbt`h4$H?+3%bQ(SQUGD^1P1Tb4 zica=`_fo6C{bA|s2>B=r*^=}WK|OG5cAHkm#e#GEWZEEU2Vs3o{t)@&CZr4Ou{qsK zGyZ*VT3-9+#HcdwUI*p50SJL$2!yyuimFo=UWqfTlX;e7u~hpPuc zI!wa+cE_2L=9*%UVwMOoLl`;muz~Ik&y*(0cci z_H(R|HDI!|$k|#3GCRJKT5vPOmfOSb`A$%b`wKT;{`z}GRnpXDyVQvb@hLgodzWGy zkwpKmVzB2dc=Z#`NwK7WhTU*uuyd`e<7z-y_h+*R-c|J)@K)FO+K_U590?9wr*Ta< z59C~`%tqMvytLx>j?}gbop;ysx5T(&frn?5#g?o6eG1m^+ScZ7eesPiWC&hXcj z2D&O#atjLI81+d#S9$;9?}?VlVp|@BJ~X;KGwZJkaz*00K&SmZKokVlcOt;X4I;Io zXVjLHVL86Y$goKEMdaMsXJfP@)SGzeXje9S_fSTgF|9om+ z*G%W}$SX9wtM{Q#j5k(oI^k_dZRk8I?CR6W^S{EwpVf2Sy$^cBF2QxzQGOrd9}}0T z^gakJqqyc^U^hSu9v>$||AwoQdPvvAo@uMTR_n8jR*%EB%!Hh%g3YXl1no?r7KMg- zn?ix!;?PNl(u2a_2M_GZSl}4^4IXk+Z-mkMEDT;&6P~f^x#+T zzHfWK(Zn)Pf6khZJ3eizko{W5x*6Ib7{TMIzwZu>T{uw>oKpa$P$MBs^ct?IR3e{h zP4V~VB-ka}XNa}c4i=Yb~l9buj2d;5}TE&bmDzO0zz(qE~D+@=SVu#w_^=QQv(29H*AcZU9vO zK(H6h1Mzol2_`{4dhmwFhT8QGo2%r)m-Xkbei~QaMTI?+ZC?r6NlJbvV%~s?$cD@- zdtbI|HkqvT;n`0Z>A%tm^y-3&&Ih^9`>rcZ2y;JLAl4WHXk!A|qRyimBor6rmdKm-^!^I;@4+cK* zkkfq^nws|Ew7Yz48Q1lJ*3iOJZxe5h;n@-~G#138$FZ^Coe%cm`nuMxEw6yvPdS4& zHM45E;tIb%epT;kANw81`C61-bworf|7|59>bb`u9EZAdIgKTXOdk;mbzIQU9O;tV zwv<=;v7${eEU!5&?WhDYtFef2?v50S(1PfKjjV!KooMG|GEIIboi}D6XANUyN9c$x ztd?c*$$fCv`H`#RT|dlFFCeCKLaMsf@5Fl{PFEG+CnFP!n#g3al-gR~{M2=XsAxVf zk6}5BzGf>|Vr5JJck@J5F77SWDL~e90L>UY5^^{t-|ctTB>mgvCC5sy=}|9$e3NX`=_kE1e2m**p7X%e&-+u{i3a^G*VH^H=4R-)S%yf z!*!kPo1NxK)R=tB61OJ`#I8I3CRGBgau!p|@&KZQujPT&F(Aon zNvoRgJnHS3pnP~$60Ry;@paba<)6jnVfrY`$nk-?Y3Ola^tsW^9r!<7j=@}3R#xNf z+b+G^E#k_eO9UP(*>SbK@;!&@$_t#WL^9$pevCzcl-kGa=PtwWWX8hq>Lz7Sigmnb zoFynJJ!&xvt>m1gFm|o7^fe2K+>5U0x1N$A@-OR={*kxhcj z8~1C2m`HklcX4}u(ziW{n}1r$S#zvk6XyCkOjp!vz}c%8w+A;w~sPpS{AUbmkyK0mlRMG=79 z7P1|Y=uq2GS0BiQD~~U|<^Y=aGX5(xbunq{;zkv4qcwzwXQf4>(*<^kY$uOYc11wAoIDK5EZZGC(+Hv3|E zUPQaO3$q3Oo*|5DV4iV$_5rVb&p&_X1sgFK1(LCRu+)OWLXeXMPtP{=4D=~2Px>Co zN|bCf#4=l93O_SnV7s!Ta|u#YrJ{~4e{|>yRbj4|FkM)s7im>y zGeR%++c!MYd-?zn1TEKUm(~D^;mebmPQ4e+`v(Ub6}_BGobCPKd*>D%WAL`?!)bO! ztManA0*+}wfm(dVWUq$P@?mM!TDyBvRqC1ufC6UeC>8xSs=TsxnqXXCQKy=SMO`7y zF}{6O7*XB^5ZM$F7Jdr|IiQlNl40h*`|WGOeH9_uV#Bjot6lwx$8s;0)gF_ma+AH< z&GlG2@?a%1zjlmJQR1_UYzry>Qgu-ConaGi7C(sC{?GfmUb^c;min`T!rI>Ti6T_V z5+_!gN}Qg{L+H_ROm(x{CRa&Aw8Q>>ZSP&*u*jkFddvQ??~S@XZ-g{;sx3_op5<-_ zcwex^Anrp1&zG*DBoCcixHpdHuG-=f*;i2t`Zo7n?R+b245_Wv&Qyhgor zn_a(zLBao<=RrS2vI4MHS_vqzQbl{Phnlo9sJ~B#(GQPx>hYeg$~|o!P~ot)mXXo; zQvBhr>JQ&Ud;7xsQI>0#ywam%bB%VB^B?Bc?LWulsO094#5pdv7@BO}*x(+Woc>cy>&O=%Ua=!f6!c4WV@G zGG7+`%ha=9fu%>@$iGynEr=OeapicjYh5A=#Q@fu=)0D%2ChKHCnnBYzTA{Iq(#|3 zIqTUr)5vOqeIJ@f$yV^HzP~0AjW-T`r4)uV0Jzj>@G~ctO;I;nB86m%z>sRcXYCXq z$fwE)^4dmyLYZAMPAGSv1j!q8DyC=pt^`~;lO4z3RU^M+S_TvS3BUAiOG@=8Kl`)_ z%&UQV7y9yit{gG*K&zC?3#3ytLp3yjFbpkz*DQNJG+>K&jj|OyQ-(Haj0&E}NGQjT z7MrlT)JU^n77u!5$H-rW8zSA&3I+w0yn|!OF`^pVOx> z>CIg5!YA1o=c#-qE8AjAT)Vg%5SoZY&v?^6EGRy}gUs>qTHyC4y8av3>xr>@?RuEp z)p;jIMDX>3U;g0BWrL4pv-O~8f&oXr98!1PQ%cI9kxxf~X)MF{qGHd|SSkcT%$^pD zT6QTqI4%$<1aj&|O5+z5k4eAVvd4S}gU`CR-i6v~6$-w8{+E%DjRrUNaoe$tW9rry0bz);!}+Iy7vg7!3P&5~w#Q+E6Y$Gb>&9f63iGDOpBq zL)6_M)Cbviu>3Hb;1s}yU?r}PeXG{pwXQ{8Tt`IpHL zhaDY0E4%z&tg|7&*?7jly-gN`M7xYmn=GafJ5>bw`MF zv-g+8Ac{haae}sZ?km`0b>}HCGea9r=+)_xIo){^7Ak^R#2zY%h@LQO_erJlVD! zTa|AJfro3SqfQN+2)EAKuBxzeQKkgp8st9%%DHQ_tN9(gu+Y%;A@A!%3{I^=)1n5* z@rSD!vQ8sO!j%rcLVz^bP&qsfhK8jTunW?r2(Pr%gHAes2Uq znL|Fm2?}g2t`AzUwCnZbWDT~2RW-+_Q7iQmQoSs#wo6u4HYao6@Cv_eKIL4n~2SEW`OnH>=0xsF{bO}$0qKAoxbW+r&lBxErO)Vvd6jcer(=D8 zn2bP9Yq!THTch7cy?FbusAdN_fq_)N0O|n$9OKVC&|-!^tD8>lT5T*S))?8`cHto< z_>Qo%*dlUmF3LvaR(G*4cTu)X^H-V#M zKJGlB3ZCnP4{LZaH%{*b@5kS10GR!T!9aWcPB72sJYk>$J}Xk)9}UtPd}k}9s(PW` zULs;j9A&j*coyysDNA3sIYE`iZ>(%>Umf;_#rBQyziDUzfirjwfY&YhAOjO4Rs-e0 zgfm`c^-xRFaTpg{!VBwkZo;nJ+$`LMt`{w?%zioclh;ou~QGA^~!g1AT{I!6OH*BQ{d_DWsU72_vUWqlCw zI;R;*PY|TZh^L-2Cl}p%%!A=+BxLd5T#<*%6V>>eWP{pd@g}O#2)Zkj*7rGN@0=pU zoSjtlcd0Os=T*PgZk-o&27xpVx!4nrqOe3Z^M3JZYm=(~IQ|s#GgarvVm(zGC18V; zrxLVE>sVcdH+h5T^z}2H%A-e*G_*9GeDP^sB?(2h0&``kjanXhraF%p)Etu9Q(G=cpR99lGc)v z@K;qv%k^V8OoWs~g;`H1O+K88G~bW>k4*xQuaeEI2V348Qe{{0L>6RDLU0iRh%4W; z2<`Vz`TBiUtTU%&+E#y>z8>#qKx zI`h0+TM-wqTFaT@x3eXxT-TZrs;A#+n5#Zxi>hN zrn>%U^*9eua1Lc9QPT`3Q>ytOSguOb>QO7sET;z8Pyz57Q4-f(o6;F{ABoBusjBMl z=07ptqn=x*9}`OuP^SGlj$a^%l-1h})(2Hc$v9vVL-IeI8y`;hYOzT)uLtFCB$~HX zM2f3>!F%DYryL*d8BHUoA&SAbcZ|aV6(%k&#CC2;hz-RgS}N%jWz&_YUe76=WILF` z#HuBf4|f?{u?!_}k?CANLd z?8C7EU3ijr2j2j(ib#j!)LwQ))b8a-6{_kQcKEBSLS;PL!_mmV3YN5v#bIJd2OdES zoU$4t0G+1F$gDKNRnjDTjE2~rJ6$X0~gT+RRFotE~SbccT^gO>VM|ftV*0;e8a&w5rHvUDc-vG;H3Q< zD(p|qHPh*S^L6wuy`aB(pbaD_A@t-3IGLtB3j|Xxl4%3|l1H1J)*BLjU!KxTCD9 z;w`k7!O3U%HNn^q02XX#GOq8~lz2s1vMe1j0dok*bj8fs`;8ul6^YUYnpF!9^(qsD z%Xy>9?HJS;5u~h?A5~*!zTTW-Q7x+M)Pi;i#`hIHv_#|Yi1UIvI^+y@CS+>*cV$3k zqL;MQQ4T9WCH^0#-a4$w_kACqA|+CyAgzF65F(NzR8T-lL`8%VqIB1Q5sIV;hyl_P zQcC9-t%yhqQX3mRY8yRZ48He#y+6nA_lL*fAG$qz?(4qtJkQIC?jBZNcEDj{#TPd? z&3aopjqiBmC0Wt$s}j#lFPJ9kEZ1RgHd$_LbJm%8_1 z_{b)}-IaGC1waPran3z5%qNVvTo9B`;audaJ-5JId-2_${&{ASUSLPP6Fki;p7i2? z$Q(a$(raqS{l`8sVPtu6-#rTVRU82%_5C{d!8f!WA5l8Xx`+{UUs&?#yKfhjlGV$Gn4i#Wm6b^z=1A@0LiXx!D2&U{hL@ z>t`|FhJ0W$EM$?1Y7`+Ii)%b*8;LqE`FtNXGW&bm!6G^81lGqjxEF=owx?zfvq2#J zJZ1tpwGT*th#`)_JG6Hb9c7TN+zADp{ghyeXMc z7sqW>^;-i%>Ub7QCj3{14v2EaSXcD;tE{($fGO1oOUU55sHF92OWc zpQJghmr>j+AwQ5ECkN;;TbtjjTNTJV1}h{iU*cbT#S({kd5PVi3DmDQzhj>{J8g$6 zV@o;Y{P4lOW=6E8S<4ofd2HUJQLB&y*P{5S%5PdLtjBbaKj&K^mH ze%qg#smX6Iz%3;II_vU^WOu(g;mATC9cABqB&D>JbUOqtk0Ga}Jt_!OgrPP`i*zg7R|z*?$v`Me?a#=8c^aE?w;m|-^OFAwuTCjEf- zeEksEGw{jQ)h7zeUa#Of8WmhgB&q4!4|8a3%UDK|kBcXb0&o+_TY-_IZ~nFg6$UGB z=EB|wth~+IUQNlC%xbXcYSUCbBL*m2n^qL3SF>C1#G$FPFL&o%6$LIlCzA<2S{))H z#nm5Y(*)Lu>QPe`$MOe`9=X3g>_bU0&(iX+xHUUY%Y7uUX4V^$$HBo%8CC4s*wi^i zLOB!i9K^bQ@;5!(LDl~{(fR1wbWq>y_n&*)U0ol=x#PFz=4|2oE9i98M;B<5No_Dn zcdQ{O>29>wMykGRF>I(v@{64O+dreD1gHD97yKF7&vpJFd1A`$8;y53I*A^x9<@;r zU^C9u8pV2<_hed|+A~X?W+QFv$NrIv{m|$$d;Z$K3ZRVWxHv8aqh8JqOZNq4hXOh&XL^yT`pvbnT;&~ULOJ&o!uKOF( zUvGUKab;?*4t$PYl2*{#+x3O2;FUVyPK1&#E5)Lc9HaQYJ#VAi=4ha1K%x#6V0PFo4e!&TGUc|NAi=?Lf zcK+AIJM7`#=a0e-$?{*XSkzToJy^4ja3d9be=QrQ{7rEtrOR%fI1bB~vRpGot7l$f z*{r013kGelxN&!j`?t^WNFA1A@7UTYtmqsZkFzeZhU*0Q8;jMQsvg~tH(|slWyOai znKSjvtyay=BeqyQu7^`)tplC))HC5*^bkd%P`L3)RRgO?=w_Gd6@Bg6zaCAtTMx4a zV=H}$lsFe>7;${fHQSeKOLqt-qwuXWo%z#g9s|L*31ho>*k3a}oW+CI{+k(@y(+49 zTd9Y9YKH?*27M*xZ>5>SQ-N3yb$oGwu(S5a_2VNeOVAI?Z?&(U(RC>>yyz^R-P=Tr z?tfy&#g0Dm=NnF;G@$=vpvJ`kh0>>s(dN46lNCzSbT@6jrQ)SL2>|jwFe&(MnB;Mk ziay5)P!JCvZLPV9NP8ol;4TnHqgB^iq%1^GcepX|=!?jo7K(C1iGEQDppk6w+k78` zi&WbPX~wy^2fK!lznNujxRy*LfVIcJh$Q0*I`c8J5xdkkK|jn(v!tJ#y>XY2k=u4t z=}Oo7?n~4!W;OMkcm4>FerI6n}Kv`j9|gD>B~UmtZtTHq;62^L*q&nzR3n5f|T%^4yH~# zSgr8OfU5w}(Y*OUReput1lDh<4gprX7H}lui?Xw!ZKO13g1BrYjwDm@Jt^wf`}a<} z05AQYUG)gE*NuVAb>f;{=I(h8ca{^n#L`RVL2nx-%KL zJCK+MzG%{}a4zWc7wI!o5*ME`^z*)3#`;F(EYc8OC+SU!OpQ0n?t{&aA2}P#QJ;FU zkpvnkCqr8V?_WxQ5se-%r0}OA0yAE^{J~LEZ7pm2$|6PQeUTkCAI4H6T2z;E3*TSk zQ48vuEEi=_VGe|nz1T{5-g4x;O!<&JMhZV08$qDbC)>7dKa;Xx?iX)Xf1ZVMTPPa} zBL;{3;ZeS`(8N9vU+$WY0{PkvKAIn51v9Z|;BE^y<6dU|J4BQd9F5LuM*ShQ70yfj zNF19HUBj7#xB!Vg%()!)P02$NRfDVU^W_8-&9-1?Y}l_&d($EKYZ6gte zBF(E_z|1?i<@^*LB38nU(V_FwX-i-e<+ajMDz*r9@tl&9>H63BgXiv{Sy0;dKN^zq zq;5Z7&5rUkFvvV&bN!R9yt8<7W<$8>9vhmU{~a4Tr}ccBuQu-y4LIrGRoP%;BmhP6 z!OkK7|Au0C99T&ku#(@vO73taRGq`#zQ856cPjz(Sej#I%|BhhuOi=ht#y)j#KPawamEW;fd{1V$=YKCL zjL6)|2G>4w6s}zz2O~ykz(vY=>M_-5YhWjX7@X=i?L-U3zog~km}NNWZaZwKG%ZcS ze`=5{#$V61rjB0?n6kaZhJKHwrra1UsjkV(Rb_qgMK6r#s1a0pDAid}o~S*5^Z7zn zKvF1;aatqSH6(L1KkE_>lab7xB#*nZNHCR!BH0$or@{gfS&A$SO6Obr%w`mfu3 zMMN5rm(GJ0a>Acy&UR36Kngj1jhbyvqFIRR0;HIP{`7(wW!Bsm%1^vBFw=IQwKPoOCYZbeMkxZ`)(5Uz||GmD%6l)vHi0w-^&b@=a46zrhK+? zxvdaY<8rqHHuRO|zVXw-LT*)d;er|P?CB;_7?(qVq0Xp*X0E(~xQX7ipwjnD>p=TS zLA38CZ1ALG`?HJQ>T4i?JTkb&#M^jV!ItN>uN`t(iY3&Ux^(-BRONopQK(I{Y@Fz zR_|?63DI6Je*P4>+jHT{Qe?0g-$FYrIt#R&KRwIe@atI!N6jl(?mE)Gpz+P0!)oI< zHAy;qDXd4^T;bhY7vq4UgKbjzB8N< z9hMlZ?jOl>)|nBleZf2FnNnd4h41(T7YFM^aj>l3G121@+e!{q$zaI~WN&(Xf@mpU zVp)}rV&aIQJW6e`_Bq6X<%!)hC{N;rSL7f^c1@LZvlS8Mm6~P4h|()R3QCKo>SF4V zE1|L#9dQz?9HuAhQQQ7@`Qwc9wop64x0)O-7rS*Qw_|IHSLaz*;Lf;yYq9pgb@~>z z>?~B;$G>$rRmI6(tp0e|(IvLD*#;1f%grC4!eHcMkcQuyBsk`@qNDv~wQMIyw zlN=}XQX9BFo+raPKPANJxO1^iydkD-ZE@{`5o~nS>^BK;X6=U^r>gUhl)V<~niW*Z z9l>1z8SiSo&PfN#Y^R(%jC3rd^d0L)`j2O;y+MKa`FSMW3*9;iKg(Y*NED-;+gmB- z6;I$&CWr%jN*(h;nRZqzOm`+HUvmew~eHX@DF=T$W560w(^d>3fT12O67e7 z8s|!u2f;xM_O{~>w3Cw?YqGWTcmmzPX(oWg4?J4Jhh!bkN8J8o;SYfbKF9?um9d)S z+t=w3!UkUvQ=p&*O!&``T3(8=cPsdQXAUD4+C$qN?gbnCVR8Py(~anF^q`7>Vj@?` z){cJ^3)S=v_EbL!o8k|q4kIvcwdYdZnvihtQW zJu7CD^9{QK_vhM+!BmmY^i1H_)*hPqxfaJkB=4glH$T-Fyc2gx;bS_ybo+O=m?22lyK$!=ESF^8H(VO!%&5RME;!xM2&#?AxoaT}3XSF3 zhjI3C0_ww+-p~F2sFHx8JX5*vvElK%$BPk?6cs^yNBlKXUt7llkpUsdTgNjJA)y-z zH?rIT#YP%A-My7UcEM_|;7&iBz)$B#|3~gbC>_0lyT6SZ;jCYNeJl53VzaGc z^zBxZS-g>J1{6{krtyj#|Gx*R8b!I@96ZqKetcWg_}A*w!3V2S0UUFn^?{jL_MFZ_ zd=+tceZk4X^nG;HsoOHA>V!9PG6%y7^F8zw&WY=%50SQSzei0(W2k9x1a)|o0t;q@ z+_)xIn#9C&!5|70u00(W75W4r=9)>`@Ouk!fiBEA(YY=Sb~Mtub$%0EHT`HqhAMhBo+BeG&ZHj}rv%bRkwls;C~A zM>g=&FFt{As$Befx3V)lPg4qXwEnY;=wl>F&iE;oeA{QXESxo5oPuTn_IIw~+^+e- zLHni$G?HF~uX|QX;#>-JnXoc&$O|m9Py-;5o{4A?{9{YIxX}wJARe2TB6bVxC^Yi&I~JVT}znno&M1xmXl!R#~fY zM|eSY{865GE4o{=19WD~iW>x$rBhOvfGE@m26U24>cr_G9v+!}tNNIXRw!s)(Z7Vc zYXf}Gtq}N39i29DZIIZ~mW4fHicAlQzZji4I235yZd7rpQc7LA<2Ra1h1Mz(FLvMI z2>d1hX*vHhmUr=7uOZ#jTIf6*B-))oLdD)9OY@IN1Cr~}AHYTwzsc`-fla-(gc6n; z>_Q=$_{{G*=8AHd;djLQ`cVJzfxNvsG6QvDFbBjyTI+`RoewNf@4y`SY*|7Ls_k?o zYWei_IZQN6h?m|SgV3(?u_3v)nR32jc~o94ptor z2VA6~ECIZ-(0l#aWeJJd43QTO`3C8;gn{p7vyn)-Qx^R@%GTeE!M~OUjI|oID89iJNIEmJL&}c0g ztK`WyIPtVw$5{M%oS^9>=-QavE#+`BS|twSRbI>hBAWd!;6_%!u~~*{yFc9PgbXz_ z=!(tDLm!nq9@wo0BUEMEr3We3o*&m&-+cy#r!!3~kZ(VP8d5QY-bYYb4KG~TBLCKh znK)l(?ta?HG+FB8iQ!SBN-Y|VI!E~X>C8uB2;%Jgi1MHFe+Ez0&pa)(V%~ITbvnN==DX zizo>y)-?_xhhsL5*@09&E%8Yp!j}nqyFI9XUI_hX4K$mK@5HOuZ;-Owr+EyD(Oay4 z!M*c?pYd8R*Ro~%-KW1S(;gaA?0!SOf4hU9YC0if6zPK~Jmu@O? zk>x7R^l~Py>F>^N{O%9dU{MB5Jh9rFIj$oLRm2JUH}ID-Nig?2+n@K%6Ei}=J2J1! z+!%G&d^Uy*Jc;%#6|xsUvDMElD2By4Crc}t1>*J%WLtqdr0rS6UGNj~xV++H3} z>2SI{1SSN6{C7wNV>xamB?Ah9bC{N(k6X~ImXQC# zxv9|Y3>rO4c`b}>RP10htY?a87`k%M3rx?kj+eQ(45`JxD~I1wUlk& zYhSw*l-F6q=WoO`ftl&v_`B0_f%{QWk4hSjbw;>_kol}aAJuc*W9h2-;WZdKoW_bkeDo{Wsafv)tea;~}_ zJ?}ush-sxQYr5C=nD=22*(2#`G=T5d&upU?8@zh6^dC;cQt8qzNsD)_h!2dyQ6L1% zd0CbX`M-1lGu(KFfkQ9*$EeNkeaeOsiO|jIGF>c16Ks00`m5a0>@6cIzKG#843xF3+Q)Znbhx-6E&0NbF+G z4lRSblQbs?Ld6s1Zt|dK=q$q1OQ#)!gyZy+%)L1un#61bBo(}VeO!6DTeci6m=>Yx z$5ZWVo9%GlD6Qa+(MQKHZCrh6uxa$;AlP;tWP$UaSEqx~~9x z*HiT&T5EHHm|fD@^Cwz6WUgnwV;a>~0ifk_f!=`$% z=_-q@(q?LK?F;IhLZZ@=jF?D(N9($GbM)l+NWB;wCF;(o3#M++$353e0PQU*U~;A; z9kCMJVF_D%n0tPD(OfUQ?Ps4Ic)xp-)mn=mBM88`Hna~h?MzBLd&e6rlL*ro=H9$-J3U%C8oQGFAcF7ac z4Syrmk|)PEqK}1=Yr*`&akhjj4P-iH8yu2bOoGpVjj(hW*zdnCMku3yUo6^U4Ebz(oGr zsQrp7TA;y87&q2Xv!JSVtS01eL^mtLlHyF|cG2Hu(5iwt0A$FaKQ%;E_zE@i&|h`s z1B?jX{L6|j^|qM`FNFM7o_92Otdm2UpG6|;wzo>+Ck0XHR!@aPV^0dlN7 zy803Q&E&ibO>PTuErJq}ErKggO*h%)nX#<5QhAf&gyAdopYy#2M!Byw50e8>z47GX zaYQ84h(iBB7=`~y-P@JlmX}>1vAtDeLZeV1Acqm(`tB~GA|eX_eYF}jea38rqdzlv z*9E##FSk;I5RR9sBKu=%9*o!@`rlsJedsb)GI2PxZ-IC3c-0pH;w;~Suwlc=xLTCz zQVlXb{2fviTK}9l;~OYcKVR*d84V}+(pnK9&ROwLKv~R?1r3GEIN^m*Ui%Sc`Diu< zec4*J-c<_pu)*iM-J3x@470H~Yu!R*2fOy9*%%m3uB@ix1Tq0r|J)kl z@L;!l`J52~c{meoqCulXVB|0ae>h$}lO;w#8?g2oY7Uz4wYBOOR}2mSvcDQC6j;-D zb+2;Etm?2qglKTUnCW-EBCkV^!TD!3o~u4=g7B8lf_M}XHIDv$Lh0$x`y$G6+smN5 zmrJ%tm7`r8bFHOKML5Vo!6E)>$Jwi{1jwrG%sk77hu9VK=89->-q+xg2)ek=X#sEmv4%5BYq<*!V6<8j{KZKE1$cU2S4F9)AlYf9S>RI1f4S z_$Z2T?@ii;_MebGI{6_gYj<}# zO_Id6{G1C*26~&9hUGb>HqoHo=tC_HPXa0xdSslXqiMJuFt8wsJRoa}RbA%3ZgeyY z$_X}e^-f3-U-^!AVEF+6$LiO9b?`IfGLp-YB^RNbXYRG@@6WvLMT%DSQ)sQ}+s$sv z+WEkri>W>&9U5t9Xxw#00p1ZYRUsZrous3|DnZqzH>Lsrg$})vwfz*~z#BBp6Y$0^ z@#X_Yxogv6-iIE#7g6^6=NQN4SWQ43pIjgDB6y4yUOleV{U(Cou~#EL`&%i*trD?d zK?7cGpH^u1*T_2D_(l7N+o!#r5QOTR0Sf$XNDvya0nDd{eImyi)kCQfe@zLz@Uh>3 z;XX+8MtdqWn-ly2gwSnOYVW4uWQU~EOKlTjcqNbid69KW{rI)uMr&Aoo^|peiZDXa zS9AW>HyIyOk5+wx`kdK&yJ2W4oav@+6+K(8~7 z+#bU-xY4JUI_&=vH9PlgtXTiWuU6DdT)9~h+<|9*y@neak!<@Nz^}ldJCaborxss@ zSU3O}QD#dyyoIsLqZNUAsDyL;a};G9h+@9{0On;i6?PM$yP6+{>mwudyLApDB&qyzn!g(rV9l$ddQ~>`y4)ynfCB_BI>z{zw!*)nptvUQX^dlS zf1_iU@88#Ds!O!PpinJ^TxT*&zK!4x&R*MUFqMq1{k^E_7au_^MX$t$;|}Mt-VUS_ zRBvmL1?3RVn<^7|O4ps^J^wffj(6U;OG~-#`XwR2T0EZZmJS%=ZU>fc)d$_k8TZL- z1AvAykK(RaO&Vxk_uYKiL~}@I6EZj07D-Y|P7I^wpj4ROC&Cl4w!y(_ss}%~uHzHU zE{aQ!b=}N004QzhMuOG?AQVX82*E%*s6|!Py#OSTgg^K56taoF@x#QZndOw%l1rPy zeQcvy`G_$97wc`BzR=aST_A1=JE=sIgz_C8s))$xdC5)f_3sNSN!ftELNy`SCrVSi z+*W)24O2-@4u9fORQDWs4)f&3G6>XNkPi`lu#`H%4yNp0@0!WlffRX27#95gJy6v# z@GI5;QTP%{x~3((;`r-mvAu+W>JmLo<-^m}tZ{D2G-vJNKAickJpPQp?~h-$2W!(n zk3S%`ws$+A@qw_{%|?xQwG2-NVkVK&Sruyiscp=DU@wa>o(KitvtC{%ix~Zf3 zE~C~nJ+*AHS2oV>HU8uYEm9*n<9V%u$Fyd^K|9Z4*>`q)#*~Ns6Kbbf&yA?p|w-6U!et)(T^arD5dHrwixmds9a6w(q_pf4_F61}H9-($7;n>)P z-$@I~SUZoGQfV+%)LP%6GX>pjalDpZa_m$i=?sdzB;8!Cat&}9l%KYZR^dgRek&BH zH_gY@+$NRE@SY(D3+?Lc-thtA;FsGOdHnC3I-x_!>-y)%Qp`x~K~xtCcWYPnhX{jIo%MI-14`F1>-1 z{@>wmq0?PD*(YRaSdqOE^45z_tVlQ&mIN%;DW&a;lB)(lmv7lmjifZH`fE3}^A zd!(K7nt)oaRG(p!T3;;6E;dJH*_@UldSSCCRb8q@!3=(furjvk;!}OT)@PudXE11E zK0#e0Ex%A*^i{C;uxVmAvDNDBlP6{ldzbRv4OsZ)7~mae5w8cp#HJZZ-!9=ktF7*I zO?`E%m#(wc^*J8GIKxPq13i~`wc4}y%}^%Nd@_1M4Ixc)eOlCN{>XJV(qOS95udqwF)|ceF3Cj}(=)LKEmIcDE0Lcy>HQm3<$hTcS0_8BTJt z{`!?0nx&yPVF3%GlVeDUj#^ll>C4_I$@uO^ems+iIDj3F>c*JWhdjjK8|du}FO^bD zD?>66ggM!A7jB6S?E0Md)L38V_A(z+TS+Or57>`)*|IbQ!kTe?hE9Z!lZ5M*@JvD1m=Zz@zf)|zU$25_p0ep|8m~vZcUx4f`i{qOynD+-sw{# z3y?pw+zj4|JY;F8m=)EPw)h2UMd{OIZ)j6MFB*Fm;Mngnp7JFG$49J{^H@@6E4P+v zp>QYRZwI#~?lTty+SQR`7M|E&enyN!K)0^d{jHpcuNq_yGPKMo=zg9ePE^bBU z*E3K|?vYiNS$t=iHz<2rFvr8bi|h%+@>%7`h~zWqP5KKyUbG2|>f#zXV$M}Ko>i;c z<>E#FN^M|#cwDb_7&0?qU94-Dk+?C`*o;#@Xnsvei?=Xrdq#!S$b}pPZYbQ+j6a~@ z;%FN~0LyQ%G2{?+zIJP6(9p|}v87}*F2S}>D=GxmrSlKr65WtD|LoQNjc308SP3u} z#L$6o^~hy6G*+{!yqN@=ly+%(opkJ>@cA{a;WL}w7W!I7-9bx#mKU)XD)R!a%uHA{ zdKp0FmkSXg&4-`&F^U}*%QH8)!-&}jO`)%7idSGbVZG-|?83PP@>aG+^l?9Fa;Ts>sskH90BIW(1h@0t@JPFisf^=_KaS9Aqy-3F z^jsy*&!85(c8^tq^i)rndBng|W$r!y-jC(iGT;WDkyPyj$X2QX^ZeCs_a6n;P~ znfTJuIEuDgnJ>d6S42tx$tzGZELkwte2D(|KK(o{Xrpu+vAXTFPB}0r$2o&$7RSKS z!>@X{pET)%j637zaOzf`o6XG6U}-nH{!&bugqKm-j5}7cin&E z5jZ6RhU*v{V5VwJ%$g>BL>$Gqq?>4S(k@n((RmL_Qx975xygg~Kwr_F%YZpQW;?@e`l5a&~dwTMM53*yV^8k5|=#Z=L;83^- zBLd3aWCp{Fg3(uSBPY8Hdl>o>7)DM`f&Uqkh;BPI0yLF;nJ_m`4OkHKECT6WWo-h8 zQrIsoFciRv$6TfX90sH>UjXPovX7gSg(X>a=G34a&1Q5h8{F&NMG{8FWNkD|#%rGO(T7n~We{aH`k0t_-^eIoDpTF+2NUtq3k`1pOH5!It)pNj z4E>+Arlh=Ql_y4bzsC2NVctXFpq#u_AZb~a66L$Oa}BZD>z6co&X4Cb`e`X>cw>f3 z98!`~MMSbsWHxW~q2-HbKArr^m1n@Wx{E#(3LapO=kGs+#|YCdgd%$OlJSYd6_EG# z!PHVM&HcZChXWdqn7LOP0)8!J3sdbq9nAk4p2XismVK!Bc1j8t07rMLxB+J4cAQ5|w|&5{nGd1&sn-Eg^X+o5dJ1E46DS6TgMCjnJOO2P*HO=)`P*xNo>T)`I)c<)WpQzXtW9(FwK(OCa-nV!qq!}tV%ab zq7HOsIPQR8AUNc+HiRv!O}-fdKlkMeKpJAk?%y$bAWKVTfX0;aVS^Jo??I9qf>!p+ zC1oa&55BUW(B022npVSe*1w|3u>1kJ_4$1&t@T3VCqJ)*!hgOABh`YgCrvIFoP&f< zcLLX5yTGV0gsk2GL%MR1O3{tJqJ&i1lv(>Uf1Q?SKFRcZG^}8 zc)@o&=#1+}(SPSzI}TLOTnm{RDySKrKZTQOblk0#V$X(oO4kGhO`iK(a;aBVuzQ zQYEZyb$HkHz#l#FX5I(cCwI!Z5V9;Zm$T{H-1zqa(jE%;n6#M3LK&^D`u%y+7kyDW zT3BXFB}q?c`@sQDmTM+eZQiSI!nfMeS9>N(qIv1O2%nlC({t8e*L@IX&D5HWJ`>y? zN9<)aiF9%T$8a$6k~gl|(sd8_x|+G^yY-TP-(H&G=KThmcY4&kTRN3i9qL7sFrVwH z4>{`sN);=(uX+I1&EMbOd;L=WJVb8f2=f@YJ^n z2F(lrj(-2k$5f0?@?E`&Fm>Dg??+W#wZ$$KHr`J7AQ3`w0(c9s(g4wz(Yt-U^%2|x=pk3Q${VFz4`}dFf`+m+|3JA4Z zPfI&{PWlsp=!!^bq0-n{bq>=_|G}s-!MdsU3um)OSPuk%SmXs);L{)P4g5^uwzM1N zj|=O;oZ{r%Re=#qoSJ;d;l>m$RxFp3oanaJQxA7W$O}!7Cd+u1dAXn&iAXRWbpr8& zlr{?9g1xNG?+pw+WHL=4%-F2SN|e*(x(64inpxRW(ppgqG3Rxc*uUP#&)ewBhQOcM zde8lY*1Fi%JN-DxidDZvu{+9Ra+=(e*R+RX@0LAP25|r11ym0>WHbFv2D#Wp{Az^? zDR?lOgH}L}^V@S#3!Grq0IqyNM){HubUT~na`D4BPRdX5) z&^728kSlwr9f8B`;*0s!W|}O+K7cT7sk~8@W{3^+-huY@2(EX<^mPk;$V7Lo8Da2& z*Znd*M<3&8^~-b-pt-Hg^uHU(C}}>&#N|Qcu1@w?wh^bnh|@JKjJ+yaf2wjew7?(` zPT*@E0AF*#k$s}LO{l?4F{!F|Vouyn2M3pwkp$Cafcty+0*7DTChyggkR+}wLI2UZ zHz>D*zrmT!RMM2;1cgGC-kb99@C}Wj*bV}`!EUQMu1vUN6j0#Q>AWgu1p0rd{2YT& zT;ZE=_#B4*Ae{@Y-^1F9DCJAN%##%Y9X$#jV@&o^oj#!C>0uK2xwVV7Rg1B`7T2=M zkSzJXJ;_OHKUJA9#c#oT$n+X7H;u=5&3tyba%gsj6^9}P@+|k{(TECes(`WZ4=WY| zRwzs!W8^+TnBjskwP~h7eNh0FaCAg!IAz=b9RDaQn6ISZSyV5!C zY9TJWSgt9?tFm&N{ZmorL&gydI%H@E!7Za8k`m^`{qKlu{M%6{&&vOtL+1#8E8aCOQroVZedQQ19W>2!5D`)H zc?&iAf>k|I-pQ}v?^(EY4SMz7^cCU8$qcFqoJc|lTg0tA#y5@bjs=n}sv#Xv>!sWy z;(F=Vt$HQ0VW{OHx#gl;U)4%a6r)#tb_S&tZlAz@o9o-XxrrcoOTBDai-#$z?*~MkP|rvy04$GQ}*NWu0<^( zQGq5yYB8JcfaC-;YgBLiyLAz&P$YiYkrr1IB4fK0*ULP3%PnyYTj*cCDNmkLP0%8s z14-zLwbY7=I;ef>;wJ2|K%RA7x3&qQ%+3AgiqWF{6!v^u>bIgTyjKYb%M}bj%i4$a zr5LvZQ=1-mKjr9&k6t`G`gA5B{w^X4(4Q3U%qn9R$_k>irz z>l*gf|80_+Wchhuqj>UMbDy69ANszn^ijAOA9U{qj^>mMJ}EogXb5q`@mdPP#RFH| z^jr;U-rN&}K)!iz?v!H>izO6R6QIYeFMI~5(EqHfOTnGj_SODb7(o0JKsq+{H&J?2 z21L)ln%B?Ae$VbXv4=`6YLr_ss@N||DhNtKCAX-`=AdmI_nP*c_#Sy*C7YjPCO~Im zWV>--_s|W`bq3p1bK`SNvQad_27p|3Cx#yOB7NzSE=e(AJ!n61)0aNqFWtdBy<1@I zOG&$Hg^Ff<$B$8rmz(-vMmjIaf`nbU;GF3@pbBa4*5~9*=o_roXaZat%pmZdkeesEWl`T%x&Jxw z`M@xguPq=`O^(AFUv`~}3@6fL?Z9WJ&H7BkR?C1^?o)Owp$rWxxUKPPnkD~dO>QBs zF$NI;KI&}LJDHsO{kErWev0}RSC5u-N{apS#TZ{9htr^FtGwj{YNl|^ZO9J*^-2?~ zDLz4ta~lS@EF@}i*4ZSccB8E@E2>)Z`F8e~6W}w&>@{28p32}7`9Gtl748S=UN{D+ zuS`M>>fJEN4L1krL~m&)>;>|YmQp0I#OI@NAxcgL)Ooii zIowx(C58x)KGQ`Yx^Z{2(++iho;vv-K1|K`-#2s?;u8vOU&SJ#Z$Np=HpNPnh{xS?JvNM2r@)%)@P zWhq_??q5=30f0W`GT@BEj@_^XuVV(hWWV&N6oBp^zPhl7;-6208TrUSF*MR7ItIAl zIKvI1tMf2NJus~sAq?}+Q)BM2YH(aw!T>J-%EdZgyvyWW9{vcTv^x)^Ul=^?11iBY ze%fLcTvqGp%rtrtPq5G?WiEbfN=*g&?xto~Ke*YDJ=x&yi|pkku^eI1itwsr4;pJJ zJ+12Hm2~H~!kP~i9!j;f-*4RpPifqkF-!Jhq?tj~C@MR}Mk%U-LGvSNGxzmJwtg&X0eJqcp#{$k?%$4CnkY_~uxihBTJ zCnGP*1Wd3YMj37dzwN@h6Ivd^t|gM^DqZuXyG8G>FvShUpIY5@=w4O%-iM?1jjXBzz#meoQk|8vV^^V0iA!xFbz>0^sqh8 zebKaeynHv+t%n`(I3R781>_$SXiL%rlY}7es&$PE}WumGOlix&0_!XgpDvN_o+(w;u2wIs!Bx zPZ^zZbanV*b#Z7c`b4fijDALZ*{~}+2rw;sl1lNXyovL_o+)Y+xE7gjULo!sdG~RJ zjR9iRXrMXrWuYdAH0&vOT|ZWM0w%)i*Qc~+PRafA8aTZmrGrZ?YhABx0!ec{^m?7N-i(nJv}#Nn*T;Migqm#gWJ zosM(rW;27?DvlArawCwPK7u)oj;MJccpBJqZ1|Vl;`+Xqv?{_yJ#=61-uXwg!sWBQ zFW1Bk`J@>6CQl{C`Nr$u+^$*<)vbhA#fkb&7KvAw`SiSD-en+dxBA2xdEl>{bPTL7&rs_On41mBJF5*7a7kL1bXUV!T!5=~+^BC&}pK6+RsD&&F2_vv^KZy0>CzgH%m>el@sw|v2* zah=Io#OT^?V0MrF`x6&vdOqA5Lr+2Vi852ocluBmkvUKrrALaroTahcC`(Yq`V&2W zd@t3TmT=xOf4n|Ob(1~m*DV>B9(V1g>00$mv-5xSUke`au@;5E8+dZT>M>&_pYOgt z&3SCr9$U9!_fXuu$jnU1-hAg5H{1S8Rq6}R!zcq1j8(^(h5IiR{Mr5^#9F=H)b;Z# zjUu+Bp~U@$@%Rm?ALr7&mZ)BVnv!wFso1!Vilw1~>R8E@=A4Zo)Ux0)M<6BuRHOVDnbQ{+Yu2-;ch ztsm{)xsB)VM>iJ1OqK4OzO++uQ2t~N35t`TfEXt0J?Qkuh?UwyWPIF5QiiGHEy+4LD#EK zB3~h%^-3-_M3gooPN41yE9o^^Tc?QDxzQwoV2>uxmN>Ti9rl%^xwnCy;(Sx7_^W4XUaJ>-bkx+j9%hxSG}3Tx-A4#4$U<}T zcY@e2s-*5WshB&D)+y%ZFahX3xe0O13veR}x3SK=C^Ko;hSV+fsZsgKD$)ETwij0j z*iNuu>4Kc?vRnMh_c;fdH_hPf`0w>Bd_K-*XGx%IT-cuOw+`x*WmB(4`j%Hy+#H4B zLDun2612k<>`D;P&cPCV&(%n53z4!Xy!Db8nqKJ9diq()LKeS+I9;yFmaOTKXT8$;W$7M-z(G8Xv_l-oq|P7T&>P?@yxve12A=U3siOA4N>^`$wu+^ zXyiJ@a+7PZx_;Oxd)9hL#_T<$CHd z!>;Rea?AH<9?pjE%`IQWa^W?$!Zp-b7&lyA>PFuq9ZiK)W^!}8_ds7~ zwW8a3sPs9s*0)S$R{E@2{0W)6qP&YkaPWxND!q+Vr}lHXg#9eddY@*^wtbI&2W=vL z+4fOMYx37*b#ttu+v z0Q>rPY}-<^vYJ(KEqv{xmK#p}GPmo^+lXZISK|ye;Z)G?Dj59>gQ=cx|CGDIr5*dN zsKLXx+DH0V)X$ASQwC^Svr_uRemXtIyk^U-)c*lY4#OR;6W;bm10M_yPl+;1t> zs&FV)GeMSmMBP$F9~uja6S#5gP!Nvrrnv72 zuS1bCzUf3{Yi>@Sf$1lgyS;puRc!Yu95$_s1X}ygH#RrKEOvF;*mOID693p+``nJ@ zr$P^vXfzf#*Xh6sMyd^O=OGXZr`Xmrz`f#mLqCevtut(baeKzP@ejsu+gjkWPaX_T$vhg`PKqJFM!B&%w zO`8Qg5B^UZ-ayu|nTxAXob6~XIb-AH) zC!5TZalZkutR#SPe`s@c(&LV+&!03lg4C9ayvTi@dx-_Y$*tYp-xshwE3G-aExokP zlATu{oVSbRJ1V2%yg!M?R2A(vG3_xc!hKk=JMnSMMsa2YT7v#6g{zbAZ9uM!K!vLb z{v0JdUtJ-LY1>*2&Y9Z%2#KTfDzbhWpTzfGnOBFQZhwglhD39dQ*?X< zLP_L)1rYg__FFm&_w>%pXrg~u9DTU@O5Ab`z(e>@ey^B2XRwfG!wYm}ACSb5=F0qfrsU4w(8LAXn|_Dg#EFNL^(N=~dU1JB0=iN@cPCy(l!|jJ$3aMyG6^5d zdX*k}Q6Z>g2PLr3eITF3&a#%Bly~fjc>oQopS^t@yROI(bsTcO@QOKD`W24QF7FUj1%cywJu1t_(yeJD@(rnh*A2NR&J)EE+?1bpvf3<-f-%f7r z%ZERz2hx(Iy`Dj9;BaemOH4@^Xalb3Q0PB|kpi;+q3l2Ew#b&LI~VrP5}@r*EdY-# z`E_KEfO}KFgj!RZ=^BwDIznBE&2PaQp1n<@uH#fUp{Z^GyY3@t#Z;wm;mZ{jClu&4Z&pFxY_S*Y(r{zz`q?E z{#{oTWMAM{;d^;0G@h6B=+Vk;5ekmQMP@x_lGukpptSGPtLfFNqm2#{#`iLEH90rA zy%ukG=6}`ixm?+JW~>9L*;pRM3bfMre)RC~OBgAfU*|%#B5nA8-sJ#hbk^wi=QvLN zxS~IQ?r0zdna;dh!7~nklIU`3_R{e(XPQZKTH@&gWjI{(jsWbyKOA{x@@nxE@5C`) zrpU?nzF$X>?Dn`ETQ7@- zU~#5XYcAKcA9C{E1Th#hoOyw6ox9t3b`L52JM1Xyc8I-AETe#l5p5rpFr%|2tFH?K zuoc3-MHwON1=Xi_SjqW~%0Cux#FBcfvmchn0=GVFn~I;@pIGos@FUxQI7|n4Sry?j z|D|ogoHO3}WW~ERarZk16Zgow^Li91TF?t&x~Ms%GXuIvlatLt0CGp1^;xUffG1)U z+)4!1Fe2rCyqmX$IAX|c`P_G43tB)JS!KFo?OomD3$DU+{s_m9eXVQ&pG3prg`3+)W4_QFGHo}5W5FEdRy22n6o6Q$G-)+404?FU1 z>KR-^Y~AYd3jg~`J!E_L#k4Mm?ORFTkf8O)^5~1D=;GC5h)U;~;oV!cXUkOu$*7Px z9&M8cstu)0qwC4MGV}48Dz=$b&PDz5jr6k1_sByR_INr}EdG3GmFj8Bfz1PcC&>61 zXKN}u=$+gD_*6l~#XpLSA99FFIyQ>Y-L86OiIt#nTkv*jkZRIh&7C~PTTx}q?9UH# z_59CdOW%0?F(5`0{W6Jg6>nazh-DZIg4kw@T!r}jEiYq>{6Ykw$;Ns2oN~EVp+xCN zt8Tv3XbV;KnqJLqdhBe(rI(LuBe6C4ym@YhT)-r-dHUcifo$Rhy8WxEGcSV~FX&NC z5U>yEwEV+RYlMMy6WjK#pNaxSs%g=C;cT^++=2GXb-R}7zNuq#h_c5!)gKtRdd?={ z=B6r2>{dXtQr!u)ce_{ob`t0}5Vy?@TD7Vk!H6v_jLVZe!zz31?Rs86#MlbCQ}Y+W za*z=xb0c}q7+QHZcprf!q^OtFX=kaqp7BlgYkDi9?f8+qF7E87v;GJ=w-}3< zsIMoKVBp^WpCZ>+MXHIWeq%VH1?rF3t-ea;UW3ZloVapG57eu@m>>m!cOlaxo}SCf|lg+3RDL3-liTP;)l zV>+#gomECi<-r{OFvK6y$4iUqyOn-c94bj)m<{#P=q_V!Q%$}Yxq2Z*SUV|~%13Iv zp8LA;Sd02`M^4WordqK!#az^4*S~@sOq&%ah$|xItE?ZQ*?a4Yf_!aqZEU+t4CZ}p z5N|(JB2y`Ku2*gK~h>LO3_E5n}Lib4PUW3oP1x7@0pzG|`Y z%T@ebcR^Fm#`pJ=rB|u$EfeWpEM9K?uL{%WtY1)FB8wlR#UG;=~-b8qa!zmu=O zSzPe!biBEd?)~Pj_;Jk>-X9CjjM-7ownSZQ3RK#I*i^2T^Y zWYtggbT6)_fl{v9$;!%KJq4pFlUv87T$0O5b5=uL48&rD8>Xz1bVP5A?vd@(moTbP zmPg^hFEe}nHzKU@A|!Hh)KKfdylwP17)T7}E)WZm1z8oWk@vCJEBZM^t`+JUmJzAO z=5y_L6vS48YSUAsybxOJvt7ON`_tQ(S*b8^5aKdMe#f=CPq}I}zg_Ha>*anGRzYFB z7-)|h_bJV}%cYU2g{?BAE0(8KJQ&a-#4>)80!iLull@@@o%L#X7kYnERgp9GfJ`6` zb@H5FcVWWGl7w>=+7Dj@dr1 zzWC^_2FH(>UE@o#xbl>RZ%ri~+ZUd17aT}I`4dAA+(h-@`!zQ;0l{h>X2lf9Vx*NH^-j*%m-E`Z^1Dl~A*5AuM*=~bD-QC^N%ssq$ z$}eu2_8fG&Jh^i5r)w0xf;T;o678Z~xJ5%~ma^*nQjAy-kmd5|4^d<1!qUrhSR|2s z+;zi?5#z@pX6PpbbEHg5xNyA;D~DFXnEdV7Q(Q<}(YNgT)#aHqj{yi+so6?OsIz>2 zja;vJVAOAr>bLj$374m`(Nu^-aaF&|&3c}nTl}H@F({E9L^XV0syPChA<8vdc-+&^ z=8(bU;ubZ(p+ieWFS^#bgf06}N)+sej>gy@YHBG*(W=2QALuD7KZ0nEygLpuMw{+J z**Z+8&slP}9}iTOcre{U$D?h>92W75O@IlV<5oT5f8v8Vnx6MTS@vxUPKCBs`EAt)wvfj7#)54lErc^@XX!P=2v`e?W6uPy%5}yUOSKx=Su>WC?ejI?fTet7fFGU=e8Wk&kw-LVqsfO(LAQ?)>=TPE2 z-s!jD`U>?LH?R<-IVINLg!GVckJ_IZLmb<@f(=!QISMm0Ac3l4|Ge#zibz_jp?mC> zcx4zk5Q^tNS&^5gC?NADNc}3s1%9@;>Eo_;kaljH6wF>hFAe2i{V}uZgKmXH!Yf#i zDwgcE;kIKOzbEWuY{jm(e0Y{>(MVmm+7YVJs+nC z<@!T8VrM}4fd;nv*th3zkZg*e-=Qy276|0ihO+F7Z-9K6V44~r8xvG>(4E)W`%A(} z1&_iRyEFJ%vc%ny@p?;kyu-oBafk@X1=0i$ry{o{@N*o1BzoR8>g+TCWptPQc6iTd zR-eF>94$WpSBXptQ`41`XT6xe%Sf$2mT*Y)9QkV$V5Tn#w-2QD`IgB4{L&E2-VZCR zPzQIPT2mP>wuqeG-evyydoBK7od0Q30Ro5+EBJknQhe>Gzs4yn1Ik{<(4;UhMBq}* zHPP;|kM&+eZ~ECtJ5O(q&^RXdK3sQM^jK!w#Ey7*@RMi-dm}p_59C;ZIDnOXS3|yD%=P|0n zX=SI`8_JzuymnI$r;e;s2)s-qz9f;i5ae22Zqji^l86@+0Das7wx*ADSV)OpRjM^K zS$_Vx=%iV&|50s-;r{h2klaR2$woRDJxfXhQwZ$VMFmD~&!D6)wkapWd@*^51M(#+ z^)8LeE`M@bcVguY{X7JvDpk({pKMcBRk89M@h$oN6T*NYj@_}s|3nuKK1keGu|htS z>};xQTH+``d&H20f@jCVO=p8q6TzH*dE1@mkfog6vO6{ZW8P!@mRjZbcfv@d=1q zEC+;G?$q8=GfhwoPMF~JwH+Etyg7#745#4^y7!fPy(MBL<;+{*0sVw+2hZcsv3p0Uu&2-TrSo;z2*0U|x1urbQ9Fk(>`Ks1`+AcxQj zk$F21V9Hp#gKpewSvMSY%Uej#20%f=d%;9$>&l06g`ksyz8#kNB zu8WVK?Be z&?8kc=7BWLRQ+2x->|Ph94MJcDGw>=WemVN8A#LS0RG{dmG_~HJ{i8V=@Fe(X}{r%Y?%hqYR``Ive`@l)lJtvgv{_9^U z9)|6bU##^_y!8aIfLu^+F^RDv{MaV$^~oGLRU5(?R`*k70y~Epv;K9m5Dpb`&J|5F zWybpL9+VKMx<^|2^R8Zfx<$UiX-=@j zVk}fuj?wNe9B${Axz$_bU$YU>BGl|{<*OPV={bkY0&|W#?SnXE|3n_*)FZ7{_2SXX zl9{V>p0BVtuo*j$8U1wb!ty0f z$(G^0P}-n|DUmn04x3I$g2|q?b*}nJsnQ5D=LxC1uL&entQXd8F>sYdLqVfarPkv= zCfyH^Oxc1A?E+e1d-fgF_4;N>B~)QY`z=d(?mvq&c8tOGIYe@cvI@w6XqP=rDoXk2 z+;Z@`oKms{*nYX+R;IS$wuCa{4l%KyJuI26qop3ZRDTnwW?wKq zdH*f4uVuyiT>1z3SNghkHzpDp70&IAg6f+u3EWPUt&oM@bh-13w=*~@$X2%f1*i1j z5K*z|Y(ix{D0&O>S4102Z8siiBhC}f%gNUS=>QA3lh-QrdJXc`Bi4O7NBPhVYikTa z=agA@?TCBhCkbMpBlmHVnuml(rU(V9{E~mQYhHv&-UKkQNMP z!Yw%22&WB!=;}H1GWNUJ`$RKrA~e1;n7bWV2txoRr-;HV6;yYGN2J~Q;#3r|OVK>_ zucN^I_rF|TG&naML(>m#BpGmDnMXr(0S29a1c@IS0f-p|Be?sw6k8wl*MgvewAJos zk3z6Wz`&yn25s_Bvh~QL*n}Ffo!tve@MuM~}`Yd3t}? znBCsml;r;XaBE$2-(fGlRR9_fZr`X2%X}&Da@9M4uQ%w1_}(7&DB=@%Y2_aXHHd>Y z?YRj}{Jfy$VneMlF{(ex&D5qPMwaU8DDFLkePxD=Nd+#H;PB(~S5n<{!Tk+3 zKpb^2PpDjB!hD+$NP z={HR0dq;^|UVDAnp&g8{_D*?s?BLL15ga5Jd5h>3??ViZNdTL1;UV@iPCUq!G9LE`e*wE12+eFxc?j5mC{?w%MO(LB$z~bHoLdI&v8JD__Q>zAR>I>9{2;s{#!L$dgMZMFnL3VgS+9{5U0wG;VU& zWhytk!!aC;s7HK-oaDwA3$f*$%j?$L)kK?Y%zupvO(}-#&1*J}Z%U5hTAgb-)eQxS z{TF~twNBf)r4yGtC@g`HxZ|fN9vZcGd))}5!BnlZA}T@AfVT>jlUay0`=-8;gzY?U zB}^#Y3DKVde%dm#SXT*7$$i5R;#AuxXcS?qGJ$~^aui5_awi&{rNSX0H8Q}aRY6tksg=xMmc_sC->otQg{sWT!b22^_va&@diVPuMhth5;C%;U( z<5tR(M|Bh1iA9DC@|9Ut2l&*(*f23RP)>URA#z3i?mDH+CSX=t+8qAW;l);xrKo~m z;7{y>#Xoh~11_W^@T`M{B}K-uvDQ~Is5Obb3< zVL)MF3cxxKZI{O$gDKFXDUtm?lThVUgIJ`P*`9Le2QZub#4{cwSCj#62~ZD7+A&kz zbdYm8K(4=-A0EkIK!A#7ntAJR&y=0zBZ5y(PJsiHhg^2XlUUz*^ z2p(6v9#U}|^I(2Jq=GM3Ni|mUql4|vGAXEc(H^BhO$OqP+-x>tLUFC0j;R*CY55wtM;o zVY{eq)41JpB04t5_@X^#GI-anXm+x@{`&bc4EKP|E3Q!gvCf)i6+uDgJI zpFc&wYoNI+k>dH~gM8b>NI%EU`MI!`18w!NxIngPO>E!teJimEdzv*_uPaLL6iOzj zioZ%;0G-BvPaxJSufEW^Ck+o4VQB|)xDh4{9@v3)f(Df)(h5- z$A@J9AO5Q?C^gT2&|#oYUY?k|f8f}wt5!)anim-RL}%d}>6(y2>nM?;y7_$pe7h~D zgh{OrRKMIsI}d~11yq;O!6nqMlmbO_ZwuAKZi)MJoE^G1hMB~(t&f4v> z{}RLS3CUNsxPWeqtzyVLKa^NSvb@kX9gnb-l@AGMT9xKQ#QK=Ne*mB6yf$3py~S@A zRL-AE+y_B{S#RNJyh9GiPPMcu>LQF$MX_dzOZJ|@&|KD@d*y*FHi6DraFSBSK7=X8 zNG!bf?of9plmeho%C)N3a&me;CONjdx>9}1WNM8M^)$jXiG&6Y@T~>1Q`w-}PJynV?#pN6E^~+D$oH z?Svq>DK}ndS!1D&^>Q5K0_t+;A##T4UYKoV3=WA4cVGk)S9aTcI9Thri{0m5V%w6b z{n~y2tsvnufwa!uiO&V;gYU{)n@xZIFg`S`urj^#jWWSY2nybQEhGlYNP%*zUH<+C zkvpeOc2onx5{|$UH!$;#k{eCsJv-%;E^MkcSk(w$OaDzfXwb{m=CIT#)LdCHPI^3| zb}aIo8PfBv2}ntSCfuri6hIj1>y2Zmy$~j;Vu9e6fM}YukN0+(d6<{2b|6+!$^Pu7 z9;Cr|<-TwMP+V87kApT+D9!J@o3RIAk)# zas#HkUS|f5tFedZ6{&UkyEvTtSn+)()DW;jF-Db6uyB$roH|i)rVuJmYIAIG5!5au z=#HZIVtt&cvAG2)v$4NjQ~k7qWL=HTM`;D)Yqd#`!+oU*Zh7}2XrP2Z%t>tAa=k5MrYL&ej+F}*)S%+W$3{(_*G8Fj zf7uks9#{id;W3Hrc?jukvan6JOjP;jV)k-ka&Ae&g4S*b3nVBA4ydH|*Om0r-)|}~ zDhhQ1!VUh4#_DvMGgYJKd?6yh6}`s&tC0>Adl=M-Lgm~Ye-~iwKnu$)dE?tnb3LH= z`p~y7zXGj+oQF^f#|-X(HKpjZ?kfjH|1pG~*Fdy5PAzgvQ@+K0!o6#U8owD92y}S@ zLHpg~avVs@?siL$!g8{_md2OG2|P?TH|+8EgR7D+PW`nsl{l2MX~(s^X>CdaqrV42 z&CJ3wTX}9}o9TKmrUZ+y{bjuaPD28HJ)BR7mXB4$`+Dl6WdI;mf4(}0C`472>C~!c z&b~Lo!ZH==ajDOsQfcfAOrnM=ASg6`jJUHlC1P7qU0`ARk$|Y*FA==;peQp5!4Q*y z*h8Zdp3`vtHrC7CGVNiRP}8!6cqARt%u}VlC!yQp7S03eyYovnzPx7i>19ZQ*^?-v z+{+#5iKYH=#s4V7Ee@m#^BEvEP>^%4%4l~0TAg{BHGv=Nv7 zW{(DdT_wF1`YpI-$2}nX68c4jwyXuFnCHj05`);UdDL%;rNj?=8W?MF{viZ0-z=>t zp*3{hib8}3v~!AVeD^QKij^7wJ}f6GC`l3D1fLmbKt9 znkBllY_yxD4;<@?P4RV(Y*wzA5iImbL<(AYj^FHafrgx`vZR^T5dqUdlf;BWf34_N zl6cDM8{}cO$ios#3lL>lC}KMS;4kvU@%T~8y4 z2m#CHoIKLw{q`(7A$>n9IK$JlCy$>5AOQZ(|O15`(jT--e`tKlTb(Q$~A>yMrvDKj1b* zaLg&}7#A7rA=Fb(HPsC&5gXrvRhiZ_gYvM@iiYZP8L4ysqQWz(HRrE05THv5RomI# zO81;_;_gfVLpI-&#!5}HaE@|V3$|;s1R!|u{Po#;74;?t1UE$8sm{HZ?RrhroG8m1 ze$&sBdz@|mk~XCvVc&oFOGb*V^eyl$;w~Lj2Hm2TJJA&fE`%Y^vPm@r{CJol>{m@y ztjHt(>;vE7Aj|c_LIdMGgV4gn5=56)fG;_a@=<5gr=%03wrG;VzuWNqs|+s&^YR_t zvmOTc{~~mqq1xWVy*7r9MPn)<%%c_Mzz9v-;7wMPyw9ri^7y8I!7U2{7%!qf_m=}E zP({!pg1r(SwB+7TO{`4cT~3PVop&vG0HZpkK~;RbspFKpJv*cC1k#1$hxPh!5N#y9 zyXr1-8W>R;2id&F*yVkIZJeVdH{oEC#dbxA`XG1x*2O2^V^w0|ai!8vrGYQU?n}b> zK+i8p8j;^_dmX0~>@y^fQ6u}y&k4N-?R(6l1Zt*l6E0zdLNesq1(CHo_U_+y8(TYx zd{>z35gn0ODBc%+A6vWhxGoa@vpQIOe`!_|wG>!?{_8OQQrdc#4Ar|#X04^(rUuh7 zKO_~^C^wXDaq5c7Vn!2q7zg-Qyo71x(zZXPddz*=K6tvTb_vlB-h_`^ zNt;%(O_teW!XWgAZe!yE-PF|Fl=>10_yk6PQ- zMGO$vU@|^b+(p(H=kcyZ9pg*tM}I&`JPz7|68>m!XK+J(Y@Jg`)j@k&;*S6Q_N604 z?zlnxoAbr@Y<~?UvOya%@QtlRcH%ZYeOo>FV=s!{ulTvj`R6mCwfD(#B5&rW%`1D| zD#2@8fR#`7LyCg&>U$rLnj{)%SB4-{t7F?&nx$M-(D=D6yc#Ty^1w$=pCNq2%I`rE z!nj1V_qK`rWI>{Nn@WcXH-o@g<5Ms*CF$38sGHV2e0=ZVK+fynFS!mf4t;O!NflY- zJpDaI+}v6Ta$Q(J&2*heg^tmA)OtyG+!y+SU~6G|agZjuxZBdUpjX(P*Qv;BiW9%= z5g3-v=$~zxj;gBL0$wm}gZT|^(;`w= z_I;Ow;LE2_I;U#UW87mC$6Pz%v=;v93bt>o9+&IF=lOlyL!(wBPfkXN2(nN;mX^Dk zd$At~1+~@X5_hswPr7f?-`9$~RCZ4|ji;@M9|e`;sPGlO0#h~Vfv}7^K%GfLP~r|N z1P%$xzOl1>nP~W;bre`{t6@X4MT@J zdGX#udpBRxtcr@Uz_z)&RA#&VU)2A~mLo_3C4)#Ag{^5QG?3ryTK#$5T(Pv}XT#@p zhXA4d8VVy=iWYJeg+n|tpH~k8AD>PtGE<3llre@}m$d?sm4#oC%0E?4NE*JBv;TrM zGbz+PWtkoo5@MsjhA8fjw{VBb9Do0qewpKW9u%NO7Sx`kiR{f$UVL0^)O#)OQ$WcU z)F&7-jxxImmWDqtQi=Ki`oOgEt&0?+pH>%%SR}r{i3ecMAi=4`aRghLIVYu#T(+LV z!afsGw5RKg`fK+M-;3H0M_(~*Q^H_`IQNPQUX%OMo3msQd4PKLT?VX#SKps#s36u! zAf)+~IA#58BYgB(`J=+1h(+DoMZ&Rr7

eB*-kI6P0#h{!E?j7JnF&|8<7e;~??>z9axbIWt?LA^*SW*BhydR%rm1&}tkN0)EbeNpMsA@G5 z8Bk{-ae|7=Ff?40g(%3A-ok?}yfSKk_~ZWb3h++7HvX;EF;rYVGg};--}v{Q2OuP)45$Z3oOv9|V5)1!E`{tjU##~@viJzmAA@6#R^;{- z_IzOPqD8D<9^6HkH>?KZhIBZp5uTHkwzzoeh}g6}mNHXvRWmzdb72aYuj}WBhahyw zH#%5vOu)DIDU+*Ld)aqy&;64qg$hAnY&r%G#)6r@s8F}F3=!FuJcwhFr;FKE9z%#( zEfu5M@~Tqt99ia|CmHt8f)AV$cQr$oi~B2V8{G<|xtIXF01<`&mk2R;*uED4jk|;; z`((KLtz+R9QS)L;*=Rwl;%=F(ByAjW4)Ao|7bbxAa7ONGwwV)!fr%QZ>zVd;zq2vA z&s$CcaGzfig@I7je4;?rE}msMi{O6Z66ah|g46hrggsg2o>YxX-}~W+Q&8*h6!tWs zo^r(Nyo51)^Vm^7WdEQ7Qr(~u9R*tm?32O-u}(Hc8q+PcP$h;3LD}u?%z)yCi|~Jz zWoQV&EnaQAE3}@?6%noSg&7d|6_7pCcLInw7CTnI4`Lh{Fvlp@81VBJC@!S`L{!1F zUBwE6nl1pYgW_P~Z#0k5;m^@ZP7Rqi0%(IU?)N>=2vjRM@BeGm3b@vv*8g@7p&TJi(UnL zo$N!OB3u;>1kT^iNzh`S&8UskxjSJ*iiFQ!Y9v>lj=;=I!CjiMAP;yagj`Q(aa3M-0buFgv91ouqrZ@~8)EnL z&V4f!oV&uinVUs@n%qhR!!(kzVHu2U!f27k!hkq?pBgB!KR~HsdhD?`n0Hyu>MvVU z-LT_BEmt-@LmiL4*83UmljliC82xz=U18XhU-6zFiK#sYXf zNeKYGj`qMcNi4hY;z82fIA=E1~mC^;nX`RTc`O(RJpt#@Trg+in-vQi0Ra$8Bw5uD)ZV+i#(>p;0A z+quxX1hN4DL)D(2s^TYp-g-T>Eirq2^ROizHo*Z zXbO}MH+^q?c`qX0-=Y*1qXTK{_tkqiP{?>ml&#$+LpQV$8LAZxm(8PEVJPfs1$@6F znqqO>g1lC(D8#EunM&&FD~A9UEb&H-BUacpSIEUQwy70H56aFB)e4dxL^(Va$2V=o zr$O|+stco1_Z$9eF%Z~WXu^Vu$J=#SzKh0V3-xE?m{9f*UqfM>l(}z+te%78*>7vI z2or$vGx3QA5T^9tjC!{AD5oUe2;P$ak!gp6K)NbsQ14rB!-s<}9I)dN1p@(tv7SBQ zo2@b6bd-mBCpkKi*C21xN7SXK?L6tO%6nT8<%n3}ub}WabyMR`aDLFS|=IO4*P7^x}r-Q!2DnVU05h!r9%uGZ)WH4E6DF8Ta!k zeT(%ZXx>Wr2n4Gt19X*o2Gi`ct}zTdvkTNGWwmh_%g=K!_%zmo6@4!ahDIe%7l+-d z{D6P+8kZ0oAjeh6RuXHG%R#h6ATz-bR$kCQs?67qVv;Tv9p6L_Z zVJi1<5$i0Op-durKRfv@T6}-kJy?GBs#e>qS6+tyv^!2=GYh%@)To-$wQ_{C+v+ zeMHE`xb#;N(Ie5rGRASb1~F&pQI-`(J88p^sZ44vIP?nOB2sh~)kXb@;0*RH)Qt-u z0d7ciSVVzwF;&Owl`k5rjBZ@g!~5P4T(hVRAR`EX;=o$<(y{_`rxG?r1Y z^db)c?EqG3hB3!BeWx!%I_(39vSEqXc2pY=(1-UspI@Crh&58zlJ?Wp)j#JaO6$g! z<+63EaFp%RV1DS1?ioMrt1uR?>bDUe;}c_usPJVcCv4ugk(Vl+XbK9}W)F>-0W}ER z-p|o`%?tM;^;ZS2G>bp;#h3#zcjViAow~ko(V4;1PP#mA@hq(GG<1zhEl54EBbP(c z4GvfcljEycUdkN5cQ8#cWGu35#%fpx20%o22vn(WFgYq~#0X(xev%rEe=5Zgy0||l z7DvV&K?lP@`)zaB8SJV8`iakx;4*IBiMMF+MgJxb2*4TR$G7(NQI~QP;hEuSIsNq7 z$c?D*c2Xo_|R7MJM$+86uz{j<~3ibPt}IWmuT{V(pvv{FN(nDh|M$AMhaU zK$rgd-kSN+QaHoPaOx79+rI9*KksNz_9Zz>{4A*(Q8`(V=F5FG2bgD>z{R+}u}D#F zYAG$_T`w0+VtS}IxaV2GHb(KITeOdLmF8vN>f57XLvt;dn!HXkgwcY9T@&`Q6oD`H z+Dh};R=Xw{SRP)C`LR!T*H@>2ShcNZxOleSd2lfH&Vv+>jhj*p!%F!n1zqL7`6{Vd zyOIoSh&1@SrE)9Q*I6|=b8zP2GUZ-p7EK^%v9gjBL{@WxEsn7MdX;YTu2oJo?O~hG zrK_!vLrGSL=MEN$rO9~rudEiI89C#*$ac1&+H297Rqb}9U(3APdZ$i9s*W+iYyCyS z);Z#_dD92flkfa)D_%=anc!q-TVC<1^wYwuIblB9xMrt>45T!Pv=;0Y$hnc3TJ$c% zL=or9@?liwH|#hLlB4`?{jpa{Z`Mk;AvJHeSMK?5Ly4DKdmZg<3Ex(giH;a={T_~I zm-;zeBGyS%)m_{UQ8JGx+{xT!`Xye&tbGOx`Bya)+f`96X;VXCmh+~WP4Iw%U>kn! zviQsn8sSeCZxcOhN))wU#F4f167C!=gwS8Ekwwf8q&4B+ZlV5OW%qB@d-@hSyy0u65cdM~Ebp-d`?ZmPt zZy{4Gi2T?s19-F*GxY{VU|H->P)=d15jn+6Z<`u->B3yO0X_bQH?7Wf#@8Y9>bBm8 z4H%$9K~tOZ*B1$yiBFAi8U6IWG7o{-rFC(l$~C(eahLM3FRA| z6D-b>tt5AUOP*pT491W8F&I6_&s`Aw*>mhsfB6rh&_=ov&NuM7Wac&$>-FiwMJ{h? zDg0%!zN2d=rQT9j-4-QmSw+PkDprL=x6#Sm1?Ra7z61_8^%Gwt{3u|dqBQkb{OaBv zEuo3d_Z4Ij)mJ5NWSJIybu+sTZwznmQ?xP0lnJ2)GJ`24)n0n!P0AZ?Qhp#c@53dE z&zFrY`=ny^%H`>@zwlsMjUg-ZDbX12x2eCJr>^M*HKl-j7K^&|elXMw`OW84TrDXg zL4$m-l2*Vyv*)&A8#@>+ualxKl~$wrIOitKN6QqCf^0X|SJEakF*+QS&@{O4f7vQV zAE!@IHF!=^uUQQG&BxHj0loJ=W7On=oJwq$BHDbhC3hq$;bdR=b$S#2L-lGytLi{o zEt&OI&DxJIZ`_i$%N%iUjq&kr&n}NzG(FQDnXr#ssmtR-0def+E@nEQ29(}z5#Oeq z#uGsMh!0|={uV2|SG^jo!%0ivtn%GmhA-!tm@Gd8Y;?on$_DG_6OYJhybosCPjJAd z9ib*H+@Mu&L;}Mr>1~2iQnxDq%XMup5vlLq3FQ5Cam;ssRN0$sVTo?Swr1H?D5A1; z+^19E)56y;->vW(68+^X$llv+DZAwh5h{gk#{O^ zBv1ekPf7*tj|^!%*Tdl=50}my@rXhV3vucGISx_$up;i2^($+}^lW7${ z>93jk6eQjMkuu&=rZxq5>7vQ~jo)G0j6#k&HHN&C6; z>#>{`mix=ShEtzeb+h_M>MVKFrdnx;Zo9IT#D}x63QuUj(`V&xf2=YfhhItx@24mp z9umL3mtnD)O-?NqZj7hc`r5zORqIArXq8)74i;TxQ)5*a>KGOL`J-O8&zMT4D*H8Q z@-|^j_bxmq+x#lr^$G=oum=P|T5;m_YUxa0qc`m+XLKhVp(oDsI=dS0VfUscYx?!O zs@Tx-(TIf5v5-zmHl7-v3)C~ZtyuLCuK(5@VHZDj&BJi_CS*`1h=NajhMm0ch3XNT zBkDXSdFf4?%-*N9uP2Vjf?D@+nApRx3v^=JSsR;_k4T92HU~k@cZfw_1z^h@xQOn9%j8V^$(C}Yn{3@)FdrG9L%=VcYl$%k!fK5B$i(|r#G#8@Yybk*i*_oV06gnD}5c*y9h{I*N zRIA*dkXkbHE2ahUmE|rbLV8Ch8?{ze&D;M-K;r(v2|6lR`a~7sH^k8-UZZ zC#lH`ks&XP>Fu+DpetjA-C6w$-Cf3K$vnj#09eGlE8-Y8{IBiP+tw3Aw&=8#84iNL$H6dOdA5)BXUP+W~ zh1c`o?-R;LlaiEYdp>K0`be2KSX`F1qN&xcv2c2+3L945cC?0nD!N1a|JwV~uqLl> z-xm?7B2a1-5Fss8Xr&M}Dk?*$fV35)RsoSo85M-62mwM896xnbh(g4|Yvc-8qAe~TgC{3edGFZz6ss7f!Y67Qj$%JlH}G=TL?i+>@UrqS(};H3 z_#z*AE$p0|%RN?C;)$G^{PQ{0fe_9VfsaBp?*hKTHJ0zugei6>`Bua>4fSUBYIOMk zkXZ*-apV3Oqo61IdaAHY_cEi$Ij^V!NIM;?thr6s7wZrJV8;K4`{80N$fby(` zhV}gC_ONc)ouf?BrM4brb`eLh!e%K=GSjL0JqW(HVu@!ieuj2~qrKygfJI)@7QuA< z@~?bbT_tHQWjc;8kC-wM_z!P`dr*BjOvgGBM)o{qcEbj4LO{~vRlnKFFH)i1Utdh! z!h8kv#>=u>zz97kXj{M%f51~QpC@Z*EOJ!56?n(>>hLm20ndwTu%}^?grssVT*FlQ zn)_DNpg!cvK7Q8^Cwf(IYcbn&Odnnx8Fj21!l8-M`{OwhSjcej1Mpm_NpJX3{tKbP zxQw=G^wL9B-$nfqr3^WF0apTdBJNpymbiT0en?(zOH zpL5PtX0gi^oBUIcB7L^EuRDn}0^g|K1SgM_u#Du(&vm6~LzsOmyeAvsUNVh1vf=5L z(<2&x6!dgN!UE||sR@Z1p6a4^@SLxOU@U{)R{I%Z^&56*p&9F=oc^loq_p@J?>B|@ zoLOCdIOta5ZBZT9vP<%P6M;W7_^k?~sH|x8?wSw&xOHs$u+)0d=bWYOB=Gs)meeRT zrow+1KzDMaqiLdGO^+`*0kYQ#;4o_ei)cOmy70GH$z#rtrf5*pgU7{0xBi%c!3*zK z>$2<2bF9&8kEjwMgQxo>c*|B_8I!n@)$sK$H9qrKMtig@U&}c|3ov; z<>IeBD1^@j)G^krb)p|cbl+;DA&NBT)^*koXrawZqoHgxTlwD~#>%ZGm~~ygan=14 z43W*+_`ToV*OR2Q9bN#gi;l-IhO`7PncyuN;2YcNKLCWoTFw+Rduz&m2liVsOquKE zUH-&fRN?(L!P<+GPT|>c3DWytTG1lza$sw>#p+eNC?qqa)47fxt+_hYNnB}h%+w!F z+mZ3TpEyJWz|`Y+4c0LpWuw%66BF5xhvKb-iYLlCaNj_E4`1n@{brh<9qD3E{@##x zA?(HKuyt`1;IQq%8*156;42R^gl2oIZd&YYU($=RxS+FBCTJNQcfKlL?2aN;q2}+Y zIS7%6-PPk2fm_XY{ATpH{B%v&{FnthE7NY98;l;&+oSs3^kS3cZJit#lAQ|COFsrv(yL(v^(k^2p)nE43l~JO%eX_&y zT)^!WUP>?ARTz=hC#h#4H0`lB>5=_@b(eI+RIxZiwU=SMhJm>JIWm-k=I4OxS>m!xKbr`m_+$J?cm*=|SkP zS3&mpb)4wb3lZzCh`tlZnu>E~554Hu`)ZBv7*~MT)g5hyIX2ssmOoyjEmF@F`YR!9 z=t{l^F|1N@FyqAA_UhihS|5k$S{@JjJlaYeiW(#nH!=qU6o8zZ{ILH^FjMjC9@5zg z4_??Mf%@2XlPY*dRnaGRQYODlv_VpSwiOffogu3Zs63&{;;Z<1z=EBw02i3U0Zz2% z{QJa=M1bK{A!%QeeQhSUUBhI?Ef&oZ`+G&y)$9gFviw28D6*_RoLIiXmrj=A=06zA zFSkVcyVvm-s(3}P)pu~4GZ%R&b*R$~QOvHncc^?*K;pvbP8k9L>;8bUR!s(&zt028 z_mERE;Ht-}(anlzEBg>zDkctDET59klx}o6=I#MpSyyj4`P^AwHfEv#V?6kYt2SixNEH*qD$|-q^8MO5uA~Q%uW| zU18_D7Pc1GGB08H24kg9st17kcR3L~=X2$f^#H!`?cxw2`F_SC6)g2tS3}!pz*BnX zNsWRG51*qaukb9f(+i=!XS|t*XDu%75OZEs^)xF92h-rRs8_i2*#f-{2{wxY57o`4 z)T=Euvn5whYrm7xj+NV-O_zZo_|kB1hP$E-9^P3Im3!B)Cy{8tP6`2AQ;>=mGSS4f zg7Odx0M3_yBQo!nX(6=0meJsDUiC0@m#C+KBe6*FW>VSGpj6CkTyW1d_c}slJ0+4D zDM(Q^?J2Vy#+|MJN%-uIM3YGk+i7V7Sodk`r<#r;=w;aZZCSXVlo zxj4c(3Y|9qbU95=chBOz#AQE>>125nLxWX3Wc{Q|g2YcCb28x{h_-Kj$Suu+0cm#{ zAR?qLJUueEjJmNL7r-}IX{qec_FkaOCmZ(%(wK9fBnM>Uoy2}k=e_u*H+r-yD>WE( zU6D2!0I1{u>i|D^Y&)gtn!x-tdHR^Um*q&W;7c#-Kp*Msd>%(;a)W`#_PlD}D0}UX zo*-G2`OW3%#|8KDZ?lj!Ks7KRq^f-+E$E5Mu*NG5fCaoe;=~NkL0{{C;#Lp;AeKNx z^r7P39M#@+@j7iKpJBbfiNyIzg|(td#0}ui-_!Jsn=Vpj2Khdd$Q!3ji@oZr4#^hY z$b04@4HbXae#8|7tpL^8%-0k@iAvc9LhfL?QwTr1PyR7+ITsj#d1v_g_@0cvm=Kg5 zcxmOi*^T$w-bg|HCnDgIMx$NAs6Phhcw-L> zrPL5^<1=Ty17Ub+Xy=nB6tkU@=1I7xwIl%@c5z8o+*77^xH><0Im?|qKF10BshebT zb-tYl_oh;&HN8UH%irp)W)<%syBByGhs`uPEA`UPvGm=&BO%9^Id{voVQ4OqL3y;>Hy zh4RM?)k-pz8;e_}Fbw2b!N~VGoqPo%cE&D}9=m5VZM14aQg`9rx*nIFM2?yA{^mri zaKtZ`WVZHXW=T{$&+nEcq`I#@?t}G7f~Ay|7#(B(L$X1e=R9kpf6$YcqtbYh{!n$y z^0fp5=28L;(^+k&aj1U$;Z&^{kG%9@3)(EY{z7s028%EQ+}Q`x-6#0VuN>ZMTdgLE z;nq>q;O!r`Xw6!L-D45WSkWv#Mf|Je+-j$MQ7sKF`|@z`i6C0<07{p~^(0S|*_OdY z(%m-rMHe}BhIi}OlLfU`mre0Cm|NoRr0s}@Mcq<-2v7kU6&pKmE4;l<5&uAM6*gj$ zZ-5qa3J7V3%<_}WK`!T`ZE-98XH0B&Z41GQdU+z#2XnRkz_y7u#QO2V_vMr@uf^9U ze*K?{Ymww}?aWU6r_hdWSb`e7F`#8@FSGU>0d;CKlNcAMGXD zC1buGF&(Ao16Fld-^bRJ5J{f8UL8%gKUn_(B_%st;qsTKv}uElC-zGG=}s@6Ul*M! zox(1?E~u)q(1_om7<1V8^`g4t*1V+_t;@%&rPqtJCP;M$qVeNt@9WAuN#U~%lk`jT zozmr|j>Qe;t91OSoRbu|rRa^vYnF7Gx8I^%I;Blrq}!nWxLhMqK4!pfjN&$iO*SUZ z;IN~MX{E9{R7bc+7lyBVtah^%;-&Kx6?M$OyYWjHtp0rW@Pt`zLm1CD(DfL>bje2; z0y2Ll4*WFxW>W7`hsR^eFVHwhzV1E;pvU@v!cswA%)U7yqVb*PTC!98E2bVj@>j+OFpejpdMAFaMm!&qP*mEqhGg>5=TryoBn~7z>nK^48RRP&;Tf3ufBt}l`(Ddwc1G34j?|>NnsH83|f99OTgc#CmuHDFI z;#qO6jdl3Bho;7Hts8ELEMs9qtK`WYmS0-(DZ?*0Vf-H=P>opWpv`hyDz^yDB=Gx} zXW>>OPfz+ThXVA#JZM?~Jzrv|l1 zeb=1T4XoY0^5vXg#sZ^4(0w*DPcnHrC1GrvtDUAkSE7XxT^m_KnS4+_hS9!<-XGRh z3~EjAXvPdpIi#*pbgh6uSb5~iT}viCt!(;|)RW@D#U20qHqU!Ix$ZnYxr@RZh2!ev zeDlTt*oYt4pz#dDG@;F9rz-S8VsxT7ZK$&~60BOIrQ0soYgADl1X};xGm>>!WcPEvyUtXSi&hV`r zJ(lKcxm$+Wf6i>whCH(~-$2Y{$j3G^>tQys22}a#!d3}WGu3Bt%SI*k+>pa&@@x!A-6`x@bmS&d!NKL0#{;v$!WD}PT$ zw&0>cK$s~P6OnbJW%K-m+V%YWtmxHW*voV_a&mkU-HJO6(oSZ0sf(P24`z>=N$P)V zXEdIim5lV~Tgh*hrO(AvjE^W*4myI9^{i|}vb_AmS!s1+SSv@bqHzPJW zOYql86Ty!Ou%W#uE|DVgcd=2VAGTv|_M~L!_G^MXNvu6Nu9BaS$v-U;(j?6%j~P>8 zXKdJ5!9b*)FKM*#T6lf>47#l0!Z1@lmm#}Mg$;hw2#mD z;(m^~I{mm;T1ShS8Syno%}sv9rCJ5$9g%w@+18fJon=TL5DQlTZe&wEJ>9ZpImrTQ zOns#v|5(?H3ear9!Cir+iHTK?)S;S1Cc;h>w1HnoC*dzO-5_kHioXQ!xIF&(jY)S! zvshg(K_)cvjb6wl$~$M8oHJV|bTZC$`Y;dkWhrW~=zuX4bv5~o$rs#m8Urc#0FMjq z2$!6D4kjlR!`O&E(JP}&AFNO}!KL;D(xvn?g$ov&pWK8N+ij~Xc~*+#mr3TW^|XKX zs+{hIBgbC09rT;16vG3N;YN}VKaL4yi*xWkQKIV! zB8$eqkIb>+2&-3CdQ9buj>@Vo8GEff+(>w|u!G?>M#h7WD36-*M01`^*B>|b)*`(%#1j^ zpnY8tu1e?bt=zzD9B6H~L7N_mX2=eiMe|q1y^huwEo?T#w^t&ql%}p26*G}KT9fxy zDu=CqYZ=C-NenRb>YwCerKp2qGgK`1g9&kI=yOcFi=do!Sah4H5jQrY*K3YjZ7VhV z@qzvX=aYg(ufR~)u@9)2PbgrGebzIGh;QC+y&R(}Yhl!(l@%^_Ci6Qih_19~=c_X(`HTVU>;NK2QLz-QHN8 zP(^mh3(F1Dqh9_Zm~~IaUv>Jx&-ne;djrI$o8lBiP!RF)(PnnZbY_I(s8DHlTL7#? z$=2Rpk$4_TT>g~vo1^P2y5O1wL*!=t3|~5DqKmOY@Dhd5uQD5Y8*OJoo$-yw+Q~NV~(17{nmxQQ3?XPsX2%Sv;W^J%lpoP%p z2+f)>*WK3hwFIerIDY=81gemu4ZAD^=S5v!SR|tRK#`tb_$SzqkYY!$s=fHhjv%|T zs4x0?2YFh!a>JCU`{VMF8>Q+jqZ!jO{A5;|{^hrY@PkW=29D;nPJtj!!cKx2Gmf$9 z000$taj^rvuNrn&J;Hc9*)f@u;7*KL)&(4{tBPSIeR@ERQM#!7%Dr`-o81Mftxos9d@z)^7orOXKV6gjzpWg zHv-!<+IpZ|_cTq)QaN@&5&B_L2h1MnPdU9)tnEXRRHXFLLybcV z@80AOfx?S9qSsOMMnTrXN8yL=vQR1O`To)wz)7+q-~N;!Yp*V}hT8~KNF`)k3z(vn z;V92q_$Jr0XY)m!Mie0MV_)@p)^cAY-1oO$6UpH*hlCy2rO!Ets6oy0xc=z`2m7J@ z;7wKh-m<~n;=Da=;|Gg@?NN~{6SI?4pbbdgLTOnzjc*?GWpQWE1~%t_(IQIbXomiy9Q_i zTp3*7Ptlg-6nc5hv0namI4J15nO`J=HmOpVLnZQCrL$g#`Ok~A+(_=2M7nTGsKqnt zFr|5|pQOB>)9c+v(OzvVJUx`2aohR%Fw^0L(ytGs=e~l*dNQ4 zytz5vY%s7?(n8(FN(_8C@?=H*Fy)*|a>j~}{c7&~9_Z?I&JAm*ARvHFS2Y?XGpV4u z^p~PT$Um3!HKIcFd{&L6XB^G{C^J)#64#hupk_Yl;vRw;9qmlf2plJqZWn!x)ZUr^I;zhpOm-i7p%m zg`7$A^4dL!48h4jkr%3PuYl8KP{-3j zRM`Q!8#W%?T;$_B=i?U!WFd?zgB_5 z5Q_D@2Qfh+><-H76ZfAx?#E|((m)j|wU$yA3WUv4lXW2O#an#wcpwxncSIIZl$ zR6e0OFc~ORhg<_-)k?N^0s7`_*Me}TTdD|0{|Dg)agbt z>2XPA{xf0~zPjGxXK!6C;(>h7;b$y?)S<&~-^Gd4{1|G*Ac6C@Lg5EZEt{P!SJ7+qCdi?J6gf(#I<`??O-gBPVXTreqW@fI1}F_Wy2plFFYAZ77PHroQP{ zwS&6mkD8Z=bG|0?zl(-fD&E5l5pl!{j89LcmEQmF>E&)P94#&e3##!BVI!mumwdMw zy1PeVu^{;XLr%PZOaDO&C_$T?b{ed252S08q?9A}wgO;eNZl@YiG3Pk1pV=Zqx>E8 zBRH(dUD3_fdPGI_+*|siGr-_V2ByiudpD&~1}G22?nkk4^pEYH8qlqFn>nR;Luat^ z3li(kjuUg=#=TF^Sbqy-@Baf)RY3CtFd$Y9zZY2k{O4`e%C8bR%I46IPlmBB*F}a3 z(A$I9*>fPsxC#f1R1L>G^>Yr$426kzTMTT%e6z@`3IVMv zAy|;M3CUl~Y5UP@B0VEUYhL#kONiqsY*L4ueg}zDE1MZ@H|~8!2jp6Bl3pA`PG6>3a~@qoDMsoEtwuQ=6`fvO)LXmJcoG{t$@0^~l;3HfR|uA+}?T zi=#oeDY*3fAHr*!p{uE#n^+_?c(|hRu>%dSS%WmN-jZL(_yQP~~gi9JWpYZ4Lmb zeyRa#^r-n1!wA@l@|iOSdfV1!b6N>{JC*ex!esay${NB~)R^{agYwF8V5Yr2qlILcI zW#3jS+e!jp=@2xg;06)7HX#!nviW*`3d_1mG%oH}3c4b1=_&L2A5-9OZzOEs`g(%# zez$T+DZcC>)^;7_)U}3Xv2)-%=&En&r(zOISe8!}NMgaS`(2>s%k{Z1INNw2n!%$C z6C+c9E>>>|b`x|^_f~+@regb5k3hCJ6rLc?e$~M~EA7)Y(7_A3)pEQ@8wD!-ojvAO z(F|Ni5RLacctCH*%^_VaUr(%@qxVgnHl*_a3$2Gv?YnZVTW%n5bAaG~fxI zivTwQHg;X)>DWu#Ygl#$+#J(3_!X4=06V7y?fdXf#Z7K#cn^h-Y{KNC864{dTvU9< zKk5Pj zsd*lX4=@@FI_gd#_K5GUDgQtC+!{_*Vo;6>Lb_{au|Fk6DgL(~B(@u%sqYk!V>x5W zVuWJ%H%VlhQLw{)zG&o}P~An>z`&+D!&*~aQ{PSRUd{n)2T3I{3}$maI(lmOX3p)9 znx8U1vtrO%9*EFZI7^sDVu#)`-F);1co6{Hk9gRWz zS*NVKwmSqv@(nBKiFoR}4zShJ*y4Vrr)q()Y6xsb5L>WTRaKocuCOk-aEBhio$qk% zNH^JbS|@McP7rQxRvCfR`w@Mxdx--ErYi}d6vbT{vJ2W7B#fHDT2e`fL=%CMU=KcMGZE=2_%{?x6z3l+XzkKi%_oLzSd^gQe zFb4l^xYFQB(O|#Z!lz1e!?L^L5Mf{&1%mVqC6Ef#N7!>sJbRS7G-xEpF`HrP(3xVJ zbtbhbWjQeK{p?X&Ds!^N;%KvLF`tO_&zxNcsepbe+XNlmm4(KFgqh&m56mGabGw=| zjK?`=7qI0P`>zf#t7eKm`Fl%~w>PR43%FVNrjCBqmQ zUey_)>KFWux2^zsRlnmADD-|EeEX$-Jns`?pVigoN9SXQZFY1Y5fwkj&7U;#hvGL@ zz1D{gzk0VzRA=8D^L?D^*>Cj91Q(0DLo#DStTSWtmP$~U8|HHsS-O@tq7--B21WL# z$|<1Hi=KG!C$As3#_v@~*b}U$u#?Yg!vexFrtq9bB*s#tpZy*;HX{j!AH(KB@xLiH z_N!zFXHizhQ9e$BNF%w;o|&fAzH-35H}}TY3hXZ?B~BG~*V=!+t$13^nTtsU>fNy+ zo|TxP1QWkWuc+@Wp{}c-%$0sKN^Qa@N`2IKyH;!Rs)$#o{8X|T48wBW!UxFO(64^m zU}(*Uxwy3ND1S$^1!`UPxA)?X=0mo{saNl>hpPMD{k-z7sg4ho>QMAeh2Tr|NNxpJt+Ql3jG-}s16R> zg7H0pzskY9kg^O^pXy-LS{yI(3%Q441MA)Ninw29YjScrD)=jtTN&J4D*Ws#K0gJh zLLVdBuW3QAZmz`~T+ce0TdA9bIg&HbfN5xZ)MspC}R6f1PkKVTL2 z4*b;AKd82^%q_EW-nMQU$ZB)%%(AzJx1x&8q%u2RZmQ z&$$3^t9i89S?hA{eSK(ZA5hiVKXo^<8TYbBBquPeq8bG{?u6mHZ=3cKUr7`40aV&l z_h)u-CjZ6?^fdP*U_v}Kzc#OX$y(J@%KPLxWY)ujsSwA_(a!4 zZUXxw2yitG!auZ88h_Nif?Xq)^`nhZ0G*Eo!iJQftK?}!Crpn@>?v#f&rs?uJ-O!R znc_aj$qLUF4d`kLM>zzFf9^!QEIV-mW*H%Thcweio?H$QB|f)n=78|&n^5%SIo!$S zx$G0ZE#cdM(bZIH{;dRHaxX6EssQu;E#q4Qkj0DGrXW;*&Z3*ZE|IMqbSYK7-QN#_ zjt0QqDM3!VJ_Tpt&u})gGYwuT8qTF)Q;)^7wR8pY&UKNhfA4)}x(?XV{LUs`8A|_r zX6q|8R#M5o^pMoG2a)9WgO{cf_zF{fAZ(v9pwK}Z=5B#T_#Y42c9gHN^8{5sx~0>V zvn~pX-w+7<8C+EJ0K#4T3OSPWa+_k1gl&4P?TC}STJ)>*4A75tmS$?m^TNvaqxUbi zf$hsd{i@)!vgAEiw0chF8c+!v=EwXLnFkeqARvsi6tDye5@wU08@z;vv_4dZx>71N z|4@Ps#{VnrZK|hLz)%$79hjsacUwwEgX!Dk#61QZpr_bM&15AID}ZZ}yP~|6fH)4Q zQ57pdMYUk%-xc8c6-zseeaK+qmtt@N`;|c0qjgZ%dZXO)o%h5CpXleFUsJy;P``qq z%apE*9E{{vI$BBM4j;fe5B96(LQwU)cPbtPSdr>nc_O9cCMw}S2~PyJZX+}_U?Nx+K#e88d+-rThW$?R+s_vZ@+rR`)^{dh#=xTg0 zm%Mwn&z8EgctnMtp%^&-k@Ud!B6yORE--QHqy>3g0Y?-8>$qkD+~JIeAgSu!ZN9VS zXon&ZLdEF)d^Ztb_^;_EC1=2(HTq3HF6e1><$#_ikvBo8D!`US@{SSD|9 zdipAh&F_$Chvv%E#qt=#m_cwJ?;|Y8WWD-fp+tP^4B@WW;f&*r73JIWYr*d4>!O|> zpxU06&J(*`?3g=NUX2t_A>RUdbY1N? zF#@MEnzvFps~9+I3E;=_gp`)aJZ|OtU3w(zY#6p{|wKN^-x3`3aL58HD%TUNgKR;a z0}LyEpW;mb!I$><#04Jf}9ws^_hEKHriDsL#5vS1-OVsJIr>+_`mHOKVo4 zk`K`^9SAy{0T=_ceP0m0=kQKEDJ literal 0 HcmV?d00001 diff --git a/src/main/resources/static/css/images/bg.jpg b/src/main/resources/static/css/images/bg.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d5870f5033f1b0ff98b6e94db9f0a84d253c86d3 GIT binary patch literal 26174 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 G(SHHxA6>Qp literal 0 HcmV?d00001 diff --git a/src/main/resources/static/css/login.css b/src/main/resources/static/css/login.css new file mode 100644 index 0000000..bcd9598 --- /dev/null +++ b/src/main/resources/static/css/login.css @@ -0,0 +1,98 @@ +html, body { + width: 100%; + height: 100%; + overflow: hidden +} + +body { + background: #1E9FFF; +} + +body:after { + content: ''; + background-repeat: no-repeat; + background-size: cover; + -webkit-filter: blur(3px); + -moz-filter: blur(3px); + -o-filter: blur(3px); + -ms-filter: blur(3px); + filter: blur(3px); + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + z-index: -1; +} + +.layui-container { + width: 100%; + height: 100%; + overflow: hidden +} + +.admin-login-background { + width: 360px; + height: 300px; + position: absolute; + left: 50%; + top: 40%; + margin-left: -180px; + margin-top: -100px; +} + +.logo-title { + text-align: center; + letter-spacing: 2px; + padding: 14px 0; +} + +.logo-title h1 { + color: #1E9FFF; + font-size: 25px; + font-weight: bold; +} + +.login-form { + background-color: #fff; + border: 1px solid #fff; + border-radius: 3px; + padding: 14px 20px; + box-shadow: 0 0 8px #eeeeee; +} + +.login-form .layui-form-item { + position: relative; +} + +.login-form .layui-form-item label { + position: absolute; + left: 1px; + top: 1px; + width: 38px; + line-height: 36px; + text-align: center; + color: #d2d2d2; +} + +.login-form .layui-form-item input { + padding-left: 36px; +} + +.captcha { + width: 60%; + display: inline-block; +} + +.captcha-img { + display: inline-block; + width: 34%; + float: right; +} + +.captcha-img img { + height: 34px; + border: 1px solid #e6e6e6; + height: 36px; + width: 100%; +} \ No newline at end of file diff --git a/src/main/resources/static/css/login2.css b/src/main/resources/static/css/login2.css new file mode 100644 index 0000000..27d4ec0 --- /dev/null +++ b/src/main/resources/static/css/login2.css @@ -0,0 +1,99 @@ +body { + background-image: url("images/bg.jpg"); + height: 100%; + width: 100% +} + +#container { + height: 100%; + width: 100% +} + +input:-webkit-autofill { + -webkit-box-shadow: inset 0 0 0 1000px #fff; + background-color: transparent +} + +.admin-login-background { + width: 300px; + height: 300px; + position: absolute; + left: 50%; + top: 40%; + margin-left: -150px; + margin-top: -100px +} + +.admin-header { + text-align: center; + margin-bottom: 20px; + color: #ffffff; + font-weight: bold; + font-size: 40px +} + +.admin-input { + border-top-style: none; + border-right-style: solid; + border-bottom-style: solid; + border-left-style: solid; + height: 50px; + width: 300px; + padding-bottom: 0px +} + +.admin-input::-webkit-input-placeholder { + color: #a78369 +} + +.layui-icon-username { + color: #a78369 !important +} + +.layui-icon-username:hover { + color: #9dadce !important +} + +.layui-icon-password { + color: #a78369 !important +} + +.layui-icon-password:hover { + color: #9dadce !important +} + +.admin-input-username { + border-top-style: solid; + border-radius: 10px 10px 0 0 +} + +.admin-input-verify { + border-radius: 0 0 10px 10px +} + +.admin-button { + margin-top: 20px; + font-weight: bold; + font-size: 18px; + width: 300px; + height: 50px; + border-radius: 5px; + background-color: #a78369; + border: 1px solid #d8b29f +} + +.admin-icon { + margin-left: 260px; + margin-top: 10px; + font-size: 30px +} + +i { + position: absolute +} + +.admin-captcha { + position: absolute; + margin-left: 205px; + margin-top: -45px +} \ No newline at end of file diff --git a/src/main/resources/static/js/build.js b/src/main/resources/static/js/build.js new file mode 100644 index 0000000..f3a1eb2 --- /dev/null +++ b/src/main/resources/static/js/build.js @@ -0,0 +1,167 @@ +layui.use(function () { + var $ = layui.jquery; + var form = layui.form; + + var build = $(".build-panel"); + + + // 禁止选择网页文本 + $(document).on('selectstart', '.layui-card', function(){ + return false; + }); + + // 移动操作 + var downPosi, target = null, dragDom = null, timer = null; + var areaPosi; + $(document).on("mousedown", ".layui-form-item", function (e) { + $this = $(this); + timer = setTimeout(function () { + downPosi = {'left': e.clientX - $this.offset().left, + 'top': e.clientY - $this.offset().top + 10}; + areaPosi = {'ltX': build.offset().left, 'ltY': build.offset().top, + 'rbX': build.offset().left + build.width(), + 'rbY': build.offset().top + build.height()}; + target = $this; + }, 200); + }); + $(document).on("mousemove", function (e) { + if(dragDom == null && target != null){ + dragDom = $("

"); + dragDom.append(target.clone()); + dragDom.addClass("drag-box"); + dragDom.css("width", target.width()); + $("body").append(dragDom); + var buildItem = target.parent('.build-item'); + if(buildItem.length > 0){ + buildItem.remove(); + } + } + if(dragDom != null){ + dragDom.css("left", e.clientX - downPosi.left); + dragDom.css("top", e.clientY - downPosi.top); + } + if(dragDom != null){ + if(e.clientX > areaPosi.ltX && e.clientY > areaPosi.ltY + && e.clientX < areaPosi.rbX && e.clientY < areaPosi.rbY){ + build.addClass("active"); + buildItemPosi(e.clientY); + }else{ + build.removeClass("active"); + shellItem.remove(); + } + } + }); + $(document).on("mouseup", function (e) { + if(dragDom != null){ + if(build.hasClass("active")){ + buildAdd(dragDom); + } + dragDom.remove(); + dragDom = null; + target = null; + build.removeClass("active"); + shellItem.remove(); + } + if(timer != null){ + clearTimeout(timer); + timer = null; + } + }); + + // 构建项位置 + var shellItem = $("
"); + var buildItemPosi = function(clientY){ + build.children('.build-item').each(function(key, val){ + var $this = $(val); + var ty = $this.offset().top; + var by = $this.offset().top + $this.height(); + if(clientY > ty && clientY < by ){ + if(clientY < (ty + by) / 2){ + $this.before(shellItem); + }else{ + $this.after(shellItem); + } + } + }); + shellItem.css('height', dragDom.height()); + if($('#shell-item').length == 0){ + build.append(shellItem); + } + }; + + // 加入构建面板 + var buildAdd = function(dragDom){ + var elem = dragDom.children(".layui-form-item").clone(); + elem.children('div').children('div').remove(); + elem.removeAttr('style'); + elem.removeClass('drag-box'); + var item = $("
" + + "" + + "
"); + shellItem.after(item.append(elem)); + + form.render(); + }; + + // 编辑构建项 + var buildItem, index; + build.on('click', '.edit', function(){ + buildItem = $(this).parents('.build-item'); + var elem = buildItem.children('.layui-form-item').clone(); + elem.children('div').children('div').remove(); + elem.find('.layui-upload-file').remove(); + + var box = $("
"); + var edit = $("").text(elem.prop('outerHTML')); + box.append(edit).append(""); + + index = layer.open({ + title: '编辑HTML', + type: 1, + skin: 'build-item-edit', //样式类名 + shadeClose: true, //开启遮罩关闭 + area: ['500px', '360px'], + content: box.prop('outerHTML') + }); + }); + + // 更新HTML + $(document).on('click', '.build-edit-btn', function(){ + var val = $(this).parent().children('textarea').val(); + buildItem.children('.layui-form-item').remove(); + buildItem.append($(val)); + form.render(); + layer.close(index); + }); + + // 删除构建项 + build.on('click', '.remove', function(){ + $(this).parents('.build-item').remove(); + }); + + // 生成代码 + $(document).on('click', '.build-generate', function(){ + var genHtml = ''; + build.find(".layui-form-item").each(function (key, val) { + var item = $(val).clone(); + item.children('div').children('div').remove(); + item.find('.layui-upload-file').remove(); + genHtml += item.prop('outerHTML') + "\n"; + }); + var box = $("
"); + var edit = $("").text(genHtml); + box.append(edit); + + index = layer.open({ + title: '复制HTML代码', + type: 1, + skin: 'build-item-edit', //样式类名 + shadeClose: true, //开启遮罩关闭 + area: ['500px', '360px'], + content: box.prop('outerHTML') + }); + $('.build-edit').focus().select(); + }); + +}); \ No newline at end of file diff --git a/src/main/resources/static/js/core.util.js b/src/main/resources/static/js/core.util.js new file mode 100644 index 0000000..8571f98 --- /dev/null +++ b/src/main/resources/static/js/core.util.js @@ -0,0 +1,182 @@ +/*工具类*/ +var CoreUtil = (function () { + var coreUtil = {}; + + /*GET*/ + coreUtil.sendGet = function(url, params, ft){ + this.sendAJAX(url, params, ft, "GET") + } + + /*POST*/ + coreUtil.sendPost = function(url, params, ft){ + this.sendAJAX(url, JSON.stringify(params), ft, "POST") + } + /*PUT*/ + coreUtil.sendPut = function(url, params, ft){ + this.sendAJAX(url, JSON.stringify(params), ft, "PUT") + } + /*DELETE*/ + coreUtil.sendDelete = function(url, params, ft){ + this.sendAJAX(url, JSON.stringify(params), ft, "DELETE") + } + + + /*ajax*/ + coreUtil.sendAJAX = function(url, params, ft, method){ + var loadIndex = top.layer.load(0, {shade: false}); + $.ajax({ + url: url, + cache: false, + async: true, + data: params, + type: method, + contentType: 'application/json; charset=UTF-8', + dataType: "json", + beforeSend: function(request) { + request.setRequestHeader("authorization", CoreUtil.getData("access_token")); + }, + success: function (res) { + top.layer.close(loadIndex); + if (res.code==0){ + if(ft!=null&&ft!=undefined){ + ft(res); + } + }else if(res.code==401001){ //凭证过期重新登录 + layer.msg("凭证过期请重新登录", {time:2000}, function () { + top.window.location.href=ctx + "index/login" + }) + }else if(res.code==401008){ //凭证过期重新登录 + layer.msg("抱歉!您暂无权限", {time:2000}) + } else { + layer.msg(res.msg); + } + }, + error:function (XMLHttpRequest, textStatus, errorThrown) { + top.layer.close(loadIndex); + if(XMLHttpRequest.status==404){ + top.window.location.href= ctx + "index/404"; + }else{ + layer.msg("服务器好像除了点问题!请稍后试试"); + } + } + }) + } + + + /*存入本地缓存*/ + coreUtil.setData = function(key, value){ + layui.data('LocalData',{ + key :key, + value: value + }) + }; + /*从本地缓存拿数据*/ + coreUtil.getData = function(key){ + var localData = layui.data('LocalData'); + return localData[key]; + }; + + //判断字符是否为空的方法 + coreUtil.isEmpty = function(obj){ + if(typeof obj == "undefined" || obj == null || obj == ""){ + return true; + }else{ + return false; + } + } + + //判断字符是否为空的方法 空的话返回默认值 + coreUtil.isEmptyGet = function(obj, defaultVal){ + if(typeof obj == "undefined" || obj == null || obj == ""){ + return defaultVal; + }else{ + return obj; + } + } + + //字典数据回显 + coreUtil.selectDictLabel = function (datas, value) { + datas = JSON.parse(datas); + var label = ""; + $.each(datas, function(index, dict) { + if (dict.value == ('' + value)) { + label = dict.label; + return false; + } + }); + //匹配不到,返回未知 + if (CoreUtil.isEmpty(label)) { + return "未知"; + } + return label; + } + + //生成随机8位数 + coreUtil.showImg = function (src) { + if (!CoreUtil.isEmpty(src)) { + var json = { + "title": "", //相册标题 + "id": "1", //相册id + "start": 0, //初始显示的图片序号,默认0 + "data": [ //相册包含的图片,数组格式 + { + "alt": "", + "pid": "1", //图片id + "src": src, //原图地址 + "thumb": "" //缩略图地址 + } + ] + }; + layer.photos({ + photos: json + , anim: 5 //0-6的选择,指定弹出图片动画类型,默认随机(请注意,3.0之前的版本用shift参数) + }); + } + } + + //获取复选框的值 + coreUtil.getCheckboxValues = function (type, data) { + if (this.isEmpty(data)) { + return ""; + } + var listRtn = []; + var keys = getObjectKeys(data); + for (var i = 0; i < keys.length; i++) { + if (keys[i].indexOf("[") > -1 && keys[i].indexOf("]") > -1 && keys[i].indexOf(type) > -1) { + listRtn.push(keys[i].substring(keys[i].indexOf("[") + 1, keys[i].indexOf("]"))) + } + } + return listRtn.toString(); + } + + //赋值复选框的值 返回json, 可以直接form.val进行赋值 + coreUtil.setCheckboxValues = function (type, values) { + var json = {}; + if (this.isEmpty(values)) { + return json; + } + values = values.split(","); + for (var i = 0; i < values.length; i++) { + var key = type + "["+values[i] + "]"; + json[key] = true; + } + return json; + } + + return coreUtil; +})(CoreUtil, window); + +//写成标准的方法(数组是object的一种): +function getObjectKeys(object) { + var keys = []; + for (var property in object) + keys.push(property); + return keys; +} + +function getObjectValues(object) { + var values = []; + for (var property in object) + values.push(object[property]); + return values; +} \ No newline at end of file diff --git a/src/main/resources/static/js/home.js b/src/main/resources/static/js/home.js new file mode 100644 index 0000000..9274883 --- /dev/null +++ b/src/main/resources/static/js/home.js @@ -0,0 +1,369 @@ +//全屏 +$('body').on('click', '[data-check-screen]', function () { + var check = $(this).attr('data-check-screen'); + if (check == 'full') { + fullScreen(); + $(this).attr('data-check-screen', 'exit'); + $(this).html(''); + } else { + exitFullScreen(); + $(this).attr('data-check-screen', 'full'); + $(this).html(''); + } +}); + +//刷新 +$('body').on('click', '[data-refresh]', function () { + $(".layui-tab-item.layui-show").find("iframe")[0].contentWindow.location.reload(); +}); + +/** + * 初始化背景色 + */ +var initBgColor = function () { + var bgcolorId = sessionStorage.getItem('layuiminiBgcolorId'); + if (bgcolorId == null || bgcolorId == undefined || bgcolorId == '') { + bgcolorId = config('BgColorDefault'); + } + var bgcolorData = bgColorConfigFun(bgcolorId); + console.log(bgcolorData) + var styleHtml = '.layui-layout-admin .layui-header{background-color:' + bgcolorData.headerRight + '!important;}\n' + + '.layui-header>ul>.layui-nav-item.layui-this,.layuimini-tool i:hover{background-color:' + bgcolorData.headerRightThis + '!important;}\n' + + '.layui-layout-admin .layui-logo {background-color:' + bgcolorData.headerLogo + '!important;color:' + bgcolorData.headerRight + '!important;}\n' + + '.layui-tab-title .layui-this {background-color:' + bgcolorData.headerRight + '!important;}\n' + + '.layui-nav-tree .layui-nav-bar {background-color:' + bgcolorData.headerRight + '!important;}\n' + + '.layui-btn {background-color:' + bgcolorData.headerRight + '!important;}\n' + + '.layui-nav .layui-this:after, .layui-nav-bar, .layui-nav-tree .layui-nav-itemed:after {background-color:' + bgcolorData.headerRight + '!important;}\n' + + '.layui-side.layui-bg-black,.layui-side.layui-bg-black>.layui-left-menu>ul {background-color:' + bgcolorData.menuLeft + '!important;}\n' + + '.layui-left-menu .layui-nav .layui-nav-child a:hover:not(.layui-this) {background-color:' + bgcolorData.menuLeftHover + ';}\n' + + '.layui-layout-admin .layui-nav-tree .layui-this, .layui-layout-admin .layui-nav-tree .layui-this>a, .layui-layout-admin .layui-nav-tree .layui-nav-child dd.layui-this, .layui-layout-admin .layui-nav-tree .layui-nav-child dd.layui-this a {\n' + + ' background-color: ' + bgcolorData.menuLeftThis + ' !important;\n' + + '}'; + $('#layuimini-bg-color').html(styleHtml); +}; + +/** + * 弹出配色方案 + */ +$('body').on('click', '[data-bgcolor]', function () { + var loading = layer.load(0, {shade: false, time: 2 * 1000}); + var clientHeight = (document.documentElement.clientHeight) - 95; + var bgColorHtml = buildBgColorHtml(); + var html = '
\n' + + '
\n' + + '配色方案\n' + + '
\n' + + '
\n' + + '
    \n' + bgColorHtml + '
\n' + + '
\n' + + '
'; + layer.open({ + type: 1, + title: false, + closeBtn: 0, + shade: 0.2, + anim: 2, + shadeClose: true, + id: 'layuiminiBgColor', + area: ['340px', clientHeight + 'px'], + offset: 'rb', + content: html, + end: function () { + $('.layuimini-select-bgcolor').removeClass('layui-this'); + } + }); + layer.close(loading); +}); +/** + * 选择配色方案 + */ +$('body').on('click', '[data-select-bgcolor]', function () { + var bgcolorId = $(this).attr('data-select-bgcolor'); + $('.layuimini-color .color-content ul .layui-this').attr('class', ''); + $(this).attr('class', 'layui-this'); + sessionStorage.setItem('layuiminiBgcolorId', bgcolorId); + initBgColor(); +}); + +/** + * 进入全屏 + */ +var fullScreen = function () { + var el = document.documentElement; + var rfs = el.requestFullScreen || el.webkitRequestFullScreen; + if (typeof rfs != "undefined" && rfs) { + rfs.call(el); + } else if (typeof window.ActiveXObject != "undefined") { + var wscript = new ActiveXObject("WScript.Shell"); + if (wscript != null) { + wscript.SendKeys("{F11}"); + } + } else if (el.msRequestFullscreen) { + el.msRequestFullscreen(); + } else if (el.oRequestFullscreen) { + el.oRequestFullscreen(); + } else { + top.layer.msg('浏览器不支持全屏调用!'); + } +}; + +/** + * 退出全屏 + */ +var exitFullScreen = function () { + var el = document; + var cfs = el.cancelFullScreen || el.webkitCancelFullScreen || el.exitFullScreen; + if (typeof cfs != "undefined" && cfs) { + cfs.call(el); + } else if (typeof window.ActiveXObject != "undefined") { + var wscript = new ActiveXObject("WScript.Shell"); + if (wscript != null) { + wscript.SendKeys("{F11}"); + } + } else if (el.msExitFullscreen) { + el.msExitFullscreen(); + } else if (el.oRequestFullscreen) { + el.oCancelFullScreen(); + } else { + top.layer.msg('浏览器不支持全屏调用!'); + } +}; + +/** + * 构建背景颜色选择 + * @returns {string} + */ +var buildBgColorHtml = function () { + var html = ''; + var bgcolorId = sessionStorage.getItem('layuiminiBgcolorId'); + if (bgcolorId == null || bgcolorId == undefined || bgcolorId == '') { + bgcolorId = 0; + } + var bgColorConfig = bgColorConfigFun(); + $.each(bgColorConfig, function (key, val) { + if (key == bgcolorId) { + html += '
  • \n'; + } else { + html += '
  • \n'; + } + html += '\n' + + '
    \n' + + '
    \n' + + '
    \n' + + '
  • '; + }); + return html; +}; +/** + * 配色方案配置项(默认选中第一个方案) + * @param bgcolorId + */ + function bgColorConfigFun(bgcolorId) { + var bgColorConfig = [ + { + headerRight: '#1aa094', + headerRightThis: '#197971', + headerLogo: '#243346', + menuLeft: '#2f4056', + menuLeftThis: '#1aa094', + menuLeftHover: '#3b3f4b', + }, + { + headerRight: '#23262e', + headerRightThis: '#0c0c0c', + headerLogo: '#0c0c0c', + menuLeft: '#23262e', + menuLeftThis: '#23262e', + menuLeftHover: '#3b3f4b', + }, + { + headerRight: '#ffa4d1', + headerRightThis: '#bf7b9d', + headerLogo: '#e694bd', + menuLeft: '#1f1f1f', + menuLeftThis: '#ffa4d1', + menuLeftHover: '#1f1f1f', + }, + { + headerRight: '#1aa094', + headerRightThis: '#197971', + headerLogo: '#0c0c0c', + menuLeft: '#23262e', + menuLeftThis: '#1aa094', + menuLeftHover: '#3b3f4b', + }, + { + headerRight: '#1E9FFF', + headerRightThis: '#0069b7', + headerLogo: '#0c0c0c', + menuLeft: '#1f1f1f', + menuLeftThis: '#1E9FFF', + menuLeftHover: '#3b3f4b', + }, + + { + headerRight: '#ffb800', + headerRightThis: '#d09600', + headerLogo: '#243346', + menuLeft: '#2f4056', + menuLeftThis: '#ffb800', + menuLeftHover: '#3b3f4b', + }, + { + headerRight: '#e82121', + headerRightThis: '#ae1919', + headerLogo: '#0c0c0c', + menuLeft: '#1f1f1f', + menuLeftThis: '#e82121', + menuLeftHover: '#3b3f4b', + }, + { + headerRight: '#963885', + headerRightThis: '#772c6a', + headerLogo: '#243346', + menuLeft: '#2f4056', + menuLeftThis: '#963885', + menuLeftHover: '#3b3f4b', + }, + { + headerRight: '#1e9fff', + headerRightThis: '#0069b7', + headerLogo: '#0069b7', + menuLeft: '#1f1f1f', + menuLeftThis: '#1e9fff', + menuLeftHover: '#3b3f4b', + }, + { + headerRight: '#ffb800', + headerRightThis: '#d09600', + headerLogo: '#d09600', + menuLeft: '#2f4056', + menuLeftThis: '#ffb800', + menuLeftHover: '#3b3f4b', + }, + { + headerRight: '#e82121', + headerRightThis: '#ae1919', + headerLogo: '#d91f1f', + menuLeft: '#1f1f1f', + menuLeftThis: '#e82121', + menuLeftHover: '#3b3f4b', + }, + { + headerRight: '#963885', + headerRightThis: '#772c6a', + headerLogo: '#772c6a', + menuLeft: '#2f4056', + menuLeftThis: '#963885', + menuLeftHover: '#3b3f4b', + } + ]; + + if (bgcolorId == undefined) { + return bgColorConfig; + } else { + return bgColorConfig[bgcolorId]; + } +}; + + +/** + * 系统配置 + * @param name + * @returns {{BgColorDefault: number, urlSuffixDefault: boolean}|*} + */ +var config = function (name) { + + var config = { + urlHashLocation: true, // URL地址hash定位 + urlSuffixDefault: false, // URL后缀 + BgColorDefault: 3, // 默认皮肤(0开始) + checkUrlDefault: false, // 是否判断URL有效 + }; + + if (name == undefined) { + return config; + } else { + return config[name]; + } +}; + + +//显示隐藏侧边栏 +var isShow=1; +function iconHide(){ + if(isShow===1) + hide(); + else + show(); + isShow*=-1; +} +function hide(){ + $('.layuimini-tool-left').animate({left:'50px'}); + + $('.layui-side cite').hide(); + $('.layui-side').animate({width:'55px'}); + $('.layui-logo').html("SM") + $('.layui-logo').animate({width:'55px'}); + $('.layui-body').animate({left:'60px'}); + document.getElementById('hide').className="layui-color layui-icon layui-icon-spread-left"; + $(".layui-side li").removeClass("layui-nav-itemed"); +} +function show(){ + $('.layuimini-tool-left').animate({left:'200px'}); + + $('.layui-side cite').show(); + $('.layui-side').animate({width:'200px'}); + $('.layui-body').animate({left:'200px'}); + $('.layui-logo').html("solon-manager") + $('.layui-logo').animate({width:'200px'}); + document.getElementById('hide').className="layui-color layui-icon layui-icon-shrink-right"; + var id = $(".layui-tab-title li.layui-this").attr("lay-id"); + if (!CoreUtil.isEmpty(id)) { + $("a[data-id='"+id+"']").parents("li").addClass("layui-nav-itemed") + } +} +function ulHide(){ + if(isShow===-1) + show(); + isShow=1; +} + +/** + * 选项卡操作 + */ +$('body').on('click', '[data-page-close]', function () { + var loading = layer.load(0, {shade: false, time: 2 * 1000}); + var closeType = $(this).attr('data-page-close'); + + if (closeType == 'all') { + if($(".layui-tab-title li").length > 1){ + $(".layui-tab-title li").each(function(){ + if($(this).attr("lay-id") != ''){ + element.tabDelete("tab",$(this).attr("lay-id")).init(); + } + }) + }else{ + layer.msg("没有可以关闭的窗口了@_@"); + } + } else { + if($(".layui-tab-title li").length > 1){ + + console.log($(".layui-tab-title li").length) + console.log($(".layui-tab-title li.layui-this span").text()) + if ($(".layui-tab-title li").length == 2 && $(".layui-tab-title li.layui-this span").text()!="主页"){ + layer.msg("没有可以关闭的窗口了@_@"); + } else { + $(".layui-tab-title li").each(function(){ + if($(this).attr("lay-id") != '' && !$(this).hasClass("layui-this")){ + element.tabDelete("tab",$(this).attr("lay-id")).init(); + } + }) + } + + }else{ + layer.msg("没有可以关闭的窗口了@_@"); + } + } + layer.close(loading); +}); diff --git a/src/main/resources/static/js/jq-module/jquery.particleground.min.js b/src/main/resources/static/js/jq-module/jquery.particleground.min.js new file mode 100644 index 0000000..dac720c --- /dev/null +++ b/src/main/resources/static/js/jq-module/jquery.particleground.min.js @@ -0,0 +1,195 @@ +/** + * Particleground + * + * @author Jonathan Nicol - @mrjnicol + * @version 1.0.1 + * @description Creates a canvas based particle system background + * + * Inspired by: + * http://requestlab.fr/ + * http://disruptivebydesign.com/ + * + * @license The MIT License (MIT) + * + * Copyright (c) 2014 Jonathan Nicol - @mrjnicol + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +!function (a) { + function b(b, d) { + function e() { + if (w) { + $canvas = a(''), v.prepend($canvas), p = $canvas[0], q = p.getContext("2d"), f(); + for (var b = Math.round(p.width * p.height / d.density), c = 0; b > c; c++) { + var e = new l; + e.setStackPos(c), x.push(e) + } + a(window).on("resize", function () { + h() + }), a(document).on("mousemove", function (a) { + y = a.pageX, z = a.pageY + }), B && !A && window.addEventListener("deviceorientation", function () { + D = Math.min(Math.max(-event.beta, -30), 30), C = Math.min(Math.max(-event.gamma, -30), 30) + }, !0), g(), o("onInit") + } + } + + function f() { + p.width = v.width(), p.height = v.height(), q.fillStyle = d.dotColor, q.strokeStyle = d.lineColor, q.lineWidth = d.lineWidth + } + + function g() { + if (w) { + s = a(window).width(), t = a(window).height(), q.clearRect(0, 0, p.width, p.height); + for (var b = 0; b < x.length; b++) x[b].updatePosition(); + for (var b = 0; b < x.length; b++) x[b].draw(); + E || (r = requestAnimationFrame(g)) + } + } + + function h() { + for (f(), i = x.length - 1; i >= 0; i--) (x[i].position.x > v.width() || x[i].position.y > v.height()) && x.splice(i, 1); + var a = Math.round(p.width * p.height / d.density); + if (a > x.length) for (; a > x.length;) { + var b = new l; + x.push(b) + } else a < x.length && x.splice(a); + for (i = x.length - 1; i >= 0; i--) x[i].setStackPos(i) + } + + function j() { + E = !0 + } + + function k() { + E = !1, g() + } + + function l() { + switch (this.stackPos, this.active = !0, this.layer = Math.ceil(3 * Math.random()), this.parallaxOffsetX = 0, this.parallaxOffsetY = 0, this.position = {x: Math.ceil(Math.random() * p.width), y: Math.ceil(Math.random() * p.height)}, this.speed = {}, d.directionX) { + case"left": + this.speed.x = +(-d.maxSpeedX + Math.random() * d.maxSpeedX - d.minSpeedX).toFixed(2); + break; + case"right": + this.speed.x = +(Math.random() * d.maxSpeedX + d.minSpeedX).toFixed(2); + break; + default: + this.speed.x = +(-d.maxSpeedX / 2 + Math.random() * d.maxSpeedX).toFixed(2), this.speed.x += this.speed.x > 0 ? d.minSpeedX : -d.minSpeedX + } + switch (d.directionY) { + case"up": + this.speed.y = +(-d.maxSpeedY + Math.random() * d.maxSpeedY - d.minSpeedY).toFixed(2); + break; + case"down": + this.speed.y = +(Math.random() * d.maxSpeedY + d.minSpeedY).toFixed(2); + break; + default: + this.speed.y = +(-d.maxSpeedY / 2 + Math.random() * d.maxSpeedY).toFixed(2), this.speed.x += this.speed.y > 0 ? d.minSpeedY : -d.minSpeedY + } + } + + function m(a, b) { + return b ? void(d[a] = b) : d[a] + } + + function n() { + v.find(".pg-canvas").remove(), o("onDestroy"), v.removeData("plugin_" + c) + } + + function o(a) { + void 0 !== d[a] && d[a].call(u) + } + + var p, q, r, s, t, u = b, v = a(b), w = !!document.createElement("canvas").getContext, x = [], y = 0, z = 0, A = !navigator.userAgent.match(/(iPhone|iPod|iPad|Android|BlackBerry|BB10|mobi|tablet|opera mini|nexus 7)/i), B = !!window.DeviceOrientationEvent, C = 0, D = 0, E = !1; + return d = a.extend({}, a.fn[c].defaults, d), l.prototype.draw = function () { + q.beginPath(), q.arc(this.position.x + this.parallaxOffsetX, this.position.y + this.parallaxOffsetY, d.particleRadius / 2, 0, 2 * Math.PI, !0), q.closePath(), q.fill(), q.beginPath(); + for (var a = x.length - 1; a > this.stackPos; a--) { + var b = x[a], c = this.position.x - b.position.x, e = this.position.y - b.position.y, f = Math.sqrt(c * c + e * e).toFixed(2); + f < d.proximity && (q.moveTo(this.position.x + this.parallaxOffsetX, this.position.y + this.parallaxOffsetY), d.curvedLines ? q.quadraticCurveTo(Math.max(b.position.x, b.position.x), Math.min(b.position.y, b.position.y), b.position.x + b.parallaxOffsetX, b.position.y + b.parallaxOffsetY) : q.lineTo(b.position.x + b.parallaxOffsetX, b.position.y + b.parallaxOffsetY)) + } + q.stroke(), q.closePath() + }, l.prototype.updatePosition = function () { + if (d.parallax) { + if (B && !A) { + var a = (s - 0) / 60; + pointerX = (C - -30) * a + 0; + var b = (t - 0) / 60; + pointerY = (D - -30) * b + 0 + } else pointerX = y, pointerY = z; + this.parallaxTargX = (pointerX - s / 2) / (d.parallaxMultiplier * this.layer), this.parallaxOffsetX += (this.parallaxTargX - this.parallaxOffsetX) / 10, this.parallaxTargY = (pointerY - t / 2) / (d.parallaxMultiplier * this.layer), this.parallaxOffsetY += (this.parallaxTargY - this.parallaxOffsetY) / 10 + } + switch (d.directionX) { + case"left": + this.position.x + this.speed.x + this.parallaxOffsetX < 0 && (this.position.x = v.width() - this.parallaxOffsetX); + break; + case"right": + this.position.x + this.speed.x + this.parallaxOffsetX > v.width() && (this.position.x = 0 - this.parallaxOffsetX); + break; + default: + (this.position.x + this.speed.x + this.parallaxOffsetX > v.width() || this.position.x + this.speed.x + this.parallaxOffsetX < 0) && (this.speed.x = -this.speed.x) + } + switch (d.directionY) { + case"up": + this.position.y + this.speed.y + this.parallaxOffsetY < 0 && (this.position.y = v.height() - this.parallaxOffsetY); + break; + case"down": + this.position.y + this.speed.y + this.parallaxOffsetY > v.height() && (this.position.y = 0 - this.parallaxOffsetY); + break; + default: + (this.position.y + this.speed.y + this.parallaxOffsetY > v.height() || this.position.y + this.speed.y + this.parallaxOffsetY < 0) && (this.speed.y = -this.speed.y) + } + this.position.x += this.speed.x, this.position.y += this.speed.y + }, l.prototype.setStackPos = function (a) { + this.stackPos = a + }, e(), {option: m, destroy: n, start: k, pause: j} + } + + var c = "particleground"; + a.fn[c] = function (d) { + if ("string" == typeof arguments[0]) { + var e, f = arguments[0], g = Array.prototype.slice.call(arguments, 1); + return this.each(function () { + a.data(this, "plugin_" + c) && "function" == typeof a.data(this, "plugin_" + c)[f] && (e = a.data(this, "plugin_" + c)[f].apply(this, g)) + }), void 0 !== e ? e : this + } + return "object" != typeof d && d ? void 0 : this.each(function () { + a.data(this, "plugin_" + c) || a.data(this, "plugin_" + c, new b(this, d)) + }) + }, a.fn[c].defaults = { + minSpeedX: .1, maxSpeedX: .7, minSpeedY: .1, maxSpeedY: .7, directionX: "center", directionY: "center", density: 1e4, dotColor: "#666666", lineColor: "#666666", particleRadius: 7, lineWidth: 1, curvedLines: !1, proximity: 100, parallax: !0, parallaxMultiplier: 5, onInit: function () { + }, onDestroy: function () { + } + } +}(jQuery), /** + * requestAnimationFrame polyfill by Erik M枚ller. fixes from Paul Irish and Tino Zijdel + * @see: http://paulirish.com/2011/requestanimationframe-for-smart-animating/ + * @see: http://my.opera.com/emoller/blog/2011/12/20/requestanimationframe-for-smart-er-animating + * @license: MIT license + */ + function () { + for (var a = 0, b = ["ms", "moz", "webkit", "o"], c = 0; c < b.length && !window.requestAnimationFrame; ++c) window.requestAnimationFrame = window[b[c] + "RequestAnimationFrame"], window.cancelAnimationFrame = window[b[c] + "CancelAnimationFrame"] || window[b[c] + "CancelRequestAnimationFrame"]; + window.requestAnimationFrame || (window.requestAnimationFrame = function (b) { + var c = (new Date).getTime(), d = Math.max(0, 16 - (c - a)), e = window.setTimeout(function () { + b(c + d) + }, d); + return a = c + d, e + }), window.cancelAnimationFrame || (window.cancelAnimationFrame = function (a) { + clearTimeout(a) + }) + }(); \ No newline at end of file diff --git a/src/main/resources/static/js/jq-module/paigusu.min.js b/src/main/resources/static/js/jq-module/paigusu.min.js new file mode 100644 index 0000000..4564bc9 --- /dev/null +++ b/src/main/resources/static/js/jq-module/paigusu.min.js @@ -0,0 +1 @@ +(function(c,f,h,k){var g=function(a,b){this.eve=a;this.defaults={width:230,height:400,color:"#1926dc",recommend:!1,title:"\u6700\u8fd1\u4f7f\u7528"};this.options=c.extend({},this.defaults,b);console.log(this.options)};g.prototype={init:function(){this.getPosition();this.initDefaultColor();this.latelyColor();this.createHtml();this.on()},createHtml:function(){var a=this.options,b=a.bg.r+","+a.bg.g+","+a.bg.b,d="";c.each(a.lately,function(a,b){if(9b.h&&(b.h+=360);b.s*=100/255;b.b*=100/255;return b={h:Math.round(b.h),s:Math.round(b.s),b:Math.round(b.b)}},hexToRgb:function(a){a=-1>16,g:(a&65280)>>8,b:a&255}},rgbToHex:function(a){var b=[a.r.toString(16),a.g.toString(16),a.b.toString(16)];c.each(b,function(a,e){1==e.length&&(b[a]="0"+e)});return b.join("")},hsbToRgb:function(a){var b,d,e;b=a.h;var c=255*a.s/100;a=255*a.b/100;if(0==c)b=d=e=a;else{var c=(255-c)*a/255,f=b%60*(a-c)/60;360==b&&(b=0);60>b?(b=a,e=c,d=c+f):120>b?(d=a,e=c,b=a-f):180>b?(d=a,b=c,e=c+f):240>b?(e=a,b=c,d=a-f):300>b?(e=a,d=c,b=c+f):360>b?(b=a,d=c,e=a-f):e=d=b=0}return{r:Math.round(b),g:Math.round(d),b:Math.round(e)}},hsbToHex:function(a){a=this.hsbToRgb(a);var b=[a.r.toString(16),a.g.toString(16),a.b.toString(16)];c.each(b,function(a,c){1==c.length&&(b[a]="0"+c)});return b.join("")},getPosition:function(){var a=this.options,b=c(f).width(),d=c(f).height(),e=this.eve.getBoundingClientRect();b-e.right>a.width?this.set({positionLeft:e.right+5}):this.set({positionLeft:e.left-a.width-5});d-e.bottom>a.height?this.set({positionTop:e.top}):this.set({positionTop:e.bottom-a.height})},doploy:function(){var a=this.options;c("#paigusu-slider-btn").css("left",a.colorSlider-5);var b=this.hsbToHex({h:a.colorSlider/160*360,s:100,b:100}),d=this.hexToRgb(b),e={h:a.colorSlider/160*360,s:100,s:a.hsb.s,b:a.hsb.b},b=this.hsbToHex(e),f=this.hexToRgb(b);f.a=a.color.a;this.set({bg:d,color:f,hex:b,hsb:e});this.setInputColor()},setInputColor:function(){var a=this.options,b=a.color.r+","+a.color.g+","+a.color.b;c("#final-color").css("background","rgba("+b+","+a.color.a+")");var d=a.bg.r+","+a.bg.g+","+a.bg.b;console.log(d);c("#color-block").css("background","rgb("+d+")");c("#paigusu-alpha-block").css("background","linear-gradient(to right, rgba("+b+", 0) 0%, rgba("+b+", 1) 100%)");c.each(a.color,function(a,b){c("input[name\x3d'paigusu-"+a+"']").val(b)});c("input[name\x3d'paigusu-hex']").val("#"+a.hex);this.callFun()},inputSetColor:function(){var a=this.options.hsb,b=this.hsbToRgb({h:0==a.h?250:a.h,s:100,b:100}),d=150-a.b/100*150-6,e=a.s/100*230-6,a=parseInt(a.h/360*160),f=this.options.color;this.set({bg:b,ident:{top:d,left:e},colorSlider:a});c("#color-block").css("background","rgb("+b.r+","+b.g+","+b.b+")");c("#block-ident").css({top:d,left:e});c("#paigusu-slider-btn").css("left",a-5);c("#final-color").css("background","rgb("+f.r+","+f.g+","+f.b+","+f.a+")");c("#paigusu-alpha-block").css("background","linear-gradient(to right, rgba(0,17,255, 0) 0%, rgba("+b.r+","+b.g+","+b.b+", 1) 100%)");c("#paigusu-alpha-btn").css("left",parseInt(160*f.a)-5);this.callFun()},palette:function(){var a=this.options;c("#block-ident").css(a.ident);var b=0>a.ident.top?0:a.ident.top,d=0>a.ident.left?0:a.ident.left,a={s:((230b.offsetX?0:b.offsetX}),a.doploy())}).on("mouseup",function(){f.paigususlider=!1}).on("mouseleave",function(){f.paigususlider=!1});c("#paigusu-alpha").off().on("mousedown",function(b){b=b||f.event;f.paigusualpha=!0;c("#paigusu-alpha-btn").css("left",b.offsetX-6);a.options.color.a=parseFloat((b.offsetX/160).toFixed(1));a.setInputColor()}).on("mousemove",function(b){b=b||f.event;f.paigusualpha&&(c("#paigusu-alpha-btn").css("left",b.offsetX-6),a.options.color.a=parseFloat(((0>b.offsetX?0:b.offsetX)/160).toFixed(1)),a.setInputColor())}).on("mouseup",function(){f.paigusualpha=!1}).on("mouseleave",function(){f.paigusualpha=!1});c('input[name\x3d"paigusu-r"],input[name\x3d"paigusu-g"],input[name\x3d"paigusu-b"],input[name\x3d"paigusu-a"]').on("keyup",function(){var b=c(this).attr("name").split("-");if("a"==b[1]){var d=parseFloat(c(this).val())||1,d=parseFloat(d.toFixed(1));if(1d)c(this).val(1),d=1}else d=parseInt(c(this).val())||0,0>d?(c(this).val(0),d=0):255").width(boundx).height(boundy).addClass(cssClass("holder")).css({position:"relative",backgroundColor:options.bgColor}).insertAfter($origimg).append($img);if(options.addClass){$div.addClass(options.addClass)}var $img2=$("").attr("src",$img.attr("src")).css("position","absolute").width(boundx).height(boundy);var $img_holder=$("
    ").width(pct(100)).height(pct(100)).css({zIndex:310,position:"absolute",overflow:"hidden"}).append($img2);var $hdl_holder=$("
    ").width(pct(100)).height(pct(100)).css("zIndex",320);var $sel=$("
    ").css({position:"absolute",zIndex:300}).insertBefore($img).append($img_holder,$hdl_holder);var bound=options.boundary;var $trk=newTracker().width(boundx+(bound*2)).height(boundy+(bound*2)).css({position:"absolute",top:px(-bound),left:px(-bound),zIndex:290}).mousedown(newSelection);var xlimit,ylimit,xmin,ymin; +var xscale,yscale,enabled=true;var docOffset=getPos($img),btndown,lastcurs,dimmed,animating,shift_down;var Coords=function(){var x1=0,y1=0,x2=0,y2=0,ox,oy;function setPressed(pos){var pos=rebound(pos);x2=x1=pos[0];y2=y1=pos[1]}function setCurrent(pos){var pos=rebound(pos);ox=pos[0]-x2;oy=pos[1]-y2;x2=pos[0];y2=pos[1]}function getOffset(){return[ox,oy]}function moveOffset(offset){var ox=offset[0],oy=offset[1];if(0>x1+ox){ox-=ox+x1}if(0>y1+oy){oy-=oy+y1}if(boundyboundx){xx=boundx;h=Math.abs((xx-x1)/aspect);yy=rh<0?y1-h:h+y1}}}else{xx=x2;h=rwa/aspect;yy=rh<0?y1-h:y1+h;if(yy<0){yy=0;w=Math.abs((yy-y1)*aspect);xx=rw<0?x1-w:w+x1}else{if(yy>boundy){yy=boundy;w=Math.abs(yy-y1)*aspect;xx=rw<0?x1-w:w+x1}}}if(xx>x1){if(xx-x1max_x){xx=x1+max_x}}if(yy>y1){yy=y1+(xx-x1)/aspect}else{yy=y1-(xx-x1)/aspect}}else{if(xxmax_x){xx=x1-max_x}}if(yy>y1){yy=y1+(x1-xx)/aspect}else{yy=y1-(x1-xx)/aspect}}}if(xx<0){x1-=xx;xx=0}else{if(xx>boundx){x1-=xx-boundx;xx=boundx}}if(yy<0){y1-=yy;yy=0}else{if(yy>boundy){y1-=yy-boundy;yy=boundy}}return last=makeObj(flipCoords(x1,y1,xx,yy))}function rebound(p){if(p[0]<0){p[0]=0}if(p[1]<0){p[1]=0}if(p[0]>boundx){p[0]=boundx}if(p[1]>boundy){p[1]=boundy}return[p[0],p[1]] +}function flipCoords(x1,y1,x2,y2){var xa=x1,xb=x2,ya=y1,yb=y2;if(x2xlimit)){x2=(xsize>0)?(x1+xlimit):(x1-xlimit)}if(ylimit&&(Math.abs(ysize)>ylimit)){y2=(ysize>0)?(y1+ylimit):(y1-ylimit)}if(ymin&&(Math.abs(ysize)0)?(y1+ymin):(y1-ymin)}if(xmin&&(Math.abs(xsize)0)?(x1+xmin):(x1-xmin)}if(x1<0){x2-=x1;x1-=x1}if(y1<0){y2-=y1;y1-=y1}if(x2<0){x1-=x2;x2-=x2}if(y2<0){y1-=y2;y2-=y2}if(x2>boundx){var delta=x2-boundx;x1-=delta;x2-=delta}if(y2>boundy){var delta=y2-boundy;y1-=delta;y2-=delta}if(x1>boundx){var delta=x1-boundy;y2-=delta;y1-=delta}if(y1>boundy){var delta=y1-boundy;y2-=delta;y1-=delta}return makeObj(flipCoords(x1,y1,x2,y2))}function makeObj(a){return{x:a[0],y:a[1],x2:a[2],y2:a[3],w:a[2]-a[0],h:a[3]-a[1]}}return{flipCoords:flipCoords,setPressed:setPressed,setCurrent:setCurrent,getOffset:getOffset,moveOffset:moveOffset,getCorner:getCorner,getFixed:getFixed}}();var Selection=function(){var start,end,dragmode,awake,hdep=370;var borders={};var handle={};var seehandles=false;var hhs=options.handleOffset;if(options.drawBorders){borders={top:insertBorder("hline").css("top",$.browser.msie?px(-1):px(0)),bottom:insertBorder("hline"),left:insertBorder("vline"),right:insertBorder("vline")}}if(options.dragEdges){handle.t=insertDragbar("n");handle.b=insertDragbar("s");handle.r=insertDragbar("e");handle.l=insertDragbar("w")}options.sideHandles&&createHandles(["n","s","e","w"]);options.cornerHandles&&createHandles(["sw","nw","ne","se"]);function insertBorder(type){var jq=$("
    ").css({position:"absolute",opacity:options.borderOpacity}).addClass(cssClass(type));$img_holder.append(jq);return jq}function dragDiv(ord,zi){var jq=$("
    ").mousedown(createDragger(ord)).css({cursor:ord+"-resize",position:"absolute",zIndex:zi});$hdl_holder.append(jq);return jq}function insertHandle(ord){return dragDiv(ord,hdep++).css({top:px(-hhs+1),left:px(-hhs+1),opacity:options.handleOpacity}).addClass(cssClass("handle")) +}function insertDragbar(ord){var s=options.handleSize,o=hhs,h=s,w=s,t=o,l=o;switch(ord){case"n":case"s":w=pct(100);break;case"e":case"w":h=pct(100);break}return dragDiv(ord,hdep++).width(w).height(h).css({top:px(-t+1),left:px(-l+1)})}function createHandles(li){for(i in li){handle[li[i]]=insertHandle(li[i])}}function moveHandles(c){var midvert=Math.round((c.h/2)-hhs),midhoriz=Math.round((c.w/2)-hhs),north=west=-hhs+1,east=c.w-hhs,south=c.h-hhs,x,y;"e" in handle&&handle.e.css({top:px(midvert),left:px(east)})&&handle.w.css({top:px(midvert)})&&handle.s.css({top:px(south),left:px(midhoriz)})&&handle.n.css({left:px(midhoriz)});"ne" in handle&&handle.ne.css({left:px(east)})&&handle.se.css({top:px(south),left:px(east)})&&handle.sw.css({top:px(south)});"b" in handle&&handle.b.css({top:px(south)})&&handle.r.css({left:px(east)})}function moveto(x,y){$img2.css({top:px(-y),left:px(-x)});$sel.css({top:px(y),left:px(x)})}function resize(w,h){$sel.width(w).height(h)}function refresh(){var c=Coords.getFixed();Coords.setPressed([c.x,c.y]);Coords.setCurrent([c.x2,c.y2]);updateVisible()}function updateVisible(){if(awake){return update()}}function update(){var c=Coords.getFixed();resize(c.w,c.h);moveto(c.x,c.y);options.drawBorders&&borders["right"].css({left:px(c.w-1)})&&borders["bottom"].css({top:px(c.h-1)});seehandles&&moveHandles(c);awake||show();options.onChange(unscale(c))}function show(){$sel.show();$img.css("opacity",options.bgOpacity);awake=true}function release(){disableHandles();$sel.hide();$img.css("opacity",1);awake=false}function showHandles(){if(seehandles){moveHandles(Coords.getFixed());$hdl_holder.show()}}function enableHandles(){seehandles=true;if(options.allowResize){moveHandles(Coords.getFixed());$hdl_holder.show();return true}}function disableHandles(){seehandles=false;$hdl_holder.hide()}function animMode(v){(animating=v)?disableHandles():enableHandles()}function done(){animMode(false);refresh()}var $track=newTracker().mousedown(createDragger("move")).css({cursor:"move",position:"absolute",zIndex:360}); +$img_holder.append($track);disableHandles();return{updateVisible:updateVisible,update:update,release:release,refresh:refresh,setCursor:function(cursor){$track.css("cursor",cursor)},enableHandles:enableHandles,enableOnly:function(){seehandles=true},showHandles:showHandles,disableHandles:disableHandles,animMode:animMode,done:done}}();var Tracker=function(){var onMove=function(){},onDone=function(){},trackDoc=options.trackDocument;if(!trackDoc){$trk.mousemove(trackMove).mouseup(trackUp).mouseout(trackUp)}function toFront(){$trk.css({zIndex:450});if(trackDoc){$(document).mousemove(trackMove).mouseup(trackUp)}}function toBack(){$trk.css({zIndex:290});if(trackDoc){$(document).unbind("mousemove",trackMove).unbind("mouseup",trackUp)}}function trackMove(e){onMove(mouseAbs(e))}function trackUp(e){e.preventDefault();e.stopPropagation();if(btndown){btndown=false;onDone(mouseAbs(e));options.onSelect(unscale(Coords.getFixed()));toBack();onMove=function(){};onDone=function(){}}return false}function activateHandlers(move,done){btndown=true;onMove=move;onDone=done;toFront();return false}function setCursor(t){$trk.css("cursor",t)}$img.before($trk);return{activateHandlers:activateHandlers,setCursor:setCursor}}();var KeyManager=function(){var $keymgr=$('').css({position:"absolute",left:"-30px"}).keypress(parseKey).blur(onBlur),$keywrap=$("
    ").css({position:"absolute",overflow:"hidden"}).append($keymgr);function watchKeys(){if(options.keySupport){$keymgr.show();$keymgr.focus()}}function onBlur(e){$keymgr.hide()}function doNudge(e,x,y){if(options.allowMove){Coords.moveOffset([x,y]);Selection.updateVisible()}e.preventDefault();e.stopPropagation()}function parseKey(e){if(e.ctrlKey){return true}shift_down=e.shiftKey?true:false;var nudge=shift_down?10:1;switch(e.keyCode){case 37:doNudge(e,-nudge,0);break;case 39:doNudge(e,nudge,0);break;case 38:doNudge(e,0,-nudge);break;case 40:doNudge(e,0,nudge);break;case 27:Selection.release();break;case 9:return true}return nothing(e) +}if(options.keySupport){$keywrap.insertBefore($img)}return{watchKeys:watchKeys}}();function px(n){return""+parseInt(n)+"px"}function pct(n){return""+parseInt(n)+"%"}function cssClass(cl){return options.baseClass+"-"+cl}function getPos(obj){var pos=$(obj).offset();return[pos.left,pos.top]}function mouseAbs(e){return[(e.pageX-docOffset[0]),(e.pageY-docOffset[1])]}function myCursor(type){if(type!=lastcurs){Tracker.setCursor(type);lastcurs=type}}function startDragMode(mode,pos){docOffset=getPos($img);Tracker.setCursor(mode=="move"?mode:mode+"-resize");if(mode=="move"){return Tracker.activateHandlers(createMover(pos),doneSelect)}var fc=Coords.getFixed();var opp=oppLockCorner(mode);var opc=Coords.getCorner(oppLockCorner(opp));Coords.setPressed(Coords.getCorner(opp));Coords.setCurrent(opc);Tracker.activateHandlers(dragmodeHandler(mode,fc),doneSelect)}function dragmodeHandler(mode,f){return function(pos){if(!options.aspectRatio){switch(mode){case"e":pos[1]=f.y2;break;case"w":pos[1]=f.y2;break;case"n":pos[0]=f.x2;break;case"s":pos[0]=f.x2;break}}else{switch(mode){case"e":pos[1]=f.y+1;break;case"w":pos[1]=f.y+1;break;case"n":pos[0]=f.x+1;break;case"s":pos[0]=f.x+1;break}}Coords.setCurrent(pos);Selection.update()}}function createMover(pos){var lloc=pos;KeyManager.watchKeys();return function(pos){Coords.moveOffset([pos[0]-lloc[0],pos[1]-lloc[1]]);lloc=pos;Selection.update()}}function oppLockCorner(ord){switch(ord){case"n":return"sw";case"s":return"nw";case"e":return"nw";case"w":return"ne";case"ne":return"sw";case"nw":return"se";case"se":return"nw";case"sw":return"ne"}}function createDragger(ord){return function(e){if(options.disabled){return false}if((ord=="move")&&!options.allowMove){return false}btndown=true;startDragMode(ord,mouseAbs(e));e.stopPropagation();e.preventDefault();return false}}function presize($obj,w,h){var nw=$obj.width(),nh=$obj.height();if((nw>w)&&w>0){nw=w;nh=(w/$obj.width())*$obj.height()}if((nh>h)&&h>0){nh=h;nw=(h/$obj.height())*$obj.width()}xscale=$obj.width()/nw; +yscale=$obj.height()/nh;$obj.width(nw).height(nh)}function unscale(c){return{x:parseInt(c.x*xscale),y:parseInt(c.y*yscale),x2:parseInt(c.x2*xscale),y2:parseInt(c.y2*yscale),w:parseInt(c.w*xscale),h:parseInt(c.h*yscale)}}function doneSelect(pos){var c=Coords.getFixed();if(c.w>options.minSelect[0]&&c.h>options.minSelect[1]){Selection.enableHandles();Selection.done()}else{Selection.release()}Tracker.setCursor(options.allowSelect?"crosshair":"default")}function newSelection(e){if(options.disabled){return false}if(!options.allowSelect){return false}btndown=true;docOffset=getPos($img);Selection.disableHandles();myCursor("crosshair");var pos=mouseAbs(e);Coords.setPressed(pos);Tracker.activateHandlers(selectDrag,doneSelect);KeyManager.watchKeys();Selection.update();e.stopPropagation();e.preventDefault();return false}function selectDrag(pos){Coords.setCurrent(pos);Selection.update()}function newTracker(){var trk=$("
    ").addClass(cssClass("tracker"));$.browser.msie&&trk.css({opacity:0,backgroundColor:"white"});return trk}function animateTo(a){var x1=a[0]/xscale,y1=a[1]/yscale,x2=a[2]/xscale,y2=a[3]/yscale;if(animating){return}var animto=Coords.flipCoords(x1,y1,x2,y2);var c=Coords.getFixed();var animat=initcr=[c.x,c.y,c.x2,c.y2];var interv=options.animationDelay;var x=animat[0];var y=animat[1];var x2=animat[2];var y2=animat[3];var ix1=animto[0]-initcr[0];var iy1=animto[1]-initcr[1];var ix2=animto[2]-initcr[2];var iy2=animto[3]-initcr[3];var pcent=0;var velocity=options.swingSpeed;Selection.animMode(true);var animator=function(){return function(){pcent+=(100-pcent)/velocity;animat[0]=x+((pcent/100)*ix1);animat[1]=y+((pcent/100)*iy1);animat[2]=x2+((pcent/100)*ix2);animat[3]=y2+((pcent/100)*iy2);if(pcent<100){animateStart()}else{Selection.done()}if(pcent>=99.8){pcent=100}setSelectRaw(animat)}}();function animateStart(){window.setTimeout(animator,interv)}animateStart()}function setSelect(rect){setSelectRaw([rect[0]/xscale,rect[1]/yscale,rect[2]/xscale,rect[3]/yscale])}function setSelectRaw(l){Coords.setPressed([l[0],l[1]]); +Coords.setCurrent([l[2],l[3]]);Selection.update()}function setOptions(opt){if(typeof(opt)!="object"){opt={}}options=$.extend(options,opt);if(typeof(options.onChange)!=="function"){options.onChange=function(){}}if(typeof(options.onSelect)!=="function"){options.onSelect=function(){}}}function tellSelect(){return unscale(Coords.getFixed())}function tellScaled(){return Coords.getFixed()}function setOptionsNew(opt){setOptions(opt);interfaceUpdate()}function disableCrop(){options.disabled=true;Selection.disableHandles();Selection.setCursor("default");Tracker.setCursor("default")}function enableCrop(){options.disabled=false;interfaceUpdate()}function cancelCrop(){Selection.done();Tracker.activateHandlers(null,null)}function destroy(){$div.remove();$origimg.show()}function interfaceUpdate(alt){options.allowResize?alt?Selection.enableOnly():Selection.enableHandles():Selection.disableHandles();Tracker.setCursor(options.allowSelect?"crosshair":"default");Selection.setCursor(options.allowMove?"move":"default");$div.css("backgroundColor",options.bgColor);if("setSelect" in options){setSelect(opt.setSelect);Selection.done();delete (options.setSelect)}if("trueSize" in options){xscale=options.trueSize[0]/boundx;yscale=options.trueSize[1]/boundy}xlimit=options.maxSize[0]||0;ylimit=options.maxSize[1]||0;xmin=options.minSize[0]||0;ymin=options.minSize[1]||0;if("outerImage" in options){$img.attr("src",options.outerImage);delete (options.outerImage)}Selection.refresh()}$hdl_holder.hide();interfaceUpdate(true);var api={animateTo:animateTo,setSelect:setSelect,setOptions:setOptionsNew,tellSelect:tellSelect,tellScaled:tellScaled,disable:disableCrop,enable:enableCrop,cancel:cancelCrop,focus:KeyManager.watchKeys,getBounds:function(){return[boundx*xscale,boundy*yscale]},getWidgetSize:function(){return[boundx,boundy]},release:Selection.release,destroy:destroy};$origimg.data("Jcrop",api);return api};$.fn.Jcrop=function(options){function attachWhenDone(from){var loadsrc=options.useImg||from.src;var img=new Image(); +img.onload=function(){$.Jcrop(from,options)};img.src=loadsrc}if(typeof(options)!=="object"){options={}}this.each(function(){if($(this).data("Jcrop")){if(options=="api"){return $(this).data("Jcrop")}else{$(this).data("Jcrop").setOptions(options)}}else{attachWhenDone(this)}});return this}})(jQuery);(function($,undefined){$.fn.zyPopup=function(options,param){var otherArgs=Array.prototype.slice.call(arguments,1);if(typeof options=="string"){var fn=this[0][options];if($.isFunction(fn)){return fn.apply(this,otherArgs)}else{throw ("zyPopup - No such method: "+options)}}return this.each(function(){var para={};var self=this;var zoom="",zoomContent="",zoomedIn=false,openedImage=null,windowWidth="",windowHeight="";var tailorVal={};var defaults={src:"",index:0,name:"",onTailor:function(val){}};para=$.extend(defaults,options);this.init=function(){this.createHtml();this.openPopup();this.bindPopupEvent()};this.createHtml=function(){$("#zoom").remove();$("body").append('
    ');zoom=$("#zoom").hide(),zoomContent=$("#zoom .content"),zoomedIn=false,openedImage=null,windowWidth=$(window).width(),windowHeight=$(window).height()};this.openPopup=function(){var self=this;var image=$(new Image()).attr("id","tailorImg").hide();$("#zoom .previous, #zoom .next").show();if(!zoomedIn){zoomedIn=true;zoom.show();$("body").addClass("zoomed")}zoomContent.html(image).delay(500).addClass("loading");image.load(render).attr("src",para.src);function render(){var image=$(this),borderWidth=parseInt(zoomContent.css("borderLeftWidth")),maxImageWidth=windowWidth-(borderWidth*2),maxImageHeight=windowHeight-(borderWidth*2),imageWidth=image.width(),imageHeight=image.height();if(imageWidth==zoomContent.width()&&imageWidth<=maxImageWidth&&imageHeight==zoomContent.height()&&imageHeight<=maxImageHeight){show(image);return}zoomContent.animate({width:image.width(),height:image.height(),marginTop:-(image.height()/2)-borderWidth,marginLeft:-(image.width()/2)-borderWidth},200,function(){show(image) +});function show(image){image.show();zoomContent.removeClass("loading");self.createTailorPlug()}}};this.createTailorPlug=function(){var width=$("#tailorImg").width();var height=$("#tailorImg").height();var x1=(width/2)-(width/5);var y1=(height/2)-(height/5);var x2=(width/2)+(width/5);var y2=(height/2)+(height/5);var api=$.Jcrop("#tailorImg",{setSelect:[x1,y1,x2,y2],onChange:setCoords,onSelect:setCoords});function setCoords(obj){tailorVal={"leftX":obj.x,"leftY":obj.y,"rightX":obj.x2,"rightY":obj.y2,"width":obj.w,"height":obj.h}}};this.bindPopupEvent=function(){var self=this;zoom.bind("click",function(event){event.preventDefault();if($(event.target).attr("id")=="zoom"){self.closePopup(event)}});$("#zoom .finish").bind("click",function(event){var quondamImgInfo=new Object();quondamImgInfo["width"]=$(".jcrop-holder>div>div>img").width();quondamImgInfo["height"]=$(".jcrop-holder>div>div>img").height();para.onTailor(tailorVal,quondamImgInfo);self.closePopup(event)});$("#zoom .close").bind("click",function(event){self.closePopup(event)})};this.closePopup=function(event){if(event){event.preventDefault()}zoomedIn=false;openedImage=null;zoom.hide();$("body").removeClass("zoomed");zoomContent.empty()};this.init()})}})(jQuery);var ZYFILE={fileInput:null,uploadInput:null,dragDrop:null,url:"",uploadFile:[],lastUploadFile:[],perUploadFile:[],fileNum:0,filterFile:function(files){return files},onSelect:function(selectFile,files){},onDelete:function(file,files){},onProgress:function(file,loaded,total){},onSuccess:function(file,responseInfo){},onFailure:function(file,responseInfo){},onComplete:function(responseInfo){},funDragHover:function(e){e.stopPropagation();e.preventDefault();this[e.type==="dragover"?"onDragOver":"onDragLeave"].call(e.target);return this},funGetFiles:function(e){var self=this;this.funDragHover(e);var files=e.target.files||e.dataTransfer.files;self.lastUploadFile=this.uploadFile;this.uploadFile=this.uploadFile.concat(this.filterFile(files));var tmpFiles=[];var lArr=[]; +var uArr=[];$.each(self.lastUploadFile,function(k,v){lArr.push(v.name)});$.each(self.uploadFile,function(k,v){uArr.push(v.name)});$.each(uArr,function(k,v){if($.inArray(v,lArr)<0){tmpFiles.push(self.uploadFile[k])}});this.uploadFile=tmpFiles;this.funDealtFiles();return true},funDealtFiles:function(){var self=this;$.each(this.uploadFile,function(k,v){v.index=self.fileNum;self.fileNum++});var selectFile=this.uploadFile;this.perUploadFile=this.perUploadFile.concat(this.uploadFile);this.uploadFile=this.lastUploadFile.concat(this.uploadFile);this.onSelect(selectFile,this.uploadFile);console.info("继续选择");console.info(this.uploadFile);return this},funDeleteFile:function(delFileIndex,isCb){var self=this;var tmpFile=[];var delFile=this.perUploadFile[delFileIndex];$.each(this.uploadFile,function(k,v){if(delFile!=v){tmpFile.push(v)}});this.uploadFile=tmpFile;if(isCb){self.onDelete(delFile,this.uploadFile)}console.info("还剩这些文件没有上传:");console.info(this.uploadFile);return true},funUploadFiles:function(){var self=this;$.each(this.uploadFile,function(k,v){self.funUploadFile(v)})},funUploadFile:function(file){var self=this;var formdata=new FormData();formdata.append("file",file);if($("#uploadTailor_"+file.index).length>0){formdata.append("tailor",$("#uploadTailor_"+file.index).attr("tailor"))}var xhr=new XMLHttpRequest();xhr.upload.addEventListener("progress",function(e){self.onProgress(file,e.loaded,e.total)},false);xhr.addEventListener("load",function(e){self.funDeleteFile(file.index,false);self.onSuccess(file,xhr.responseText);if(self.uploadFile.length==0){self.onComplete("全部完成")}},false);xhr.addEventListener("error",function(e){self.onFailure(file,xhr.responseText)},false);xhr.open("POST",self.url,true);xhr.send(formdata)},funReturnNeedFiles:function(){return this.uploadFile},init:function(){var self=this;if(this.dragDrop){this.dragDrop.addEventListener("dragover",function(e){self.funDragHover(e)},false);this.dragDrop.addEventListener("dragleave",function(e){self.funDragHover(e)},false); +this.dragDrop.addEventListener("drop",function(e){self.funGetFiles(e)},false)}if(self.fileInput){this.fileInput.addEventListener("change",function(e){self.funGetFiles(e)},false)}if(self.uploadInput){this.uploadInput.addEventListener("click",function(e){self.funUploadFiles(e)},false)}}};(function($,undefined){$.fn.zyUpload=function(options,param){var otherArgs=Array.prototype.slice.call(arguments,1);if(typeof options=="string"){var fn=this[0][options];if($.isFunction(fn)){return fn.apply(this,otherArgs)}else{throw ("zyUpload - No such method: "+options)}}return this.each(function(){var para={};var self=this;var defaults={width:"700px",height:"400px",itemWidth:"140px",itemHeight:"120px",url:"/upload/UploadAction",fileType:[],fileSize:51200000,multiple:true,dragDrop:true,tailor:false,del:true,finishDel:false,onSelect:function(selectFiles,allFiles){},onDelete:function(file,files){},onSuccess:function(file,response){},onFailure:function(file,response){},onComplete:function(response){}};para=$.extend(defaults,options);this.init=function(){this.createHtml();this.createCorePlug()};this.createHtml=function(){var multiple="";para.multiple?multiple="multiple":multiple="";var html="";if(para.dragDrop){html+='
    ';html+='
    ';html+='
    ';html+='
    ';html+='
    ';html+='
    ';html+='
    点击选择文件
    ';html+=' ";html+="
    ";html+="
    ";html+=' 或者将文件拖到此处';html+="
    ";html+='
    ';html+='
    选中0张文件,共0B。
    ';html+='
    ';html+='
    继续选择
    ';html+='
    开始上传
    '; +html+="
    ";html+="
    ";html+='
    ';html+="
    ";html+='
    ';html+=' ';html+="
    ";html+='
    ';html+="
    ";html+="
    "}else{var imgWidth=parseInt(para.itemWidth.replace("px",""))-15;html+='
    ';html+='
    ';html+='
    ';html+='
    ';html+='
    选中0张文件,共0B。
    ';html+='
    ';html+=' ";html+='
    选择文件
    ';html+='
    开始上传
    ';html+="
    ";html+="
    ";html+='
    ';html+=' ";html+="
    ";html+="
    ";html+='
    ';html+=' ';html+="
    ";html+='
    ';html+="
    ";html+="
    "}$(self).append(html).css({"width":para.width,"height":para.height});this.addEvent()};this.funSetStatusInfo=function(files){var size=0;var num=files.length;$.each(files,function(k,v){size+=v.size});if(size>1024*1024){size=(Math.round(size*100/(1024*1024))/100).toString()+"MB" +}else{size=(Math.round(size*100/1024)/100).toString()+"KB"}$("#status_info").html("选中"+num+"张文件,共"+size+"。")};this.funFilterEligibleFile=function(files){var arrFiles=[];for(var i=0,file;file=files[i];i++){var newStr=file.name.split("").reverse().join("");if(newStr.split(".")[0]!=null){var type=newStr.split(".")[0].split("").reverse().join("");if(jQuery.inArray(type,para.fileType)>-1){if(file.size>=para.fileSize){alert('您这个"'+file.name+'"文件大小过大')}else{arrFiles.push(file)}}else{alert('您这个"'+file.name+'"上传类型不符合')}}else{alert('您这个"'+file.name+'"没有类型, 无法识别')}}return arrFiles};this.funDisposePreviewHtml=function(file,e){var html="";var imgWidth=parseInt(para.itemWidth.replace("px",""))-15;var imgHeight=parseInt(para.itemHeight.replace("px",""))-10;var editHtml="";var delHtml="";if(para.tailor){editHtml=''}if(para.del){delHtml=''}var newStr=file.name.split("").reverse().join("");var type=newStr.split(".")[0].split("").reverse().join("");var fileImgSrc="zyupload/skins/images/fileType/";if(type=="rar"){fileImgSrc=fileImgSrc+"rar.png"}else{if(type=="zip"){fileImgSrc=fileImgSrc+"zip.png"}else{if(type=="txt"){fileImgSrc=fileImgSrc+"txt.png"}else{if(type=="ppt"){fileImgSrc=fileImgSrc+"ppt.png"}else{if(type=="xls"){fileImgSrc=fileImgSrc+"xls.png"}else{if(type=="pdf"){fileImgSrc=fileImgSrc+"pdf.png"}else{if(type=="psd"){fileImgSrc=fileImgSrc+"psd.png"}else{if(type=="ttf"){fileImgSrc=fileImgSrc+"ttf.png"}else{if(type=="swf"){fileImgSrc=fileImgSrc+"swf.png"}else{fileImgSrc=fileImgSrc+"file.png"}}}}}}}}}if(file.type.indexOf("image")==0){html+='
    ';html+='
    ';html+='
    ';html+='

    '+file.name+"

    ";html+=editHtml;html+=delHtml;html+="
    ";html+="
    ";html+=' '; +html+='
    ';html+=' ';html+="
    ";html+="
    ";html+='

    ';html+='

    上传失败,请重试

    ';html+='

    裁剪完成

    ';html+='

    ';html+="
    "}else{html+='
    ';html+='
    ';html+='
    ';html+='

    '+file.name+"

    ";html+=delHtml;html+="
    ";html+="
    ";html+=' ';html+='
    ';html+=' ';html+="
    ";html+="
    ";html+='

    ';html+='

    上传失败,请重试

    ';html+='

    ';html+="
    "}return html};this.createPopupPlug=function(imgSrc,index,name){$("body").zyPopup({src:imgSrc,index:index,name:name,onTailor:function(val,quondamImgInfo){var nWidth=parseInt(para.itemWidth.replace("px",""));var nHeight=parseInt(para.itemHeight.replace("px",""));var qWidth=val.width;var qHeight=val.height;var ratio=nWidth/qWidth;var width=ratio*quondamImgInfo.width;var height=ratio*quondamImgInfo.height;var left=val.leftX*ratio;var top=val.rightY*ratio-qHeight*ratio;$("#uploadImage_"+index).css({"width":width,"height":height,"margin-left":-left,"margin-top":-top}); +$("#uploadTailor_"+index).show();console.info(val);var tailor="{'leftX':"+val.leftX+",'leftY':"+val.leftY+",'rightX':"+val.rightX+",'rightY':"+val.rightY+",'width':"+val.width+",'height':"+val.height+"}";$("#uploadTailor_"+index).attr("tailor",tailor)}})};this.createCorePlug=function(){var params={fileInput:$("#fileImage").get(0),uploadInput:$("#fileSubmit").get(0),dragDrop:$("#fileDragArea").get(0),url:$("#uploadForm").attr("action"),filterFile:function(files){return self.funFilterEligibleFile(files)},onSelect:function(selectFiles,allFiles){para.onSelect(selectFiles,allFiles);self.funSetStatusInfo(ZYFILE.funReturnNeedFiles());var html="",i=0;var funDealtPreviewHtml=function(){file=selectFiles[i];if(file){var reader=new FileReader();reader.onload=function(e){html+=self.funDisposePreviewHtml(file,e);i++;funDealtPreviewHtml()};reader.readAsDataURL(file)}else{funAppendPreviewHtml(html)}};var funAppendPreviewHtml=function(html){if(para.dragDrop){$("#preview").append(html)}else{$(".add_upload").before(html)}funBindDelEvent();funBindHoverEvent()};var funBindDelEvent=function(){if($(".file_del").length>0){$(".file_del").click(function(){ZYFILE.funDeleteFile(parseInt($(this).attr("data-index")),true);return false})}if($(".file_edit").length>0){$(".file_edit").click(function(){var imgIndex=$(this).attr("data-index");var imgName=$(this).prev(".file_name").attr("title");var imgSrc=$("#uploadImage_"+imgIndex).attr("src");self.createPopupPlug(imgSrc,imgIndex,imgName);return false})}};var funBindHoverEvent=function(){$(".upload_append_list").hover(function(e){$(this).find(".file_bar").addClass("file_hover")},function(e){$(this).find(".file_bar").removeClass("file_hover")})};funDealtPreviewHtml()},onDelete:function(file,files){para.onDelete(file,files);$("#uploadList_"+file.index).fadeOut();self.funSetStatusInfo(files);console.info("剩下的文件");console.info(files)},onProgress:function(file,loaded,total){var eleProgress=$("#uploadProgress_"+file.index),percent=(loaded/total*100).toFixed(2)+"%"; +if(eleProgress.is(":hidden")){eleProgress.show()}eleProgress.css("width",percent)},onSuccess:function(file,response){para.onSuccess(file,response);$("#uploadProgress_"+file.index).hide();$("#uploadSuccess_"+file.index).show();if(para.finishDel){$("#uploadList_"+file.index).fadeOut();self.funSetStatusInfo(ZYFILE.funReturnNeedFiles())}if($("#uploadTailor_"+file.index).length>0){$("#uploadTailor_"+file.index).hide()}},onFailure:function(file,response){para.onFailure(file,response);$("#uploadProgress_"+file.index).hide();$("#uploadSuccess_"+file.index).show();if($("#uploadTailor_"+file.index).length>0){$("#uploadTailor_"+file.index).hide()}$("#uploadInf").append("

    文件"+file.name+"上传失败!

    ")},onComplete:function(response){para.onComplete(response);console.info(response)},onDragOver:function(){$(this).addClass("upload_drag_hover")},onDragLeave:function(){$(this).removeClass("upload_drag_hover")}};ZYFILE=$.extend(ZYFILE,params);ZYFILE.init()};this.addEvent=function(){if($(".filePicker").length>0){$(".filePicker").bind("click",function(e){$("#fileImage").click()})}$(".webuploader_pick").bind("click",function(e){$("#fileImage").click()});$(".upload_btn").bind("click",function(e){if(ZYFILE.funReturnNeedFiles().length>0){$("#fileSubmit").click()}else{alert("请先选中文件再点击上传")}});if($("#rapidAddImg").length>0){$("#rapidAddImg").bind("click",function(e){$("#fileImage").click()})}};this.init()})}})(jQuery); diff --git a/src/main/resources/static/js/jquery.js b/src/main/resources/static/js/jquery.js new file mode 100644 index 0000000..07c00cd --- /dev/null +++ b/src/main/resources/static/js/jquery.js @@ -0,0 +1,2 @@ +/*! jQuery v3.4.1 | (c) JS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],E=C.document,r=Object.getPrototypeOf,s=t.slice,g=t.concat,u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},x=function(e){return null!=e&&e===e.window},c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.4.1",k=function(e,t){return new k.fn.init(e,t)},p=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;function d(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp($),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+$),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","ig"),ne=function(e,t,n){var r="0x"+t-65536;return r!=r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(m.childNodes),m.childNodes),t[m.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&((e?e.ownerDocument||e:m)!==C&&T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!A[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&U.test(t)){(s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=k),o=(l=h(t)).length;while(o--)l[o]="#"+s+" "+xe(l[o]);c=l.join(","),f=ee.test(t)&&ye(e.parentNode)||e}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){A(t,!0)}finally{s===k&&e.removeAttribute("id")}}}return g(t.replace(B,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[k]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e.namespaceURI,n=(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:m;return r!==C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),m!==C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=k,!C.getElementsByName||!C.getElementsByName(k).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+k+"-]").length||v.push("~="),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+k+"+*").length||v.push(".#.+[+~]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",$)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e===C||e.ownerDocument===m&&y(m,e)?-1:t===C||t.ownerDocument===m&&y(m,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e===C?-1:t===C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]===m?-1:s[r]===m?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if((e.ownerDocument||e)!==C&&T(e),d.matchesSelector&&E&&!A[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){A(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=p[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&p(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?k.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?k.grep(e,function(e){return e===n!==r}):"string"!=typeof n?k.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(k.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||q,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:L.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof k?t[0]:t,k.merge(this,k.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),D.test(r[1])&&k.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(k):k.makeArray(e,this)}).prototype=k.fn,q=k(E);var H=/^(?:parents|prev(?:Until|All))/,O={children:!0,contents:!0,next:!0,prev:!0};function P(e,t){while((e=e[t])&&1!==e.nodeType);return e}k.fn.extend({has:function(e){var t=k(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i,ge={option:[1,""],thead:[1,"","
    "],col:[2,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?k.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;nx",y.noCloneChecked=!!me.cloneNode(!0).lastChild.defaultValue;var Te=/^key/,Ce=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ee=/^([^.]*)(?:\.(.+)|)/;function ke(){return!0}function Se(){return!1}function Ne(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function Ae(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)Ae(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Se;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return k().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=k.guid++)),e.each(function(){k.event.add(this,t,i,r,n)})}function De(e,i,o){o?(Q.set(e,i,!1),k.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Q.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(k.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Q.set(this,i,r),t=o(this,i),this[i](),r!==(n=Q.get(this,i))||t?Q.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n.value}else r.length&&(Q.set(this,i,{value:k.event.trigger(k.extend(r[0],k.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Q.get(e,i)&&k.event.add(e,i,ke)}k.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.get(t);if(v){n.handler&&(n=(o=n).handler,i=o.selector),i&&k.find.matchesSelector(ie,i),n.guid||(n.guid=k.guid++),(u=v.events)||(u=v.events={}),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof k&&k.event.triggered!==e.type?k.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(R)||[""]).length;while(l--)d=g=(s=Ee.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=k.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=k.event.special[d]||{},c=k.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&k.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),k.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.hasData(e)&&Q.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(R)||[""]).length;while(l--)if(d=g=(s=Ee.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=k.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||k.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)k.event.remove(e,d+t[l],n,r,!0);k.isEmptyObject(u)&&Q.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=k.event.fix(e),u=new Array(arguments.length),l=(Q.get(this,"events")||{})[s.type]||[],c=k.event.special[s.type]||{};for(u[0]=s,t=1;t\x20\t\r\n\f]*)[^>]*)\/>/gi,qe=/\s*$/g;function Oe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&k(e).children("tbody")[0]||e}function Pe(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Re(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Me(e,t){var n,r,i,o,a,s,u,l;if(1===t.nodeType){if(Q.hasData(e)&&(o=Q.access(e),a=Q.set(t,o),l=o.events))for(i in delete a.handle,a.events={},l)for(n=0,r=l[i].length;n")},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=oe(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||k.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var Vt,Gt=[],Yt=/(=)\?(?=&|$)|\?\?/;k.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Gt.pop()||k.expando+"_"+kt++;return this[e]=!0,e}}),k.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Yt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Yt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Yt,"$1"+r):!1!==e.jsonp&&(e.url+=(St.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||k.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?k(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Gt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Vt=E.implementation.createHTMLDocument("").body).innerHTML="
    ",2===Vt.childNodes.length),k.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=D.exec(e))?[t.createElement(i[1])]:(i=we([e],t,o),o&&o.length&&k(o).remove(),k.merge([],i.childNodes)));var r,i,o},k.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(k.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},k.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){k.fn[t]=function(e){return this.on(t,e)}}),k.expr.pseudos.animated=function(t){return k.grep(k.timers,function(e){return t===e.elem}).length},k.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=k.css(e,"position"),c=k(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=k.css(e,"top"),u=k.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,k.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},k.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){k.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===k.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===k.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=k(e).offset()).top+=k.css(e,"borderTopWidth",!0),i.left+=k.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-k.css(r,"marginTop",!0),left:t.left-i.left-k.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===k.css(e,"position"))e=e.offsetParent;return e||ie})}}),k.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;k.fn[t]=function(e){return _(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),k.each(["top","left"],function(e,n){k.cssHooks[n]=ze(y.pixelPosition,function(e,t){if(t)return t=_e(e,n),$e.test(t)?k(e).position()[n]+"px":t})}),k.each({Height:"height",Width:"width"},function(a,s){k.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){k.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return _(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?k.css(e,t,i):k.style(e,t,n,i)},s,n?e:void 0,n)}})}),k.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){k.fn[n]=function(e,t){return 0.layui-tab { + margin: 0; + box-shadow: none; + border: none; +} + +/* 表达式 */ +.cron-title { + font-weight: 700; + font-size: 14px; + margin: 10px; + margin-bottom: 0; +} + +.cron-box { + margin: 10px; +} + +.cron-box+.cron-box { + margin-top: 0; +} + +/* 按钮 */ +.cron-footer-btns { + text-align: right; +} + +.cron-footer-btns span { + height: 26px; + line-height: 26px; + margin: 0 0 0 -1px; + padding: 0 10px; + border: 1px solid #C9C9C9; + background-color: #fff; + white-space: nowrap; + vertical-align: top; + border-radius: 2px; + display: inline-block; + cursor: pointer; + font-size: 12px; + box-sizing: border-box; + color: #666; +} + +.cron-footer-btns span:hover { + color: #5FB878; +} + + +/* 表单 */ +.layui-cron .layui-form-radio { + margin-right: 0; +} + +.cron-form { + line-height: 28px; + font-size: 14px; +} + +.cron-input-mid { + display: inline-block; + vertical-align: middle; + margin-top: 6px; + background-color: #e5e5e5; + padding: 0 12px; + height: 28px; + line-height: 28px; + border: 1px solid #ccc; + box-sizing: border-box; +} + +.cron-input { + display: inline-block; + vertical-align: middle; + margin-top: 6px; + padding: 0 8px; + background-color: #fff; + border: 1px solid #ccc; + height: 28px; + line-height: 28px; + box-sizing: border-box; + width: 80px; + -webkit-transition: border-color ease-in-out .15s, -webkit-box-shadow ease-in-out .15s; + -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; + transition: border-color ease-in-out .15s, -webkit-box-shadow ease-in-out .15s; + transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; + transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s, -webkit-box-shadow ease-in-out .15s; +} + +.cron-input:focus { + outline: 0; + border: 1px solid #01AAED; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 4px 0px #01AAED; + translate: 1s; +} + +.layui-cron .layui-form-checkbox[lay-skin="primary"] span { + padding-right: 10px; + min-width: 16px; +} + +.layui-cron .layui-form-checkbox[lay-skin="primary"] { + padding-left: 22px; + margin-top: 5px; +} +.layui-cron input[type=number] { + -moz-appearance:textfield; +} +.layui-cron input[type=number]::-webkit-inner-spin-button, +.layui-cron input[type=number]::-webkit-outer-spin-button { + -webkit-appearance: none; + margin: 0; +} +.cron-tips{ + color: grey; + line-height: 28px; + height: 28px; + display: inline-block; + vertical-align: middle; + margin-top: 8px; + margin-left: 5px; +} \ No newline at end of file diff --git a/src/main/resources/static/layui-ext/cron/cron.js b/src/main/resources/static/layui-ext/cron/cron.js new file mode 100644 index 0000000..29ee42b --- /dev/null +++ b/src/main/resources/static/layui-ext/cron/cron.js @@ -0,0 +1,1137 @@ +/** + @ Name:layui.cron Cron表达式解析器 + @ Author:贝哥哥 + @ License:MIT + */ + +layui.define(["form"], function (exports) { + //假如该组件依赖 layui.form + var $ = layui.$, + form = layui.form, + //字符常量 + MOD_NAME = "cron", + ELEM = ".layui-cron", + //外部接口 + cron = { + v: "1.0.0", + index: layui.cron ? layui.cron.index + 10000 : 0, + + //设置全局项 + set: function (options) { + var that = this; + that.config = $.extend({}, that.config, options); + return that; + }, + + //事件监听 + on: function (events, callback) { + return layui.onevent.call(this, MOD_NAME, events, callback); + }, + //主体CSS等待事件 + ready: function (fn) { + var cssPath = layui.cache.base + "cron/cron.css?v=" + cron.v; + layui.link(cssPath, fn, "cron"); //此处的“cron”要对应 cron.css 中的样式: html #layuicss-cron{} + return this; + }, + }, + // 返回当前实例 + thisIns = function () { + var that = this, + options = that.config, + id = options.id || options.index; + return { + reload: function (options) { + that.reload.call(that, options); + }, + config: options, + }; + }, + //构造器 + Class = function (options) { + var that = this; + that.index = ++cron.index; + that.config = $.extend({}, that.config, cron.config, options); + cron.ready(function () { + that.init(); + }); + }; + + //默认配置 + Class.prototype.config = { + value: "* * * * * ?", // 当前表达式值,每秒执行一次 + lang: "cn", //语言,只支持cn/en,即中文和英文 + trigger: "focus", //呼出控件的事件 + done: null, //控件选择完毕后的回调,点击运行/确定也均会触发 + run: null, // 最近运行时间接口 + }; + + // 多语言 + Class.prototype.lang = function () { + var that = this, + options = that.config, + text = { + cn: { + tabs: ["秒", "分", "时", "日", "月", "周", "年"], + tools: { + confirm: "确定", + parse: "解析", + run: "运行", + }, + }, + en: { + tabs: [ + "Seconds", + "Minutes", + "Hours", + "Days", + "Months", + "Weeks", + "Years", + ], + weeks: ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"], + month: [ + "Jan", + "Feb", + "Mar", + "Apr", + "May", + "Jun", + "Jul", + "Aug", + "Sep", + "Oct", + "Nov", + "Dec", + ], + tools: { + confirm: "Confirm", + parse: "Parse", + run: "Run", + }, + }, + }; + return text[options.lang] || text["cn"]; + }; + + // 初始准备 + Class.prototype.init = function () { + var that = this, + options = that.config; + + that.$elem = $(options.elem); + options.elem = that.$elem[0]; + + if (!options.elem) return; + + options.value || (options.value = "* * * * * ?"); + + // 初始化表达式 + var arr = options.value.split(" "); + that.cron = []; + for (var i = 1; i <= 7; i++) { + if (i < 6) { + that.cron.push(arr[i - 1] || "*"); + } else if (i < 7) { + that.cron.push(arr[i - 1] || "?"); + } else { + that.cron.push(arr[i - 1] || ""); + } + } + + //如果不是input|textarea元素,则默认采用click事件 + if (!that.isInput(options.elem)) { + if (options.trigger === "focus") { + options.trigger = "click"; + } + } + + console.log("绑定事件."); + that.events(); + }; + + // 绑定的元素事件处理 + Class.prototype.events = function () { + var that = this, + options = that.config; + if (!options.elem || options.elem.eventHandler) return; + + // 绑定触发事件 + that.$elem.on(options.trigger, function () { + that.render(); + }); + + // 绑定关闭控件事件 + $(document) + .on("click", function (e) { + if ( + (that.elemCron && that.elemCron.contains(e.target)) || + e.target === options.elem + ) { + return; // 点击的是当前绑定元素或cron容器内的元素则不关闭 + } + that.remove(); + }) + .on("keydown", function (e) { + if (e.keyCode === 13) { + e.preventDefault(); + layer.msg("取消事件默认动作,点击确定按钮"); + // $(that.footer).find(ELEM_CONFIRM)[0].click(); + } + }); + + //自适应定位 + $(window).on("resize", function () { + if (!options.elem || !$(ELEM)[0]) { + return false; + } + that.position(); + }); + + options.elem.eventHandler = true; + }; + + // 渲染视图 + Class.prototype.render = function () { + var that = this, + options = that.config, + lang = that.lang(); + // that.remove(); + + var $elemCron = (that.$elemCron = $('
    ')), + // 主区域 + elemMain = [], // tabs容器 + elemSeconds = that.getSecondsElem(), // 秒 + elemMinutes = that.getMinutesElem(), // 分 + elemHours = that.getHoursElem(), // 时 + elemDays = that.getDaysElem(), // 日 + elemMonths = that.getMonthsElem(), // 月 + elemWeeks = that.getWeeksElem(), // 周 + elemYears = that.getYearsElem(); // 年 + + // 组装容器 + elemMain.push( + '
    ', + '
      ' + ); + layui.each(lang.tabs, function (i, tab) { + if (i == 0) { + elemMain.push('
    • ', tab, "
    • "); + } else { + elemMain.push("
    • ", tab, "
    • "); + } + }); + elemMain.push( + "
    ", + '
    ', + elemSeconds, + elemMinutes, + elemHours, + elemDays, + elemMonths, + elemWeeks, + elemYears, + "
    ", + "
    " + ); + $elemCron.append(elemMain.join("")); + + // 底部区域 + var elemFooter = [ + '
    最近运行时间
    ', + '
    ', + '
    ', + ]; + $elemCron.append(elemFooter.join("")); + + // 渲染 + $("body").append($elemCron); + that.elemCron = that.$elemCron[0]; + form.render(); + + // 定位 + that.position(); + + // 监听 + //点击底部按钮 + $elemCron.find(".cron-footer-btns span").on("click", function () { + var type = $(this).attr("lay-type"); + that.tool(this, type); + }); + }; + + // 渲染秒 + Class.prototype.getSecondsElem = function () { + var that = this, + options = that.config, + elem = [ + '
    ', + ]; + + var radio = ["", "", "", ""]; + val = ["", "", "", "", []]; + + if (that.cron[0] == "*") { + radio[0] = "checked"; + } else if (that.cron[0].split("-").length == 2) { + radio[1] = "checked"; + val[0] = that.cron[0].split("-")[0]; + val[1] = that.cron[0].split("-")[1]; + } else if (that.cron[0].split("/").length == 2) { + radio[2] = "checked"; + val[2] = that.cron[0].split("/")[0]; + val[3] = that.cron[0].split("/")[1]; + } else { + radio[3] = "checked"; + val[4] = that.cron[0].split(","); + } + + elem.push( + '
    ", + '
    ", + '
    ', + '
    -
    ', + '
    (0-59)
    ', + '
    ", + '
    ', + '
    秒开始,每
    ', + '
    秒执行一次
    (0/60)
    ', + '
    " + ); + elem.push("
    "); + for (var i = 0; i < 60; i++) { + elem.push( + ' -1 ? "checked" : "", + ">" + ); + } + elem.push("
    "); + + elem.push("
    "); + + return elem.join(""); + }; + + // 渲染分 + Class.prototype.getMinutesElem = function () { + var that = this, + options = that.config, + elem = [ + '
    ', + ]; + + var radio = ["", "", "", ""]; + val = ["", "", "", "", []]; + + if (that.cron[1] == "*") { + radio[0] = "checked"; + } else if (that.cron[1].split("-").length == 2) { + radio[1] = "checked"; + val[0] = that.cron[1].split("-")[0]; + val[1] = that.cron[1].split("-")[1]; + } else if (that.cron[1].split("/").length == 2) { + radio[2] = "checked"; + val[2] = that.cron[1].split("/")[0]; + val[3] = that.cron[1].split("/")[1]; + } else { + radio[3] = "checked"; + val[4] = that.cron[1].split(","); + } + + elem.push( + '
    ", + '
    ", + '
    ', + '
    -
    ', + '
    (0-59)
    ', + '
    ", + '
    ', + '
    分开始,每
    ', + '
    分执行一次
    (0/60)
    ', + '
    " + ); + elem.push("
    "); + for (var i = 0; i < 60; i++) { + elem.push( + ' -1 ? "checked" : "", + ">" + ); + } + elem.push("
    "); + + elem.push("
    "); + + return elem.join(""); + }; + + // 渲染时 + Class.prototype.getHoursElem = function () { + var that = this, + options = that.config, + elem = [ + '
    ', + ]; + + var radio = ["", "", "", ""]; + val = ["", "", "", "", []]; + + if (that.cron[2] == "*") { + radio[0] = "checked"; + } else if (that.cron[2].split("-").length == 2) { + radio[1] = "checked"; + val[0] = that.cron[2].split("-")[0]; + val[1] = that.cron[2].split("-")[1]; + } else if (that.cron[2].split("/").length == 2) { + radio[2] = "checked"; + val[2] = that.cron[2].split("/")[0]; + val[3] = that.cron[2].split("/")[1]; + } else { + radio[3] = "checked"; + val[4] = that.cron[2].split(","); + } + + elem.push( + '
    ", + '
    ", + '
    ', + '
    -
    ', + '
    (0-23)
    ', + '
    ", + '
    ', + '
    时开始,每
    ', + '
    时执行一次
    (0/24)
    ', + '
    " + ); + elem.push("
    "); + for (var i = 0; i < 24; i++) { + elem.push( + ' -1 ? "checked" : "", + ">" + ); + } + elem.push("
    "); + + elem.push("
    "); + + return elem.join(""); + }; + + // 渲染天 + Class.prototype.getDaysElem = function () { + var that = this, + options = that.config, + elem = [ + '
    ', + ]; + + var radio = ["", "", "", "", "", "", ""]; + val = ["", "", "", "", "", []]; + + if (that.cron[3] == "*") { + radio[0] = "checked"; + } else if (that.cron[3] == "?") { + radio[1] = "checked"; + } else if (that.cron[3].split("-").length == 2) { + radio[2] = "checked"; + val[0] = that.cron[3].split("-")[0]; + val[1] = that.cron[3].split("-")[1]; + } else if (that.cron[3].split("/").length == 2) { + radio[3] = "checked"; + val[2] = that.cron[3].split("/")[0]; + val[3] = that.cron[3].split("/")[1]; + } else if (that.cron[3].indexOf("W") > -1) { + radio[4] = "checked"; + val[4] = that.cron[3].match(/(\d+)W$/)[1]; + } else if (that.cron[3] == "L") { + radio[5] = "checked"; + } else { + radio[6] = "checked"; + val[5] = that.cron[3].split(","); + } + + elem.push( + '
    ", + '
    ", + '
    ", + '
    ', + '
    -
    ', + '
    (1-31)
    ', + '
    ", + '
    ', + '
    日开始,每
    ', + '
    日执行一次
    (1/31)
    ', + '
    ", + '
    每月
    ', + '
    号最近的那个工作日
    (1-31)
    ', + '
    ", + '
    " + ); + elem.push("
    "); + for (var i = 1; i <= 31; i++) { + elem.push( + ' -1 ? "checked" : "", + ">" + ); + } + elem.push("
    "); + + elem.push("
    "); + + return elem.join(""); + }; + + // 渲染月 + Class.prototype.getMonthsElem = function () { + var that = this, + options = that.config, + elem = [ + '
    ', + ]; + + var radio = ["", "", "", "", ""]; + val = ["", "", "", "", []]; + + if (that.cron[4] == "*") { + radio[0] = "checked"; + } else if (that.cron[4] == "?") { + radio[1] = "checked"; + } else if (that.cron[4].split("-").length == 2) { + radio[2] = "checked"; + val[0] = that.cron[4].split("-")[0]; + val[1] = that.cron[4].split("-")[1]; + } else if (that.cron[4].split("/").length == 2) { + radio[3] = "checked"; + val[2] = that.cron[4].split("/")[0]; + val[3] = that.cron[4].split("/")[1]; + } else { + radio[4] = "checked"; + val[4] = that.cron[4].split(","); + } + + elem.push( + '
    ", + '
    ", + '
    ", + '
    ', + '
    -
    ', + '
    (1-12)
    ', + '
    ", + '
    ', + '
    月开始,每
    ', + '
    月执行一次
    (1/12)
    ', + '
    " + ); + elem.push("
    "); + for (var i = 0; i < 24; i++) { + elem.push( + ' -1 ? "checked" : "", + ">" + ); + } + elem.push("
    "); + + elem.push("
    "); + + return elem.join(""); + }; + + // 渲染周 + Class.prototype.getWeeksElem = function () { + var that = this, + options = that.config, + elem = [ + '
    ', + ]; + + var radio = ["", "", "", "", "", ""]; + val = ["", "", "", "", "", []]; + + if (that.cron[5] == "*") { + radio[0] = "checked"; + } else if (that.cron[5] == "?") { + radio[1] = "checked"; + } else if (that.cron[5].split("-").length == 2) { + radio[2] = "checked"; + val[0] = that.cron[5].split("-")[0]; + val[1] = that.cron[5].split("-")[1]; + } else if (that.cron[5].split("#").length == 2) { + radio[3] = "checked"; + val[2] = that.cron[5].split("#")[0]; + val[3] = that.cron[5].split("#")[1]; + } else if (/\d+L/.test(that.cron[5])) { + radio[4] = "checked"; + val[4] = that.cron[5].match(/(\d+)L/)[1]; + } else { + radio[5] = "checked"; + val[5] = that.cron[5].split(","); + } + + elem.push( + '
    ", + '
    ", + '
    ", + '
    ', + '
    -
    ', + '
    (1-7)
    ', + '
    ", + '
    ', + '
    周的星期
    ', + '(1-4/1-7)
    ', + '
    ', + '(1-7)
    ', + '
    " + ); + elem.push("
    "); + for (var i = 1; i <= 7; i++) { + elem.push( + ' -1 ? "checked" : "", + ">" + ); + } + elem.push("
    "); + + elem.push("
    "); + + return elem.join(""); + }; + + // 渲染年 + Class.prototype.getYearsElem = function () { + var that = this, + options = that.config, + elem = [ + '
    ', + ]; + + var radio = ["", "", ""]; + val = ["", ""]; + + if (that.cron[6] == "*") { + radio[0] = "checked"; + } else if (that.cron[6] == "" || that.cron[6] == " ") { + radio[1] = "checked"; + } else if (that.cron[6].split("-").length == 2) { + radio[2] = "checked"; + val[0] = that.cron[6].split("-")[0]; + val[1] = that.cron[6].split("-")[1]; + } + + elem.push( + '
    ", + '
    ", + '
    ", + '
    ', + '
    -
    ', + '
    ' + ); + + elem.push("
    "); + + return elem.join(""); + }; + + function isNotBlank(str) { + return str != undefined && str !== ""; + } + + // 底部按钮事件 + Class.prototype.tool = function (btn, type) { + var that = this, + options = that.config, + active = { + // 计算秒 + calSeconds: function () { + var data = form.val("cronSecForm"), + dataType = data["type[0]"]; + if ( + "range" == dataType && + isNotBlank(data.rangeStart) && + isNotBlank(data.rangeEnd) + ) { + that.cron[0] = data.rangeStart + "-" + data.rangeEnd; + } else if ( + "per" == dataType && + isNotBlank(data.perFrom) && + isNotBlank(data.perVal) + ) { + that.cron[0] = data.perFrom + "/" + data.perVal; + } else if ("assign" == dataType) { + var checkbox = []; + layui.each(data, function (key, value) { + if (/^seconds/.test(key)) { + checkbox.push(value); + } + }); + if (checkbox.length) { + that.cron[0] = checkbox.join(","); + } else { + that.cron[0] = "*"; + } + } else if ("all" == dataType) { + that.cron[0] = "*"; + } + }, + calMinutes: function () { + var data = form.val("cronMinForm"), + dataType = data["type[1]"]; + if ( + "range" == dataType && + isNotBlank(data.rangeStart) && + isNotBlank(data.rangeEnd) + ) { + that.cron[1] = data.rangeStart + "-" + data.rangeEnd; + } else if ( + "per" == dataType && + isNotBlank(data.perFrom) && + isNotBlank(data.perVal) + ) { + that.cron[1] = data.perFrom + "/" + data.perVal; + } else if ("assign" == dataType) { + var checkbox = []; + layui.each(data, function (key, value) { + if (/^minutes/.test(key)) { + checkbox.push(value); + } + }); + if (checkbox.length) { + that.cron[1] = checkbox.join(","); + } else { + that.cron[1] = "*"; + } + } else if ("all" == dataType) { + that.cron[1] = "*"; + } + }, + calHours: function () { + var data = form.val("cronHourForm"), + dataType = data["type[2]"]; + if ( + "range" == dataType && + isNotBlank(data.rangeStart) && + isNotBlank(data.rangeEnd) + ) { + that.cron[2] = data.rangeStart + "-" + data.rangeEnd; + } else if ( + "per" == dataType && + isNotBlank(data.perFrom) && + isNotBlank(data.perVal) + ) { + that.cron[2] = data.perFrom + "/" + data.perVal; + } else if ("assign" == dataType) { + var checkbox = []; + layui.each(data, function (key, value) { + if (/^hours/.test(key)) { + checkbox.push(value); + } + }); + if (checkbox.length) { + that.cron[2] = checkbox.join(","); + } else { + that.cron[2] = "*"; + } + } else if ("all" == dataType) { + that.cron[2] = "*"; + } + }, + calDays: function () { + var data = form.val("cronDayForm"), + dataType = data["type[3]"]; + + if ( + "range" == dataType && + isNotBlank(data.rangeStart) && + isNotBlank(data.rangeEnd) + ) { + that.cron[3] = data.rangeStart + "-" + data.rangeEnd; + } else if ( + "per" == dataType && + isNotBlank(data.perFrom) && + isNotBlank(data.perVal) + ) { + that.cron[3] = data.perFrom + "/" + data.perVal; + } else if ("work" == dataType && isNotBlank(data.workDay)) { + that.cron[3] = data.workDay + "W"; + } else if ("last" == dataType) { + that.cron[3] = "L"; + } else if ("assign" == dataType) { + var checkbox = []; + layui.each(data, function (key, value) { + if (/^days/.test(key)) { + checkbox.push(value); + } + }); + if (checkbox.length) { + that.cron[3] = checkbox.join(","); + } else { + that.cron[3] = "*"; + } + } else if ("all" == dataType) { + that.cron[3] = "*"; + } else if ("none" == dataType) { + that.cron[3] = "?"; + } + }, + calMonths: function () { + var data = form.val("cronMonthFrom"), + dataType = data["type[4]"]; + if ( + "range" == dataType && + isNotBlank(data.rangeStart) && + isNotBlank(data.rangeEnd) + ) { + that.cron[4] = data.rangeStart + "-" + data.rangeEnd; + } else if ( + "per" == dataType && + isNotBlank(data.perFrom) && + isNotBlank(data.perVal) + ) { + that.cron[4] = data.perFrom + "/" + data.perVal; + } else if ("assign" == dataType) { + var checkbox = []; + layui.each(data, function (key, value) { + if (/^months/.test(key)) { + checkbox.push(value); + } + }); + if (checkbox.length) { + that.cron[4] = checkbox.join(","); + } else { + that.cron[4] = "*"; + } + } else if ("all" == dataType) { + that.cron[4] = "*"; + } else if ("none" == dataType) { + that.cron[4] = "?"; + } + }, + calWeeks: function () { + var data = form.val("cronWeekForm"), + dataType = data["type[5]"]; + console.log(data); + if ( + "range" == dataType && + isNotBlank(data.rangeStart) && + isNotBlank(data.rangeEnd) + ) { + that.cron[5] = data.rangeStart + "-" + data.rangeEnd; + } else if ( + "per" == dataType && + isNotBlank(data.perFrom) && + isNotBlank(data.perVal) + ) { + that.cron[5] = data.perFrom + "#" + data.perVal; + } else if ("last" == dataType && isNotBlank(data.lastVal)) { + that.cron[5] = data.lastVal + "L"; + } else if ("assign" == dataType) { + var checkbox = []; + layui.each(data, function (key, value) { + if (/^weeks/.test(key)) { + checkbox.push(value); + } + }); + if (checkbox.length) { + that.cron[5] = checkbox.join(","); + } else { + that.cron[5] = "*"; + } + } else if ("all" == dataType) { + that.cron[5] = "*"; + } else if ("none" == dataType) { + that.cron[5] = "?"; + } + }, + calYears: function () { + var data = form.val("cronYearForm"), + dataType = data["type[6]"]; + if ( + "range" == dataType && + isNotBlank(data.rangeStart) && + isNotBlank(data.rangeEnd) + ) { + that.cron[6] = data.rangeStart + "-" + data.rangeEnd; + } else if ("all" == dataType) { + that.cron[6] = "*"; + } else if ("none" == dataType) { + that.cron[6] = ""; + } + }, + + // 计算表达式 + calculate: function () { + active.calSeconds(); + active.calMinutes(); + active.calHours(); + active.calDays(); + active.calMonths(); + active.calWeeks(); + active.calYears(); + if (that.cron[5] != "?" && that.cron[3] != "?") { + layer.msg("不支持周参数和日参数同时存在"); + return false; + } + return true; + }, + // 运行 + run: function () { + if (!active.calculate()) { + return; + } + var cronStr = that.cron.join(" ").trim(); + // TODO 请求接口获取最近运行时间,或js生成最近运行时间 + if (options.url) { + $.post( + options.url, + { cron: cronStr }, + function (res) { + if (res.code == 0) { + $("#run-list").empty().append(res.data.join("
    ")); + } else { + layer.alert(res.msg, { icon: 2, title: "错误" }); + } + }, + "json" + ); + } + options.done(cronStr); + }, + + //确定 + confirm: function () { + if (!active.calculate()) { + return; + } + var cronStr = that.cron.join(" ").trim(); + options.done && options.done(cronStr); + that.remove(); + }, + }; + active[type] && active[type](); + }; + + // 定位算法 + Class.prototype.position = function () { + var that = this, + options = that.config, + elem = options.elem, + rect = elem.getBoundingClientRect(), //绑定元素的坐标 + cronWidth = that.elemCron.offsetWidth, //控件的宽度 + cronHeight = that.elemCron.offsetHeight, //控件的高度 + //滚动条高度 + scrollArea = function (type) { + type = type ? "scrollLeft" : "scrollTop"; + return document.body[type] | document.documentElement[type]; + }, + winArea = function (type) { + return document.documentElement[type ? "clientWidth" : "clientHeight"]; + }, + margin = 5, + left = rect.left, + top = rect.bottom; + + //如果右侧超出边界 + if (left + cronWidth + margin > winArea("width")) { + left = winArea("width") - cronWidth - margin; + } + + //如果底部超出边界 + if (top + cronHeight + margin > winArea()) { + top = + rect.top > cronHeight //顶部是否有足够区域显示完全 + ? rect.top - cronHeight + : winArea() - cronHeight; + top = top - margin * 2; + } + + that.elemCron.style.left = + left + (options.position === "fixed" ? 0 : scrollArea(1)) + "px"; + that.elemCron.style.top = + top + (options.position === "fixed" ? 0 : scrollArea()) + "px"; + }; + + // 控件移除 + Class.prototype.remove = function () { + var that = this, + options = that.config; + $(ELEM).remove(); + }; + + // 是否输入框 + Class.prototype.isInput = function (elem) { + return /input|textarea/.test(elem.tagName.toLocaleLowerCase()); + }; + + /** + * 核心入口 + * @param options + * @returns {{reload: reload, config: *}} + */ + cron.render = function (options) { + var ins = new Class(options); + return thisIns.call(ins); + }; + + exports("cron", cron); +}); diff --git a/src/main/resources/static/layui-ext/eleTree/eleTree.js b/src/main/resources/static/layui-ext/eleTree/eleTree.js new file mode 100644 index 0000000..df97ed5 --- /dev/null +++ b/src/main/resources/static/layui-ext/eleTree/eleTree.js @@ -0,0 +1 @@ +!function(e,t){if("object"==typeof exports&&"object"==typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{var n=t();for(var r in n)("object"==typeof exports?exports:e)[r]=n[r]}}(window,(function(){return function(e){var t={};function n(r){if(t[r])return t[r].exports;var i=t[r]={i:r,l:!1,exports:{}};return e[r].call(i.exports,i,i.exports,n),i.l=!0,i.exports}return n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var i in e)n.d(r,i,function(t){return e[t]}.bind(null,i));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=152)}([function(e,t,n){var r=n(2),i=n(22),o=n(15),a=n(16),u=n(23),c=function(e,t,n){var l,f,s,d,h=e&c.F,p=e&c.G,v=e&c.S,g=e&c.P,y=e&c.B,m=p?r:v?r[t]||(r[t]={}):(r[t]||{}).prototype,b=p?i:i[t]||(i[t]={}),x=b.prototype||(b.prototype={});for(l in p&&(n=t),n)s=((f=!h&&m&&void 0!==m[l])?m:n)[l],d=y&&f?u(s,r):g&&"function"==typeof s?u(Function.call,s):s,m&&a(m,l,s,e&c.U),b[l]!=s&&o(b,l,d),g&&x[l]!=s&&(x[l]=s)};r.core=i,c.F=1,c.G=2,c.S=4,c.P=8,c.B=16,c.W=32,c.U=64,c.R=128,e.exports=c},function(e,t,n){var r=n(4);e.exports=function(e){if(!r(e))throw TypeError(e+" is not an object!");return e}},function(e,t){var n=e.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=n)},function(e,t){e.exports=function(e){try{return!!e()}catch(e){return!0}}},function(e,t){e.exports=function(e){return"object"==typeof e?null!==e:"function"==typeof e}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.symbolAttr=t.eleTreeConfig=void 0;t.eleTreeConfig={el:"",data:[],emptText:"暂无数据",highlightCurrent:!1,defaultExpandAll:!1,expandOnClickNode:!0,checkOnClickNode:!1,radioOnClickNode:!1,defaultExpandedKeys:[],autoExpandParent:!1,showCheckbox:!1,checkStrictly:!1,isDefaultChangePstatus:!1,defaultCheckedKeys:[],accordion:!1,indent:16,lazy:!1,load:function(){},draggable:!1,contextmenuList:[],searchNodeMethod:null,showLine:!0,imgUrl:"./images/",icon:{fold:"",leaf:"",checkFull:"",checkHalf:"",checkNone:"",dropdownOff:"",dropdownOn:"",loading:"",radioCheck:"",radioCheckNone:""},rightMenuList:[],done:null,showRadio:!1,radioType:"level",defaultRadioCheckedKeys:[],customText:null,method:"get",url:"",where:{},headers:{},response:{statusName:"code",statusCode:0,dataName:"data"},defaultPid:"",request:{name:"label",key:"id",children:"children",disabled:"disabled",checked:"checked",isOpen:"isOpen",isLeaf:"isLeaf",pid:"pid",radioChecked:"radioChecked",radioDisabled:"radioDisabled"}};var r={isRenderChild:Symbol("isRenderChild"),disabledParentStatus:Symbol("disabledParentStatus"),isLazyNode:Symbol("isLazyNode"),parentNode:Symbol("parentNode"),isHideNode:Symbol("isHideNode"),isPasteNode:Symbol("isPasteNode"),editNodeType:Symbol("editNodeType")};t.symbolAttr=r},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.getNodeDataById=function(e){var t=this.config.request,n=(t.name,t.key),r=(t.isOpen,t.checked,t.children),i=(t.disabled,t.isLeaf,null);return function t(o){for(var a=0,u=o.length;a0&&t(o[a][r]))return!0}return!1}(this.config.data),i},t.recurseTree=function(e){var t=this.config.request,n=(t.name,t.key,t.isOpen,t.checked,t.children);t.disabled,t.isLeaf;!function t(r){for(var i=0,o=r.length;i0&&t(r[i][n])}(this.config.data)},t.updateDate=function(e){var t=this,n=this.config.request,o=(n.name,n.key),a=(n.isOpen,n.checked,n.children),u=(n.disabled,n.isLeaf,function(n){if(t.config.showRadio&&"all"===t.config.radioType){if("current"!==n)return t.isAlreadyRadioChecked=!1,void(t.currentRadioCheckedData=null);!function e(n){for(var r=0,i=n.length;r0&&e(n[r][a]))return!0}return!1}(e[i.symbolAttr.parentNode][a])}});if(!e)return u(),void r.renderData.call(this);var l=e[i.symbolAttr.parentNode];l?(u("current"),r.changeData.call(this,l[this.config.request.children],l,!1,!0)):(u(),r.renderData.call(this))},t.dataToPid=function(e){var t=this,n=this.config.request,r=(n.name,n.key),i=(n.isOpen,n.checked,n.children),o=(n.disabled,n.isLeaf,n.pid);if(c(e)&&e.length>0&&o in e[0]&&!(i in e[0]))return e.filter((function(n){var a=e.filter((function(e){return n[r]===e[o]}));return a.length>0&&(n[i]=a),n[o]===t.config.defaultPid}));return e},t.deepCopy=function e(t){var n=c(t)?[]:{};for(var r in t)a(t[r])||c(t[r])?n[r]=e(t[r]):n[r]=t[r];return n},t.dataExtend=function e(t,n){var r={};for(var i in t)a(t[i])?r[i]=e(t[i],n[i]||{}):r[i]=u(n[i])?t[i]:n[i];return r},t.changeParentCheckedStatus=function e(t,n){var r=this,i=this.config.request,o=(i.name,i.key,i.isOpen,i.checked),a=i.children,u=i.disabled;i.isLeaf,i.pid;this.config.showCheckbox&&!this.config.checkStrictly&&this.config.isDefaultChangePstatus&&(t.forEach((function(t){t[a]&&t[a].length>0&&e.call(r,t[a],t)})),n&&(n[o]=n[a].filter((function(e){return!e[u]})).every((function(e){return e[o]}))))},t.isFun=o,t.isObject=a,t.isUndefined=u,t.isArray=c,t.isBoolean=l,t.isString=f,t.isNumber=s,t.paramDetection=function(e,t,n){for(var r=t.split("|"),i=!1,u=0,d=r.length;u0?i(r(e),9007199254740991):0}},function(e,t,n){e.exports=!n(3)((function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a}))},function(e,t,n){var r=n(1),i=n(109),o=n(27),a=Object.defineProperty;t.f=n(9)?Object.defineProperty:function(e,t,n){if(r(e),t=o(t,!0),r(n),i)try{return a(e,t,n)}catch(e){}if("get"in n||"set"in n)throw TypeError("Accessors not supported!");return"value"in n&&(e[t]=n.value),e}},function(e,t,n){var r=n(28);e.exports=function(e){return Object(r(e))}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(){var e=this.node;this.node=i.default.call(this,this.config.data,!0,!0),a(e,this.node)};var r,i=(r=n(104))&&r.__esModule?r:{default:r},o=n(14);n(5);var a=(0,o.init)([n(71).default,n(72).default,n(73).default,n(74).default])},function(e,t){e.exports=function(e){if("function"!=typeof e)throw TypeError(e+" is not a function!");return e}},function(e,t,n){"use strict";function r(e,t,n,r,i){return{sel:e,data:t,children:n,text:r,elm:i,key:void 0===t?void 0:t.key}}n.r(t),n.d(t,"h",(function(){return c})),n.d(t,"thunk",(function(){return d})),n.d(t,"init",(function(){return b}));var i=r,o=Array.isArray;function a(e){return"string"==typeof e||"number"==typeof e}var u={createElement:function(e){return document.createElement(e)},createElementNS:function(e,t){return document.createElementNS(e,t)},createTextNode:function(e){return document.createTextNode(e)},createComment:function(e){return document.createComment(e)},insertBefore:function(e,t,n){e.insertBefore(t,n)},removeChild:function(e,t){e.removeChild(t)},appendChild:function(e,t){e.appendChild(t)},parentNode:function(e){return e.parentNode},nextSibling:function(e){return e.nextSibling},tagName:function(e){return e.tagName},setTextContent:function(e,t){e.textContent=t},getTextContent:function(e){return e.textContent},isElement:function(e){return 1===e.nodeType},isText:function(e){return 3===e.nodeType},isComment:function(e){return 8===e.nodeType}};function c(e,t,n){var i,u,c,l={};if(void 0!==n?(l=t,o(n)?i=n:a(n)?u=n:n&&n.sel&&(i=[n])):void 0!==t&&(o(t)?i=t:a(t)?u=t:t&&t.sel?i=[t]:l=t),void 0!==i)for(c=0;c0?f:u.length,y=s>0?s:u.length,m=-1!==f||-1!==s?u.slice(0,Math.min(g,y)):u,b=e.elm=p(r)&&p(n=r.ns)?l.createElementNS(n,m):l.createElement(m);for(g0&&b.setAttribute("class",u.slice(y+1).replace(/\./g," ")),n=0;nf?b(e,null==n[v+1]?null:n[v+1].elm,n,c,v,r):_(e,t,u,f))}(o,a,u,n):p(u)?(p(e.text)&&l.setTextContent(o,""),b(o,null,u,0,u.length-1,n)):p(a)?_(o,a,0,a.length-1):p(e.text)&&l.setTextContent(o,""):e.text!==t.text&&(p(a)&&_(o,a,0,a.length-1),l.setTextContent(o,t.text)),p(i)&&p(r=i.postpatch)&&r(e,t)}}return function(e,t){var n,r,o,a=[];for(n=0;n"+i+""};e.exports=function(e,t){var n={};n[e]=t(u),r(r.P+r.F*i((function(){var t=""[e]('"');return t!==t.toLowerCase()||t.split('"').length>3})),"String",n)}},function(e,t){var n={}.hasOwnProperty;e.exports=function(e,t){return n.call(e,t)}},function(e,t,n){var r=n(53),i=n(28);e.exports=function(e){return r(i(e))}},function(e,t,n){var r=n(54),i=n(36),o=n(19),a=n(27),u=n(18),c=n(109),l=Object.getOwnPropertyDescriptor;t.f=n(9)?l:function(e,t){if(e=o(e),t=a(t,!0),c)try{return l(e,t)}catch(e){}if(u(e,t))return i(!r.f.call(e,t),e[t])}},function(e,t,n){var r=n(18),i=n(11),o=n(79)("IE_PROTO"),a=Object.prototype;e.exports=Object.getPrototypeOf||function(e){return e=i(e),r(e,o)?e[o]:"function"==typeof e.constructor&&e instanceof e.constructor?e.constructor.prototype:e instanceof Object?a:null}},function(e,t){var n=e.exports={version:"2.6.11"};"number"==typeof __e&&(__e=n)},function(e,t,n){var r=n(13);e.exports=function(e,t,n){if(r(e),void 0===t)return e;switch(n){case 1:return function(n){return e.call(t,n)};case 2:return function(n,r){return e.call(t,n,r)};case 3:return function(n,r,i){return e.call(t,n,r,i)}}return function(){return e.apply(t,arguments)}}},function(e,t){var n={}.toString;e.exports=function(e){return n.call(e).slice(8,-1)}},function(e,t){var n=Math.ceil,r=Math.floor;e.exports=function(e){return isNaN(e=+e)?0:(e>0?r:n)(e)}},function(e,t,n){"use strict";var r=n(3);e.exports=function(e,t){return!!e&&r((function(){t?e.call(null,(function(){}),1):e.call(null)}))}},function(e,t,n){var r=n(4);e.exports=function(e,t){if(!r(e))return e;var n,i;if(t&&"function"==typeof(n=e.toString)&&!r(i=n.call(e)))return i;if("function"==typeof(n=e.valueOf)&&!r(i=n.call(e)))return i;if(!t&&"function"==typeof(n=e.toString)&&!r(i=n.call(e)))return i;throw TypeError("Can't convert object to primitive value")}},function(e,t){e.exports=function(e){if(null==e)throw TypeError("Can't call method on "+e);return e}},function(e,t,n){var r=n(0),i=n(22),o=n(3);e.exports=function(e,t){var n=(i.Object||{})[e]||Object[e],a={};a[e]=t(n),r(r.S+r.F*o((function(){n(1)})),"Object",a)}},function(e,t,n){var r=n(23),i=n(53),o=n(11),a=n(8),u=n(95);e.exports=function(e,t){var n=1==e,c=2==e,l=3==e,f=4==e,s=6==e,d=5==e||s,h=t||u;return function(t,u,p){for(var v,g,y=o(t),m=i(y),b=r(u,p,3),x=a(m.length),_=0,w=n?h(t,x):c?h(t,0):void 0;x>_;_++)if((d||_ in m)&&(g=b(v=m[_],_,y),e))if(n)w[_]=g;else if(g)switch(e){case 3:return!0;case 5:return v;case 6:return _;case 2:w.push(v)}else if(f)return!1;return s?-1:l||f?f:w}}},function(e,t,n){"use strict";if(n(9)){var r=n(33),i=n(2),o=n(3),a=n(0),u=n(67),c=n(103),l=n(23),f=n(43),s=n(36),d=n(15),h=n(45),p=n(25),v=n(8),g=n(137),y=n(39),m=n(27),b=n(18),x=n(49),_=n(4),w=n(11),T=n(92),S=n(40),k=n(21),O=n(41).f,M=n(94),P=n(37),A=n(7),E=n(30),N=n(57),j=n(56),C=n(97),L=n(51),D=n(62),R=n(42),I=n(96),F=n(126),B=n(10),q=n(20),z=B.f,U=q.f,W=i.RangeError,G=i.TypeError,V=i.Uint8Array,H=Array.prototype,Y=c.ArrayBuffer,$=c.DataView,K=E(0),X=E(2),J=E(3),Z=E(4),Q=E(5),ee=E(6),te=N(!0),ne=N(!1),re=C.values,ie=C.keys,oe=C.entries,ae=H.lastIndexOf,ue=H.reduce,ce=H.reduceRight,le=H.join,fe=H.sort,se=H.slice,de=H.toString,he=H.toLocaleString,pe=A("iterator"),ve=A("toStringTag"),ge=P("typed_constructor"),ye=P("def_constructor"),me=u.CONSTR,be=u.TYPED,xe=u.VIEW,_e=E(1,(function(e,t){return Oe(j(e,e[ye]),t)})),we=o((function(){return 1===new V(new Uint16Array([1]).buffer)[0]})),Te=!!V&&!!V.prototype.set&&o((function(){new V(1).set({})})),Se=function(e,t){var n=p(e);if(n<0||n%t)throw W("Wrong offset!");return n},ke=function(e){if(_(e)&&be in e)return e;throw G(e+" is not a typed array!")},Oe=function(e,t){if(!_(e)||!(ge in e))throw G("It is not a typed array constructor!");return new e(t)},Me=function(e,t){return Pe(j(e,e[ye]),t)},Pe=function(e,t){for(var n=0,r=t.length,i=Oe(e,r);r>n;)i[n]=t[n++];return i},Ae=function(e,t,n){z(e,t,{get:function(){return this._d[n]}})},Ee=function(e){var t,n,r,i,o,a,u=w(e),c=arguments.length,f=c>1?arguments[1]:void 0,s=void 0!==f,d=M(u);if(null!=d&&!T(d)){for(a=d.call(u),r=[],t=0;!(o=a.next()).done;t++)r.push(o.value);u=r}for(s&&c>2&&(f=l(f,arguments[2],2)),t=0,n=v(u.length),i=Oe(this,n);n>t;t++)i[t]=s?f(u[t],t):u[t];return i},Ne=function(){for(var e=0,t=arguments.length,n=Oe(this,t);t>e;)n[e]=arguments[e++];return n},je=!!V&&o((function(){he.call(new V(1))})),Ce=function(){return he.apply(je?se.call(ke(this)):ke(this),arguments)},Le={copyWithin:function(e,t){return F.call(ke(this),e,t,arguments.length>2?arguments[2]:void 0)},every:function(e){return Z(ke(this),e,arguments.length>1?arguments[1]:void 0)},fill:function(e){return I.apply(ke(this),arguments)},filter:function(e){return Me(this,X(ke(this),e,arguments.length>1?arguments[1]:void 0))},find:function(e){return Q(ke(this),e,arguments.length>1?arguments[1]:void 0)},findIndex:function(e){return ee(ke(this),e,arguments.length>1?arguments[1]:void 0)},forEach:function(e){K(ke(this),e,arguments.length>1?arguments[1]:void 0)},indexOf:function(e){return ne(ke(this),e,arguments.length>1?arguments[1]:void 0)},includes:function(e){return te(ke(this),e,arguments.length>1?arguments[1]:void 0)},join:function(e){return le.apply(ke(this),arguments)},lastIndexOf:function(e){return ae.apply(ke(this),arguments)},map:function(e){return _e(ke(this),e,arguments.length>1?arguments[1]:void 0)},reduce:function(e){return ue.apply(ke(this),arguments)},reduceRight:function(e){return ce.apply(ke(this),arguments)},reverse:function(){for(var e,t=ke(this).length,n=Math.floor(t/2),r=0;r1?arguments[1]:void 0)},sort:function(e){return fe.call(ke(this),e)},subarray:function(e,t){var n=ke(this),r=n.length,i=y(e,r);return new(j(n,n[ye]))(n.buffer,n.byteOffset+i*n.BYTES_PER_ELEMENT,v((void 0===t?r:y(t,r))-i))}},De=function(e,t){return Me(this,se.call(ke(this),e,t))},Re=function(e){ke(this);var t=Se(arguments[1],1),n=this.length,r=w(e),i=v(r.length),o=0;if(i+t>n)throw W("Wrong length!");for(;o255?255:255&r),i.v[h](n*t+i.o,r,we)}(this,n,e)},enumerable:!0})};b?(p=n((function(e,n,r,i){f(e,p,l,"_d");var o,a,u,c,s=0,h=0;if(_(n)){if(!(n instanceof Y||"ArrayBuffer"==(c=x(n))||"SharedArrayBuffer"==c))return be in n?Pe(p,n):Ee.call(p,n);o=n,h=Se(r,t);var y=n.byteLength;if(void 0===i){if(y%t)throw W("Wrong length!");if((a=y-h)<0)throw W("Wrong length!")}else if((a=v(i)*t)+h>y)throw W("Wrong length!");u=a/t}else u=g(n),o=new Y(a=u*t);for(d(e,"_d",{b:o,o:h,l:a,e:u,v:new $(o)});sdocument.F=Object<\/script>"),e.close(),c=e.F;r--;)delete c.prototype[o[r]];return c()};e.exports=Object.create||function(e,t){var n;return null!==e?(u.prototype=r(e),n=new u,u.prototype=null,n[a]=e):n=c(),void 0===t?n:i(n,t)}},function(e,t,n){var r=n(111),i=n(80).concat("length","prototype");t.f=Object.getOwnPropertyNames||function(e){return r(e,i)}},function(e,t,n){"use strict";var r=n(2),i=n(10),o=n(9),a=n(7)("species");e.exports=function(e){var t=r[e];o&&t&&!t[a]&&i.f(t,a,{configurable:!0,get:function(){return this}})}},function(e,t){e.exports=function(e,t,n,r){if(!(e instanceof t)||void 0!==r&&r in e)throw TypeError(n+": incorrect invocation!");return e}},function(e,t,n){var r=n(23),i=n(124),o=n(92),a=n(1),u=n(8),c=n(94),l={},f={};(t=e.exports=function(e,t,n,s,d){var h,p,v,g,y=d?function(){return e}:c(e),m=r(n,s,t?2:1),b=0;if("function"!=typeof y)throw TypeError(e+" is not iterable!");if(o(y)){for(h=u(e.length);h>b;b++)if((g=t?m(a(p=e[b])[0],p[1]):m(e[b]))===l||g===f)return g}else for(v=y.call(e);!(p=v.next()).done;)if((g=i(v,m,p.value,t))===l||g===f)return g}).BREAK=l,t.RETURN=f},function(e,t,n){var r=n(16);e.exports=function(e,t,n){for(var i in t)r(e,i,t[i],n);return e}},function(e,t,n){var r=n(4);e.exports=function(e,t){if(!r(e)||e._t!==t)throw TypeError("Incompatible receiver, "+t+" required!");return e}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){var t=this.config,n=t.request,r=(n.name,n.key,n.isOpen),i=n.checked,o=n.children,a=n.disabled,u=n.isLeaf,c=n.radioChecked,l=n.radioDisabled,f={};Object.keys(e).forEach((function(t){t!==o&&(f[t]=e[t])})),t.showCheckbox&&(f[i]=2===e[i],f[a]=e[a]||!1);f[r]=2===e[r],f[u]=t.lazy?e[u]||!1:0===e[o].length,t.showRadio&&(f[c]=2===e[c],f[l]=e[l]||!1);return f}},function(e,t,n){var r=n(10).f,i=n(18),o=n(7)("toStringTag");e.exports=function(e,t,n){e&&!i(e=n?e:e.prototype,o)&&r(e,o,{configurable:!0,value:t})}},function(e,t,n){var r=n(24),i=n(7)("toStringTag"),o="Arguments"==r(function(){return arguments}());e.exports=function(e){var t,n,a;return void 0===e?"Undefined":null===e?"Null":"string"==typeof(n=function(e,t){try{return e[t]}catch(e){}}(t=Object(e),i))?n:o?r(t):"Object"==(a=r(t))&&"function"==typeof t.callee?"Arguments":a}},function(e,t,n){var r=n(0),i=n(28),o=n(3),a=n(83),u="["+a+"]",c=RegExp("^"+u+u+"*"),l=RegExp(u+u+"*$"),f=function(e,t,n){var i={},u=o((function(){return!!a[e]()||"​…"!="​…"[e]()})),c=i[e]=u?t(s):a[e];n&&(i[n]=c),r(r.P+r.F*u,"String",i)},s=f.trim=function(e,t){return e=String(i(e)),1&t&&(e=e.replace(c,"")),2&t&&(e=e.replace(l,"")),e};e.exports=f},function(e,t){e.exports={}},function(e,t,n){var r=n(22),i=n(2),o=i["__core-js_shared__"]||(i["__core-js_shared__"]={});(e.exports=function(e,t){return o[e]||(o[e]=void 0!==t?t:{})})("versions",[]).push({version:r.version,mode:n(33)?"pure":"global",copyright:"© 2019 Denis Pushkarev (zloirock.ru)"})},function(e,t,n){var r=n(24);e.exports=Object("z").propertyIsEnumerable(0)?Object:function(e){return"String"==r(e)?e.split(""):Object(e)}},function(e,t){t.f={}.propertyIsEnumerable},function(e,t,n){"use strict";var r=n(1);e.exports=function(){var e=r(this),t="";return e.global&&(t+="g"),e.ignoreCase&&(t+="i"),e.multiline&&(t+="m"),e.unicode&&(t+="u"),e.sticky&&(t+="y"),t}},function(e,t,n){var r=n(1),i=n(13),o=n(7)("species");e.exports=function(e,t){var n,a=r(e).constructor;return void 0===a||null==(n=r(a)[o])?t:i(n)}},function(e,t,n){var r=n(19),i=n(8),o=n(39);e.exports=function(e){return function(t,n,a){var u,c=r(t),l=i(c.length),f=o(a,l);if(e&&n!=n){for(;l>f;)if((u=c[f++])!=u)return!0}else for(;l>f;f++)if((e||f in c)&&c[f]===n)return e||f||0;return!e&&-1}}},function(e,t){t.f=Object.getOwnPropertySymbols},function(e,t,n){var r=n(24);e.exports=Array.isArray||function(e){return"Array"==r(e)}},function(e,t,n){var r=n(25),i=n(28);e.exports=function(e){return function(t,n){var o,a,u=String(i(t)),c=r(n),l=u.length;return c<0||c>=l?e?"":void 0:(o=u.charCodeAt(c))<55296||o>56319||c+1===l||(a=u.charCodeAt(c+1))<56320||a>57343?e?u.charAt(c):o:e?u.slice(c,c+2):a-56320+(o-55296<<10)+65536}}},function(e,t,n){var r=n(4),i=n(24),o=n(7)("match");e.exports=function(e){var t;return r(e)&&(void 0!==(t=e[o])?!!t:"RegExp"==i(e))}},function(e,t,n){var r=n(7)("iterator"),i=!1;try{var o=[7][r]();o.return=function(){i=!0},Array.from(o,(function(){throw 2}))}catch(e){}e.exports=function(e,t){if(!t&&!i)return!1;var n=!1;try{var o=[7],a=o[r]();a.next=function(){return{done:n=!0}},o[r]=function(){return a},e(o)}catch(e){}return n}},function(e,t,n){"use strict";var r=n(49),i=RegExp.prototype.exec;e.exports=function(e,t){var n=e.exec;if("function"==typeof n){var o=n.call(e,t);if("object"!=typeof o)throw new TypeError("RegExp exec method returned something other than an Object or null");return o}if("RegExp"!==r(e))throw new TypeError("RegExp#exec called on incompatible receiver");return i.call(e,t)}},function(e,t,n){"use strict";n(128);var r=n(16),i=n(15),o=n(3),a=n(28),u=n(7),c=n(98),l=u("species"),f=!o((function(){var e=/./;return e.exec=function(){var e=[];return e.groups={a:"7"},e},"7"!=="".replace(e,"$")})),s=function(){var e=/(?:)/,t=e.exec;e.exec=function(){return t.apply(this,arguments)};var n="ab".split(e);return 2===n.length&&"a"===n[0]&&"b"===n[1]}();e.exports=function(e,t,n){var d=u(e),h=!o((function(){var t={};return t[d]=function(){return 7},7!=""[e](t)})),p=h?!o((function(){var t=!1,n=/a/;return n.exec=function(){return t=!0,null},"split"===e&&(n.constructor={},n.constructor[l]=function(){return n}),n[d](""),!t})):void 0;if(!h||!p||"replace"===e&&!f||"split"===e&&!s){var v=/./[d],g=n(a,d,""[e],(function(e,t,n,r,i){return t.exec===c?h&&!i?{done:!0,value:v.call(t,n,r)}:{done:!0,value:e.call(n,t,r)}:{done:!1}})),y=g[0],m=g[1];r(String.prototype,e,y),i(RegExp.prototype,d,2==t?function(e,t){return m.call(e,this,t)}:function(e){return m.call(e,this)})}}},function(e,t,n){var r=n(2).navigator;e.exports=r&&r.userAgent||""},function(e,t,n){"use strict";var r=n(2),i=n(0),o=n(16),a=n(45),u=n(34),c=n(44),l=n(43),f=n(4),s=n(3),d=n(62),h=n(48),p=n(84);e.exports=function(e,t,n,v,g,y){var m=r[e],b=m,x=g?"set":"add",_=b&&b.prototype,w={},T=function(e){var t=_[e];o(_,e,"delete"==e||"has"==e?function(e){return!(y&&!f(e))&&t.call(this,0===e?0:e)}:"get"==e?function(e){return y&&!f(e)?void 0:t.call(this,0===e?0:e)}:"add"==e?function(e){return t.call(this,0===e?0:e),this}:function(e,n){return t.call(this,0===e?0:e,n),this})};if("function"==typeof b&&(y||_.forEach&&!s((function(){(new b).entries().next()})))){var S=new b,k=S[x](y?{}:-0,1)!=S,O=s((function(){S.has(1)})),M=d((function(e){new b(e)})),P=!y&&s((function(){for(var e=new b,t=5;t--;)e[x](t,t);return!e.has(-0)}));M||((b=t((function(t,n){l(t,b,e);var r=p(new m,t,b);return null!=n&&c(n,g,r[x],r),r}))).prototype=_,_.constructor=b),(O||P)&&(T("delete"),T("has"),g&&T("get")),(P||k)&&T(x),y&&_.clear&&delete _.clear}else b=v.getConstructor(t,e,g,x),a(b.prototype,n),u.NEED=!0;return h(b,e),w[e]=b,i(i.G+i.W+i.F*(b!=m),w),y||v.setStrong(b,e,g),b}},function(e,t,n){for(var r,i=n(2),o=n(15),a=n(37),u=a("typed_array"),c=a("view"),l=!(!i.ArrayBuffer||!i.DataView),f=l,s=0,d="Int8Array,Uint8Array,Uint8ClampedArray,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array".split(",");s<9;)(r=i[d[s++]])?(o(r.prototype,u,!0),o(r.prototype,c,!0)):f=!1;e.exports={ABV:l,CONSTR:f,TYPED:u,VIEW:c}},function(e,t,n){"use strict";e.exports=n(33)||!n(3)((function(){var e=Math.random();__defineSetter__.call(null,e,(function(){})),delete n(2)[e]}))},function(e,t,n){"use strict";var r=n(0);e.exports=function(e){r(r.S,e,{of:function(){for(var e=arguments.length,t=new Array(e);e--;)t[e]=arguments[e];return new this(t)}})}},function(e,t,n){"use strict";var r=n(0),i=n(13),o=n(23),a=n(44);e.exports=function(e){r(r.S,e,{from:function(e){var t,n,r,u,c=arguments[1];return i(this),(t=void 0!==c)&&i(c),null==e?new this:(n=[],t?(r=0,u=o(c,arguments[2],2),a(e,!1,(function(e){n.push(u(e,r++))}))):a(e,!1,n.push,n),new this(n))}})}},function(e,t,n){"use strict";function r(e,t){var n,r,i=t.elm,o=e.data.class,a=t.data.class;if((o||a)&&o!==a){for(r in a=a||{},o=o||{})a[r]||i.classList.remove(r);for(r in a)(n=a[r])!==o[r]&&i.classList[n?"add":"remove"](r)}}Object.defineProperty(t,"__esModule",{value:!0}),t.classModule={create:r,update:r},t.default=t.classModule},function(e,t,n){"use strict";function r(e,t){var n,r,i=t.elm,o=e.data.props,a=t.data.props;if((o||a)&&o!==a){for(n in a=a||{},o=o||{})a[n]||delete i[n];for(n in a)r=a[n],o[n]===r||"value"===n&&i[n]===r||(i[n]=r)}}Object.defineProperty(t,"__esModule",{value:!0}),t.propsModule={create:r,update:r},t.default=t.propsModule},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r="undefined"!=typeof window&&window.requestAnimationFrame.bind(window)||setTimeout,i=!1;function o(e,t,n){var i;i=function(){e[t]=n},r((function(){r(i)}))}function a(e,t){var n,r,i=t.elm,a=e.data.style,u=t.data.style;if((a||u)&&a!==u){u=u||{};var c="delayed"in(a=a||{});for(r in a)u[r]||("-"===r[0]&&"-"===r[1]?i.style.removeProperty(r):i.style[r]="");for(r in u)if(n=u[r],"delayed"===r&&u.delayed)for(var l in u.delayed)n=u.delayed[l],c&&n===a.delayed[l]||o(i.style,l,n);else"remove"!==r&&n!==a[r]&&("-"===r[0]&&"-"===r[1]?i.style.setProperty(r,n):i.style[r]=n)}}t.styleModule={pre:function(){i=!1},create:a,update:a,destroy:function(e){var t,n,r=e.elm,i=e.data.style;if(i&&(t=i.destroy))for(n in t)r.style[n]=t[n]},remove:function(e,t){var n=e.data.style;if(n&&n.remove){i||(e.elm.offsetLeft,i=!0);var r,o=e.elm,a=0,u=n.remove,c=0,l=[];for(r in u)l.push(r),o.style[r]=u[r];for(var f=getComputedStyle(o)["transition-property"].split(", ");a1&&void 0!==arguments[1]?arguments[1]:[],n=this.config,r=n.request,u=(r.name,r.key),c=(r.isOpen,r.checked,r.children);r.disabled,r.isLeaf;if((0,i.paramDetection)(t,"String|Number|Array","remove方法第一个参数必须为String|Number|Array"))return e;t=(0,i.isArray)(t)?t:[t];var l=function e(n){for(var r=0;r0&&e(n[r][c])};return l(n.data),i.updateDate.call(this),o.default.call(this),e};var r,i=n(6),o=(r=n(12))&&r.__esModule?r:{default:r},a=n(5)},function(e,t,n){var r=n(4),i=n(2).document,o=r(i)&&r(i.createElement);e.exports=function(e){return o?i.createElement(e):{}}},function(e,t,n){var r=n(2),i=n(22),o=n(33),a=n(110),u=n(10).f;e.exports=function(e){var t=i.Symbol||(i.Symbol=o?{}:r.Symbol||{});"_"==e.charAt(0)||e in t||u(t,e,{value:a.f(e)})}},function(e,t,n){var r=n(52)("keys"),i=n(37);e.exports=function(e){return r[e]||(r[e]=i(e))}},function(e,t){e.exports="constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(",")},function(e,t,n){var r=n(2).document;e.exports=r&&r.documentElement},function(e,t,n){var r=n(4),i=n(1),o=function(e,t){if(i(e),!r(t)&&null!==t)throw TypeError(t+": can't set as prototype!")};e.exports={set:Object.setPrototypeOf||("__proto__"in{}?function(e,t,r){try{(r=n(23)(Function.call,n(20).f(Object.prototype,"__proto__").set,2))(e,[]),t=!(e instanceof Array)}catch(e){t=!0}return function(e,n){return o(e,n),t?e.__proto__=n:r(e,n),e}}({},!1):void 0),check:o}},function(e,t){e.exports="\t\n\v\f\r  ᠎              \u2028\u2029\ufeff"},function(e,t,n){var r=n(4),i=n(82).set;e.exports=function(e,t,n){var o,a=t.constructor;return a!==n&&"function"==typeof a&&(o=a.prototype)!==n.prototype&&r(o)&&i&&i(e,o),e}},function(e,t,n){"use strict";var r=n(25),i=n(28);e.exports=function(e){var t=String(i(this)),n="",o=r(e);if(o<0||o==1/0)throw RangeError("Count can't be negative");for(;o>0;(o>>>=1)&&(t+=t))1&o&&(n+=t);return n}},function(e,t){e.exports=Math.sign||function(e){return 0==(e=+e)||e!=e?e:e<0?-1:1}},function(e,t){var n=Math.expm1;e.exports=!n||n(10)>22025.465794806718||n(10)<22025.465794806718||-2e-17!=n(-2e-17)?function(e){return 0==(e=+e)?e:e>-1e-6&&e<1e-6?e+e*e/2:Math.exp(e)-1}:n},function(e,t,n){"use strict";var r=n(33),i=n(0),o=n(16),a=n(15),u=n(51),c=n(89),l=n(48),f=n(21),s=n(7)("iterator"),d=!([].keys&&"next"in[].keys()),h=function(){return this};e.exports=function(e,t,n,p,v,g,y){c(n,t,p);var m,b,x,_=function(e){if(!d&&e in k)return k[e];switch(e){case"keys":case"values":return function(){return new n(this,e)}}return function(){return new n(this,e)}},w=t+" Iterator",T="values"==v,S=!1,k=e.prototype,O=k[s]||k["@@iterator"]||v&&k[v],M=O||_(v),P=v?T?_("entries"):M:void 0,A="Array"==t&&k.entries||O;if(A&&(x=f(A.call(new e)))!==Object.prototype&&x.next&&(l(x,w,!0),r||"function"==typeof x[s]||a(x,s,h)),T&&O&&"values"!==O.name&&(S=!0,M=function(){return O.call(this)}),r&&!y||!d&&!S&&k[s]||a(k,s,M),u[t]=M,u[w]=h,v)if(m={values:T?M:_("values"),keys:g?M:_("keys"),entries:P},y)for(b in m)b in k||o(k,b,m[b]);else i(i.P+i.F*(d||S),t,m);return m}},function(e,t,n){"use strict";var r=n(40),i=n(36),o=n(48),a={};n(15)(a,n(7)("iterator"),(function(){return this})),e.exports=function(e,t,n){e.prototype=r(a,{next:i(1,n)}),o(e,t+" Iterator")}},function(e,t,n){var r=n(61),i=n(28);e.exports=function(e,t,n){if(r(t))throw TypeError("String#"+n+" doesn't accept regex!");return String(i(e))}},function(e,t,n){var r=n(7)("match");e.exports=function(e){var t=/./;try{"/./"[e](t)}catch(n){try{return t[r]=!1,!"/./"[e](t)}catch(e){}}return!0}},function(e,t,n){var r=n(51),i=n(7)("iterator"),o=Array.prototype;e.exports=function(e){return void 0!==e&&(r.Array===e||o[i]===e)}},function(e,t,n){"use strict";var r=n(10),i=n(36);e.exports=function(e,t,n){t in e?r.f(e,t,i(0,n)):e[t]=n}},function(e,t,n){var r=n(49),i=n(7)("iterator"),o=n(51);e.exports=n(22).getIteratorMethod=function(e){if(null!=e)return e[i]||e["@@iterator"]||o[r(e)]}},function(e,t,n){var r=n(245);e.exports=function(e,t){return new(r(e))(t)}},function(e,t,n){"use strict";var r=n(11),i=n(39),o=n(8);e.exports=function(e){for(var t=r(this),n=o(t.length),a=arguments.length,u=i(a>1?arguments[1]:void 0,n),c=a>2?arguments[2]:void 0,l=void 0===c?n:i(c,n);l>u;)t[u++]=e;return t}},function(e,t,n){"use strict";var r=n(35),i=n(127),o=n(51),a=n(19);e.exports=n(88)(Array,"Array",(function(e,t){this._t=a(e),this._i=0,this._k=t}),(function(){var e=this._t,t=this._k,n=this._i++;return!e||n>=e.length?(this._t=void 0,i(1)):i(0,"keys"==t?n:"values"==t?e[n]:[n,e[n]])}),"values"),o.Arguments=o.Array,r("keys"),r("values"),r("entries")},function(e,t,n){"use strict";var r,i,o=n(55),a=RegExp.prototype.exec,u=String.prototype.replace,c=a,l=(r=/a/,i=/b*/g,a.call(r,"a"),a.call(i,"a"),0!==r.lastIndex||0!==i.lastIndex),f=void 0!==/()??/.exec("")[1];(l||f)&&(c=function(e){var t,n,r,i,c=this;return f&&(n=new RegExp("^"+c.source+"$(?!\\s)",o.call(c))),l&&(t=c.lastIndex),r=a.call(c,e),l&&r&&(c.lastIndex=c.global?r.index+r[0].length:t),f&&r&&r.length>1&&u.call(r[0],n,(function(){for(i=1;in;)t.push(arguments[n++]);return y[++g]=function(){u("function"==typeof e?e:Function(e),t)},r(g),g},h=function(e){delete y[e]},"process"==n(24)(s)?r=function(e){s.nextTick(a(m,e,1))}:v&&v.now?r=function(e){v.now(a(m,e,1))}:p?(o=(i=new p).port2,i.port1.onmessage=b,r=a(o.postMessage,o,1)):f.addEventListener&&"function"==typeof postMessage&&!f.importScripts?(r=function(e){f.postMessage(e+"","*")},f.addEventListener("message",b,!1)):r="onreadystatechange"in l("script")?function(e){c.appendChild(l("script")).onreadystatechange=function(){c.removeChild(this),m.call(e)}}:function(e){setTimeout(a(m,e,1),0)}),e.exports={set:d,clear:h}},function(e,t,n){var r=n(2),i=n(100).set,o=r.MutationObserver||r.WebKitMutationObserver,a=r.process,u=r.Promise,c="process"==n(24)(a);e.exports=function(){var e,t,n,l=function(){var r,i;for(c&&(r=a.domain)&&r.exit();e;){i=e.fn,e=e.next;try{i()}catch(r){throw e?n():t=void 0,r}}t=void 0,r&&r.enter()};if(c)n=function(){a.nextTick(l)};else if(!o||r.navigator&&r.navigator.standalone)if(u&&u.resolve){var f=u.resolve(void 0);n=function(){f.then(l)}}else n=function(){i.call(r,l)};else{var s=!0,d=document.createTextNode("");new o(l).observe(d,{characterData:!0}),n=function(){d.data=s=!s}}return function(r){var i={fn:r,next:void 0};t&&(t.next=i),e||(e=i,n()),t=i}}},function(e,t,n){"use strict";var r=n(13);function i(e){var t,n;this.promise=new e((function(e,r){if(void 0!==t||void 0!==n)throw TypeError("Bad Promise constructor");t=e,n=r})),this.resolve=r(t),this.reject=r(n)}e.exports.f=function(e){return new i(e)}},function(e,t,n){"use strict";var r=n(2),i=n(9),o=n(33),a=n(67),u=n(15),c=n(45),l=n(3),f=n(43),s=n(25),d=n(8),h=n(137),p=n(41).f,v=n(10).f,g=n(96),y=n(48),m=r.ArrayBuffer,b=r.DataView,x=r.Math,_=r.RangeError,w=r.Infinity,T=m,S=x.abs,k=x.pow,O=x.floor,M=x.log,P=x.LN2,A=i?"_b":"buffer",E=i?"_l":"byteLength",N=i?"_o":"byteOffset";function j(e,t,n){var r,i,o,a=new Array(n),u=8*n-t-1,c=(1<>1,f=23===t?k(2,-24)-k(2,-77):0,s=0,d=e<0||0===e&&1/e<0?1:0;for((e=S(e))!=e||e===w?(i=e!=e?1:0,r=c):(r=O(M(e)/P),e*(o=k(2,-r))<1&&(r--,o*=2),(e+=r+l>=1?f/o:f*k(2,1-l))*o>=2&&(r++,o/=2),r+l>=c?(i=0,r=c):r+l>=1?(i=(e*o-1)*k(2,t),r+=l):(i=e*k(2,l-1)*k(2,t),r=0));t>=8;a[s++]=255&i,i/=256,t-=8);for(r=r<0;a[s++]=255&r,r/=256,u-=8);return a[--s]|=128*d,a}function C(e,t,n){var r,i=8*n-t-1,o=(1<>1,u=i-7,c=n-1,l=e[c--],f=127&l;for(l>>=7;u>0;f=256*f+e[c],c--,u-=8);for(r=f&(1<<-u)-1,f>>=-u,u+=t;u>0;r=256*r+e[c],c--,u-=8);if(0===f)f=1-a;else{if(f===o)return r?NaN:l?-w:w;r+=k(2,t),f-=a}return(l?-1:1)*r*k(2,f-t)}function L(e){return e[3]<<24|e[2]<<16|e[1]<<8|e[0]}function D(e){return[255&e]}function R(e){return[255&e,e>>8&255]}function I(e){return[255&e,e>>8&255,e>>16&255,e>>24&255]}function F(e){return j(e,52,8)}function B(e){return j(e,23,4)}function q(e,t,n){v(e.prototype,t,{get:function(){return this[n]}})}function z(e,t,n,r){var i=h(+n);if(i+t>e[E])throw _("Wrong index!");var o=e[A]._b,a=i+e[N],u=o.slice(a,a+t);return r?u:u.reverse()}function U(e,t,n,r,i,o){var a=h(+n);if(a+t>e[E])throw _("Wrong index!");for(var u=e[A]._b,c=a+e[N],l=r(+i),f=0;fH;)(W=V[H++])in m||u(m,W,T[W]);o||(G.constructor=m)}var Y=new b(new m(2)),$=b.prototype.setInt8;Y.setInt8(0,2147483648),Y.setInt8(1,2147483649),!Y.getInt8(0)&&Y.getInt8(1)||c(b.prototype,{setInt8:function(e,t){$.call(this,e,t<<24>>24)},setUint8:function(e,t){$.call(this,e,t<<24>>24)}},!0)}else m=function(e){f(this,m,"ArrayBuffer");var t=h(e);this._b=g.call(new Array(t),0),this[E]=t},b=function(e,t,n){f(this,b,"DataView"),f(e,m,"DataView");var r=e[E],i=s(t);if(i<0||i>r)throw _("Wrong offset!");if(i+(n=void 0===n?r-i:d(n))>r)throw _("Wrong length!");this[A]=e,this[N]=i,this[E]=n},i&&(q(m,"byteLength","_l"),q(b,"buffer","_b"),q(b,"byteLength","_l"),q(b,"byteOffset","_o")),c(b.prototype,{getInt8:function(e){return z(this,1,e)[0]<<24>>24},getUint8:function(e){return z(this,1,e)[0]},getInt16:function(e){var t=z(this,2,e,arguments[1]);return(t[1]<<8|t[0])<<16>>16},getUint16:function(e){var t=z(this,2,e,arguments[1]);return t[1]<<8|t[0]},getInt32:function(e){return L(z(this,4,e,arguments[1]))},getUint32:function(e){return L(z(this,4,e,arguments[1]))>>>0},getFloat32:function(e){return C(z(this,4,e,arguments[1]),23,4)},getFloat64:function(e){return C(z(this,8,e,arguments[1]),52,8)},setInt8:function(e,t){U(this,1,e,D,t)},setUint8:function(e,t){U(this,1,e,D,t)},setInt16:function(e,t){U(this,2,e,R,t,arguments[2])},setUint16:function(e,t){U(this,2,e,R,t,arguments[2])},setInt32:function(e,t){U(this,4,e,I,t,arguments[2])},setUint32:function(e,t){U(this,4,e,I,t,arguments[2])},setFloat32:function(e,t){U(this,4,e,B,t,arguments[2])},setFloat64:function(e,t){U(this,8,e,F,t,arguments[2])}});y(m,"ArrayBuffer"),y(b,"DataView"),u(b.prototype,a.VIEW,!0),t.ArrayBuffer=m,t.DataView=b},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t,n){var c=this,f=this.config;return this.node=(0,u.h)("div.eleTree-group",{style:{marginLeft:n?"none":f.indent+"px"}},[n&&(0===e.length||e.every((function(e){return e[a.symbolAttr.isHideNode]})))?i.default.call(this):null,o.default.call(this,n)].concat(function(e){return function(e){if(Array.isArray(e))return l(e)}(e)||function(e){if("undefined"!=typeof Symbol&&Symbol.iterator in Object(e))return Array.from(e)}(e)||function(e,t){if(!e)return;if("string"==typeof e)return l(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);"Object"===n&&e.constructor&&(n=e.constructor.name);if("Map"===n||"Set"===n)return Array.from(e);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return l(e,t)}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}(e.map((function(e){return r.default.call(c,e,t,n)}))))),this.node};var r=c(n(356)),i=c(n(374)),o=c(n(375)),a=n(5),u=n(14);function c(e){return e&&e.__esModule?e:{default:e}}function l(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n.eleTree-loading-content");t&&t.parentNode.removeChild(t)};var r=n(14),i=(0,r.init)([n(71).default,n(72).default,n(73).default,n(74).default])},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t,n){var r=this.config,u=r.request,c=(u.key,u.isOpen),l=(u.checked,u.children),f=(u.disabled,u.isLeaf,u.pid);if((0,o.isObject)(t)||(0,o.isArray)(t)){n=(0,o.isObject)(t)?[t]:t;for(var s=0;s2&&void 0!==arguments[2]?arguments[2]:"children",a=arguments.length>3?arguments[3]:void 0,u=arguments.length>4&&void 0!==arguments[4]?arguments[4]:"paste",c=this.config,l=c.request,f=(l.key,l.isOpen,l.checked,l.children);l.disabled,l.isLeaf,l.pid;if((0,i.paramDetection)(t,"String|Number","paste方法第一个参数必须为String|Number"))return e;if((0,i.paramDetection)(t,"String","paste方法第二个参数必须为String"))return e;var p=a||i.getNodeDataById.call(this,t);"children"===o?s.call(this,p,"paste",(function(){var e=d.call(n,u);e&&(p[f].push(e),i.updateDate.call(n),r.default.call(n))})):"before"===o?s.call(this,p,"paste_before",(function(){h.call(n,p,"before",u)})):"after"===o&&s.call(this,p,"paste_after",(function(){h.call(n,p,"after",u)}));return e};var r=l(n(12)),i=n(6),o=n(5),a=n(75),u=n(105),c=l(n(76));function l(e){return e&&e.__esModule?e:{default:e}}function f(e){return(f="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function s(e,t,n,r){var i=this;this.eventList[t]?(u.showLoding.call(this),a.emit.call(this,{v:e,type:t,event:event,otherOpt:Object.assign({},r,{load:function(){u.removeLoding.call(i),n()},stop:function(){u.removeLoding.call(i)}})})):n()}var d=function(e){var t=this,n=this.config.request,r=n.key,i=(n.isOpen,n.checked,n.children,n.disabled,n.isLeaf,n.pid,this.rightMenuPasteData);if(i){i[o.symbolAttr.isPasteNode]&&(e="move");return i[o.symbolAttr.isPasteNode]&&c.default.call(this,null,[i[r]]),function n(i){var o=Array.isArray(i)?[]:{};return Object.keys(i).forEach((function(a){o[a]="object"===f(i[a])?n(i[a]):a===r&&"paste"===e?t.customIndex++:i[a]})),o}(i)}},h=function(e,t,n){var a=this.config,u=a.request,c=u.key,l=(u.isOpen,u.checked,u.children),f=(u.disabled,u.isLeaf,u.pid,d.call(this,n));if(f){var s=e[o.symbolAttr.parentNode];if(s){var h=s[l].findIndex((function(t){return t[c]===e[c]}));h="before"===t?h:h+1,s[l].splice(h,0,f)}else{var p=a.data.findIndex((function(t){return t[c]===e[c]}));p="before"===t?p:p+1,a.data.splice(p,0,f)}i.updateDate.call(this),r.default.call(this)}}},function(e,t){var n;n=function(){return this}();try{n=n||new Function("return this")()}catch(e){"object"==typeof window&&(n=window)}e.exports=n},function(e,t,n){e.exports=!n(9)&&!n(3)((function(){return 7!=Object.defineProperty(n(77)("div"),"a",{get:function(){return 7}}).a}))},function(e,t,n){t.f=n(7)},function(e,t,n){var r=n(18),i=n(19),o=n(57)(!1),a=n(79)("IE_PROTO");e.exports=function(e,t){var n,u=i(e),c=0,l=[];for(n in u)n!=a&&r(u,n)&&l.push(n);for(;t.length>c;)r(u,n=t[c++])&&(~o(l,n)||l.push(n));return l}},function(e,t,n){var r=n(10),i=n(1),o=n(38);e.exports=n(9)?Object.defineProperties:function(e,t){i(e);for(var n,a=o(t),u=a.length,c=0;u>c;)r.f(e,n=a[c++],t[n]);return e}},function(e,t,n){var r=n(19),i=n(41).f,o={}.toString,a="object"==typeof window&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[];e.exports.f=function(e){return a&&"[object Window]"==o.call(e)?function(e){try{return i(e)}catch(e){return a.slice()}}(e):i(r(e))}},function(e,t,n){"use strict";var r=n(9),i=n(38),o=n(58),a=n(54),u=n(11),c=n(53),l=Object.assign;e.exports=!l||n(3)((function(){var e={},t={},n=Symbol(),r="abcdefghijklmnopqrst";return e[n]=7,r.split("").forEach((function(e){t[e]=e})),7!=l({},e)[n]||Object.keys(l({},t)).join("")!=r}))?function(e,t){for(var n=u(e),l=arguments.length,f=1,s=o.f,d=a.f;l>f;)for(var h,p=c(arguments[f++]),v=s?i(p).concat(s(p)):i(p),g=v.length,y=0;g>y;)h=v[y++],r&&!d.call(p,h)||(n[h]=p[h]);return n}:l},function(e,t){e.exports=Object.is||function(e,t){return e===t?0!==e||1/e==1/t:e!=e&&t!=t}},function(e,t,n){"use strict";var r=n(13),i=n(4),o=n(117),a=[].slice,u={},c=function(e,t,n){if(!(t in u)){for(var r=[],i=0;i>>0||(a.test(n)?16:10))}:r},function(e,t,n){var r=n(2).parseFloat,i=n(50).trim;e.exports=1/r(n(83)+"-0")!=-1/0?function(e){var t=i(String(e),3),n=r(t);return 0===n&&"-"==t.charAt(0)?-0:n}:r},function(e,t,n){var r=n(24);e.exports=function(e,t){if("number"!=typeof e&&"Number"!=r(e))throw TypeError(t);return+e}},function(e,t,n){var r=n(4),i=Math.floor;e.exports=function(e){return!r(e)&&isFinite(e)&&i(e)===e}},function(e,t){e.exports=Math.log1p||function(e){return(e=+e)>-1e-8&&e<1e-8?e-e*e/2:Math.log(1+e)}},function(e,t,n){var r=n(86),i=Math.pow,o=i(2,-52),a=i(2,-23),u=i(2,127)*(2-a),c=i(2,-126);e.exports=Math.fround||function(e){var t,n,i=Math.abs(e),l=r(e);return iu||n!=n?l*(1/0):l*n}},function(e,t,n){var r=n(1);e.exports=function(e,t,n,i){try{return i?t(r(n)[0],n[1]):t(n)}catch(t){var o=e.return;throw void 0!==o&&r(o.call(e)),t}}},function(e,t,n){var r=n(13),i=n(11),o=n(53),a=n(8);e.exports=function(e,t,n,u,c){r(t);var l=i(e),f=o(l),s=a(l.length),d=c?s-1:0,h=c?-1:1;if(n<2)for(;;){if(d in f){u=f[d],d+=h;break}if(d+=h,c?d<0:s<=d)throw TypeError("Reduce of empty array with no initial value")}for(;c?d>=0:s>d;d+=h)d in f&&(u=t(u,f[d],d,l));return u}},function(e,t,n){"use strict";var r=n(11),i=n(39),o=n(8);e.exports=[].copyWithin||function(e,t){var n=r(this),a=o(n.length),u=i(e,a),c=i(t,a),l=arguments.length>2?arguments[2]:void 0,f=Math.min((void 0===l?a:i(l,a))-c,a-u),s=1;for(c0;)c in n?n[u]=n[c]:delete n[u],u+=s,c+=s;return n}},function(e,t){e.exports=function(e,t){return{value:t,done:!!e}}},function(e,t,n){"use strict";var r=n(98);n(0)({target:"RegExp",proto:!0,forced:r!==/./.exec},{exec:r})},function(e,t,n){n(9)&&"g"!=/./g.flags&&n(10).f(RegExp.prototype,"flags",{configurable:!0,get:n(55)})},function(e,t){e.exports=function(e){try{return{e:!1,v:e()}}catch(e){return{e:!0,v:e}}}},function(e,t,n){var r=n(1),i=n(4),o=n(102);e.exports=function(e,t){if(r(e),i(t)&&t.constructor===e)return t;var n=o.f(e);return(0,n.resolve)(t),n.promise}},function(e,t,n){"use strict";var r=n(133),i=n(46);e.exports=n(66)("Map",(function(e){return function(){return e(this,arguments.length>0?arguments[0]:void 0)}}),{get:function(e){var t=r.getEntry(i(this,"Map"),e);return t&&t.v},set:function(e,t){return r.def(i(this,"Map"),0===e?0:e,t)}},r,!0)},function(e,t,n){"use strict";var r=n(10).f,i=n(40),o=n(45),a=n(23),u=n(43),c=n(44),l=n(88),f=n(127),s=n(42),d=n(9),h=n(34).fastKey,p=n(46),v=d?"_s":"size",g=function(e,t){var n,r=h(t);if("F"!==r)return e._i[r];for(n=e._f;n;n=n.n)if(n.k==t)return n};e.exports={getConstructor:function(e,t,n,l){var f=e((function(e,r){u(e,f,t,"_i"),e._t=t,e._i=i(null),e._f=void 0,e._l=void 0,e[v]=0,null!=r&&c(r,n,e[l],e)}));return o(f.prototype,{clear:function(){for(var e=p(this,t),n=e._i,r=e._f;r;r=r.n)r.r=!0,r.p&&(r.p=r.p.n=void 0),delete n[r.i];e._f=e._l=void 0,e[v]=0},delete:function(e){var n=p(this,t),r=g(n,e);if(r){var i=r.n,o=r.p;delete n._i[r.i],r.r=!0,o&&(o.n=i),i&&(i.p=o),n._f==r&&(n._f=i),n._l==r&&(n._l=o),n[v]--}return!!r},forEach:function(e){p(this,t);for(var n,r=a(e,arguments.length>1?arguments[1]:void 0,3);n=n?n.n:this._f;)for(r(n.v,n.k,this);n&&n.r;)n=n.p},has:function(e){return!!g(p(this,t),e)}}),d&&r(f.prototype,"size",{get:function(){return p(this,t)[v]}}),f},def:function(e,t,n){var r,i,o=g(e,t);return o?o.v=n:(e._l=o={i:i=h(t,!0),k:t,v:n,p:r=e._l,n:void 0,r:!1},e._f||(e._f=o),r&&(r.n=o),e[v]++,"F"!==i&&(e._i[i]=o)),e},getEntry:g,setStrong:function(e,t,n){l(e,t,(function(e,n){this._t=p(e,t),this._k=n,this._l=void 0}),(function(){for(var e=this._k,t=this._l;t&&t.r;)t=t.p;return this._t&&(this._l=t=t?t.n:this._t._f)?f(0,"keys"==e?t.k:"values"==e?t.v:[t.k,t.v]):(this._t=void 0,f(1))}),n?"entries":"values",!n,!0),s(t)}}},function(e,t,n){"use strict";var r=n(133),i=n(46);e.exports=n(66)("Set",(function(e){return function(){return e(this,arguments.length>0?arguments[0]:void 0)}}),{add:function(e){return r.def(i(this,"Set"),e=0===e?0:e,e)}},r)},function(e,t,n){"use strict";var r,i=n(2),o=n(30)(0),a=n(16),u=n(34),c=n(114),l=n(136),f=n(4),s=n(46),d=n(46),h=!i.ActiveXObject&&"ActiveXObject"in i,p=u.getWeak,v=Object.isExtensible,g=l.ufstore,y=function(e){return function(){return e(this,arguments.length>0?arguments[0]:void 0)}},m={get:function(e){if(f(e)){var t=p(e);return!0===t?g(s(this,"WeakMap")).get(e):t?t[this._i]:void 0}},set:function(e,t){return l.def(s(this,"WeakMap"),e,t)}},b=e.exports=n(66)("WeakMap",y,m,l,!0,!0);d&&h&&(c((r=l.getConstructor(y,"WeakMap")).prototype,m),u.NEED=!0,o(["delete","has","get","set"],(function(e){var t=b.prototype,n=t[e];a(t,e,(function(t,i){if(f(t)&&!v(t)){this._f||(this._f=new r);var o=this._f[e](t,i);return"set"==e?this:o}return n.call(this,t,i)}))})))},function(e,t,n){"use strict";var r=n(45),i=n(34).getWeak,o=n(1),a=n(4),u=n(43),c=n(44),l=n(30),f=n(18),s=n(46),d=l(5),h=l(6),p=0,v=function(e){return e._l||(e._l=new g)},g=function(){this.a=[]},y=function(e,t){return d(e.a,(function(e){return e[0]===t}))};g.prototype={get:function(e){var t=y(this,e);if(t)return t[1]},has:function(e){return!!y(this,e)},set:function(e,t){var n=y(this,e);n?n[1]=t:this.a.push([e,t])},delete:function(e){var t=h(this.a,(function(t){return t[0]===e}));return~t&&this.a.splice(t,1),!!~t}},e.exports={getConstructor:function(e,t,n,o){var l=e((function(e,r){u(e,l,t,"_i"),e._t=t,e._i=p++,e._l=void 0,null!=r&&c(r,n,e[o],e)}));return r(l.prototype,{delete:function(e){if(!a(e))return!1;var n=i(e);return!0===n?v(s(this,t)).delete(e):n&&f(n,this._i)&&delete n[this._i]},has:function(e){if(!a(e))return!1;var n=i(e);return!0===n?v(s(this,t)).has(e):n&&f(n,this._i)}}),l},def:function(e,t,n){var r=i(o(t),!0);return!0===r?v(e).set(t,n):r[e._i]=n,e},ufstore:v}},function(e,t,n){var r=n(25),i=n(8);e.exports=function(e){if(void 0===e)return 0;var t=r(e),n=i(t);if(t!==n)throw RangeError("Wrong length!");return n}},function(e,t,n){var r=n(41),i=n(58),o=n(1),a=n(2).Reflect;e.exports=a&&a.ownKeys||function(e){var t=r.f(o(e)),n=i.f;return n?t.concat(n(e)):t}},function(e,t,n){"use strict";var r=n(59),i=n(4),o=n(8),a=n(23),u=n(7)("isConcatSpreadable");e.exports=function e(t,n,c,l,f,s,d,h){for(var p,v,g=f,y=0,m=!!d&&a(d,h,3);y0)g=e(t,n,p,o(p.length),g,s-1)-1;else{if(g>=9007199254740991)throw TypeError();t[g]=p}g++}y++}return g}},function(e,t,n){var r=n(8),i=n(85),o=n(28);e.exports=function(e,t,n,a){var u=String(o(e)),c=u.length,l=void 0===n?" ":String(n),f=r(t);if(f<=c||""==l)return u;var s=f-c,d=i.call(l,Math.ceil(s/l.length));return d.length>s&&(d=d.slice(0,s)),a?d+u:u+d}},function(e,t,n){var r=n(9),i=n(38),o=n(19),a=n(54).f;e.exports=function(e){return function(t){for(var n,u=o(t),c=i(u),l=c.length,f=0,s=[];l>f;)n=c[f++],r&&!a.call(u,n)||s.push(e?[n,u[n]]:u[n]);return s}}},function(e,t,n){var r=n(49),i=n(143);e.exports=function(e){return function(){if(r(this)!=e)throw TypeError(e+"#toJSON isn't generic");return i(this)}}},function(e,t,n){var r=n(44);e.exports=function(e,t){var n=[];return r(e,!1,n.push,n,t),n}},function(e,t){e.exports=Math.scale||function(e,t,n,r,i){return 0===arguments.length||e!=e||t!=t||n!=n||r!=r||i!=i?NaN:e===1/0||e===-1/0?e:(e-t)*(i-r)/(n-t)+r}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.renderData=function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0],t=null;u.call(this,this.config.data,t,e,!1)},t.changeData=u;var r,i=(r=n(146))&&r.__esModule?r:{default:r},o=n(5),a=n(6);function u(e,t){var n=this,r=arguments.length>2&&void 0!==arguments[2]&&arguments[2],c=arguments.length>3&&void 0!==arguments[3]&&arguments[3],l=this.config,f=l.request,s=f.key,d=f.isOpen,h=f.checked,p=f.children,v=f.disabled,g=f.isLeaf,y=f.radioChecked,m=f.radioDisabled,b=!1;e.forEach((function(f,x){var _=function(e){return"boolean"==typeof e?e:"number"==typeof e&&2===e},w=r?_(f[d])||l.defaultExpandAll||l.defaultExpandedKeys.includes(f[s])||l.autoExpandParent&&_(t[d]):_(f[d]);if(f[d]=w?2:0,f[p]=f[p]||[],f[g]=l.lazy?f[g]||!1:0===f[p].length,f[o.symbolAttr.isRenderChild]=2===f[d]||f[o.symbolAttr.isRenderChild]||!1,f[o.symbolAttr.parentNode]=t,f[o.symbolAttr.isHideNode]=!(0,a.isUndefined)(f[o.symbolAttr.isHideNode])&&f[o.symbolAttr.isHideNode],f[o.symbolAttr.isPasteNode]=!1,f[o.symbolAttr.editNodeType]=null,l.lazy&&(f[o.symbolAttr.isLazyNode]=f[o.symbolAttr.isLazyNode]||!1),l.showCheckbox){var T=r&&l.defaultCheckedKeys.includes(f[s])||_(f[h]);if(f[h]=T?2:0,f[v]=f[v]||!1,!l.checkStrictly){var S;if(S=!!t&&(t[v]?2===t[o.symbolAttr.disabledParentStatus]:2===t[h]),f[v]?f[o.symbolAttr.disabledParentStatus]=S?2:0:f[h]=2===f[h]||S?2:0,x===e.length-1){var k=!1;if(t&&t[o.symbolAttr.parentNode]){var O=t[o.symbolAttr.parentNode][p];k=O.findIndex((function(e){return t[s]===e[s]}))===O.length-1}k&&0===t[h]&&t[p].some((function(e){return 2===e[h]}))?i.default.call(n,f,!0):i.default.call(n,f,c)}}}if(l.showRadio){var M=r&&l.defaultRadioCheckedKeys.includes(f[s])||_(f[y]);f[y]=M?2:0,f[m]=f[m]||!1,f[y]&&("level"===l.radioType?(f[y]=!b&&M?2:0,b=!0):"all"===l.radioType&&(f[y]=!n.isAlreadyRadioChecked&&M?2:0,n.isAlreadyRadioChecked=!0,n.currentRadioCheckedData=2===f[y]?f:n.currentRadioCheckedData))}f[l.request.children]&&f[l.request.children].length>0&&u.call(n,f[p],f,r,c)}))}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function e(t){var n=arguments.length>1&&void 0!==arguments[1]&&arguments[1],o=this.config,a=o.request,u=(a.key,a.isOpen,a.checked),c=a.children,l=a.disabled,f=(a.isLeaf,t[i.symbolAttr.parentNode]);if(!f)return;var s=function(e){return(0,r.isUndefined)(e[i.symbolAttr.disabledParentStatus])?e[u]:e[i.symbolAttr.disabledParentStatus]},d=function e(t){if(!t[l])return!0;for(var n=0;n2&&void 0!==arguments[2]?arguments[2]:[],r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"before",c=this.config,l=c.request,f=(l.name,l.key),s=(l.isOpen,l.checked,l.children);l.disabled,l.isLeaf;if((0,i.paramDetection)(t,"String|Number","insertAfter方法第一个参数必须为String|Number"))return e;if((0,i.paramDetection)(n,"Array|Object","insertAfter方法第二个参数必须为Array|Object"))return e;n=(0,i.isArray)(n)?n:[n];var d=i.getNodeDataById.call(this,t);if(!d)return e;var h=d[a.symbolAttr.parentNode];if(h){var p,v=h[s].findIndex((function(e){return e[f]===t}));v="before"===r?v:"after"===r?v+1:v,(p=h[s]).splice.apply(p,[v,0].concat(u(n))),i.updateDate.call(this,d)}else{var g,y=c.data.findIndex((function(e){return e[f]===t}));y="before"===r?y:"after"===r?y+1:y,(g=c.data).splice.apply(g,[y,0].concat(u(n))),i.updateDate.call(this)}return o.default.call(this),e};var r,i=n(6),o=(r=n(12))&&r.__esModule?r:{default:r},a=n(5);function u(e){return function(e){if(Array.isArray(e))return c(e)}(e)||function(e){if("undefined"!=typeof Symbol&&Symbol.iterator in Object(e))return Array.from(e)}(e)||function(e,t){if(!e)return;if("string"==typeof e)return c(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);"Object"===n&&e.constructor&&(n=e.constructor.name);if("Map"===n||"Set"===n)return Array.from(e);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return c(e,t)}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function c(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n1&&void 0!==arguments[1]?arguments[1]:"c",r=this.config,a=r.request,u=a.key,c=(a.isOpen,a.checked,a.children),l=(a.disabled,a.isLeaf,a.pid),f=[],s=function e(n,r){for(var o=0,a=n.length;o0&&(r[o][c]=[],e(n[o][c],r[o][c]))},d=function e(n,a){for(var f=0,s=n.length;f0&&e(n[f][c],a)}},h="c"===n?s:"p"===n?d:null;return h&&h(r.data,f),f};var r,i=(r=n(47))&&r.__esModule?r:{default:r},o=n(5)},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0,n(153);var r,i=(r=n(355))&&r.__esModule?r:{default:r};window.layui&&layui.define?layui.define((function(e){e("eleTree",i.default)})):"undefined"!=typeof window&&(window.eleTree=i.default);var o=i.default;t.default=o},function(e,t,n){"use strict";(function(e){if(n(154),n(351),n(352),e._babelPolyfill)throw new Error("only one instance of babel-polyfill is allowed");e._babelPolyfill=!0;function t(e,t,n){e[t]||Object.defineProperty(e,t,{writable:!0,configurable:!0,value:n})}t(String.prototype,"padLeft","".padStart),t(String.prototype,"padRight","".padEnd),"pop,reverse,shift,keys,values,entries,indexOf,every,some,forEach,map,filter,find,findIndex,includes,join,slice,concat,push,splice,unshift,sort,lastIndexOf,reduce,reduceRight,copyWithin,fill".split(",").forEach((function(e){[][e]&&t(Array,e,Function.call.bind([][e]))}))}).call(this,n(108))},function(e,t,n){n(155),n(158),n(159),n(160),n(161),n(162),n(163),n(164),n(165),n(166),n(167),n(168),n(169),n(170),n(171),n(172),n(173),n(174),n(175),n(176),n(177),n(178),n(179),n(180),n(181),n(182),n(183),n(184),n(185),n(186),n(187),n(188),n(189),n(190),n(191),n(192),n(193),n(194),n(195),n(196),n(197),n(198),n(199),n(200),n(201),n(202),n(203),n(204),n(205),n(206),n(207),n(208),n(209),n(210),n(211),n(212),n(213),n(214),n(215),n(216),n(217),n(218),n(219),n(220),n(221),n(222),n(223),n(224),n(225),n(226),n(227),n(228),n(229),n(230),n(231),n(232),n(233),n(235),n(236),n(238),n(239),n(240),n(241),n(242),n(243),n(244),n(246),n(247),n(248),n(249),n(250),n(251),n(252),n(253),n(254),n(255),n(256),n(257),n(258),n(97),n(259),n(128),n(260),n(129),n(261),n(262),n(263),n(264),n(265),n(132),n(134),n(135),n(266),n(267),n(268),n(269),n(270),n(271),n(272),n(273),n(274),n(275),n(276),n(277),n(278),n(279),n(280),n(281),n(282),n(283),n(284),n(285),n(286),n(287),n(288),n(289),n(290),n(291),n(292),n(293),n(294),n(295),n(296),n(297),n(298),n(299),n(300),n(301),n(302),n(303),n(304),n(305),n(306),n(307),n(308),n(309),n(310),n(311),n(312),n(313),n(314),n(315),n(316),n(317),n(318),n(319),n(320),n(321),n(322),n(323),n(324),n(325),n(326),n(327),n(328),n(329),n(330),n(331),n(332),n(333),n(334),n(335),n(336),n(337),n(338),n(339),n(340),n(341),n(342),n(343),n(344),n(345),n(346),n(347),n(348),n(349),n(350),e.exports=n(22)},function(e,t,n){"use strict";var r=n(2),i=n(18),o=n(9),a=n(0),u=n(16),c=n(34).KEY,l=n(3),f=n(52),s=n(48),d=n(37),h=n(7),p=n(110),v=n(78),g=n(157),y=n(59),m=n(1),b=n(4),x=n(11),_=n(19),w=n(27),T=n(36),S=n(40),k=n(113),O=n(20),M=n(58),P=n(10),A=n(38),E=O.f,N=P.f,j=k.f,C=r.Symbol,L=r.JSON,D=L&&L.stringify,R=h("_hidden"),I=h("toPrimitive"),F={}.propertyIsEnumerable,B=f("symbol-registry"),q=f("symbols"),z=f("op-symbols"),U=Object.prototype,W="function"==typeof C&&!!M.f,G=r.QObject,V=!G||!G.prototype||!G.prototype.findChild,H=o&&l((function(){return 7!=S(N({},"a",{get:function(){return N(this,"a",{value:7}).a}})).a}))?function(e,t,n){var r=E(U,t);r&&delete U[t],N(e,t,n),r&&e!==U&&N(U,t,r)}:N,Y=function(e){var t=q[e]=S(C.prototype);return t._k=e,t},$=W&&"symbol"==typeof C.iterator?function(e){return"symbol"==typeof e}:function(e){return e instanceof C},K=function(e,t,n){return e===U&&K(z,t,n),m(e),t=w(t,!0),m(n),i(q,t)?(n.enumerable?(i(e,R)&&e[R][t]&&(e[R][t]=!1),n=S(n,{enumerable:T(0,!1)})):(i(e,R)||N(e,R,T(1,{})),e[R][t]=!0),H(e,t,n)):N(e,t,n)},X=function(e,t){m(e);for(var n,r=g(t=_(t)),i=0,o=r.length;o>i;)K(e,n=r[i++],t[n]);return e},J=function(e){var t=F.call(this,e=w(e,!0));return!(this===U&&i(q,e)&&!i(z,e))&&(!(t||!i(this,e)||!i(q,e)||i(this,R)&&this[R][e])||t)},Z=function(e,t){if(e=_(e),t=w(t,!0),e!==U||!i(q,t)||i(z,t)){var n=E(e,t);return!n||!i(q,t)||i(e,R)&&e[R][t]||(n.enumerable=!0),n}},Q=function(e){for(var t,n=j(_(e)),r=[],o=0;n.length>o;)i(q,t=n[o++])||t==R||t==c||r.push(t);return r},ee=function(e){for(var t,n=e===U,r=j(n?z:_(e)),o=[],a=0;r.length>a;)!i(q,t=r[a++])||n&&!i(U,t)||o.push(q[t]);return o};W||(u((C=function(){if(this instanceof C)throw TypeError("Symbol is not a constructor!");var e=d(arguments.length>0?arguments[0]:void 0),t=function(n){this===U&&t.call(z,n),i(this,R)&&i(this[R],e)&&(this[R][e]=!1),H(this,e,T(1,n))};return o&&V&&H(U,e,{configurable:!0,set:t}),Y(e)}).prototype,"toString",(function(){return this._k})),O.f=Z,P.f=K,n(41).f=k.f=Q,n(54).f=J,M.f=ee,o&&!n(33)&&u(U,"propertyIsEnumerable",J,!0),p.f=function(e){return Y(h(e))}),a(a.G+a.W+a.F*!W,{Symbol:C});for(var te="hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables".split(","),ne=0;te.length>ne;)h(te[ne++]);for(var re=A(h.store),ie=0;re.length>ie;)v(re[ie++]);a(a.S+a.F*!W,"Symbol",{for:function(e){return i(B,e+="")?B[e]:B[e]=C(e)},keyFor:function(e){if(!$(e))throw TypeError(e+" is not a symbol!");for(var t in B)if(B[t]===e)return t},useSetter:function(){V=!0},useSimple:function(){V=!1}}),a(a.S+a.F*!W,"Object",{create:function(e,t){return void 0===t?S(e):X(S(e),t)},defineProperty:K,defineProperties:X,getOwnPropertyDescriptor:Z,getOwnPropertyNames:Q,getOwnPropertySymbols:ee});var oe=l((function(){M.f(1)}));a(a.S+a.F*oe,"Object",{getOwnPropertySymbols:function(e){return M.f(x(e))}}),L&&a(a.S+a.F*(!W||l((function(){var e=C();return"[null]"!=D([e])||"{}"!=D({a:e})||"{}"!=D(Object(e))}))),"JSON",{stringify:function(e){for(var t,n,r=[e],i=1;arguments.length>i;)r.push(arguments[i++]);if(n=t=r[1],(b(t)||void 0!==e)&&!$(e))return y(t)||(t=function(e,t){if("function"==typeof n&&(t=n.call(this,e,t)),!$(t))return t}),r[1]=t,D.apply(L,r)}}),C.prototype[I]||n(15)(C.prototype,I,C.prototype.valueOf),s(C,"Symbol"),s(Math,"Math",!0),s(r.JSON,"JSON",!0)},function(e,t,n){e.exports=n(52)("native-function-to-string",Function.toString)},function(e,t,n){var r=n(38),i=n(58),o=n(54);e.exports=function(e){var t=r(e),n=i.f;if(n)for(var a,u=n(e),c=o.f,l=0;u.length>l;)c.call(e,a=u[l++])&&t.push(a);return t}},function(e,t,n){var r=n(0);r(r.S,"Object",{create:n(40)})},function(e,t,n){var r=n(0);r(r.S+r.F*!n(9),"Object",{defineProperty:n(10).f})},function(e,t,n){var r=n(0);r(r.S+r.F*!n(9),"Object",{defineProperties:n(112)})},function(e,t,n){var r=n(19),i=n(20).f;n(29)("getOwnPropertyDescriptor",(function(){return function(e,t){return i(r(e),t)}}))},function(e,t,n){var r=n(11),i=n(21);n(29)("getPrototypeOf",(function(){return function(e){return i(r(e))}}))},function(e,t,n){var r=n(11),i=n(38);n(29)("keys",(function(){return function(e){return i(r(e))}}))},function(e,t,n){n(29)("getOwnPropertyNames",(function(){return n(113).f}))},function(e,t,n){var r=n(4),i=n(34).onFreeze;n(29)("freeze",(function(e){return function(t){return e&&r(t)?e(i(t)):t}}))},function(e,t,n){var r=n(4),i=n(34).onFreeze;n(29)("seal",(function(e){return function(t){return e&&r(t)?e(i(t)):t}}))},function(e,t,n){var r=n(4),i=n(34).onFreeze;n(29)("preventExtensions",(function(e){return function(t){return e&&r(t)?e(i(t)):t}}))},function(e,t,n){var r=n(4);n(29)("isFrozen",(function(e){return function(t){return!r(t)||!!e&&e(t)}}))},function(e,t,n){var r=n(4);n(29)("isSealed",(function(e){return function(t){return!r(t)||!!e&&e(t)}}))},function(e,t,n){var r=n(4);n(29)("isExtensible",(function(e){return function(t){return!!r(t)&&(!e||e(t))}}))},function(e,t,n){var r=n(0);r(r.S+r.F,"Object",{assign:n(114)})},function(e,t,n){var r=n(0);r(r.S,"Object",{is:n(115)})},function(e,t,n){var r=n(0);r(r.S,"Object",{setPrototypeOf:n(82).set})},function(e,t,n){"use strict";var r=n(49),i={};i[n(7)("toStringTag")]="z",i+""!="[object z]"&&n(16)(Object.prototype,"toString",(function(){return"[object "+r(this)+"]"}),!0)},function(e,t,n){var r=n(0);r(r.P,"Function",{bind:n(116)})},function(e,t,n){var r=n(10).f,i=Function.prototype,o=/^\s*function ([^ (]*)/;"name"in i||n(9)&&r(i,"name",{configurable:!0,get:function(){try{return(""+this).match(o)[1]}catch(e){return""}}})},function(e,t,n){"use strict";var r=n(4),i=n(21),o=n(7)("hasInstance"),a=Function.prototype;o in a||n(10).f(a,o,{value:function(e){if("function"!=typeof this||!r(e))return!1;if(!r(this.prototype))return e instanceof this;for(;e=i(e);)if(this.prototype===e)return!0;return!1}})},function(e,t,n){var r=n(0),i=n(118);r(r.G+r.F*(parseInt!=i),{parseInt:i})},function(e,t,n){var r=n(0),i=n(119);r(r.G+r.F*(parseFloat!=i),{parseFloat:i})},function(e,t,n){"use strict";var r=n(2),i=n(18),o=n(24),a=n(84),u=n(27),c=n(3),l=n(41).f,f=n(20).f,s=n(10).f,d=n(50).trim,h=r.Number,p=h,v=h.prototype,g="Number"==o(n(40)(v)),y="trim"in String.prototype,m=function(e){var t=u(e,!1);if("string"==typeof t&&t.length>2){var n,r,i,o=(t=y?t.trim():d(t,3)).charCodeAt(0);if(43===o||45===o){if(88===(n=t.charCodeAt(2))||120===n)return NaN}else if(48===o){switch(t.charCodeAt(1)){case 66:case 98:r=2,i=49;break;case 79:case 111:r=8,i=55;break;default:return+t}for(var a,c=t.slice(2),l=0,f=c.length;li)return NaN;return parseInt(c,r)}}return+t};if(!h(" 0o1")||!h("0b1")||h("+0x1")){h=function(e){var t=arguments.length<1?0:e,n=this;return n instanceof h&&(g?c((function(){v.valueOf.call(n)})):"Number"!=o(n))?a(new p(m(t)),n,h):m(t)};for(var b,x=n(9)?l(p):"MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,EPSILON,isFinite,isInteger,isNaN,isSafeInteger,MAX_SAFE_INTEGER,MIN_SAFE_INTEGER,parseFloat,parseInt,isInteger".split(","),_=0;x.length>_;_++)i(p,b=x[_])&&!i(h,b)&&s(h,b,f(p,b));h.prototype=v,v.constructor=h,n(16)(r,"Number",h)}},function(e,t,n){"use strict";var r=n(0),i=n(25),o=n(120),a=n(85),u=1..toFixed,c=Math.floor,l=[0,0,0,0,0,0],f="Number.toFixed: incorrect invocation!",s=function(e,t){for(var n=-1,r=t;++n<6;)r+=e*l[n],l[n]=r%1e7,r=c(r/1e7)},d=function(e){for(var t=6,n=0;--t>=0;)n+=l[t],l[t]=c(n/e),n=n%e*1e7},h=function(){for(var e=6,t="";--e>=0;)if(""!==t||0===e||0!==l[e]){var n=String(l[e]);t=""===t?n:t+a.call("0",7-n.length)+n}return t},p=function(e,t,n){return 0===t?n:t%2==1?p(e,t-1,n*e):p(e*e,t/2,n)};r(r.P+r.F*(!!u&&("0.000"!==8e-5.toFixed(3)||"1"!==.9.toFixed(0)||"1.25"!==1.255.toFixed(2)||"1000000000000000128"!==(0xde0b6b3a7640080).toFixed(0))||!n(3)((function(){u.call({})}))),"Number",{toFixed:function(e){var t,n,r,u,c=o(this,f),l=i(e),v="",g="0";if(l<0||l>20)throw RangeError(f);if(c!=c)return"NaN";if(c<=-1e21||c>=1e21)return String(c);if(c<0&&(v="-",c=-c),c>1e-21)if(n=(t=function(e){for(var t=0,n=e;n>=4096;)t+=12,n/=4096;for(;n>=2;)t+=1,n/=2;return t}(c*p(2,69,1))-69)<0?c*p(2,-t,1):c/p(2,t,1),n*=4503599627370496,(t=52-t)>0){for(s(0,n),r=l;r>=7;)s(1e7,0),r-=7;for(s(p(10,r,1),0),r=t-1;r>=23;)d(1<<23),r-=23;d(1<0?v+((u=g.length)<=l?"0."+a.call("0",l-u)+g:g.slice(0,u-l)+"."+g.slice(u-l)):v+g}})},function(e,t,n){"use strict";var r=n(0),i=n(3),o=n(120),a=1..toPrecision;r(r.P+r.F*(i((function(){return"1"!==a.call(1,void 0)}))||!i((function(){a.call({})}))),"Number",{toPrecision:function(e){var t=o(this,"Number#toPrecision: incorrect invocation!");return void 0===e?a.call(t):a.call(t,e)}})},function(e,t,n){var r=n(0);r(r.S,"Number",{EPSILON:Math.pow(2,-52)})},function(e,t,n){var r=n(0),i=n(2).isFinite;r(r.S,"Number",{isFinite:function(e){return"number"==typeof e&&i(e)}})},function(e,t,n){var r=n(0);r(r.S,"Number",{isInteger:n(121)})},function(e,t,n){var r=n(0);r(r.S,"Number",{isNaN:function(e){return e!=e}})},function(e,t,n){var r=n(0),i=n(121),o=Math.abs;r(r.S,"Number",{isSafeInteger:function(e){return i(e)&&o(e)<=9007199254740991}})},function(e,t,n){var r=n(0);r(r.S,"Number",{MAX_SAFE_INTEGER:9007199254740991})},function(e,t,n){var r=n(0);r(r.S,"Number",{MIN_SAFE_INTEGER:-9007199254740991})},function(e,t,n){var r=n(0),i=n(119);r(r.S+r.F*(Number.parseFloat!=i),"Number",{parseFloat:i})},function(e,t,n){var r=n(0),i=n(118);r(r.S+r.F*(Number.parseInt!=i),"Number",{parseInt:i})},function(e,t,n){var r=n(0),i=n(122),o=Math.sqrt,a=Math.acosh;r(r.S+r.F*!(a&&710==Math.floor(a(Number.MAX_VALUE))&&a(1/0)==1/0),"Math",{acosh:function(e){return(e=+e)<1?NaN:e>94906265.62425156?Math.log(e)+Math.LN2:i(e-1+o(e-1)*o(e+1))}})},function(e,t,n){var r=n(0),i=Math.asinh;r(r.S+r.F*!(i&&1/i(0)>0),"Math",{asinh:function e(t){return isFinite(t=+t)&&0!=t?t<0?-e(-t):Math.log(t+Math.sqrt(t*t+1)):t}})},function(e,t,n){var r=n(0),i=Math.atanh;r(r.S+r.F*!(i&&1/i(-0)<0),"Math",{atanh:function(e){return 0==(e=+e)?e:Math.log((1+e)/(1-e))/2}})},function(e,t,n){var r=n(0),i=n(86);r(r.S,"Math",{cbrt:function(e){return i(e=+e)*Math.pow(Math.abs(e),1/3)}})},function(e,t,n){var r=n(0);r(r.S,"Math",{clz32:function(e){return(e>>>=0)?31-Math.floor(Math.log(e+.5)*Math.LOG2E):32}})},function(e,t,n){var r=n(0),i=Math.exp;r(r.S,"Math",{cosh:function(e){return(i(e=+e)+i(-e))/2}})},function(e,t,n){var r=n(0),i=n(87);r(r.S+r.F*(i!=Math.expm1),"Math",{expm1:i})},function(e,t,n){var r=n(0);r(r.S,"Math",{fround:n(123)})},function(e,t,n){var r=n(0),i=Math.abs;r(r.S,"Math",{hypot:function(e,t){for(var n,r,o=0,a=0,u=arguments.length,c=0;a0?(r=n/c)*r:n;return c===1/0?1/0:c*Math.sqrt(o)}})},function(e,t,n){var r=n(0),i=Math.imul;r(r.S+r.F*n(3)((function(){return-5!=i(4294967295,5)||2!=i.length})),"Math",{imul:function(e,t){var n=+e,r=+t,i=65535&n,o=65535&r;return 0|i*o+((65535&n>>>16)*o+i*(65535&r>>>16)<<16>>>0)}})},function(e,t,n){var r=n(0);r(r.S,"Math",{log10:function(e){return Math.log(e)*Math.LOG10E}})},function(e,t,n){var r=n(0);r(r.S,"Math",{log1p:n(122)})},function(e,t,n){var r=n(0);r(r.S,"Math",{log2:function(e){return Math.log(e)/Math.LN2}})},function(e,t,n){var r=n(0);r(r.S,"Math",{sign:n(86)})},function(e,t,n){var r=n(0),i=n(87),o=Math.exp;r(r.S+r.F*n(3)((function(){return-2e-17!=!Math.sinh(-2e-17)})),"Math",{sinh:function(e){return Math.abs(e=+e)<1?(i(e)-i(-e))/2:(o(e-1)-o(-e-1))*(Math.E/2)}})},function(e,t,n){var r=n(0),i=n(87),o=Math.exp;r(r.S,"Math",{tanh:function(e){var t=i(e=+e),n=i(-e);return t==1/0?1:n==1/0?-1:(t-n)/(o(e)+o(-e))}})},function(e,t,n){var r=n(0);r(r.S,"Math",{trunc:function(e){return(e>0?Math.floor:Math.ceil)(e)}})},function(e,t,n){var r=n(0),i=n(39),o=String.fromCharCode,a=String.fromCodePoint;r(r.S+r.F*(!!a&&1!=a.length),"String",{fromCodePoint:function(e){for(var t,n=[],r=arguments.length,a=0;r>a;){if(t=+arguments[a++],i(t,1114111)!==t)throw RangeError(t+" is not a valid code point");n.push(t<65536?o(t):o(55296+((t-=65536)>>10),t%1024+56320))}return n.join("")}})},function(e,t,n){var r=n(0),i=n(19),o=n(8);r(r.S,"String",{raw:function(e){for(var t=i(e.raw),n=o(t.length),r=arguments.length,a=[],u=0;n>u;)a.push(String(t[u++])),u=t.length?{value:void 0,done:!0}:(e=r(t,n),this._i+=e.length,{value:e,done:!1})}))},function(e,t,n){"use strict";var r=n(0),i=n(60)(!1);r(r.P,"String",{codePointAt:function(e){return i(this,e)}})},function(e,t,n){"use strict";var r=n(0),i=n(8),o=n(90),a="".endsWith;r(r.P+r.F*n(91)("endsWith"),"String",{endsWith:function(e){var t=o(this,e,"endsWith"),n=arguments.length>1?arguments[1]:void 0,r=i(t.length),u=void 0===n?r:Math.min(i(n),r),c=String(e);return a?a.call(t,c,u):t.slice(u-c.length,u)===c}})},function(e,t,n){"use strict";var r=n(0),i=n(90);r(r.P+r.F*n(91)("includes"),"String",{includes:function(e){return!!~i(this,e,"includes").indexOf(e,arguments.length>1?arguments[1]:void 0)}})},function(e,t,n){var r=n(0);r(r.P,"String",{repeat:n(85)})},function(e,t,n){"use strict";var r=n(0),i=n(8),o=n(90),a="".startsWith;r(r.P+r.F*n(91)("startsWith"),"String",{startsWith:function(e){var t=o(this,e,"startsWith"),n=i(Math.min(arguments.length>1?arguments[1]:void 0,t.length)),r=String(e);return a?a.call(t,r,n):t.slice(n,n+r.length)===r}})},function(e,t,n){"use strict";n(17)("anchor",(function(e){return function(t){return e(this,"a","name",t)}}))},function(e,t,n){"use strict";n(17)("big",(function(e){return function(){return e(this,"big","","")}}))},function(e,t,n){"use strict";n(17)("blink",(function(e){return function(){return e(this,"blink","","")}}))},function(e,t,n){"use strict";n(17)("bold",(function(e){return function(){return e(this,"b","","")}}))},function(e,t,n){"use strict";n(17)("fixed",(function(e){return function(){return e(this,"tt","","")}}))},function(e,t,n){"use strict";n(17)("fontcolor",(function(e){return function(t){return e(this,"font","color",t)}}))},function(e,t,n){"use strict";n(17)("fontsize",(function(e){return function(t){return e(this,"font","size",t)}}))},function(e,t,n){"use strict";n(17)("italics",(function(e){return function(){return e(this,"i","","")}}))},function(e,t,n){"use strict";n(17)("link",(function(e){return function(t){return e(this,"a","href",t)}}))},function(e,t,n){"use strict";n(17)("small",(function(e){return function(){return e(this,"small","","")}}))},function(e,t,n){"use strict";n(17)("strike",(function(e){return function(){return e(this,"strike","","")}}))},function(e,t,n){"use strict";n(17)("sub",(function(e){return function(){return e(this,"sub","","")}}))},function(e,t,n){"use strict";n(17)("sup",(function(e){return function(){return e(this,"sup","","")}}))},function(e,t,n){var r=n(0);r(r.S,"Date",{now:function(){return(new Date).getTime()}})},function(e,t,n){"use strict";var r=n(0),i=n(11),o=n(27);r(r.P+r.F*n(3)((function(){return null!==new Date(NaN).toJSON()||1!==Date.prototype.toJSON.call({toISOString:function(){return 1}})})),"Date",{toJSON:function(e){var t=i(this),n=o(t);return"number"!=typeof n||isFinite(n)?t.toISOString():null}})},function(e,t,n){var r=n(0),i=n(234);r(r.P+r.F*(Date.prototype.toISOString!==i),"Date",{toISOString:i})},function(e,t,n){"use strict";var r=n(3),i=Date.prototype.getTime,o=Date.prototype.toISOString,a=function(e){return e>9?e:"0"+e};e.exports=r((function(){return"0385-07-25T07:06:39.999Z"!=o.call(new Date(-50000000000001))}))||!r((function(){o.call(new Date(NaN))}))?function(){if(!isFinite(i.call(this)))throw RangeError("Invalid time value");var e=this,t=e.getUTCFullYear(),n=e.getUTCMilliseconds(),r=t<0?"-":t>9999?"+":"";return r+("00000"+Math.abs(t)).slice(r?-6:-4)+"-"+a(e.getUTCMonth()+1)+"-"+a(e.getUTCDate())+"T"+a(e.getUTCHours())+":"+a(e.getUTCMinutes())+":"+a(e.getUTCSeconds())+"."+(n>99?n:"0"+a(n))+"Z"}:o},function(e,t,n){var r=Date.prototype,i=r.toString,o=r.getTime;new Date(NaN)+""!="Invalid Date"&&n(16)(r,"toString",(function(){var e=o.call(this);return e==e?i.call(this):"Invalid Date"}))},function(e,t,n){var r=n(7)("toPrimitive"),i=Date.prototype;r in i||n(15)(i,r,n(237))},function(e,t,n){"use strict";var r=n(1),i=n(27);e.exports=function(e){if("string"!==e&&"number"!==e&&"default"!==e)throw TypeError("Incorrect hint");return i(r(this),"number"!=e)}},function(e,t,n){var r=n(0);r(r.S,"Array",{isArray:n(59)})},function(e,t,n){"use strict";var r=n(23),i=n(0),o=n(11),a=n(124),u=n(92),c=n(8),l=n(93),f=n(94);i(i.S+i.F*!n(62)((function(e){Array.from(e)})),"Array",{from:function(e){var t,n,i,s,d=o(e),h="function"==typeof this?this:Array,p=arguments.length,v=p>1?arguments[1]:void 0,g=void 0!==v,y=0,m=f(d);if(g&&(v=r(v,p>2?arguments[2]:void 0,2)),null==m||h==Array&&u(m))for(n=new h(t=c(d.length));t>y;y++)l(n,y,g?v(d[y],y):d[y]);else for(s=m.call(d),n=new h;!(i=s.next()).done;y++)l(n,y,g?a(s,v,[i.value,y],!0):i.value);return n.length=y,n}})},function(e,t,n){"use strict";var r=n(0),i=n(93);r(r.S+r.F*n(3)((function(){function e(){}return!(Array.of.call(e)instanceof e)})),"Array",{of:function(){for(var e=0,t=arguments.length,n=new("function"==typeof this?this:Array)(t);t>e;)i(n,e,arguments[e++]);return n.length=t,n}})},function(e,t,n){"use strict";var r=n(0),i=n(19),o=[].join;r(r.P+r.F*(n(53)!=Object||!n(26)(o)),"Array",{join:function(e){return o.call(i(this),void 0===e?",":e)}})},function(e,t,n){"use strict";var r=n(0),i=n(81),o=n(24),a=n(39),u=n(8),c=[].slice;r(r.P+r.F*n(3)((function(){i&&c.call(i)})),"Array",{slice:function(e,t){var n=u(this.length),r=o(this);if(t=void 0===t?n:t,"Array"==r)return c.call(this,e,t);for(var i=a(e,n),l=a(t,n),f=u(l-i),s=new Array(f),d=0;d1&&(r=Math.min(r,o(arguments[1]))),r<0&&(r=n+r);r>=0;r--)if(r in t&&t[r]===e)return r||0;return-1}})},function(e,t,n){var r=n(0);r(r.P,"Array",{copyWithin:n(126)}),n(35)("copyWithin")},function(e,t,n){var r=n(0);r(r.P,"Array",{fill:n(96)}),n(35)("fill")},function(e,t,n){"use strict";var r=n(0),i=n(30)(5),o=!0;"find"in[]&&Array(1).find((function(){o=!1})),r(r.P+r.F*o,"Array",{find:function(e){return i(this,e,arguments.length>1?arguments[1]:void 0)}}),n(35)("find")},function(e,t,n){"use strict";var r=n(0),i=n(30)(6),o="findIndex",a=!0;o in[]&&Array(1)[o]((function(){a=!1})),r(r.P+r.F*a,"Array",{findIndex:function(e){return i(this,e,arguments.length>1?arguments[1]:void 0)}}),n(35)(o)},function(e,t,n){n(42)("Array")},function(e,t,n){var r=n(2),i=n(84),o=n(10).f,a=n(41).f,u=n(61),c=n(55),l=r.RegExp,f=l,s=l.prototype,d=/a/g,h=/a/g,p=new l(d)!==d;if(n(9)&&(!p||n(3)((function(){return h[n(7)("match")]=!1,l(d)!=d||l(h)==h||"/a/i"!=l(d,"i")})))){l=function(e,t){var n=this instanceof l,r=u(e),o=void 0===t;return!n&&r&&e.constructor===l&&o?e:i(p?new f(r&&!o?e.source:e,t):f((r=e instanceof l)?e.source:e,r&&o?c.call(e):t),n?this:s,l)};for(var v=function(e){e in l||o(l,e,{configurable:!0,get:function(){return f[e]},set:function(t){f[e]=t}})},g=a(f),y=0;g.length>y;)v(g[y++]);s.constructor=l,l.prototype=s,n(16)(r,"RegExp",l)}n(42)("RegExp")},function(e,t,n){"use strict";n(129);var r=n(1),i=n(55),o=n(9),a=/./.toString,u=function(e){n(16)(RegExp.prototype,"toString",e,!0)};n(3)((function(){return"/a/b"!=a.call({source:"a",flags:"b"})}))?u((function(){var e=r(this);return"/".concat(e.source,"/","flags"in e?e.flags:!o&&e instanceof RegExp?i.call(e):void 0)})):"toString"!=a.name&&u((function(){return a.call(this)}))},function(e,t,n){"use strict";var r=n(1),i=n(8),o=n(99),a=n(63);n(64)("match",1,(function(e,t,n,u){return[function(n){var r=e(this),i=null==n?void 0:n[t];return void 0!==i?i.call(n,r):new RegExp(n)[t](String(r))},function(e){var t=u(n,e,this);if(t.done)return t.value;var c=r(e),l=String(this);if(!c.global)return a(c,l);var f=c.unicode;c.lastIndex=0;for(var s,d=[],h=0;null!==(s=a(c,l));){var p=String(s[0]);d[h]=p,""===p&&(c.lastIndex=o(l,i(c.lastIndex),f)),h++}return 0===h?null:d}]}))},function(e,t,n){"use strict";var r=n(1),i=n(11),o=n(8),a=n(25),u=n(99),c=n(63),l=Math.max,f=Math.min,s=Math.floor,d=/\$([$&`']|\d\d?|<[^>]*>)/g,h=/\$([$&`']|\d\d?)/g;n(64)("replace",2,(function(e,t,n,p){return[function(r,i){var o=e(this),a=null==r?void 0:r[t];return void 0!==a?a.call(r,o,i):n.call(String(o),r,i)},function(e,t){var i=p(n,e,this,t);if(i.done)return i.value;var s=r(e),d=String(this),h="function"==typeof t;h||(t=String(t));var g=s.global;if(g){var y=s.unicode;s.lastIndex=0}for(var m=[];;){var b=c(s,d);if(null===b)break;if(m.push(b),!g)break;""===String(b[0])&&(s.lastIndex=u(d,o(s.lastIndex),y))}for(var x,_="",w=0,T=0;T=w&&(_+=d.slice(w,k)+E,w=k+S.length)}return _+d.slice(w)}];function v(e,t,r,o,a,u){var c=r+e.length,l=o.length,f=h;return void 0!==a&&(a=i(a),f=d),n.call(u,f,(function(n,i){var u;switch(i.charAt(0)){case"$":return"$";case"&":return e;case"`":return t.slice(0,r);case"'":return t.slice(c);case"<":u=a[i.slice(1,-1)];break;default:var f=+i;if(0===f)return n;if(f>l){var d=s(f/10);return 0===d?n:d<=l?void 0===o[d-1]?i.charAt(1):o[d-1]+i.charAt(1):n}u=o[f-1]}return void 0===u?"":u}))}}))},function(e,t,n){"use strict";var r=n(1),i=n(115),o=n(63);n(64)("search",1,(function(e,t,n,a){return[function(n){var r=e(this),i=null==n?void 0:n[t];return void 0!==i?i.call(n,r):new RegExp(n)[t](String(r))},function(e){var t=a(n,e,this);if(t.done)return t.value;var u=r(e),c=String(this),l=u.lastIndex;i(l,0)||(u.lastIndex=0);var f=o(u,c);return i(u.lastIndex,l)||(u.lastIndex=l),null===f?-1:f.index}]}))},function(e,t,n){"use strict";var r=n(61),i=n(1),o=n(56),a=n(99),u=n(8),c=n(63),l=n(98),f=n(3),s=Math.min,d=[].push,h="length",p=!f((function(){RegExp(4294967295,"y")}));n(64)("split",2,(function(e,t,n,f){var v;return v="c"=="abbc".split(/(b)*/)[1]||4!="test".split(/(?:)/,-1)[h]||2!="ab".split(/(?:ab)*/)[h]||4!=".".split(/(.?)(.?)/)[h]||".".split(/()()/)[h]>1||"".split(/.?/)[h]?function(e,t){var i=String(this);if(void 0===e&&0===t)return[];if(!r(e))return n.call(i,e,t);for(var o,a,u,c=[],f=(e.ignoreCase?"i":"")+(e.multiline?"m":"")+(e.unicode?"u":"")+(e.sticky?"y":""),s=0,p=void 0===t?4294967295:t>>>0,v=new RegExp(e.source,f+"g");(o=l.call(v,i))&&!((a=v.lastIndex)>s&&(c.push(i.slice(s,o.index)),o[h]>1&&o.index=p));)v.lastIndex===o.index&&v.lastIndex++;return s===i[h]?!u&&v.test("")||c.push(""):c.push(i.slice(s)),c[h]>p?c.slice(0,p):c}:"0".split(void 0,0)[h]?function(e,t){return void 0===e&&0===t?[]:n.call(this,e,t)}:n,[function(n,r){var i=e(this),o=null==n?void 0:n[t];return void 0!==o?o.call(n,i,r):v.call(String(i),n,r)},function(e,t){var r=f(v,e,this,t,v!==n);if(r.done)return r.value;var l=i(e),d=String(this),h=o(l,RegExp),g=l.unicode,y=(l.ignoreCase?"i":"")+(l.multiline?"m":"")+(l.unicode?"u":"")+(p?"y":"g"),m=new h(p?l:"^(?:"+l.source+")",y),b=void 0===t?4294967295:t>>>0;if(0===b)return[];if(0===d.length)return null===c(m,d)?[d]:[];for(var x=0,_=0,w=[];_o;)a(n[o++]);e._c=[],e._n=!1,t&&!e._h&&L(e)}))}},L=function(e){y.call(c,(function(){var t,n,r,i=e._v,o=D(e);if(o&&(t=x((function(){P?S.emit("unhandledRejection",i,e):(n=c.onunhandledrejection)?n({promise:e,reason:i}):(r=c.console)&&r.error&&r.error("Unhandled promise rejection",i)})),e._h=P||D(e)?2:1),e._a=void 0,o&&t.e)throw t.v}))},D=function(e){return 1!==e._h&&0===(e._a||e._c).length},R=function(e){y.call(c,(function(){var t;P?S.emit("rejectionHandled",e):(t=c.onrejectionhandled)&&t({promise:e,reason:e._v})}))},I=function(e){var t=this;t._d||(t._d=!0,(t=t._w||t)._v=e,t._s=2,t._a||(t._a=t._c.slice()),C(t,!0))},F=function(e){var t,n=this;if(!n._d){n._d=!0,n=n._w||n;try{if(n===e)throw T("Promise can't be resolved itself");(t=j(e))?m((function(){var r={_w:n,_d:!1};try{t.call(e,l(F,r,1),l(I,r,1))}catch(e){I.call(r,e)}})):(n._v=e,n._s=1,C(n,!1))}catch(e){I.call({_w:n,_d:!1},e)}}};N||(M=function(e){p(this,M,"Promise","_h"),h(e),r.call(this);try{e(l(F,this,1),l(I,this,1))}catch(e){I.call(this,e)}},(r=function(e){this._c=[],this._a=void 0,this._s=0,this._d=!1,this._v=void 0,this._h=0,this._n=!1}).prototype=n(45)(M.prototype,{then:function(e,t){var n=E(g(this,M));return n.ok="function"!=typeof e||e,n.fail="function"==typeof t&&t,n.domain=P?S.domain:void 0,this._c.push(n),this._a&&this._a.push(n),this._s&&C(this,!1),n.promise},catch:function(e){return this.then(void 0,e)}}),o=function(){var e=new r;this.promise=e,this.resolve=l(F,e,1),this.reject=l(I,e,1)},b.f=E=function(e){return e===M||e===a?new o(e):i(e)}),s(s.G+s.W+s.F*!N,{Promise:M}),n(48)(M,"Promise"),n(42)("Promise"),a=n(22).Promise,s(s.S+s.F*!N,"Promise",{reject:function(e){var t=E(this);return(0,t.reject)(e),t.promise}}),s(s.S+s.F*(u||!N),"Promise",{resolve:function(e){return w(u&&this===a?M:this,e)}}),s(s.S+s.F*!(N&&n(62)((function(e){M.all(e).catch(A)}))),"Promise",{all:function(e){var t=this,n=E(t),r=n.resolve,i=n.reject,o=x((function(){var n=[],o=0,a=1;v(e,!1,(function(e){var u=o++,c=!1;n.push(void 0),a++,t.resolve(e).then((function(e){c||(c=!0,n[u]=e,--a||r(n))}),i)})),--a||r(n)}));return o.e&&i(o.v),n.promise},race:function(e){var t=this,n=E(t),r=n.reject,i=x((function(){v(e,!1,(function(e){t.resolve(e).then(n.resolve,r)}))}));return i.e&&r(i.v),n.promise}})},function(e,t,n){"use strict";var r=n(136),i=n(46);n(66)("WeakSet",(function(e){return function(){return e(this,arguments.length>0?arguments[0]:void 0)}}),{add:function(e){return r.def(i(this,"WeakSet"),e,!0)}},r,!1,!0)},function(e,t,n){"use strict";var r=n(0),i=n(67),o=n(103),a=n(1),u=n(39),c=n(8),l=n(4),f=n(2).ArrayBuffer,s=n(56),d=o.ArrayBuffer,h=o.DataView,p=i.ABV&&f.isView,v=d.prototype.slice,g=i.VIEW;r(r.G+r.W+r.F*(f!==d),{ArrayBuffer:d}),r(r.S+r.F*!i.CONSTR,"ArrayBuffer",{isView:function(e){return p&&p(e)||l(e)&&g in e}}),r(r.P+r.U+r.F*n(3)((function(){return!new d(2).slice(1,void 0).byteLength})),"ArrayBuffer",{slice:function(e,t){if(void 0!==v&&void 0===t)return v.call(a(this),e);for(var n=a(this).byteLength,r=u(e,n),i=u(void 0===t?n:t,n),o=new(s(this,d))(c(i-r)),l=new h(this),f=new h(o),p=0;r=t.length)return{value:void 0,done:!0}}while(!((e=t[this._i++])in this._t));return{value:e,done:!1}})),r(r.S,"Reflect",{enumerate:function(e){return new o(e)}})},function(e,t,n){var r=n(20),i=n(21),o=n(18),a=n(0),u=n(4),c=n(1);a(a.S,"Reflect",{get:function e(t,n){var a,l,f=arguments.length<3?t:arguments[2];return c(t)===f?t[n]:(a=r.f(t,n))?o(a,"value")?a.value:void 0!==a.get?a.get.call(f):void 0:u(l=i(t))?e(l,n,f):void 0}})},function(e,t,n){var r=n(20),i=n(0),o=n(1);i(i.S,"Reflect",{getOwnPropertyDescriptor:function(e,t){return r.f(o(e),t)}})},function(e,t,n){var r=n(0),i=n(21),o=n(1);r(r.S,"Reflect",{getPrototypeOf:function(e){return i(o(e))}})},function(e,t,n){var r=n(0);r(r.S,"Reflect",{has:function(e,t){return t in e}})},function(e,t,n){var r=n(0),i=n(1),o=Object.isExtensible;r(r.S,"Reflect",{isExtensible:function(e){return i(e),!o||o(e)}})},function(e,t,n){var r=n(0);r(r.S,"Reflect",{ownKeys:n(138)})},function(e,t,n){var r=n(0),i=n(1),o=Object.preventExtensions;r(r.S,"Reflect",{preventExtensions:function(e){i(e);try{return o&&o(e),!0}catch(e){return!1}}})},function(e,t,n){var r=n(10),i=n(20),o=n(21),a=n(18),u=n(0),c=n(36),l=n(1),f=n(4);u(u.S,"Reflect",{set:function e(t,n,u){var s,d,h=arguments.length<4?t:arguments[3],p=i.f(l(t),n);if(!p){if(f(d=o(t)))return e(d,n,u,h);p=c(0)}if(a(p,"value")){if(!1===p.writable||!f(h))return!1;if(s=i.f(h,n)){if(s.get||s.set||!1===s.writable)return!1;s.value=u,r.f(h,n,s)}else r.f(h,n,c(0,u));return!0}return void 0!==p.set&&(p.set.call(h,u),!0)}})},function(e,t,n){var r=n(0),i=n(82);i&&r(r.S,"Reflect",{setPrototypeOf:function(e,t){i.check(e,t);try{return i.set(e,t),!0}catch(e){return!1}}})},function(e,t,n){"use strict";var r=n(0),i=n(57)(!0);r(r.P,"Array",{includes:function(e){return i(this,e,arguments.length>1?arguments[1]:void 0)}}),n(35)("includes")},function(e,t,n){"use strict";var r=n(0),i=n(139),o=n(11),a=n(8),u=n(13),c=n(95);r(r.P,"Array",{flatMap:function(e){var t,n,r=o(this);return u(e),t=a(r.length),n=c(r,0),i(n,r,r,t,0,1,e,arguments[1]),n}}),n(35)("flatMap")},function(e,t,n){"use strict";var r=n(0),i=n(139),o=n(11),a=n(8),u=n(25),c=n(95);r(r.P,"Array",{flatten:function(){var e=arguments[0],t=o(this),n=a(t.length),r=c(t,0);return i(r,t,t,n,0,void 0===e?1:u(e)),r}}),n(35)("flatten")},function(e,t,n){"use strict";var r=n(0),i=n(60)(!0);r(r.P,"String",{at:function(e){return i(this,e)}})},function(e,t,n){"use strict";var r=n(0),i=n(140),o=n(65),a=/Version\/10\.\d+(\.\d+)?( Mobile\/\w+)? Safari\//.test(o);r(r.P+r.F*a,"String",{padStart:function(e){return i(this,e,arguments.length>1?arguments[1]:void 0,!0)}})},function(e,t,n){"use strict";var r=n(0),i=n(140),o=n(65),a=/Version\/10\.\d+(\.\d+)?( Mobile\/\w+)? Safari\//.test(o);r(r.P+r.F*a,"String",{padEnd:function(e){return i(this,e,arguments.length>1?arguments[1]:void 0,!1)}})},function(e,t,n){"use strict";n(50)("trimLeft",(function(e){return function(){return e(this,1)}}),"trimStart")},function(e,t,n){"use strict";n(50)("trimRight",(function(e){return function(){return e(this,2)}}),"trimEnd")},function(e,t,n){"use strict";var r=n(0),i=n(28),o=n(8),a=n(61),u=n(55),c=RegExp.prototype,l=function(e,t){this._r=e,this._s=t};n(89)(l,"RegExp String",(function(){var e=this._r.exec(this._s);return{value:e,done:null===e}})),r(r.P,"String",{matchAll:function(e){if(i(this),!a(e))throw TypeError(e+" is not a regexp!");var t=String(this),n="flags"in c?String(e.flags):u.call(e),r=new RegExp(e.source,~n.indexOf("g")?n:"g"+n);return r.lastIndex=o(e.lastIndex),new l(r,t)}})},function(e,t,n){n(78)("asyncIterator")},function(e,t,n){n(78)("observable")},function(e,t,n){var r=n(0),i=n(138),o=n(19),a=n(20),u=n(93);r(r.S,"Object",{getOwnPropertyDescriptors:function(e){for(var t,n,r=o(e),c=a.f,l=i(r),f={},s=0;l.length>s;)void 0!==(n=c(r,t=l[s++]))&&u(f,t,n);return f}})},function(e,t,n){var r=n(0),i=n(141)(!1);r(r.S,"Object",{values:function(e){return i(e)}})},function(e,t,n){var r=n(0),i=n(141)(!0);r(r.S,"Object",{entries:function(e){return i(e)}})},function(e,t,n){"use strict";var r=n(0),i=n(11),o=n(13),a=n(10);n(9)&&r(r.P+n(68),"Object",{__defineGetter__:function(e,t){a.f(i(this),e,{get:o(t),enumerable:!0,configurable:!0})}})},function(e,t,n){"use strict";var r=n(0),i=n(11),o=n(13),a=n(10);n(9)&&r(r.P+n(68),"Object",{__defineSetter__:function(e,t){a.f(i(this),e,{set:o(t),enumerable:!0,configurable:!0})}})},function(e,t,n){"use strict";var r=n(0),i=n(11),o=n(27),a=n(21),u=n(20).f;n(9)&&r(r.P+n(68),"Object",{__lookupGetter__:function(e){var t,n=i(this),r=o(e,!0);do{if(t=u(n,r))return t.get}while(n=a(n))}})},function(e,t,n){"use strict";var r=n(0),i=n(11),o=n(27),a=n(21),u=n(20).f;n(9)&&r(r.P+n(68),"Object",{__lookupSetter__:function(e){var t,n=i(this),r=o(e,!0);do{if(t=u(n,r))return t.set}while(n=a(n))}})},function(e,t,n){var r=n(0);r(r.P+r.R,"Map",{toJSON:n(142)("Map")})},function(e,t,n){var r=n(0);r(r.P+r.R,"Set",{toJSON:n(142)("Set")})},function(e,t,n){n(69)("Map")},function(e,t,n){n(69)("Set")},function(e,t,n){n(69)("WeakMap")},function(e,t,n){n(69)("WeakSet")},function(e,t,n){n(70)("Map")},function(e,t,n){n(70)("Set")},function(e,t,n){n(70)("WeakMap")},function(e,t,n){n(70)("WeakSet")},function(e,t,n){var r=n(0);r(r.G,{global:n(2)})},function(e,t,n){var r=n(0);r(r.S,"System",{global:n(2)})},function(e,t,n){var r=n(0),i=n(24);r(r.S,"Error",{isError:function(e){return"Error"===i(e)}})},function(e,t,n){var r=n(0);r(r.S,"Math",{clamp:function(e,t,n){return Math.min(n,Math.max(t,e))}})},function(e,t,n){var r=n(0);r(r.S,"Math",{DEG_PER_RAD:Math.PI/180})},function(e,t,n){var r=n(0),i=180/Math.PI;r(r.S,"Math",{degrees:function(e){return e*i}})},function(e,t,n){var r=n(0),i=n(144),o=n(123);r(r.S,"Math",{fscale:function(e,t,n,r,a){return o(i(e,t,n,r,a))}})},function(e,t,n){var r=n(0);r(r.S,"Math",{iaddh:function(e,t,n,r){var i=e>>>0,o=n>>>0;return(t>>>0)+(r>>>0)+((i&o|(i|o)&~(i+o>>>0))>>>31)|0}})},function(e,t,n){var r=n(0);r(r.S,"Math",{isubh:function(e,t,n,r){var i=e>>>0,o=n>>>0;return(t>>>0)-(r>>>0)-((~i&o|~(i^o)&i-o>>>0)>>>31)|0}})},function(e,t,n){var r=n(0);r(r.S,"Math",{imulh:function(e,t){var n=+e,r=+t,i=65535&n,o=65535&r,a=n>>16,u=r>>16,c=(a*o>>>0)+(i*o>>>16);return a*u+(c>>16)+((i*u>>>0)+(65535&c)>>16)}})},function(e,t,n){var r=n(0);r(r.S,"Math",{RAD_PER_DEG:180/Math.PI})},function(e,t,n){var r=n(0),i=Math.PI/180;r(r.S,"Math",{radians:function(e){return e*i}})},function(e,t,n){var r=n(0);r(r.S,"Math",{scale:n(144)})},function(e,t,n){var r=n(0);r(r.S,"Math",{umulh:function(e,t){var n=+e,r=+t,i=65535&n,o=65535&r,a=n>>>16,u=r>>>16,c=(a*o>>>0)+(i*o>>>16);return a*u+(c>>>16)+((i*u>>>0)+(65535&c)>>>16)}})},function(e,t,n){var r=n(0);r(r.S,"Math",{signbit:function(e){return(e=+e)!=e?e:0==e?1/e==1/0:e>0}})},function(e,t,n){"use strict";var r=n(0),i=n(22),o=n(2),a=n(56),u=n(131);r(r.P+r.R,"Promise",{finally:function(e){var t=a(this,i.Promise||o.Promise),n="function"==typeof e;return this.then(n?function(n){return u(t,e()).then((function(){return n}))}:e,n?function(n){return u(t,e()).then((function(){throw n}))}:e)}})},function(e,t,n){"use strict";var r=n(0),i=n(102),o=n(130);r(r.S,"Promise",{try:function(e){var t=i.f(this),n=o(e);return(n.e?t.reject:t.resolve)(n.v),t.promise}})},function(e,t,n){var r=n(32),i=n(1),o=r.key,a=r.set;r.exp({defineMetadata:function(e,t,n,r){a(e,t,i(n),o(r))}})},function(e,t,n){var r=n(32),i=n(1),o=r.key,a=r.map,u=r.store;r.exp({deleteMetadata:function(e,t){var n=arguments.length<3?void 0:o(arguments[2]),r=a(i(t),n,!1);if(void 0===r||!r.delete(e))return!1;if(r.size)return!0;var c=u.get(t);return c.delete(n),!!c.size||u.delete(t)}})},function(e,t,n){var r=n(32),i=n(1),o=n(21),a=r.has,u=r.get,c=r.key,l=function(e,t,n){if(a(e,t,n))return u(e,t,n);var r=o(t);return null!==r?l(e,r,n):void 0};r.exp({getMetadata:function(e,t){return l(e,i(t),arguments.length<3?void 0:c(arguments[2]))}})},function(e,t,n){var r=n(134),i=n(143),o=n(32),a=n(1),u=n(21),c=o.keys,l=o.key,f=function(e,t){var n=c(e,t),o=u(e);if(null===o)return n;var a=f(o,t);return a.length?n.length?i(new r(n.concat(a))):a:n};o.exp({getMetadataKeys:function(e){return f(a(e),arguments.length<2?void 0:l(arguments[1]))}})},function(e,t,n){var r=n(32),i=n(1),o=r.get,a=r.key;r.exp({getOwnMetadata:function(e,t){return o(e,i(t),arguments.length<3?void 0:a(arguments[2]))}})},function(e,t,n){var r=n(32),i=n(1),o=r.keys,a=r.key;r.exp({getOwnMetadataKeys:function(e){return o(i(e),arguments.length<2?void 0:a(arguments[1]))}})},function(e,t,n){var r=n(32),i=n(1),o=n(21),a=r.has,u=r.key,c=function(e,t,n){if(a(e,t,n))return!0;var r=o(t);return null!==r&&c(e,r,n)};r.exp({hasMetadata:function(e,t){return c(e,i(t),arguments.length<3?void 0:u(arguments[2]))}})},function(e,t,n){var r=n(32),i=n(1),o=r.has,a=r.key;r.exp({hasOwnMetadata:function(e,t){return o(e,i(t),arguments.length<3?void 0:a(arguments[2]))}})},function(e,t,n){var r=n(32),i=n(1),o=n(13),a=r.key,u=r.set;r.exp({metadata:function(e,t){return function(n,r){u(e,t,(void 0!==r?i:o)(n),a(r))}}})},function(e,t,n){var r=n(0),i=n(101)(),o=n(2).process,a="process"==n(24)(o);r(r.G,{asap:function(e){var t=a&&o.domain;i(t?t.bind(e):e)}})},function(e,t,n){"use strict";var r=n(0),i=n(2),o=n(22),a=n(101)(),u=n(7)("observable"),c=n(13),l=n(1),f=n(43),s=n(45),d=n(15),h=n(44),p=h.RETURN,v=function(e){return null==e?void 0:c(e)},g=function(e){var t=e._c;t&&(e._c=void 0,t())},y=function(e){return void 0===e._o},m=function(e){y(e)||(e._o=void 0,g(e))},b=function(e,t){l(e),this._c=void 0,this._o=e,e=new x(this);try{var n=t(e),r=n;null!=n&&("function"==typeof n.unsubscribe?n=function(){r.unsubscribe()}:c(n),this._c=n)}catch(t){return void e.error(t)}y(this)&&g(this)};b.prototype=s({},{unsubscribe:function(){m(this)}});var x=function(e){this._s=e};x.prototype=s({},{next:function(e){var t=this._s;if(!y(t)){var n=t._o;try{var r=v(n.next);if(r)return r.call(n,e)}catch(e){try{m(t)}finally{throw e}}}},error:function(e){var t=this._s;if(y(t))throw e;var n=t._o;t._o=void 0;try{var r=v(n.error);if(!r)throw e;e=r.call(n,e)}catch(e){try{g(t)}finally{throw e}}return g(t),e},complete:function(e){var t=this._s;if(!y(t)){var n=t._o;t._o=void 0;try{var r=v(n.complete);e=r?r.call(n,e):void 0}catch(e){try{g(t)}finally{throw e}}return g(t),e}}});var _=function(e){f(this,_,"Observable","_f")._f=c(e)};s(_.prototype,{subscribe:function(e){return new b(e,this._f)},forEach:function(e){var t=this;return new(o.Promise||i.Promise)((function(n,r){c(e);var i=t.subscribe({next:function(t){try{return e(t)}catch(e){r(e),i.unsubscribe()}},error:r,complete:n})}))}}),s(_,{from:function(e){var t="function"==typeof this?this:_,n=v(l(e)[u]);if(n){var r=l(n.call(e));return r.constructor===t?r:new t((function(e){return r.subscribe(e)}))}return new t((function(t){var n=!1;return a((function(){if(!n){try{if(h(e,!1,(function(e){if(t.next(e),n)return p}))===p)return}catch(e){if(n)throw e;return void t.error(e)}t.complete()}})),function(){n=!0}}))},of:function(){for(var e=0,t=arguments.length,n=new Array(t);e2,i=!!r&&a.call(arguments,2);return e(r?function(){("function"==typeof t?t:Function(t)).apply(this,i)}:t,n)}};i(i.G+i.B+i.F*u,{setTimeout:c(r.setTimeout),setInterval:c(r.setInterval)})},function(e,t,n){var r=n(0),i=n(100);r(r.G+r.B,{setImmediate:i.set,clearImmediate:i.clear})},function(e,t,n){for(var r=n(97),i=n(38),o=n(16),a=n(2),u=n(15),c=n(51),l=n(7),f=l("iterator"),s=l("toStringTag"),d=c.Array,h={CSSRuleList:!0,CSSStyleDeclaration:!1,CSSValueList:!1,ClientRectList:!1,DOMRectList:!1,DOMStringList:!1,DOMTokenList:!0,DataTransferItemList:!1,FileList:!1,HTMLAllCollection:!1,HTMLCollection:!1,HTMLFormElement:!1,HTMLSelectElement:!1,MediaList:!0,MimeTypeArray:!1,NamedNodeMap:!1,NodeList:!0,PaintRequestList:!1,Plugin:!1,PluginArray:!1,SVGLengthList:!1,SVGNumberList:!1,SVGPathSegList:!1,SVGPointList:!1,SVGStringList:!1,SVGTransformList:!1,SourceBufferList:!1,StyleSheetList:!0,TextTrackCueList:!1,TextTrackList:!1,TouchList:!1},p=i(h),v=0;v=0;--i){var o=this.tryEntries[i],a=o.completion;if("root"===o.tryLoc)return n("end");if(o.tryLoc<=this.prev){var u=r.call(o,"catchLoc"),c=r.call(o,"finallyLoc");if(u&&c){if(this.prev=0;--n){var i=this.tryEntries[n];if(i.tryLoc<=this.prev&&r.call(i,"finallyLoc")&&this.prev=0;--t){var n=this.tryEntries[t];if(n.finallyLoc===e)return this.complete(n.completion,n.afterLoc),S(n),f}},catch:function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var n=this.tryEntries[t];if(n.tryLoc===e){var r=n.completion;if("throw"===r.type){var i=r.arg;S(n)}return i}}throw new Error("illegal catch attempt")},delegateYield:function(e,t,n){return this.delegate={iterator:O(e),resultName:t,nextLoc:n},"next"===this.method&&(this.arg=void 0),f}}}function v(e,t,n,r){var i=t&&t.prototype instanceof y?t:y,o=Object.create(i.prototype),a=new k(r||[]);return o._invoke=function(e,t,n){var r="suspendedStart";return function(i,o){if("executing"===r)throw new Error("Generator is already running");if("completed"===r){if("throw"===i)throw o;return M()}for(n.method=i,n.arg=o;;){var a=n.delegate;if(a){var u=w(a,n);if(u){if(u===f)continue;return u}}if("next"===n.method)n.sent=n._sent=n.arg;else if("throw"===n.method){if("suspendedStart"===r)throw r="completed",n.arg;n.dispatchException(n.arg)}else"return"===n.method&&n.abrupt("return",n.arg);r="executing";var c=g(e,t,n);if("normal"===c.type){if(r=n.done?"completed":"suspendedYield",c.arg===f)continue;return{value:c.arg,done:n.done}}"throw"===c.type&&(r="completed",n.method="throw",n.arg=c.arg)}}}(e,n,a),o}function g(e,t,n){try{return{type:"normal",arg:e.call(t,n)}}catch(e){return{type:"throw",arg:e}}}function y(){}function m(){}function b(){}function x(e){["next","throw","return"].forEach((function(t){e[t]=function(e){return this._invoke(t,e)}}))}function _(e){function n(t,i,o,a){var u=g(e[t],e,i);if("throw"!==u.type){var c=u.arg,l=c.value;return l&&"object"==typeof l&&r.call(l,"__await")?Promise.resolve(l.__await).then((function(e){n("next",e,o,a)}),(function(e){n("throw",e,o,a)})):Promise.resolve(l).then((function(e){c.value=e,o(c)}),a)}a(u.arg)}var i;"object"==typeof t.process&&t.process.domain&&(n=t.process.domain.bind(n)),this._invoke=function(e,t){function r(){return new Promise((function(r,i){n(e,t,r,i)}))}return i=i?i.then(r,r):r()}}function w(e,t){var n=e.iterator[t.method];if(void 0===n){if(t.delegate=null,"throw"===t.method){if(e.iterator.return&&(t.method="return",t.arg=void 0,w(e,t),"throw"===t.method))return f;t.method="throw",t.arg=new TypeError("The iterator does not provide a 'throw' method")}return f}var r=g(n,e.iterator,t.arg);if("throw"===r.type)return t.method="throw",t.arg=r.arg,t.delegate=null,f;var i=r.arg;return i?i.done?(t[e.resultName]=i.value,t.next=e.nextLoc,"return"!==t.method&&(t.method="next",t.arg=void 0),t.delegate=null,f):i:(t.method="throw",t.arg=new TypeError("iterator result is not an object"),t.delegate=null,f)}function T(e){var t={tryLoc:e[0]};1 in e&&(t.catchLoc=e[1]),2 in e&&(t.finallyLoc=e[2],t.afterLoc=e[3]),this.tryEntries.push(t)}function S(e){var t=e.completion||{};t.type="normal",delete t.arg,e.completion=t}function k(e){this.tryEntries=[{tryLoc:"root"}],e.forEach(T,this),this.reset(!0)}function O(e){if(e){var t=e[o];if(t)return t.call(e);if("function"==typeof e.next)return e;if(!isNaN(e.length)){var n=-1,i=function t(){for(;++n0),c=null,l=function(){var e=function(e){return function(){var t=this,n=arguments;return new Promise((function(r,i){var a=e.apply(t,n);function u(e){o(a,r,i,u,c,"next",e)}function c(e){o(a,r,i,u,c,"throw",e)}u(void 0)}))}}(regeneratorRuntime.mark((function e(n){return regeneratorRuntime.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:t.icon[n]?/\.(jpg|png|gif)$/.test(t.icon[n])?c=(0,r.h)("span.eleTree-icon",{style:{"background-image":'url("'.concat(t.imgUrl+t.icon[n],'")'),"background-size":"contain"}}):/^(\.)/.test(t.icon[n])&&(c=(0,r.h)("span.eleTree-icon".concat(t.icon[n]))):c=null;case 1:case"end":return e.stop()}}),e)})));return function(t){return e.apply(this,arguments)}}();return t.lazy&&e[t.request.isLeaf]||!t.lazy&&!u?l("leaf"):l("fold"),c};var r=n(14),i=n(6);function o(e,t,n,r,i,o,a){try{var u=e[o](a),c=u.value}catch(e){return void n(e)}u.done?t(c):Promise.resolve(c).then(r,i)}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){var t=this.config,n=t.request,a=(n.name,n.key,n.isOpen),u=(n.checked,n.children),c=(n.disabled,n.isLeaf),l=e[u]&&(0,i.isArray)(e[u])&&e[u].length>0;if(t.lazy&&e[c]||!t.lazy&&!l)return(0,r.h)("span.eleTree-dropdown.eleTree-dropdown-hide");var f=null,s=function(){var e=function(e){return function(){var t=this,n=arguments;return new Promise((function(r,i){var a=e.apply(t,n);function u(e){o(a,r,i,u,c,"next",e)}function c(e){o(a,r,i,u,c,"throw",e)}u(void 0)}))}}(regeneratorRuntime.mark((function e(n){var i;return regeneratorRuntime.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:t.icon[n]?/\.(jpg|png|gif)$/.test(t.icon[n])?f=(0,r.h)("span.eleTree-dropdown",{style:{"background-image":'url("'.concat(t.imgUrl+t.icon[n],'")'),"background-size":"contain"}}):/^(\.)/.test(t.icon[n])&&(f=(0,r.h)("span.eleTree-dropdown".concat(t.icon[n]))):(i="dropdownOn"===n?".eleTree-dropdown-code.eleTree-dropdown-open":"loading"===n?".eleTree-loading.eleTree-animate-rotate.eleTree-loading-code":".eleTree-dropdown-code",f=(0,r.h)("span.eleTree-dropdown"+i));case 1:case"end":return e.stop()}}),e)})));return function(t){return e.apply(this,arguments)}}();return 2===e[a]?s("dropdownOn"):1===e[a]?s("loading"):s("dropdownOff"),f};var r=n(14),i=n(6);function o(e,t,n,r,i,o,a){try{var u=e[o](a),c=u.value}catch(e){return void n(e)}u.done?t(c):Promise.resolve(c).then(r,i)}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){var t=this.config,n=t.request,o=(n.name,n.key,n.isOpen,n.checked),a=(n.children,n.disabled),u=(n.isLeaf,null),c=e[a]?".eleTree-checkbox-code_disabled":"",l=2===e[o]?".eleTree-checkbox-code_checked":1===e[o]?".eleTree-checkbox-code_half":"",f="span.eleTree-checkbox.eleTree-checkbox-code".concat(l).concat(c),s=function(){var e=function(e){return function(){var t=this,n=arguments;return new Promise((function(r,o){var a=e.apply(t,n);function u(e){i(a,r,o,u,c,"next",e)}function c(e){i(a,r,o,u,c,"throw",e)}u(void 0)}))}}(regeneratorRuntime.mark((function e(n){return regeneratorRuntime.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:t.icon[n]?/\.(jpg|png|gif)$/.test(t.icon[n])?u=c?(0,r.h)(f):(0,r.h)("span.eleTree-checkbox",{style:{"background-image":'url("'.concat(t.imgUrl+t.icon[n],'")'),"background-size":"contain"}}):/^(\.)/.test(t.icon[n])&&(u=c?(0,r.h)(f):(0,r.h)("span.eleTree-checkbox".concat(c).concat(t.icon[n]),{style:{"font-size":"20px",right:"2px"}})):u=(0,r.h)(f);case 1:case"end":return e.stop()}}),e)})));return function(t){return e.apply(this,arguments)}}();return 2===e[o]?s("checkFull"):1===e[o]?s("checkHalf"):s("checkNone"),t.showCheckbox?u:null};var r=n(14);function i(e,t,n,r,i,o,a){try{var u=e[o](a),c=u.value}catch(e){return void n(e)}u.done?t(c):Promise.resolve(c).then(r,i)}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){var t=this.config,n=t.request,o=(n.name,n.key,n.isOpen,n.checked,n.children,n.disabled,n.isLeaf,n.radioChecked),a=n.radioDisabled,u=null,c=e[a]?".eleTree-radio-code_disabled":"",l=2===e[o]?".eleTree-radio-code_checked":"",f="span.eleTree-radio.eleTree-radio-code".concat(l).concat(c),s=function(){var e=function(e){return function(){var t=this,n=arguments;return new Promise((function(r,o){var a=e.apply(t,n);function u(e){i(a,r,o,u,c,"next",e)}function c(e){i(a,r,o,u,c,"throw",e)}u(void 0)}))}}(regeneratorRuntime.mark((function e(n){return regeneratorRuntime.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:t.icon[n]?/\.(jpg|png|gif)$/.test(t.icon[n])?u=c?(0,r.h)(f):(0,r.h)("span.eleTree-radio",{style:{"background-image":'url("'.concat(t.imgUrl+t.icon[n],'")'),"background-size":"contain"}}):/^(\.)/.test(t.icon[n])&&(u=c?(0,r.h)(f):(0,r.h)("span.eleTree-radio".concat(c).concat(t.icon[n]),{style:{"font-size":"16px"}})):u=(0,r.h)(f);case 1:case"end":return e.stop()}}),e)})));return function(t){return e.apply(this,arguments)}}();return 2===e[o]?s("radioCheck"):s("radioCheckNone"),t.showRadio?u:null};var r=n(14);function i(e,t,n,r,i,o,a){try{var u=e[o](a),c=u.value}catch(e){return void n(e)}u.done?t(c):Promise.resolve(c).then(r,i)}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){var t=this,n=this.config,c=n.request,l=c.name;c.key,c.isOpen,c.checked,c.children,c.disabled,c.isLeaf;if(n.customText){var f=n.customText(u.default.call(this,e)).trim();f.split(/\%\<[\w|\W]+\>\%/);document.createElement("span").innerHTML=f.replace(/\%\<[\w|\W]+\>\%/,"")}return e[o.symbolAttr.editNodeType]?(0,r.h)("input.eleTree-text_edit",{props:{type:"text",value:e[l]},on:{blur:[a.default,this,e]}}):(0,r.h)("span.eleTree-text",{style:e[o.symbolAttr.isPasteNode]?{color:"#aaa"}:{}},function(){if(!n.customText)return e[l];var r=n.customText(u.default.call(t,e)).trim(),o=document.createElement("span");o.innerHTML=r;for(var a=[],c=0;c0)f.default.call(e,null,t[h],n);else{if(t[g].length>0)return t[p]=A,void r.default.call(e);t[m]=!0,r.default.call(e)}}}})}t[l.symbolAttr.isLazyNode]=!0}r.default.call(e),u.emit.call(e,{v:t,type:"click",event:n})}else u.emit.call(e,{v:t,type:"click",event:n});s.highlightCurrent&&(e.activeElm&&e.activeElm.classList.remove("eleTree-title-active"),this.elm.classList.add("eleTree-title-active"),e.activeElm=this.elm)};var r=s(n(12)),i=s(n(146)),o=s(n(369)),a=s(n(370)),u=n(75),c=n(6),l=n(5),f=s(n(106));function s(e){return e&&e.__esModule?e:{default:e}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){var t=this.config.request,n=(t.name,t.key,t.isOpen,t.checked),r=t.children,i=t.disabled;t.isLeaf;!function t(o){o.forEach((function(o,a){o[i]?o.disabledParentStatus=2===e[n]?2:0:o[n]=2===e[n]?2:0,o[r].length>0&&t(o[r])}))}(e[r])}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){var t=this.config,n=t.request,i=(n.name,n.key),o=(n.isOpen,n.checked,n.children),a=(n.disabled,n.isLeaf,n.radioChecked);if("level"===t.radioType){var u=e[r.symbolAttr.parentNode]?e[r.symbolAttr.parentNode][o]:t.data;if(2===e[a])e[a]=0;else{var c=u.filter((function(e){return 2===e[a]}))[0];c&&(c[a]=0),e[a]=2}}else"all"===t.radioType&&(e[a]=2===e[a]?0:2,this.currentRadioCheckedData?this.currentRadioCheckedData[i]!==e[i]?(this.currentRadioCheckedData[a]=0,this.currentRadioCheckedData=e):this.currentRadioCheckedData=null:this.currentRadioCheckedData=e)};var r=n(5)},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t,n){var r=e.config;r.highlightCurrent&&(e.activeElm&&e.activeElm.classList.remove("eleTree-title-active"),this.elm.classList.add("eleTree-title-active"),e.activeElm=this.elm);if(0===r.rightMenuList.length)return;n.preventDefault();var o=r.request,a=(o.name,o.key,o.isOpen,o.checked,o.children,o.disabled,o.isLeaf,document.querySelector(r.el));e.isShowRightMenu=!0,e.rightMenuCdata=t,e.rightMenuCdom=this.elm;var u=0,c=0;i.default.call(e,u,c);var l=a.querySelector(".eleTree-menu"),f=window.getComputedStyle(l,null).getPropertyValue("width"),s=window.getComputedStyle(l,null).getPropertyValue("height");f=parseInt(f)+6,s=parseInt(s)+6,u=n.clientX+window.pageXOffset-a.offsetLeft,c=n.clientY+window.pageYOffset-a.offsetTop,n.clientX+window.pageXOffset+f>document.documentElement.scrollWidth&&(u-=f);n.clientY+window.pageYOffset+s>document.documentElement.scrollHeight&&(c-=s);i.default.call(e,u,c)};var r,i=(r=n(148))&&r.__esModule?r:{default:r}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t,n){var f=e.config.request,d=f.name,h=f.key,p=(f.isOpen,f.checked,f.children,f.disabled,f.isLeaf,e.rightMenuCdata),v={copy:function(){return l.copy.call(e,null,"",p)},paste:function(){return l.paste.call(e,null,"","children",p)},paste_before:function(){return l.paste.call(e,null,"","before",p)},paste_after:function(){return l.paste.call(e,null,"","after",p)},cut_paste:function(){return l.cutPaste.call(e,null,"",p)},edit:function(){return a.default.call(e,null,p,"edit")},remove:function(){l.emitEvent.call(e,p,"remove",(function(){r.default.call(e,null,[p[h]]),u.default.call(e)}))},add_child:function(){var t;i.default.call(e,null,p[h],[(t={},s(t,d,"未命名"),s(t,h,++e.customIndex),t)]),a.default.call(e,null,e.customIndex,"add_child")},add_before:function(){var t;o.default.call(e,null,p[h],[(t={},s(t,d,"未命名"),s(t,h,++e.customIndex),t)],"before"),a.default.call(e,null,e.customIndex,"add_before")},add_after:function(){var t;o.default.call(e,null,p[h],[(t={},s(t,d,"未命名"),s(t,h,++e.customIndex),t)],"after"),a.default.call(e,null,e.customIndex,"add_after")}};v[t.value]?v[t.value]():(g="custom_".concat(t.value),l.emitEvent.call(e,p,g,(function(){c.updateDate.call(e,p),u.default.call(e)})));var g};n(5);var r=f(n(76)),i=f(n(106)),o=f(n(149)),a=f(n(150)),u=f(n(12)),c=n(6),l=n(107);function f(e){return e&&e.__esModule?e:{default:e}}function s(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.mousedown=function(e,t){f=t,s=this,c=0,d=!1,h=!1;var n=(l=e).config,r=document.querySelector(n.el);r.style["-webkit-user-select"]="none",r.style["-moz-user-select"]="none",r.style["-ms-user-select"]="none",r.style["user-select"]="none",document.addEventListener("mousemove",p),document.addEventListener("mouseup",v)},t.mousemove=p,t.mouseup=v;var r=n(107),i=u(n(76)),o=u(n(47)),a=n(5);function u(e){return e&&e.__esModule?e:{default:e}}var c=0,l=null,f=null,s=null,d=!1,h=!1;function p(e){var t=l.config,n=s.elm.querySelector(".eleTree-text");if(!(++c<3)&&n){h=!0;var i,o=document.querySelector(t.el),a=e.clientX+window.pageXOffset-o.offsetLeft,u=e.clientY+window.pageYOffset-o.offsetTop;i=function(){var e=s.elm.querySelector(".eleTree-text").innerText,t=document.createElement("span");t.innerText=e,t.classList.add("eleTree-cloneElm"),t.style.top=u+"px",t.style.left=a+"px",o.appendChild(t),l.rightMenuPasteData=f,r.copy.call(l,null,"",f)},d||(i(),d=!0);var p=o.querySelector(".eleTree-cloneElm");p&&(p.style.top=u+3+"px",p.style.left=a+3+"px")}}function v(e,t,n){if(l){var u=l.config,c=u.request,s=(c.name,c.key),d=(c.isOpen,c.checked,c.children,c.disabled,c.isLeaf,document.querySelector(u.el)),g=document.querySelector(".eleTree-cloneElm");if(g&&g.parentNode.removeChild(g),h){if(t||n||(n=e),this.elm&&u.el===l.config.el)e.rightMenuPasteData&&f[s]!==t[s]&&!function(e,t,n){for(var r=e[a.symbolAttr.parentNode],i=!1;r;)r[n]===t[n]?(i=!0,r=null):r=r[a.symbolAttr.parentNode];return i}(t,f,s)&&r.emitEvent.call(e,f,"drag",(function(){i.default.call(e,null,[e.rightMenuPasteData[s]]),r.paste.call(e,null,"","children",t,"move")}),{endData:o.default.call(e,t),range:"inner"});else if(n.target.isEqualNode(d)){var y=u.data[u.data.length-1];r.emitEvent.call(l,f,"drag",(function(){i.default.call(l,null,[l.rightMenuPasteData[s]]),r.paste.call(l,null,"","after",y,"move")}),{endData:o.default.call(l,y),range:"outer"})}d.style["-webkit-user-select"]="auto",d.style["-moz-user-select"]="auto",d.style["-ms-user-select"]="auto",d.style["user-select"]="auto"}document.removeEventListener("mousemove",p),document.removeEventListener("mouseup",v)}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(){return(0,r.h)("div.eleTree-empty-text",this.config.emptText)};var r=n(14)},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){var t=-1*this.config.indent+6;return!e&&this.config.showLine?(0,r.h)("i.eleTree-line-vertical",{style:{position:"absolute",borderLeft:"1px dotted #666",height:"100%",left:t+"px"}}):null};var r=n(14)},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(){var e=this;document.addEventListener("click",(function(){0!==e.config.rightMenuList.length&&e.isShowRightMenu&&(e.isShowRightMenu=!1,i.default.call(e))})),document.addEventListener("contextmenu",(function(t){if(0!==e.config.rightMenuList.length&&e.isShowRightMenu){for(var n=t.target,r=document.querySelector(e.config.el),o=n;o&&!r.isEqualNode(o);)o=o.parentNode;var a=n.classList.contains("eleTree-title")||n.parentNode.classList&&n.parentNode.classList.contains("eleTree-title");(!o||o&&!a)&&(e.isShowRightMenu=!1,i.default.call(e))}}))};var r,i=(r=n(148))&&r.__esModule?r:{default:r};n(5)},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(){var e=this,t={on:function(){for(var n=arguments.length,i=new Array(n),o=0;o1&&void 0!==arguments[1]&&arguments[1],r=arguments.length>2&&void 0!==arguments[2]&&arguments[2],a=this.config,u=a.request,c=(u.key,u.isOpen,u.checked),l=u.children,f=(u.disabled,u.isLeaf,[]);if((0,o.paramDetection)(n,"Boolean","getChecked方法第一个参数必须为Boolean"))return f;if((0,o.paramDetection)(r,"Boolean","getChecked方法第二个参数必须为Boolean"))return f;var s=function e(o){for(var a=function(a){var u=function(e){o[a][c]===e&&f.push(i.default.call(t,o[a]))};n?0===o[a][l].length&&u(2):(u(2),r&&u(1)),o[a][l].length>0&&e(o[a][l])},u=0;u1&&void 0!==arguments[1]?arguments[1]:[],n=!(arguments.length>2&&void 0!==arguments[2])||arguments[2],r=this.config,a=r.request,u=(a.name,a.key),c=(a.isOpen,a.checked),l=(a.children,a.disabled);a.isLeaf;return(0,i.paramDetection)(t,"Array","setChecked方法第一个参数必须为Array")||(0,i.paramDetection)(n,"Boolean","setChecked方法第二个参数必须为Boolean")||(i.recurseTree.call(this,(function(e){e[l]||(n&&(e[c]=0),t.includes(e[u])&&(e[c]=2))})),i.updateDate.call(this),o.default.call(this)),e};var r,i=n(6),o=(r=n(12))&&r.__esModule?r:{default:r}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[],n=this.config,r=n.request,u=(r.name,r.key),c=(r.isOpen,r.checked),l=r.children,f=r.disabled;r.isLeaf;if((0,i.paramDetection)(t,"String|Number|Array","unChecked方法第一个参数必须为String|Number|Array"))return e;var s=0===(t=(0,i.isArray)(t)?t:[t]).length,d=function e(t){for(var n=0;n0&&d(e[l])}})),i.updateDate.call(this),o.default.call(this),e};var r,i=n(6),o=(r=n(12))&&r.__esModule?r:{default:r},a=n(5)},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){var t=this.config,n=t.request,r=(n.name,n.key,n.isOpen);n.checked,n.children,n.disabled,n.isLeaf;return i.recurseTree.call(this,(function(e){t.lazy?e[a.symbolAttr.isLazyNode]&&2!==e[r]&&(e[r]=2):2!==e[r]&&(e[r]=2)})),i.updateDate.call(this),o.default.call(this),e};var r,i=n(6),o=(r=n(12))&&r.__esModule?r:{default:r},a=n(5)},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){var t=this.config.request,n=(t.name,t.key,t.isOpen);t.checked,t.children,t.disabled,t.isLeaf;return i.recurseTree.call(this,(function(e){0!==e[n]&&(e[n]=0)})),i.updateDate.call(this),o.default.call(this),e};var r,i=n(6),o=(r=n(12))&&r.__esModule?r:{default:r}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return(0,r.paramDetection)(t,"Object","reload方法第一个参数必须为Object")?this:(this.reload.call(this,t),e)};var r=n(6)},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t,n){var r=this.config,u=r.request,c=(u.name,u.key,u.isOpen),l=(u.checked,u.children);u.disabled,u.isLeaf;null==t&&(t="");if((0,o.paramDetection)(t,"String|Number","search方法第一个参数必须为String|Number"))return e;if((0,o.paramDetection)(n,"Function","search方法第二个参数必须为Function"))return e;var f=function e(t){t&&(t[a.symbolAttr.isHideNode]=!1,t[c]=2,e(t[a.symbolAttr.parentNode]))};return function e(r){for(var i=0,o=r.length;i0&&e(r[i][l])}(r.data),o.updateDate.call(this),i.default.call(this),e};var r,i=(r=n(12))&&r.__esModule?r:{default:r},o=n(6),a=n(5)},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){var t=this,n=this.config,r=n.request,o=(r.name,r.key,r.isOpen,r.checked,r.children),a=(r.disabled,r.isLeaf,r.radioChecked);if("all"===n.radioType&&this.currentRadioCheckedData)return[i.default.call(this,this.currentRadioCheckedData)];if("level"===n.radioType){var u=[];return function e(n){for(var r=0;r0&&e(n[r][o])}(n.data),u}return[]};var r,i=(r=n(47))&&r.__esModule?r:{default:r};n(6),n(5)},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[],n=!(arguments.length>2&&void 0!==arguments[2])||arguments[2],r=this.config,u=r.request,c=(u.name,u.key),l=(u.isOpen,u.checked,u.children),f=(u.disabled,u.isLeaf,u.radioChecked),s=u.radioDisabled;if((0,i.paramDetection)(t,"Array","setRadioChecked方法第一个参数必须为Array"))return e;if((0,i.paramDetection)(n,"Boolean","setRadioChecked方法第二个参数必须为Boolean"))return e;if(0===t.length)return e;if("all"===r.radioType){var d=i.getNodeDataById.call(this,t[t.length-1]);d[f]=2,this.currentRadioCheckedData&&this.currentRadioCheckedData[c]!==d[c]&&(this.currentRadioCheckedData[f]=0),this.currentRadioCheckedData=d}else"level"===r.radioType&&i.recurseTree.call(this,(function(e){if(!e[s]&&(n&&(e[f]=0),t.includes(e[c]))){var i=e[a.symbolAttr.parentNode]?e[a.symbolAttr.parentNode][l]:r.data;if(2!==e[f]){var o=i.filter((function(e){return 2===e[f]}))[0];o&&(o[f]=0),e[f]=2}}}));return i.updateDate.call(this),o.default.call(this),e};var r,i=n(6),o=(r=n(12))&&r.__esModule?r:{default:r},a=n(5)},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[],n=this.config,r=n.request,a=(r.name,r.key),u=(r.isOpen,r.checked,r.children,r.disabled,r.isLeaf,r.radioChecked),c=r.radioDisabled;if((0,i.paramDetection)(t,"Array","unRadioChecked方法第一个参数必须为Array"))return e;var l=0===t.length;if("all"===n.radioType)if(l)this.currentRadioCheckedData[u]=0,i.updateDate.call(this,this.currentRadioCheckedData);else{var f=i.getNodeDataById.call(this,t[t.length-1]);this.currentRadioCheckedData&&this.currentRadioCheckedData[a]===f[a]&&(this.currentRadioCheckedData[u]=0,i.updateDate.call(this,f))}else"level"===n.radioType&&(i.recurseTree.call(this,(function(e){e[c]||(l||t.includes(e[a]))&&(e[u]=0)})),i.updateDate.call(this));return o.default.call(this),e};var r,i=n(6),o=(r=n(12))&&r.__esModule?r:{default:r}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){if(this.rightMenuPasteData)return i.default.call(this,this.rightMenuPasteData);return null};var r,i=(r=n(47))&&r.__esModule?r:{default:r}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){var t=this.config.request,n=(t.name,t.key,t.isOpen,t.checked),r=(t.children,t.disabled);t.isLeaf;return i.recurseTree.call(this,(function(e){e[r]||(e[n]=2)})),i.updateDate.call(this),o.default.call(this),e};var r,i=n(6),o=(r=n(12))&&r.__esModule?r:{default:r}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){var t=this.config.request,n=(t.name,t.key,t.isOpen,t.checked),r=(t.children,t.disabled);t.isLeaf;return i.recurseTree.call(this,(function(e){e[r]||(2===e[n]?e[n]=0:0===e[n]&&(e[n]=2))})),i.updateDate.call(this),o.default.call(this),e};var r,i=n(6),o=(r=n(12))&&r.__esModule?r:{default:r}},function(e,t,n){var r=n(392),i=n(393);"string"==typeof(i=i.__esModule?i.default:i)&&(i=[[e.i,i,""]]);var o={insert:"head",singleton:!1};r(i,o);e.exports=i.locals||{}},function(e,t,n){"use strict";var r,i=function(){return void 0===r&&(r=Boolean(window&&document&&document.all&&!window.atob)),r},o=function(){var e={};return function(t){if(void 0===e[t]){var n=document.querySelector(t);if(window.HTMLIFrameElement&&n instanceof window.HTMLIFrameElement)try{n=n.contentDocument.head}catch(e){n=null}e[t]=n}return e[t]}}(),a=[];function u(e){for(var t=-1,n=0;n1&&void 0!==arguments[1]?arguments[1]:"",n=""===t;for(var r in e)t+=-1==t.indexOf("?")?"?":"&",t+=encodeURIComponent(r)+"="+encodeURIComponent(e[r]);return n&&t&&(t=t.substr(1)),t},i=function(e){var t=e.method,n=void 0===t?"get":t,i=e.url,o=void 0===i?"":i,a=e.data,u=void 0===a?{}:a,c=e.headers,l=void 0===c?{}:c;return new Promise((function(e,t){"post"===(n=n.toLocaleLowerCase())&&(l=Object.assign(l,{"Content-Type":"application/x-www-form-urlencoded"}));var i=new XMLHttpRequest;"post"===n?i.open("post",o,!0):(o=r(u,o),i.open("get",o,!0)),Object.keys(l).forEach((function(e){i.setRequestHeader(e,l[e])})),"post"===n?i.send(r(u)):i.send(),i.onreadystatechange=function(){4==i.readyState&&(i.status>=200&&i.status<300||304==i.status?e(JSON.parse(i.responseText)):t(new Error(i.statusText)))}}))};t.default=i}])})); diff --git a/src/main/resources/static/layui-ext/icon/iconPicker.js b/src/main/resources/static/layui-ext/icon/iconPicker.js new file mode 100644 index 0000000..276e7fd --- /dev/null +++ b/src/main/resources/static/layui-ext/icon/iconPicker.js @@ -0,0 +1,327 @@ + +layui.define(['laypage', 'form'], function (exports) { + "use strict"; + + var IconPicker =function () { + this.v = '0.1.beta'; + }, _MOD = 'iconPicker', + _this = this, + $ = layui.jquery, + laypage = layui.laypage, + form = layui.form, + BODY = 'body', + TIPS = '请选择图标'; + + /** + * 渲染组件 + */ + IconPicker.prototype.render = function(options){ + var opts = options, + // DOM选择器 + elem = opts.elem, + // 数据类型:fontClass/unicode + type = opts.type == null ? 'fontClass' : opts.type, + // 是否分页:true/false + page = opts.page, + // 每页显示数量 + limit = limit == null ? 12 : opts.limit, + // 是否开启搜索:true/false + search = opts.search == null ? true : opts.search, + // 点击回调 + click = opts.click, + // json数据 + data = {}, + // 唯一标识 + tmp = new Date().getTime(), + // 是否使用的class数据 + isFontClass = opts.type === 'fontClass', + TITLE = 'layui-select-title', + TITLE_ID = 'layui-select-title-' + tmp, + ICON_BODY = 'layui-iconpicker-' + tmp, + PICKER_BODY = 'layui-iconpicker-body-' + tmp, + PAGE_ID = 'layui-iconpicker-page-' + tmp, + LIST_BOX = 'layui-iconpicker-list-box', + selected = 'layui-form-selected', + unselect = 'layui-unselect'; + + var a = { + init: function () { + data = common.getData[type](); + + a.hideElem().createSelect().createBody().toggleSelect(); + common.loadCss(); + return a; + }, + /** + * 隐藏elem + */ + hideElem: function () { + $(elem).hide(); + return a; + }, + /** + * 绘制select下拉选择框 + */ + createSelect: function () { + var selectHtml = '
    ' + + '
    ' + + '
    '+ + '' + + '' + + ''+ + '' + + '
    '+ + '
    ' + + '
    ' + + '123' + + '
    '; + $(elem).after(selectHtml); + return a; + }, + /** + * 展开/折叠下拉框 + */ + toggleSelect: function () { + var item = '#' + TITLE_ID + ' .layui-iconpicker-item,#' + TITLE_ID + ' .layui-iconpicker-item .layui-edge'; + a.event('click', item, function (e) { + console.log('xxxx'); + var $icon = $('#' + ICON_BODY); + if ($icon.hasClass(selected)) { + $icon.removeClass(selected).addClass(unselect); + } else { + $icon.addClass(selected).removeClass(unselect); + } + e.stopPropagation(); + }); + return a; + }, + /** + * 绘制主体部分 + */ + createBody: function () { + // 获取数据 + var searchHtml = ''; + + if (search) { + searchHtml = ''; + } + + // 组合dom + var bodyHtml = '
    ' + + searchHtml + + '
    '+ + '
    '; + $('#' + ICON_BODY).find('.layui-anim').eq(0).html(bodyHtml); + a.search().createList().check().page(); + + return a; + }, + /** + * 绘制图标列表 + * @param text 模糊查询关键字 + * @returns {string} + */ + createList: function (text) { + var d = data, + l = d.length, + pageHtml = '', + listHtml = $('
    ')//'
    '; + + // 计算分页数据 + var _limit = limit, // 每页显示数量 + _pages = l % _limit === 0 ? l / _limit : parseInt(l / _limit + 1), // 总计多少页 + _id = PAGE_ID; + + // 图标列表 + var icons = []; + + for (var i = 0; i < l; i++) { + var obj = d[i]; + + // 判断是否模糊查询 + if (text && obj.indexOf(text) === -1) { + continue; + } + + // 每个图标dom + var icon = '
    '; + if (isFontClass){ + icon += ''; + } else { + icon += ''+ obj.replace('amp;', '') +''; + } + icon += '
    '; + + icons.push(icon); + } + + // 查询出图标后再分页 + l = icons.length; + _pages = l % _limit === 0 ? l / _limit : parseInt(l / _limit + 1); + for (var i = 0; i < _pages; i++) { + // 按limit分块 + var lm = $('
    '); + + for (var j = i * _limit; j < (i+1) * _limit && j < l; j++) { + lm.append(icons[j]); + } + + listHtml.append(lm); + } + + // 无数据 + if (l === 0) { + listHtml.append('

    无数据

    '); + } + + // 判断是否分页 + if (page){ + $('#' + PICKER_BODY).addClass('layui-iconpicker-body-page'); + pageHtml = '
    ' + + '
    ' + + '1/' + + ''+ _pages +'' + + ' ('+ l +')' + + '
    ' + + '
    ' + + ' ' + + ' ' + + '
    ' + + '
    '; + } + + + $('#' + ICON_BODY).find('.layui-anim').find('.' + LIST_BOX).html('').append(listHtml).append(pageHtml); + return a; + }, + // 分页 + page: function () { + var icon = '#' + PAGE_ID + ' .layui-iconpicker-page-operate .layui-icon'; + + $(icon).unbind('click'); + a.event('click', icon, function (e) { + var elem = e.currentTarget, + total = parseInt($('#' +PAGE_ID + '-pages').html()), + isPrev = $(elem).attr('prev') !== undefined, + // 按钮上标的页码 + index = parseInt($(elem).attr('data-index')), + $cur = $('#' +PAGE_ID + '-current'), + // 点击时正在显示的页码 + current = parseInt($cur.html()); + + // 分页数据 + if (isPrev && current > 1) { + current=current-1; + $(icon + '[prev]').attr('data-index', current); + } else if (!isPrev && current < total){ + current=current+1; + $(icon + '[next]').attr('data-index', current); + } + $cur.html(current); + + // 图标数据 + $('.layui-iconpicker-icon-limit').hide(); + $('#layui-iconpicker-icon-limit-' + current).show(); + e.stopPropagation(); + }); + return a; + }, + /** + * 搜索 + */ + search: function () { + var item = '#' + PICKER_BODY + ' .layui-iconpicker-search .layui-input'; + a.event('input propertychange', item, function (e) { + var elem = e.target, + t = $(elem).val(); + a.createList(t); + }); + a.event('click', item, function (e) { + e.stopPropagation(); + }); + return a; + }, + /** + * 点击选中图标 + */ + check: function () { + var item = '#' + PICKER_BODY + ' .layui-iconpicker-icon-item'; + a.event('click', item, function (e) { + var el = $(e.currentTarget).find('.layui-icon'), + icon = ''; + if (isFontClass) { + var clsArr = el.attr('class').split(/[\s\n]/), + cls = clsArr[1], + icon = cls; + $('#' + TITLE_ID).find('.layui-iconpicker-item .layui-icon').html('').attr('class', clsArr.join(' ')); + } else { + var cls = el.html(), + icon = cls; + $('#' + TITLE_ID).find('.layui-iconpicker-item .layui-icon').html(icon); + } + + $('#' + ICON_BODY).removeClass(selected).addClass(unselect); + $(elem).attr('value', icon); + // 回调 + if (click) { + click({ + icon: icon + }); + } + + }); + return a; + }, + event: function (evt, el, fn) { + $(BODY).on(evt, el, fn); + } + }; + + var common = { + /** + * 加载样式表 + */ + loadCss: function () { + var css = '.layui-iconpicker {max-width: 280px;}.layui-iconpicker .layui-anim{display:none;position:absolute;left:0;top:42px;padding:5px 0;z-index:899;min-width:100%;border:1px solid #d2d2d2;max-height:300px;overflow-y:auto;background-color:#fff;border-radius:2px;box-shadow:0 2px 4px rgba(0,0,0,.12);box-sizing:border-box;}.layui-iconpicker-item{border:1px solid #e6e6e6;width:90px;height:38px;border-radius:4px;cursor:pointer;position:relative;}.layui-iconpicker-icon{border-right:1px solid #e6e6e6;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:block;width:60px;height:100%;float:left;text-align:center;background:#fff;transition:all .3s;}.layui-iconpicker-icon i{line-height:38px;font-size:18px;}.layui-iconpicker-item > .layui-edge{left:70px;}.layui-iconpicker-item:hover{border-color:#D2D2D2!important;}.layui-iconpicker-item:hover .layui-iconpicker-icon{border-color:#D2D2D2!important;}.layui-iconpicker.layui-form-selected .layui-anim{display:block;}.layui-iconpicker-body{padding:6px;}.layui-iconpicker .layui-iconpicker-list{background-color:#fff;border:1px solid #ccc;border-radius:4px;}.layui-iconpicker .layui-iconpicker-icon-item{display:inline-block;width:21.1%;line-height:36px;text-align:center;cursor:pointer;vertical-align:top;height:36px;margin:4px;border:1px solid #ddd;border-radius:2px;transition:300ms;}.layui-iconpicker .layui-iconpicker-icon-item i.layui-icon{font-size:17px;}.layui-iconpicker .layui-iconpicker-icon-item:hover{background-color:#eee;border-color:#ccc;-webkit-box-shadow:0 0 2px #aaa,0 0 2px #fff inset;-moz-box-shadow:0 0 2px #aaa,0 0 2px #fff inset;box-shadow:0 0 2px #aaa,0 0 2px #fff inset;text-shadow:0 0 1px #fff;}.layui-iconpicker-search{position:relative;margin:0 0 6px 0;border:1px solid #e6e6e6;border-radius:2px;transition:300ms;}.layui-iconpicker-search:hover{border-color:#D2D2D2!important;}.layui-iconpicker-search .layui-input{cursor:text;display:inline-block;width:86%;border:none;padding-right:0;margin-top:1px;}.layui-iconpicker-search .layui-icon{position:absolute;top:11px;right:4%;}.layui-iconpicker-tips{text-align:center;padding:8px 0;cursor:not-allowed;}.layui-iconpicker-page{margin-top:6px;margin-bottom:-6px;font-size:12px;padding:0 2px;}.layui-iconpicker-page-count{display:inline-block;}.layui-iconpicker-page-operate{display:inline-block;float:right;cursor:default;}.layui-iconpicker-page-operate .layui-icon{font-size:12px;cursor:pointer;}.layui-iconpicker-body-page .layui-iconpicker-icon-limit{display:none;}.layui-iconpicker-body-page .layui-iconpicker-icon-limit:first-child{display:block;}'; + $('head').append(''); + }, + /** + * 获取数据 + */ + getData: { + fontClass: function () { + var arr = ["layui-icon-rate-half","layui-icon-rate","layui-icon-rate-solid","layui-icon-cellphone","layui-icon-vercode","layui-icon-login-wechat","layui-icon-login-qq","layui-icon-login-weibo","layui-icon-password","layui-icon-username","layui-icon-refresh-3","layui-icon-auz","layui-icon-spread-left","layui-icon-shrink-right","layui-icon-snowflake","layui-icon-tips","layui-icon-note","layui-icon-home","layui-icon-senior","layui-icon-refresh","layui-icon-refresh-1","layui-icon-flag","layui-icon-theme","layui-icon-notice","layui-icon-website","layui-icon-console","layui-icon-face-surprised","layui-icon-set","layui-icon-template-1","layui-icon-app","layui-icon-template","layui-icon-praise","layui-icon-tread","layui-icon-male","layui-icon-female","layui-icon-camera","layui-icon-camera-fill","layui-icon-more","layui-icon-more-vertical","layui-icon-rmb","layui-icon-dollar","layui-icon-diamond","layui-icon-fire","layui-icon-return","layui-icon-location","layui-icon-read","layui-icon-survey","layui-icon-face-smile","layui-icon-face-cry","layui-icon-cart-simple","layui-icon-cart","layui-icon-next","layui-icon-prev","layui-icon-upload-drag","layui-icon-upload","layui-icon-download-circle","layui-icon-component","layui-icon-file-b","layui-icon-user","layui-icon-find-fill","layui-icon-loading","layui-icon-loading-1","layui-icon-add-1","layui-icon-play","layui-icon-pause","layui-icon-headset","layui-icon-video","layui-icon-voice","layui-icon-speaker","layui-icon-fonts-del","layui-icon-fonts-code","layui-icon-fonts-html","layui-icon-fonts-strong","layui-icon-unlink","layui-icon-picture","layui-icon-link","layui-icon-face-smile-b","layui-icon-align-left","layui-icon-align-right","layui-icon-align-center","layui-icon-fonts-u","layui-icon-fonts-i","layui-icon-tabs","layui-icon-radio","layui-icon-circle","layui-icon-edit","layui-icon-share","layui-icon-delete","layui-icon-form","layui-icon-cellphone-fine","layui-icon-dialogue","layui-icon-fonts-clear","layui-icon-layer","layui-icon-date","layui-icon-water","layui-icon-code-circle","layui-icon-carousel","layui-icon-prev-circle","layui-icon-layouts","layui-icon-util","layui-icon-templeate-1","layui-icon-upload-circle","layui-icon-tree","layui-icon-table","layui-icon-chart","layui-icon-chart-screen","layui-icon-engine","layui-icon-triangle-d","layui-icon-triangle-r","layui-icon-file","layui-icon-set-sm","layui-icon-add-circle","layui-icon-404","layui-icon-about","layui-icon-up","layui-icon-down","layui-icon-left","layui-icon-right","layui-icon-circle-dot","layui-icon-search","layui-icon-set-fill","layui-icon-group","layui-icon-friends","layui-icon-reply-fill","layui-icon-menu-fill","layui-icon-log","layui-icon-picture-fine","layui-icon-face-smile-fine","layui-icon-list","layui-icon-release","layui-icon-ok","layui-icon-help","layui-icon-chat","layui-icon-top","layui-icon-star","layui-icon-star-fill","layui-icon-close-fill","layui-icon-close","layui-icon-ok-circle","layui-icon-add-circle-fine"]; + return arr; + }, + unicode: function () { + return ["&#xe6c9;","&#xe67b;","&#xe67a;","&#xe678;","&#xe679;","&#xe677;","&#xe676;","&#xe675;","&#xe673;","&#xe66f;","&#xe9aa;","&#xe672;","&#xe66b;","&#xe668;","&#xe6b1;","&#xe702;","&#xe66e;","&#xe68e;","&#xe674;","&#xe669;","&#xe666;","&#xe66c;","&#xe66a;","&#xe667;","&#xe7ae;","&#xe665;","&#xe664;","&#xe716;","&#xe656;","&#xe653;","&#xe663;","&#xe6c6;","&#xe6c5;","&#xe662;","&#xe661;","&#xe660;","&#xe65d;","&#xe65f;","&#xe671;","&#xe65e;","&#xe659;","&#xe735;","&#xe756;","&#xe65c;","&#xe715;","&#xe705;","&#xe6b2;","&#xe6af;","&#xe69c;","&#xe698;","&#xe657;","&#xe65b;","&#xe65a;","&#xe681;","&#xe67c;","&#xe601;","&#xe857;","&#xe655;","&#xe770;","&#xe670;","&#xe63d;","&#xe63e;","&#xe654;","&#xe652;","&#xe651;","&#xe6fc;","&#xe6ed;","&#xe688;","&#xe645;","&#xe64f;","&#xe64e;","&#xe64b;","&#xe62b;","&#xe64d;","&#xe64a;","&#xe64c;","&#xe650;","&#xe649;","&#xe648;","&#xe647;","&#xe646;","&#xe644;","&#xe62a;","&#xe643;","&#xe63f;","&#xe642;","&#xe641;","&#xe640;","&#xe63c;","&#xe63b;","&#xe63a;","&#xe639;","&#xe638;","&#xe637;","&#xe636;","&#xe635;","&#xe634;","&#xe633;","&#xe632;","&#xe631;","&#xe630;","&#xe62f;","&#xe62e;","&#xe62d;","&#xe62c;","&#xe629;","&#xe628;","&#xe625;","&#xe623;","&#xe621;","&#xe620;","&#xe61f;","&#xe61c;","&#xe60b;","&#xe619;","&#xe61a;","&#xe603;","&#xe602;","&#xe617;","&#xe615;","&#xe614;","&#xe613;","&#xe612;","&#xe611;","&#xe60f;","&#xe60e;","&#xe60d;","&#xe60c;","&#xe60a;","&#xe609;","&#xe605;","&#xe607;","&#xe606;","&#xe604;","&#xe600;","&#xe658;","&#x1007;","&#x1006;","&#x1005;","&#xe608;"]; + } + } + }; + + a.init(); + return new IconPicker(); + }; + + /** + * 选中图标 + * @param filter lay-filter + * @param iconName 图标名称,自动识别fontClass/unicode + */ + IconPicker.prototype.checkIcon = function (filter, iconName){ + var p = $('*[lay-filter='+ filter +']').next().find('.layui-iconpicker-item .layui-icon'), + c = iconName; + + if (c.indexOf('#xe') > 0){ + p.html(c); + } else { + p.html('').attr('class', 'layui-icon ' + c); + } + }; + + var iconPicker = new IconPicker(); + exports(_MOD, iconPicker); +}); \ No newline at end of file diff --git a/src/main/resources/static/layui-ext/tinymce/tinymce.js b/src/main/resources/static/layui-ext/tinymce/tinymce.js new file mode 100644 index 0000000..409187a --- /dev/null +++ b/src/main/resources/static/layui-ext/tinymce/tinymce.js @@ -0,0 +1,268 @@ +// http://tinymce.ax-z.cn/ 中文文档 + +layui.define(['jquery'],function (exports) { + var $ = layui.$ + + var modFile = layui.cache.modules['tinymce']; + + var modPath = modFile.substr(0, modFile.lastIndexOf('.')) + + var setter = layui.setter || {}//兼容layuiadmin + + var response = setter.response || {}//兼容layuiadmin + + // ---------------- 以上代码无需修改 ---------------- + + var plugin_filename = 'tinymce.min.js'//插件路径,不包含base_url部分 + + var settings = { + base_url: modPath + , images_upload_url: ''//图片上传接口,可在option传入,也可在这里修改,option的值优先 + , language: 'zh_CN'//语言,可在option传入,也可在这里修改,option的值优先 + , response: {//后台返回数据格式设置 + statusName: response.statusName || 'code'//返回状态字段 + , msgName: response.msgName || 'msg'//返回消息字段 + , dataName: response.dataName || 'data'//返回的数据 + , statusCode: response.statusCode || { + ok: 0//数据正常 + } + } + , success: function (res, succFun, failFun) {//图片上传完成回调 根据自己需要修改 + if (res[this.response.statusName] == this.response.statusCode.ok) { + succFun(res[this.response.dataName]); + } else { + failFun(res[this.response.msgName]); + } + } + }; + + // ---------------- 以下代码无需修改 ---------------- + + var t = {}; + + //初始化 + t.render = function (option,callback) { + + var admin = layui.admin || {} + + var form = option.form || {} + + var file_field = form.name || 'edit' //文件字段名 + + var form_data = form.data || {} //其他表单数据 {key:value, ...} + + option.suffix= isset(option.suffix) ? option.suffix : (plugin_filename.indexOf('.min')>-1 ? '.min' : '') + + option.base_url = isset(option.base_url) ? option.base_url : settings.base_url + + option.language = isset(option.language) ? option.language : settings.language + + option.selector = isset(option.selector) ? option.selector : option.elem + + option.quickbars_selection_toolbar = isset(option.quickbars_selection_toolbar) ? option.quickbars_selection_toolbar : 'cut copy | bold italic underline strikethrough ' + + option.plugins = isset(option.plugins) ? option.plugins : 'quickbars print preview searchreplace autolink fullscreen image link media codesample table charmap hr advlist lists wordcount imagetools indent2em'; + + option.toolbar = isset(option.toolbar) ? option.toolbar : 'undo redo | forecolor backcolor bold italic underline strikethrough | indent2em alignleft aligncenter alignright alignjustify outdent indent | link bullist numlist image table codesample | formatselect fontselect fontsizeselect'; + + option.resize = isset(option.resize) ? option.resize : false; + + option.elementpath = isset(option.elementpath) ? option.elementpath : false; + + option.branding = isset(option.branding) ? option.branding : false; + + option.contextmenu_never_use_native = isset(option.contextmenu_never_use_native) ? option.contextmenu_never_use_native : true; + + option.menubar = isset(option.menubar) ? option.menubar : 'file edit insert format table'; + + option.images_upload_url = isset(option.images_upload_url) ? option.images_upload_url : settings.images_upload_url; + + option.images_upload_handler = isset(option.images_upload_handler) ? option.images_upload_handler : function (blobInfo, succFun, failFun) { + + if(isEmpty(option.images_upload_url)){ + + failFun("上传接口未配置"); + + return console.error('images_upload_url未配置'); + + } + + var formData = new FormData(); + + formData.append(file_field, blobInfo.blob()); + + if(typeof form_data == 'object'){ + + for(var key in form_data){ + + formData.append(key, form_data[key]); + + } + + } + + var ajaxOpt = { + + url: option.images_upload_url, + + dataType: 'json', + + type: 'POST', + + data: formData, + + processData: false, + + contentType: false, + + success: function (res) { + + settings.success(res, succFun, failFun) + + }, + error: function (res) { + + failFun("网络错误:" + res.status); + + } + }; + + if (typeof admin.req == 'function') { + + admin.req(ajaxOpt); + + } else { + + $.ajax(ajaxOpt); + + } + } + + var edit = t.get(option.elem); + + if (edit) { + + edit.destroy(); + + } + + option.menu = isset(option.menu) ? option.menu : { + + file: {title: '文件', items: 'newdocument | print preview fullscreen | wordcount'}, + + edit: {title: '编辑', items: 'undo redo | cut copy paste pastetext selectall | searchreplace'}, + + format: { + + title: '格式', + + items: 'bold italic underline strikethrough superscript subscript | formats | forecolor backcolor | removeformat' + + }, + + table: {title: '表格', items: 'inserttable tableprops deletetable | cell row column'}, + }; + + initTinymce(); + + layui.sessionData('layui-tinymce',{ + + key:option.selector, + + value:option + }) + + tinymce.init(option); + + if(typeof callback == 'function'){ + callback.call(option) + } + + return tinymce.activeEditor; + }; + + t.init = t.render + + // 获取ID对应的编辑器对象 + t.get = function (elem) { + + initTinymce(); + + if (elem && /^#|\./.test(elem)) { + + var id = elem.substr(1); + + var edit = tinymce.editors[id]; + + return edit + + } else { + return false; + } + } + + //重载 + t.reload = function (option,callback) { + + option = option || {} + + var edit = t.get(option.elem); + + var optionCache = layui.sessionData('layui-tinymce')[option.elem] + + edit.destroy() + + $.extend(optionCache,option) + + tinymce.init(optionCache) + + if(typeof callback == 'function'){ + callback.call(optionCache) + } + + return tinymce.activeEditor; + } + + // 适配单页应用的渲染 + t.autoRender = function (option, callback) { + + if (typeof tinymce == 'undefined') { + return t.render(option, callback); + } + + if (!tinymce.editors[option.elem.substr(1)]) { + return t.render(option, callback); + } + + return t.reload(option, callback); + } + + function initTinymce(){ + if (typeof tinymce == 'undefined') { + $.ajax({//获取插件 + url: settings.base_url + '/' + plugin_filename, + dataType: 'script', + cache: true, + async: false, + }); + } + } + + function isset(value){ + return typeof value !== 'undefined' && value !== null + } + + function isEmpty(value){ + if(typeof value === 'undefined' || value === null|| value === ''){ + return true + } else if (value instanceof Array && value.length === 0){ + return true + } else if (typeof value === 'object' && Object.keys(value).length === 0){ + return true + } + return false + } + + exports('tinymce', t); + +}); diff --git a/src/main/resources/static/layui-ext/tinymce/tinymce/icons/default/icons.min.js b/src/main/resources/static/layui-ext/tinymce/tinymce/icons/default/icons.min.js new file mode 100644 index 0000000..086f297 --- /dev/null +++ b/src/main/resources/static/layui-ext/tinymce/tinymce/icons/default/icons.min.js @@ -0,0 +1 @@ +tinymce.IconManager.add("default",{icons:{"accessibility-check":'',"action-next":'',"action-prev":'',"align-center":'',"align-justify":'',"align-left":'',"align-none":'',"align-right":'',"arrow-left":'',"arrow-right":'',bold:'',bookmark:'',"border-width":'',brightness:'',browse:'',cancel:'',"change-case":'',"character-count":'',"checklist-rtl":'',checklist:'',checkmark:'',"chevron-down":'',"chevron-left":'',"chevron-right":'',"chevron-up":'',close:'',"code-sample":'',"color-levels":'',"color-picker":'',"color-swatch-remove-color":'',"color-swatch":'',"comment-add":'',comment:'',contrast:'',copy:'',crop:'',"cut-column":'',"cut-row":'',cut:'',"document-properties":'',drag:'',"duplicate-column":'',"duplicate-row":'',duplicate:'',"edit-block":'',"edit-image":'',"embed-page":'',embed:'',emoji:'',"export":'',fill:'',"flip-horizontally":'',"flip-vertically":'',"format-painter":'',format:'',fullscreen:'',gallery:'',gamma:'',help:'',"highlight-bg-color":'',home:'',"horizontal-rule":'',"image-options":'',image:'',indent:'',info:'',"insert-character":'',"insert-time":'',invert:'',italic:'',"line-height":'',line:'',link:'',"list-bull-circle":'',"list-bull-default":'',"list-bull-square":'',"list-num-default-rtl":'',"list-num-default":'',"list-num-lower-alpha-rtl":'',"list-num-lower-alpha":'',"list-num-lower-greek-rtl":'',"list-num-lower-greek":'',"list-num-lower-roman-rtl":'',"list-num-lower-roman":'',"list-num-upper-alpha-rtl":'',"list-num-upper-alpha":'',"list-num-upper-roman-rtl":'',"list-num-upper-roman":'',lock:'',ltr:'',"more-drawer":'',"new-document":'',"new-tab":'',"non-breaking":'',notice:'',"ordered-list-rtl":'',"ordered-list":'',orientation:'',outdent:'',"page-break":'',paragraph:'',"paste-column-after":'',"paste-column-before":'',"paste-row-after":'',"paste-row-before":'',"paste-text":'',paste:'',"permanent-pen":'',plus:'',preferences:'',preview:'',print:'',quote:'',redo:'',reload:'',"remove-formatting":'',remove:'',"resize-handle":'',resize:'',"restore-draft":'',"rotate-left":'',"rotate-right":'',rtl:'',save:'',search:'',"select-all":'',selected:'',settings:'',sharpen:'',sourcecode:'',"spell-check":'',"strike-through":'',subscript:'',superscript:'',"table-cell-properties":'',"table-cell-select-all":'',"table-cell-select-inner":'',"table-delete-column":'',"table-delete-row":'',"table-delete-table":'',"table-insert-column-after":'',"table-insert-column-before":'',"table-insert-row-above":'',"table-insert-row-after":'',"table-left-header":'',"table-merge-cells":'',"table-row-properties":'',"table-split-cells":'',"table-top-header":'',table:'',template:'',"temporary-placeholder":'',"text-color":'',toc:'',translate:'',underline:'',undo:'',unlink:'',unlock:'',"unordered-list":'',unselected:'',upload:'',user:'',visualblocks:'',visualchars:'',warning:'',"zoom-in":'',"zoom-out":''}}); \ No newline at end of file diff --git a/src/main/resources/static/layui-ext/tinymce/tinymce/jquery.tinymce.min.js b/src/main/resources/static/layui-ext/tinymce/tinymce/jquery.tinymce.min.js new file mode 100644 index 0000000..f26b879 --- /dev/null +++ b/src/main/resources/static/layui-ext/tinymce/tinymce/jquery.tinymce.min.js @@ -0,0 +1,92 @@ +/** + * 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/ + */ +/** + * Jquery integration plugin. + * + * @class tinymce.core.JqueryIntegration + * @private + */ +!function(){var f,c,u,s=[],p="undefined"!=typeof global?global:window,d=p.jQuery,v=function(){ +// Reference to tinymce needs to be lazily evaluated since tinymce +// might be loaded through the compressor or other means +return p.tinymce};d.fn.tinymce=function(o){var e,t,i,l=this,r=""; +// No match then just ignore the call +if(!l.length)return l; +// Get editor instance +if(!o)return v()?v().get(l[0].id):null;l.css("visibility","hidden");// Hide textarea to avoid flicker +var n,a=function(){var a=[],c=0; +// Apply patches to the jQuery object, only once +u||(m(),u=!0), +// Create an editor instance for each matched node +l.each(function(e,t){var n,i=t.id,r=o.oninit; +// Generate unique id for target element if needed +i||(t.id=i=v().DOM.uniqueId()), +// Only init the editor once +v().get(i)||( +// Create editor instance and render it +n=v().createEditor(i,o),a.push(n),n.on("init",function(){var e,t=r;l.css("visibility",""), +// Run this if the oninit setting is defined +// this logic will fire the oninit callback ones each +// matched editor instance is initialized +r&&++c==a.length&&("string"==typeof t&&(e=-1===t.indexOf(".")?null:v().resolve(t.replace(/\.\w+$/,"")),t=v().resolve(t)), +// Call the oninit function with the object +t.apply(e||v(),a))}))}), +// Render the editor instances in a separate loop since we +// need to have the full editors array used in the onInit calls +d.each(a,function(e,t){t.render()})}; +// Load TinyMCE on demand, if we need to +return p.tinymce||c||!(e=o.script_url)? +// Delay the init call until tinymce is loaded +1===c?s.push(a):a():(c=1,t=e.substring(0,e.lastIndexOf("/")), +// Check if it's a dev/src version they want to load then +// make sure that all plugins, themes etc are loaded in source mode as well +-1!=e.indexOf(".min")&&(r=".min"), +// Setup tinyMCEPreInit object this will later be used by the TinyMCE +// core script to locate other resources like CSS files, dialogs etc +// You can also predefined a tinyMCEPreInit object and then it will use that instead +p.tinymce=p.tinyMCEPreInit||{base:t,suffix:r}, +// url contains gzip then we assume it's a compressor +-1!=e.indexOf("gzip")&&(i=o.language||"en",e=e+(/\?/.test(e)?"&":"?")+"js=true&core=true&suffix="+escape(r)+"&themes="+escape(o.theme||"modern")+"&plugins="+escape(o.plugins||"")+"&languages="+(i||""), +// Check if compressor script is already loaded otherwise setup a basic one +p.tinyMCE_GZ||(p.tinyMCE_GZ={start:function(){var n=function(e){v().ScriptLoader.markDone(v().baseURI.toAbsolute(e))}; +// Add core languages +n("langs/"+i+".js"), +// Add themes with languages +n("themes/"+o.theme+"/theme"+r+".js"),n("themes/"+o.theme+"/langs/"+i+".js"), +// Add plugins with languages +d.each(o.plugins.split(","),function(e,t){t&&(n("plugins/"+t+"/plugin"+r+".js"),n("plugins/"+t+"/langs/"+i+".js"))})},end:function(){}})),(n=document.createElement("script")).type="text/javascript",n.onload=n.onreadystatechange=function(e){e=e||window.event,2===c||"load"!=e.type&&!/complete|loaded/.test(n.readyState)||(v().dom.Event.domLoaded=1,c=2, +// Execute callback after mainscript has been loaded and before the initialization occurs +o.script_loaded&&o.script_loaded(),a(),d.each(s,function(e,t){t()}))},n.src=e,document.body.appendChild(n)),l}, +// Add :tinymce pseudo selector this will select elements that has been converted into editor instances +// it's now possible to use things like $('*:tinymce') to get all TinyMCE bound elements. +d.extend(d.expr[":"],{tinymce:function(e){var t;return!!(e.id&&"tinymce"in p&&(t=v().get(e.id))&&t.editorManager===v())}}); +// This function patches internal jQuery functions so that if +// you for example remove an div element containing an editor it's +// automatically destroyed by the TinyMCE API +var m=function(){ +// Removes any child editor instances by looking for editor wrapper elements +var r=function(e){ +// If the function is remove +"remove"===e&&this.each(function(e,t){var n=l(t);n&&n.remove()}),this.find("span.mceEditor,div.mceEditor").each(function(e,t){var n=v().get(t.id.replace(/_parent$/,""));n&&n.remove()})},o=function(i){var e,t=this; +// Handle set value +/*jshint eqnull:true */if(null!=i)r.call(t), +// Saves the contents before get/set value of textarea/div +t.each(function(e,t){var n;(n=v().get(t.id))&&n.setContent(i)});else if(0])*>/g,""):n.getContent({save:!0}):a.apply(d(t),r)}),i}}), +// Makes it possible to use $('#id').append("content"); to append contents to the TinyMCE editor iframe +d.each(["append","prepend"],function(e,t){var n=s[t]=d.fn[t],r="prepend"===t;d.fn[t]=function(i){var e=this;return u(e)?i!==f?("string"==typeof i&&e.filter(":tinymce").each(function(e,t){var n=l(t);n&&n.setContent(r?i+n.getContent():n.getContent()+i)}),n.apply(e.not(":tinymce"),arguments),e):void 0:n.apply(e,arguments)}}), +// Makes sure that the editor instance gets properly destroyed when the parent element is removed +d.each(["remove","replaceWith","replaceAll","empty"],function(e,t){var n=s[t]=d.fn[t];d.fn[t]=function(){return r.call(this,t),n.apply(this,arguments)}}),s.attr=d.fn.attr, +// Makes sure that $('#tinymce_id').attr('value') gets the editors current HTML contents +d.fn.attr=function(e,t){var n=this,i=arguments;if(!e||"value"!==e||!u(n))return s.attr.apply(n,i);if(t!==f)return o.call(n.filter(":tinymce"),t),s.attr.apply(n.not(":tinymce"),i),n;// return original set for chaining +var r=n[0],a=l(r);return a?a.getContent({save:!0}):s.attr.apply(d(r),i)}}}(); \ No newline at end of file diff --git a/src/main/resources/static/layui-ext/tinymce/tinymce/langs/readme.md b/src/main/resources/static/layui-ext/tinymce/tinymce/langs/readme.md new file mode 100644 index 0000000..a52bf03 --- /dev/null +++ b/src/main/resources/static/layui-ext/tinymce/tinymce/langs/readme.md @@ -0,0 +1,3 @@ +This is where language files should be placed. + +Please DO NOT translate these directly use this service: https://www.transifex.com/projects/p/tinymce/ diff --git a/src/main/resources/static/layui-ext/tinymce/tinymce/langs/zh_CN.js b/src/main/resources/static/layui-ext/tinymce/tinymce/langs/zh_CN.js new file mode 100644 index 0000000..89b106c --- /dev/null +++ b/src/main/resources/static/layui-ext/tinymce/tinymce/langs/zh_CN.js @@ -0,0 +1,419 @@ +tinymce.addI18n('zh_CN',{ +"Redo": "\u91cd\u505a", +"Undo": "\u64a4\u9500", +"Cut": "\u526a\u5207", +"Copy": "\u590d\u5236", +"Paste": "\u7c98\u8d34", +"Select all": "\u5168\u9009", +"New document": "\u65b0\u6587\u4ef6", +"Ok": "\u786e\u5b9a", +"Cancel": "\u53d6\u6d88", +"Visual aids": "\u7f51\u683c\u7ebf", +"Bold": "\u7c97\u4f53", +"Italic": "\u659c\u4f53", +"Underline": "\u4e0b\u5212\u7ebf", +"Strikethrough": "\u5220\u9664\u7ebf", +"Superscript": "\u4e0a\u6807", +"Subscript": "\u4e0b\u6807", +"Clear formatting": "\u6e05\u9664\u683c\u5f0f", +"Align left": "\u5de6\u8fb9\u5bf9\u9f50", +"Align center": "\u4e2d\u95f4\u5bf9\u9f50", +"Align right": "\u53f3\u8fb9\u5bf9\u9f50", +"Justify": "\u4e24\u7aef\u5bf9\u9f50", +"Bullet list": "\u9879\u76ee\u7b26\u53f7", +"Numbered list": "\u7f16\u53f7\u5217\u8868", +"Decrease indent": "\u51cf\u5c11\u7f29\u8fdb", +"Increase indent": "\u589e\u52a0\u7f29\u8fdb", +"Close": "\u5173\u95ed", +"Formats": "\u683c\u5f0f", +"Your browser doesn't support direct access to the clipboard. Please use the Ctrl+X\/C\/V keyboard shortcuts instead.": "\u4f60\u7684\u6d4f\u89c8\u5668\u4e0d\u652f\u6301\u6253\u5f00\u526a\u8d34\u677f\uff0c\u8bf7\u4f7f\u7528Ctrl+X\/C\/V\u7b49\u5feb\u6377\u952e\u3002", +"Headers": "\u6807\u9898", +"Header 1": "\u6807\u98981", +"Header 2": "\u6807\u98982", +"Header 3": "\u6807\u98983", +"Header 4": "\u6807\u98984", +"Header 5": "\u6807\u98985", +"Header 6": "\u6807\u98986", +"Headings": "\u6807\u9898", +"Heading 1": "\u6807\u98981", +"Heading 2": "\u6807\u98982", +"Heading 3": "\u6807\u98983", +"Heading 4": "\u6807\u98984", +"Heading 5": "\u6807\u98985", +"Heading 6": "\u6807\u98986", +"Preformatted": "\u9884\u5148\u683c\u5f0f\u5316\u7684", +"Div": "Div", +"Pre": "Pre", +"Code": "\u4ee3\u7801", +"Paragraph": "\u6bb5\u843d", +"Blockquote": "\u5f15\u6587\u533a\u5757", +"Inline": "\u6587\u672c", +"Blocks": "\u57fa\u5757", +"Paste is now in plain text mode. Contents will now be pasted as plain text until you toggle this option off.": "\u5f53\u524d\u4e3a\u7eaf\u6587\u672c\u7c98\u8d34\u6a21\u5f0f\uff0c\u518d\u6b21\u70b9\u51fb\u53ef\u4ee5\u56de\u5230\u666e\u901a\u7c98\u8d34\u6a21\u5f0f\u3002", +"Fonts": "\u5b57\u4f53", +"Font Sizes": "\u5b57\u53f7", +"Class": "\u7c7b\u578b", +"Browse for an image": "\u6d4f\u89c8\u56fe\u50cf", +"OR": "\u6216", +"Drop an image here": "\u62d6\u653e\u4e00\u5f20\u56fe\u50cf\u81f3\u6b64", +"Upload": "\u4e0a\u4f20", +"Block": "\u5757", +"Align": "\u5bf9\u9f50", +"Default": "\u9ed8\u8ba4", +"Circle": "\u7a7a\u5fc3\u5706", +"Disc": "\u5b9e\u5fc3\u5706", +"Square": "\u65b9\u5757", +"Lower Alpha": "\u5c0f\u5199\u82f1\u6587\u5b57\u6bcd", +"Lower Greek": "\u5c0f\u5199\u5e0c\u814a\u5b57\u6bcd", +"Lower Roman": "\u5c0f\u5199\u7f57\u9a6c\u5b57\u6bcd", +"Upper Alpha": "\u5927\u5199\u82f1\u6587\u5b57\u6bcd", +"Upper Roman": "\u5927\u5199\u7f57\u9a6c\u5b57\u6bcd", +"Anchor...": "\u951a\u70b9...", +"Name": "\u540d\u79f0", +"Id": "\u6807\u8bc6\u7b26", +"Id should start with a letter, followed only by letters, numbers, dashes, dots, colons or underscores.": "\u6807\u8bc6\u7b26\u5e94\u8be5\u4ee5\u5b57\u6bcd\u5f00\u5934\uff0c\u540e\u8ddf\u5b57\u6bcd\u3001\u6570\u5b57\u3001\u7834\u6298\u53f7\u3001\u70b9\u3001\u5192\u53f7\u6216\u4e0b\u5212\u7ebf\u3002", +"You have unsaved changes are you sure you want to navigate away?": "\u4f60\u8fd8\u6709\u6587\u6863\u5c1a\u672a\u4fdd\u5b58\uff0c\u786e\u5b9a\u8981\u79bb\u5f00\uff1f", +"Restore last draft": "\u6062\u590d\u4e0a\u6b21\u7684\u8349\u7a3f", +"Special character...": "\u7279\u6b8a\u5b57\u7b26...", +"Source code": "\u6e90\u4ee3\u7801", +"Insert\/Edit code sample": "\u63d2\u5165\/\u7f16\u8f91\u4ee3\u7801\u793a\u4f8b", +"Language": "\u8bed\u8a00", +"Code sample...": "\u793a\u4f8b\u4ee3\u7801...", +"Color Picker": "\u9009\u8272\u5668", +"R": "R", +"G": "G", +"B": "B", +"Left to right": "\u4ece\u5de6\u5230\u53f3", +"Right to left": "\u4ece\u53f3\u5230\u5de6", +"Emoticons...": "\u8868\u60c5\u7b26\u53f7...", +"Metadata and Document Properties": "\u5143\u6570\u636e\u548c\u6587\u6863\u5c5e\u6027", +"Title": "\u6807\u9898", +"Keywords": "\u5173\u952e\u8bcd", +"Description": "\u63cf\u8ff0", +"Robots": "\u673a\u5668\u4eba", +"Author": "\u4f5c\u8005", +"Encoding": "\u7f16\u7801", +"Fullscreen": "\u5168\u5c4f", +"Action": "\u64cd\u4f5c", +"Shortcut": "\u5feb\u6377\u952e", +"Help": "\u5e2e\u52a9", +"Address": "\u5730\u5740", +"Focus to menubar": "\u79fb\u52a8\u7126\u70b9\u5230\u83dc\u5355\u680f", +"Focus to toolbar": "\u79fb\u52a8\u7126\u70b9\u5230\u5de5\u5177\u680f", +"Focus to element path": "\u79fb\u52a8\u7126\u70b9\u5230\u5143\u7d20\u8def\u5f84", +"Focus to contextual toolbar": "\u79fb\u52a8\u7126\u70b9\u5230\u4e0a\u4e0b\u6587\u83dc\u5355", +"Insert link (if link plugin activated)": "\u63d2\u5165\u94fe\u63a5 (\u5982\u679c\u94fe\u63a5\u63d2\u4ef6\u5df2\u6fc0\u6d3b)", +"Save (if save plugin activated)": "\u4fdd\u5b58(\u5982\u679c\u4fdd\u5b58\u63d2\u4ef6\u5df2\u6fc0\u6d3b)", +"Find (if searchreplace plugin activated)": "\u67e5\u627e(\u5982\u679c\u67e5\u627e\u66ff\u6362\u63d2\u4ef6\u5df2\u6fc0\u6d3b)", +"Plugins installed ({0}):": "\u5df2\u5b89\u88c5\u63d2\u4ef6 ({0}):", +"Premium plugins:": "\u4f18\u79c0\u63d2\u4ef6\uff1a", +"Learn more...": "\u4e86\u89e3\u66f4\u591a...", +"You are using {0}": "\u4f60\u6b63\u5728\u4f7f\u7528 {0}", +"Plugins": "\u63d2\u4ef6", +"Handy Shortcuts": "\u5feb\u6377\u952e", +"Horizontal line": "\u6c34\u5e73\u5206\u5272\u7ebf", +"Insert\/edit image": "\u63d2\u5165\/\u7f16\u8f91\u56fe\u7247", +"Image description": "\u56fe\u7247\u63cf\u8ff0", +"Source": "\u5730\u5740", +"Dimensions": "\u5927\u5c0f", +"Constrain proportions": "\u4fdd\u6301\u7eb5\u6a2a\u6bd4", +"General": "\u666e\u901a", +"Advanced": "\u9ad8\u7ea7", +"Style": "\u6837\u5f0f", +"Vertical space": "\u5782\u76f4\u8fb9\u8ddd", +"Horizontal space": "\u6c34\u5e73\u8fb9\u8ddd", +"Border": "\u8fb9\u6846", +"Insert image": "\u63d2\u5165\u56fe\u7247", +"Image...": "\u56fe\u7247...", +"Image list": "\u56fe\u7247\u5217\u8868", +"Rotate counterclockwise": "\u9006\u65f6\u9488\u65cb\u8f6c", +"Rotate clockwise": "\u987a\u65f6\u9488\u65cb\u8f6c", +"Flip vertically": "\u5782\u76f4\u7ffb\u8f6c", +"Flip horizontally": "\u6c34\u5e73\u7ffb\u8f6c", +"Edit image": "\u7f16\u8f91\u56fe\u7247", +"Image options": "\u56fe\u7247\u9009\u9879", +"Zoom in": "\u653e\u5927", +"Zoom out": "\u7f29\u5c0f", +"Crop": "\u88c1\u526a", +"Resize": "\u8c03\u6574\u5927\u5c0f", +"Orientation": "\u65b9\u5411", +"Brightness": "\u4eae\u5ea6", +"Sharpen": "\u9510\u5316", +"Contrast": "\u5bf9\u6bd4\u5ea6", +"Color levels": "\u989c\u8272\u5c42\u6b21", +"Gamma": "\u4f3d\u9a6c\u503c", +"Invert": "\u53cd\u8f6c", +"Apply": "\u5e94\u7528", +"Back": "\u540e\u9000", +"Insert date\/time": "\u63d2\u5165\u65e5\u671f\/\u65f6\u95f4", +"Date\/time": "\u65e5\u671f\/\u65f6\u95f4", +"Insert\/Edit Link": "\u63d2\u5165\/\u7f16\u8f91\u94fe\u63a5", +"Insert\/edit link": "\u63d2\u5165\/\u7f16\u8f91\u94fe\u63a5", +"Text to display": "\u663e\u793a\u6587\u5b57", +"Url": "\u5730\u5740", +"Open link in...": "\u94fe\u63a5\u6253\u5f00\u4f4d\u7f6e...", +"Current window": "\u5f53\u524d\u7a97\u53e3", +"None": "\u65e0", +"New window": "\u5728\u65b0\u7a97\u53e3\u6253\u5f00", +"Remove link": "\u5220\u9664\u94fe\u63a5", +"Anchors": "\u951a\u70b9", +"Link...": "\u94fe\u63a5...", +"Paste or type a link": "\u7c98\u8d34\u6216\u8f93\u5165\u94fe\u63a5", +"The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?": "\u4f60\u6240\u586b\u5199\u7684URL\u5730\u5740\u4e3a\u90ae\u4ef6\u5730\u5740\uff0c\u9700\u8981\u52a0\u4e0amailto:\u524d\u7f00\u5417\uff1f", +"The URL you entered seems to be an external link. Do you want to add the required http:\/\/ prefix?": "\u4f60\u6240\u586b\u5199\u7684URL\u5730\u5740\u5c5e\u4e8e\u5916\u90e8\u94fe\u63a5\uff0c\u9700\u8981\u52a0\u4e0ahttp:\/\/:\u524d\u7f00\u5417\uff1f", +"Link list": "\u94fe\u63a5\u5217\u8868", +"Insert video": "\u63d2\u5165\u89c6\u9891", +"Insert\/edit video": "\u63d2\u5165\/\u7f16\u8f91\u89c6\u9891", +"Insert\/edit media": "\u63d2\u5165\/\u7f16\u8f91\u5a92\u4f53", +"Alternative source": "\u955c\u50cf", +"Alternative source URL": "\u66ff\u4ee3\u6765\u6e90\u7f51\u5740", +"Media poster (Image URL)": "\u5c01\u9762(\u56fe\u7247\u5730\u5740)", +"Paste your embed code below:": "\u5c06\u5185\u5d4c\u4ee3\u7801\u7c98\u8d34\u5728\u4e0b\u9762:", +"Embed": "\u5185\u5d4c", +"Media...": "\u591a\u5a92\u4f53...", +"Nonbreaking space": "\u4e0d\u95f4\u65ad\u7a7a\u683c", +"Page break": "\u5206\u9875\u7b26", +"Paste as text": "\u7c98\u8d34\u4e3a\u6587\u672c", +"Preview": "\u9884\u89c8", +"Print...": "\u6253\u5370...", +"Save": "\u4fdd\u5b58", +"Find": "\u67e5\u627e", +"Replace with": "\u66ff\u6362\u4e3a", +"Replace": "\u66ff\u6362", +"Replace all": "\u5168\u90e8\u66ff\u6362", +"Previous": "\u4e0a\u4e00\u4e2a", +"Next": "\u4e0b\u4e00\u4e2a", +"Find and replace...": "\u67e5\u627e\u5e76\u66ff\u6362...", +"Could not find the specified string.": "\u672a\u627e\u5230\u641c\u7d22\u5185\u5bb9.", +"Match case": "\u533a\u5206\u5927\u5c0f\u5199", +"Find whole words only": "\u5168\u5b57\u5339\u914d", +"Spell check": "\u62fc\u5199\u68c0\u67e5", +"Ignore": "\u5ffd\u7565", +"Ignore all": "\u5168\u90e8\u5ffd\u7565", +"Finish": "\u5b8c\u6210", +"Add to Dictionary": "\u6dfb\u52a0\u5230\u5b57\u5178", +"Insert table": "\u63d2\u5165\u8868\u683c", +"Table properties": "\u8868\u683c\u5c5e\u6027", +"Delete table": "\u5220\u9664\u8868\u683c", +"Cell": "\u5355\u5143\u683c", +"Row": "\u884c", +"Column": "\u5217", +"Cell properties": "\u5355\u5143\u683c\u5c5e\u6027", +"Merge cells": "\u5408\u5e76\u5355\u5143\u683c", +"Split cell": "\u62c6\u5206\u5355\u5143\u683c", +"Insert row before": "\u5728\u4e0a\u65b9\u63d2\u5165", +"Insert row after": "\u5728\u4e0b\u65b9\u63d2\u5165", +"Delete row": "\u5220\u9664\u884c", +"Row properties": "\u884c\u5c5e\u6027", +"Cut row": "\u526a\u5207\u884c", +"Copy row": "\u590d\u5236\u884c", +"Paste row before": "\u7c98\u8d34\u5230\u4e0a\u65b9", +"Paste row after": "\u7c98\u8d34\u5230\u4e0b\u65b9", +"Insert column before": "\u5728\u5de6\u4fa7\u63d2\u5165", +"Insert column after": "\u5728\u53f3\u4fa7\u63d2\u5165", +"Delete column": "\u5220\u9664\u5217", +"Cols": "\u5217", +"Rows": "\u884c", +"Width": "\u5bbd", +"Height": "\u9ad8", +"Cell spacing": "\u5355\u5143\u683c\u5916\u95f4\u8ddd", +"Cell padding": "\u5355\u5143\u683c\u5185\u8fb9\u8ddd", +"Show caption": "\u663e\u793a\u6807\u9898", +"Left": "\u5de6\u5bf9\u9f50", +"Center": "\u5c45\u4e2d", +"Right": "\u53f3\u5bf9\u9f50", +"Cell type": "\u5355\u5143\u683c\u7c7b\u578b", +"Scope": "\u8303\u56f4", +"Alignment": "\u5bf9\u9f50\u65b9\u5f0f", +"H Align": "\u6c34\u5e73\u5bf9\u9f50", +"V Align": "\u5782\u76f4\u5bf9\u9f50", +"Top": "\u9876\u90e8\u5bf9\u9f50", +"Middle": "\u5782\u76f4\u5c45\u4e2d", +"Bottom": "\u5e95\u90e8\u5bf9\u9f50", +"Header cell": "\u8868\u5934\u5355\u5143\u683c", +"Row group": "\u884c\u7ec4", +"Column group": "\u5217\u7ec4", +"Row type": "\u884c\u7c7b\u578b", +"Header": "\u8868\u5934", +"Body": "\u8868\u4f53", +"Footer": "\u8868\u5c3e", +"Border color": "\u8fb9\u6846\u989c\u8272", +"Insert template...": "\u63d2\u5165\u6a21\u677f...", +"Templates": "\u6a21\u677f", +"Template": "\u6a21\u677f", +"Text color": "\u6587\u5b57\u989c\u8272", +"Background color": "\u80cc\u666f\u8272", +"Custom...": "\u81ea\u5b9a\u4e49...", +"Custom color": "\u81ea\u5b9a\u4e49\u989c\u8272", +"No color": "\u65e0", +"Remove color": "\u79fb\u9664\u989c\u8272", +"Table of Contents": "\u5185\u5bb9\u5217\u8868", +"Show blocks": "\u663e\u793a\u533a\u5757\u8fb9\u6846", +"Show invisible characters": "\u663e\u793a\u4e0d\u53ef\u89c1\u5b57\u7b26", +"Word count": "\u5b57\u6570", +"Count": "\u8ba1\u6570", +"Document": "\u6587\u6863", +"Selection": "\u9009\u62e9", +"Words": "\u5355\u8bcd", +"Words: {0}": "\u5b57\u6570\uff1a{0}", +"{0} words": "{0} \u5b57", +"File": "\u6587\u4ef6", +"Edit": "\u7f16\u8f91", +"Insert": "\u63d2\u5165", +"View": "\u89c6\u56fe", +"Format": "\u683c\u5f0f", +"Table": "\u8868\u683c", +"Tools": "\u5de5\u5177", +"Powered by {0}": "\u7531{0}\u9a71\u52a8", +"Rich Text Area. Press ALT-F9 for menu. Press ALT-F10 for toolbar. Press ALT-0 for help": "\u5728\u7f16\u8f91\u533a\u6309ALT-F9\u6253\u5f00\u83dc\u5355\uff0c\u6309ALT-F10\u6253\u5f00\u5de5\u5177\u680f\uff0c\u6309ALT-0\u67e5\u770b\u5e2e\u52a9", +"Image title": "\u56fe\u7247\u6807\u9898", +"Border width": "\u8fb9\u6846\u5bbd\u5ea6", +"Border style": "\u8fb9\u6846\u6837\u5f0f", +"Error": "\u9519\u8bef", +"Warn": "\u8b66\u544a", +"Valid": "\u6709\u6548", +"To open the popup, press Shift+Enter": "\u6309Shitf+Enter\u952e\u6253\u5f00\u5bf9\u8bdd\u6846", +"Rich Text Area. Press ALT-0 for help.": "\u7f16\u8f91\u533a\u3002\u6309Alt+0\u952e\u6253\u5f00\u5e2e\u52a9\u3002", +"System Font": "\u7cfb\u7edf\u5b57\u4f53", +"Failed to upload image: {0}": "\u56fe\u7247\u4e0a\u4f20\u5931\u8d25: {0}", +"Failed to load plugin: {0} from url {1}": "\u63d2\u4ef6\u52a0\u8f7d\u5931\u8d25: {0} \u6765\u81ea\u94fe\u63a5 {1}", +"Failed to load plugin url: {0}": "\u63d2\u4ef6\u52a0\u8f7d\u5931\u8d25 \u94fe\u63a5: {0}", +"Failed to initialize plugin: {0}": "\u63d2\u4ef6\u521d\u59cb\u5316\u5931\u8d25: {0}", +"example": "\u793a\u4f8b", +"Search": "\u641c\u7d22", +"All": "\u5168\u90e8", +"Currency": "\u8d27\u5e01", +"Text": "\u6587\u5b57", +"Quotations": "\u5f15\u7528", +"Mathematical": "\u6570\u5b66", +"Extended Latin": "\u62c9\u4e01\u8bed\u6269\u5145", +"Symbols": "\u7b26\u53f7", +"Arrows": "\u7bad\u5934", +"User Defined": "\u81ea\u5b9a\u4e49", +"dollar sign": "\u7f8e\u5143\u7b26\u53f7", +"currency sign": "\u8d27\u5e01\u7b26\u53f7", +"euro-currency sign": "\u6b27\u5143\u7b26\u53f7", +"colon sign": "\u5192\u53f7", +"cruzeiro sign": "\u514b\u9c81\u8d5b\u7f57\u5e01\u7b26\u53f7", +"french franc sign": "\u6cd5\u90ce\u7b26\u53f7", +"lira sign": "\u91cc\u62c9\u7b26\u53f7", +"mill sign": "\u5bc6\u5c14\u7b26\u53f7", +"naira sign": "\u5948\u62c9\u7b26\u53f7", +"peseta sign": "\u6bd4\u585e\u5854\u7b26\u53f7", +"rupee sign": "\u5362\u6bd4\u7b26\u53f7", +"won sign": "\u97e9\u5143\u7b26\u53f7", +"new sheqel sign": "\u65b0\u8c22\u514b\u5c14\u7b26\u53f7", +"dong sign": "\u8d8a\u5357\u76fe\u7b26\u53f7", +"kip sign": "\u8001\u631d\u57fa\u666e\u7b26\u53f7", +"tugrik sign": "\u56fe\u683c\u91cc\u514b\u7b26\u53f7", +"drachma sign": "\u5fb7\u62c9\u514b\u9a6c\u7b26\u53f7", +"german penny symbol": "\u5fb7\u56fd\u4fbf\u58eb\u7b26\u53f7", +"peso sign": "\u6bd4\u7d22\u7b26\u53f7", +"guarani sign": "\u74dc\u62c9\u5c3c\u7b26\u53f7", +"austral sign": "\u6fb3\u5143\u7b26\u53f7", +"hryvnia sign": "\u683c\u91cc\u592b\u5c3c\u4e9a\u7b26\u53f7", +"cedi sign": "\u585e\u5730\u7b26\u53f7", +"livre tournois sign": "\u91cc\u5f17\u5f17\u5c14\u7b26\u53f7", +"spesmilo sign": "spesmilo\u7b26\u53f7", +"tenge sign": "\u575a\u6208\u7b26\u53f7", +"indian rupee sign": "\u5370\u5ea6\u5362\u6bd4", +"turkish lira sign": "\u571f\u8033\u5176\u91cc\u62c9", +"nordic mark sign": "\u5317\u6b27\u9a6c\u514b", +"manat sign": "\u9a6c\u7eb3\u7279\u7b26\u53f7", +"ruble sign": "\u5362\u5e03\u7b26\u53f7", +"yen character": "\u65e5\u5143\u5b57\u6837", +"yuan character": "\u4eba\u6c11\u5e01\u5143\u5b57\u6837", +"yuan character, in hong kong and taiwan": "\u5143\u5b57\u6837\uff08\u6e2f\u53f0\u5730\u533a\uff09", +"yen\/yuan character variant one": "\u5143\u5b57\u6837\uff08\u5927\u5199\uff09", +"Loading emoticons...": "\u52a0\u8f7d\u8868\u60c5\u7b26\u53f7...", +"Could not load emoticons": "\u4e0d\u80fd\u52a0\u8f7d\u8868\u60c5\u7b26\u53f7", +"People": "\u4eba\u7c7b", +"Animals and Nature": "\u52a8\u7269\u548c\u81ea\u7136", +"Food and Drink": "\u98df\u7269\u548c\u996e\u54c1", +"Activity": "\u6d3b\u52a8", +"Travel and Places": "\u65c5\u6e38\u548c\u5730\u70b9", +"Objects": "\u7269\u4ef6", +"Flags": "\u65d7\u5e1c", +"Characters": "\u5b57\u7b26", +"Characters (no spaces)": "\u5b57\u7b26(\u65e0\u7a7a\u683c)", +"{0} characters": "{0} \u4e2a\u5b57\u7b26", +"Error: Form submit field collision.": "\u9519\u8bef: \u8868\u5355\u63d0\u4ea4\u5b57\u6bb5\u51b2\u7a81\u3002", +"Error: No form element found.": "\u9519\u8bef: \u6ca1\u6709\u8868\u5355\u63a7\u4ef6\u3002", +"Update": "\u66f4\u65b0", +"Color swatch": "\u989c\u8272\u6837\u672c", +"Turquoise": "\u9752\u7eff\u8272", +"Green": "\u7eff\u8272", +"Blue": "\u84dd\u8272", +"Purple": "\u7d2b\u8272", +"Navy Blue": "\u6d77\u519b\u84dd", +"Dark Turquoise": "\u6df1\u84dd\u7eff\u8272", +"Dark Green": "\u6df1\u7eff\u8272", +"Medium Blue": "\u4e2d\u84dd\u8272", +"Medium Purple": "\u4e2d\u7d2b\u8272", +"Midnight Blue": "\u6df1\u84dd\u8272", +"Yellow": "\u9ec4\u8272", +"Orange": "\u6a59\u8272", +"Red": "\u7ea2\u8272", +"Light Gray": "\u6d45\u7070\u8272", +"Gray": "\u7070\u8272", +"Dark Yellow": "\u6697\u9ec4\u8272", +"Dark Orange": "\u6df1\u6a59\u8272", +"Dark Red": "\u6df1\u7ea2\u8272", +"Medium Gray": "\u4e2d\u7070\u8272", +"Dark Gray": "\u6df1\u7070\u8272", +"Light Green": "\u6d45\u7eff\u8272", +"Light Yellow": "\u6d45\u9ec4\u8272", +"Light Red": "\u6d45\u7ea2\u8272", +"Light Purple": "\u6d45\u7d2b\u8272", +"Light Blue": "\u6d45\u84dd\u8272", +"Dark Purple": "\u6df1\u7d2b\u8272", +"Dark Blue": "\u6df1\u84dd\u8272", +"Black": "\u9ed1\u8272", +"White": "\u767d\u8272", +"Switch to or from fullscreen mode": "\u5207\u6362\u5168\u5c4f\u6a21\u5f0f", +"Open help dialog": "\u6253\u5f00\u5e2e\u52a9\u5bf9\u8bdd\u6846", +"history": "\u5386\u53f2", +"styles": "\u6837\u5f0f", +"formatting": "\u683c\u5f0f\u5316", +"alignment": "\u5bf9\u9f50", +"indentation": "\u7f29\u8fdb", +"permanent pen": "\u8bb0\u53f7\u7b14", +"comments": "\u5907\u6ce8", +"Format Painter": "\u683c\u5f0f\u5237", +"Insert\/edit iframe": "\u63d2\u5165\/\u7f16\u8f91\u6846\u67b6", +"Capitalization": "\u5927\u5199", +"lowercase": "\u5c0f\u5199", +"UPPERCASE": "\u5927\u5199", +"Title Case": "\u9996\u5b57\u6bcd\u5927\u5199", +"Permanent Pen Properties": "\u6c38\u4e45\u7b14\u5c5e\u6027", +"Permanent pen properties...": "\u6c38\u4e45\u7b14\u5c5e\u6027...", +"Font": "\u5b57\u4f53", +"Size": "\u5b57\u53f7", +"More...": "\u66f4\u591a...", +"Spellcheck Language": "\u62fc\u5199\u68c0\u67e5\u8bed\u8a00", +"Select...": "\u9009\u62e9...", +"Preferences": "\u9996\u9009\u9879", +"Yes": "\u662f", +"No": "\u5426", +"Keyboard Navigation": "\u952e\u76d8\u6307\u5f15", +"Version": "\u7248\u672c", +"Anchor": "\u951a\u70b9", +"Special character": "\u7279\u6b8a\u7b26\u53f7", +"Code sample": "\u4ee3\u7801\u793a\u4f8b", +"Color": "\u989c\u8272", +"Emoticons": "\u8868\u60c5", +"Document properties": "\u6587\u6863\u5c5e\u6027", +"Image": "\u56fe\u7247", +"Insert link": "\u63d2\u5165\u94fe\u63a5", +"Target": "\u6253\u5f00\u65b9\u5f0f", +"Link": "\u94fe\u63a5", +"Poster": "\u5c01\u9762", +"Media": "\u5a92\u4f53", +"Print": "\u6253\u5370", +"Prev": "\u4e0a\u4e00\u4e2a", +"Find and replace": "\u67e5\u627e\u548c\u66ff\u6362", +"Whole words": "\u5168\u5b57\u5339\u914d", +"Spellcheck": "\u62fc\u5199\u68c0\u67e5", +"Caption": "\u6807\u9898", +"Insert template": "\u63d2\u5165\u6a21\u677f" +}); \ No newline at end of file diff --git a/src/main/resources/static/layui-ext/tinymce/tinymce/license.txt b/src/main/resources/static/layui-ext/tinymce/tinymce/license.txt new file mode 100644 index 0000000..b17fc90 --- /dev/null +++ b/src/main/resources/static/layui-ext/tinymce/tinymce/license.txt @@ -0,0 +1,504 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! + + diff --git a/src/main/resources/static/layui-ext/tinymce/tinymce/plugins/advlist/plugin.js b/src/main/resources/static/layui-ext/tinymce/tinymce/plugins/advlist/plugin.js new file mode 100644 index 0000000..dacd551 --- /dev/null +++ b/src/main/resources/static/layui-ext/tinymce/tinymce/plugins/advlist/plugin.js @@ -0,0 +1,281 @@ +/** + * 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/ + * + * Version: 5.4.2 (2020-08-17) + */ +(function () { + 'use strict'; + + var global = tinymce.util.Tools.resolve('tinymce.PluginManager'); + + var global$1 = tinymce.util.Tools.resolve('tinymce.util.Tools'); + + var applyListFormat = function (editor, listName, styleValue) { + var cmd = listName === 'UL' ? 'InsertUnorderedList' : 'InsertOrderedList'; + editor.execCommand(cmd, false, styleValue === false ? null : { 'list-style-type': styleValue }); + }; + + var register = function (editor) { + editor.addCommand('ApplyUnorderedListStyle', function (ui, value) { + applyListFormat(editor, 'UL', value['list-style-type']); + }); + editor.addCommand('ApplyOrderedListStyle', function (ui, value) { + applyListFormat(editor, 'OL', value['list-style-type']); + }); + }; + + var getNumberStyles = function (editor) { + var styles = editor.getParam('advlist_number_styles', 'default,lower-alpha,lower-greek,lower-roman,upper-alpha,upper-roman'); + return styles ? styles.split(/[ ,]/) : []; + }; + var getBulletStyles = function (editor) { + var styles = editor.getParam('advlist_bullet_styles', 'default,circle,square'); + return styles ? styles.split(/[ ,]/) : []; + }; + + var noop = function () { + }; + var constant = function (value) { + return function () { + return value; + }; + }; + var never = constant(false); + var always = constant(true); + + var none = function () { + return NONE; + }; + var NONE = function () { + var eq = function (o) { + return o.isNone(); + }; + var call = function (thunk) { + return thunk(); + }; + var id = function (n) { + return n; + }; + var me = { + fold: function (n, _s) { + return n(); + }, + is: never, + isSome: never, + isNone: always, + getOr: id, + getOrThunk: call, + getOrDie: function (msg) { + throw new Error(msg || 'error: getOrDie called on none.'); + }, + getOrNull: constant(null), + getOrUndefined: constant(undefined), + or: id, + orThunk: call, + map: none, + each: noop, + bind: none, + exists: never, + forall: always, + filter: none, + equals: eq, + equals_: eq, + toArray: function () { + return []; + }, + toString: constant('none()') + }; + return me; + }(); + var some = function (a) { + var constant_a = constant(a); + var self = function () { + return me; + }; + var bind = function (f) { + return f(a); + }; + var me = { + fold: function (n, s) { + return s(a); + }, + is: function (v) { + return a === v; + }, + isSome: always, + isNone: never, + getOr: constant_a, + getOrThunk: constant_a, + getOrDie: constant_a, + getOrNull: constant_a, + getOrUndefined: constant_a, + or: self, + orThunk: self, + map: function (f) { + return some(f(a)); + }, + each: function (f) { + f(a); + }, + bind: bind, + exists: bind, + forall: bind, + filter: function (f) { + return f(a) ? me : NONE; + }, + toArray: function () { + return [a]; + }, + toString: function () { + return 'some(' + a + ')'; + }, + equals: function (o) { + return o.is(a); + }, + equals_: function (o, elementEq) { + return o.fold(never, function (b) { + return elementEq(a, b); + }); + } + }; + return me; + }; + var from = function (value) { + return value === null || value === undefined ? NONE : some(value); + }; + var Option = { + some: some, + none: none, + from: from + }; + + var isChildOfBody = function (editor, elm) { + return editor.$.contains(editor.getBody(), elm); + }; + var isTableCellNode = function (node) { + return node && /^(TH|TD)$/.test(node.nodeName); + }; + var isListNode = function (editor) { + return function (node) { + return node && /^(OL|UL|DL)$/.test(node.nodeName) && isChildOfBody(editor, node); + }; + }; + var getSelectedStyleType = function (editor) { + var listElm = editor.dom.getParent(editor.selection.getNode(), 'ol,ul'); + var style = editor.dom.getStyle(listElm, 'listStyleType'); + return Option.from(style); + }; + + var findIndex = function (list, predicate) { + for (var index = 0; index < list.length; index++) { + var element = list[index]; + if (predicate(element)) { + return index; + } + } + return -1; + }; + var styleValueToText = function (styleValue) { + return styleValue.replace(/\-/g, ' ').replace(/\b\w/g, function (chr) { + return chr.toUpperCase(); + }); + }; + var isWithinList = function (editor, e, nodeName) { + var tableCellIndex = findIndex(e.parents, isTableCellNode); + var parents = tableCellIndex !== -1 ? e.parents.slice(0, tableCellIndex) : e.parents; + var lists = global$1.grep(parents, isListNode(editor)); + return lists.length > 0 && lists[0].nodeName === nodeName; + }; + var addSplitButton = function (editor, id, tooltip, cmd, nodeName, styles) { + editor.ui.registry.addSplitButton(id, { + tooltip: tooltip, + icon: nodeName === 'OL' ? 'ordered-list' : 'unordered-list', + presets: 'listpreview', + columns: 3, + fetch: function (callback) { + var items = global$1.map(styles, function (styleValue) { + var iconStyle = nodeName === 'OL' ? 'num' : 'bull'; + var iconName = styleValue === 'disc' || styleValue === 'decimal' ? 'default' : styleValue; + var itemValue = styleValue === 'default' ? '' : styleValue; + var displayText = styleValueToText(styleValue); + return { + type: 'choiceitem', + value: itemValue, + icon: 'list-' + iconStyle + '-' + iconName, + text: displayText + }; + }); + callback(items); + }, + onAction: function () { + return editor.execCommand(cmd); + }, + onItemAction: function (_splitButtonApi, value) { + applyListFormat(editor, nodeName, value); + }, + select: function (value) { + var listStyleType = getSelectedStyleType(editor); + return listStyleType.map(function (listStyle) { + return value === listStyle; + }).getOr(false); + }, + onSetup: function (api) { + var nodeChangeHandler = function (e) { + api.setActive(isWithinList(editor, e, nodeName)); + }; + editor.on('NodeChange', nodeChangeHandler); + return function () { + return editor.off('NodeChange', nodeChangeHandler); + }; + } + }); + }; + var addButton = function (editor, id, tooltip, cmd, nodeName, _styles) { + editor.ui.registry.addToggleButton(id, { + active: false, + tooltip: tooltip, + icon: nodeName === 'OL' ? 'ordered-list' : 'unordered-list', + onSetup: function (api) { + var nodeChangeHandler = function (e) { + api.setActive(isWithinList(editor, e, nodeName)); + }; + editor.on('NodeChange', nodeChangeHandler); + return function () { + return editor.off('NodeChange', nodeChangeHandler); + }; + }, + onAction: function () { + return editor.execCommand(cmd); + } + }); + }; + var addControl = function (editor, id, tooltip, cmd, nodeName, styles) { + if (styles.length > 1) { + addSplitButton(editor, id, tooltip, cmd, nodeName, styles); + } else { + addButton(editor, id, tooltip, cmd, nodeName); + } + }; + var register$1 = function (editor) { + addControl(editor, 'numlist', 'Numbered list', 'InsertOrderedList', 'OL', getNumberStyles(editor)); + addControl(editor, 'bullist', 'Bullet list', 'InsertUnorderedList', 'UL', getBulletStyles(editor)); + }; + + function Plugin () { + global.add('advlist', function (editor) { + var hasPlugin = function (editor, plugin) { + return global$1.inArray(editor.getParam('plugins', '', 'string').split(/[ ,]/), plugin) !== -1; + }; + if (hasPlugin(editor, 'lists')) { + register$1(editor); + register(editor); + } + }); + } + + Plugin(); + +}()); diff --git a/src/main/resources/static/layui-ext/tinymce/tinymce/plugins/advlist/plugin.min.js b/src/main/resources/static/layui-ext/tinymce/tinymce/plugins/advlist/plugin.min.js new file mode 100644 index 0000000..f27c134 --- /dev/null +++ b/src/main/resources/static/layui-ext/tinymce/tinymce/plugins/advlist/plugin.min.js @@ -0,0 +1,9 @@ +/** + * 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/ + * + * Version: 5.4.2 (2020-08-17) + */ +!function(){"use strict";var n,t,e,r=tinymce.util.Tools.resolve("tinymce.PluginManager"),l=tinymce.util.Tools.resolve("tinymce.util.Tools"),c=function(n,t,e){var r="UL"===t?"InsertUnorderedList":"InsertOrderedList";n.execCommand(r,!1,!1===e?null:{"list-style-type":e})},i=function(n){return function(){return n}},u=i(!1),s=i(!0),o=function(){return a},a=(n=function(n){return n.isNone()},{fold:function(n,t){return n()},is:u,isSome:u,isNone:s,getOr:e=function(n){return n},getOrThunk:t=function(n){return n()},getOrDie:function(n){throw new Error(n||"error: getOrDie called on none.")},getOrNull:i(null),getOrUndefined:i(undefined),or:e,orThunk:t,map:o,each:function(){},bind:o,exists:u,forall:s,filter:o,equals:n,equals_:n,toArray:function(){return[]},toString:i("none()")}),f=function(e){var n=i(e),t=function(){return o},r=function(n){return n(e)},o={fold:function(n,t){return t(e)},is:function(n){return e===n},isSome:s,isNone:u,getOr:n,getOrThunk:n,getOrDie:n,getOrNull:n,getOrUndefined:n,or:t,orThunk:t,map:function(n){return f(n(e))},each:function(n){n(e)},bind:r,exists:r,forall:r,filter:function(n){return n(e)?o:a},toArray:function(){return[e]},toString:function(){return"some("+e+")"},equals:function(n){return n.is(e)},equals_:function(n,t){return n.fold(u,function(n){return t(e,n)})}};return o},d=function(n){return null===n||n===undefined?a:f(n)},g=function(n){return n&&/^(TH|TD)$/.test(n.nodeName)},m=function(r){return function(n){return n&&/^(OL|UL|DL)$/.test(n.nodeName)&&(e=n,(t=r).$.contains(t.getBody(),e));var t,e}},p=function(n,t,e){var r=function(n,t){for(var e=0;e len) { + index = len; + } + } + return index; + }; + var setStart = function (rng, container, offset) { + if (container.nodeType !== 1 || container.hasChildNodes()) { + rng.setStart(container, scopeIndex(container, offset)); + } else { + rng.setStartBefore(container); + } + }; + var setEnd = function (rng, container, offset) { + if (container.nodeType !== 1 || container.hasChildNodes()) { + rng.setEnd(container, scopeIndex(container, offset)); + } else { + rng.setEndAfter(container); + } + }; + var parseCurrentLine = function (editor, endOffset, delimiter) { + var end, endContainer, bookmark, text, prev, len, rngText; + var autoLinkPattern = getAutoLinkPattern(editor); + var defaultLinkTarget = getDefaultLinkTarget(editor); + if (editor.selection.getNode().tagName === 'A') { + return; + } + var rng = editor.selection.getRng().cloneRange(); + if (rng.startOffset < 5) { + prev = rng.endContainer.previousSibling; + if (!prev) { + if (!rng.endContainer.firstChild || !rng.endContainer.firstChild.nextSibling) { + return; + } + prev = rng.endContainer.firstChild.nextSibling; + } + len = prev.length; + setStart(rng, prev, len); + setEnd(rng, prev, len); + if (rng.endOffset < 5) { + return; + } + end = rng.endOffset; + endContainer = prev; + } else { + endContainer = rng.endContainer; + if (endContainer.nodeType !== 3 && endContainer.firstChild) { + while (endContainer.nodeType !== 3 && endContainer.firstChild) { + endContainer = endContainer.firstChild; + } + if (endContainer.nodeType === 3) { + setStart(rng, endContainer, 0); + setEnd(rng, endContainer, endContainer.nodeValue.length); + } + } + if (rng.endOffset === 1) { + end = 2; + } else { + end = rng.endOffset - 1 - endOffset; + } + } + var start = end; + do { + setStart(rng, endContainer, end >= 2 ? end - 2 : 0); + setEnd(rng, endContainer, end >= 1 ? end - 1 : 0); + end -= 1; + rngText = rng.toString(); + } while (rngText !== ' ' && rngText !== '' && rngText.charCodeAt(0) !== 160 && end - 2 >= 0 && rngText !== delimiter); + if (rangeEqualsDelimiterOrSpace(rng.toString(), delimiter)) { + setStart(rng, endContainer, end); + setEnd(rng, endContainer, start); + end += 1; + } else if (rng.startOffset === 0) { + setStart(rng, endContainer, 0); + setEnd(rng, endContainer, start); + } else { + setStart(rng, endContainer, end); + setEnd(rng, endContainer, start); + } + text = rng.toString(); + if (text.charAt(text.length - 1) === '.') { + setEnd(rng, endContainer, start - 1); + } + text = rng.toString().trim(); + var matches = text.match(autoLinkPattern); + var protocol = getDefaultLinkProtocol(editor); + if (matches) { + if (matches[1] === 'www.') { + matches[1] = protocol + '://www.'; + } else if (/@$/.test(matches[1]) && !/^mailto:/.test(matches[1])) { + matches[1] = 'mailto:' + matches[1]; + } + bookmark = editor.selection.getBookmark(); + editor.selection.setRng(rng); + editor.execCommand('createlink', false, matches[1] + matches[2]); + if (defaultLinkTarget !== false) { + editor.dom.setAttrib(editor.selection.getNode(), 'target', defaultLinkTarget); + } + editor.selection.moveToBookmark(bookmark); + editor.nodeChanged(); + } + }; + var setup = function (editor) { + var autoUrlDetectState; + editor.on('keydown', function (e) { + if (e.keyCode === 13) { + return handleEnter(editor); + } + }); + if (global$1.browser.isIE()) { + editor.on('focus', function () { + if (!autoUrlDetectState) { + autoUrlDetectState = true; + try { + editor.execCommand('AutoUrlDetect', false, true); + } catch (ex) { + } + } + }); + return; + } + editor.on('keypress', function (e) { + if (e.keyCode === 41) { + return handleEclipse(editor); + } + }); + editor.on('keyup', function (e) { + if (e.keyCode === 32) { + return handleSpacebar(editor); + } + }); + }; + + function Plugin () { + global.add('autolink', function (editor) { + setup(editor); + }); + } + + Plugin(); + +}()); diff --git a/src/main/resources/static/layui-ext/tinymce/tinymce/plugins/autolink/plugin.min.js b/src/main/resources/static/layui-ext/tinymce/tinymce/plugins/autolink/plugin.min.js new file mode 100644 index 0000000..3f14bae --- /dev/null +++ b/src/main/resources/static/layui-ext/tinymce/tinymce/plugins/autolink/plugin.min.js @@ -0,0 +1,9 @@ +/** + * 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/ + * + * Version: 5.4.2 (2020-08-17) + */ +!function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager"),i=tinymce.util.Tools.resolve("tinymce.Env"),o=function(e,t){if(t<0&&(t=0),3===e.nodeType){var n=e.data.length;n getAutoResizeMinHeight(editor)) { + resizeHeight = contentHeight + chromeHeight; + } + var maxHeight = getAutoResizeMaxHeight(editor); + if (maxHeight && resizeHeight > maxHeight) { + resizeHeight = maxHeight; + toggleScrolling(editor, true); + } else { + toggleScrolling(editor, false); + } + if (resizeHeight !== oldSize.get()) { + var deltaSize = resizeHeight - oldSize.get(); + dom.setStyle(editor.getContainer(), 'height', resizeHeight + 'px'); + oldSize.set(resizeHeight); + fireResizeEditor(editor); + if (global$1.browser.isSafari() && global$1.mac) { + var win = editor.getWin(); + win.scrollTo(win.pageXOffset, win.pageYOffset); + } + if (editor.hasFocus()) { + editor.selection.scrollIntoView(editor.selection.getNode()); + } + if (global$1.webkit && deltaSize < 0) { + resize(editor, oldSize); + } + } + }; + var setup = function (editor, oldSize) { + editor.on('init', function () { + var overflowPadding = getAutoResizeOverflowPadding(editor); + var dom = editor.dom; + dom.setStyles(editor.getDoc().documentElement, { height: 'auto' }); + dom.setStyles(editor.getBody(), { + 'paddingLeft': overflowPadding, + 'paddingRight': overflowPadding, + 'min-height': 0 + }); + }); + editor.on('NodeChange SetContent keyup FullscreenStateChanged ResizeContent', function () { + resize(editor, oldSize); + }); + if (shouldAutoResizeOnInit(editor)) { + editor.on('init', function () { + wait(editor, oldSize, 20, 100, function () { + wait(editor, oldSize, 5, 1000); + }); + }); + } + }; + + var register = function (editor, oldSize) { + editor.addCommand('mceAutoResize', function () { + resize(editor, oldSize); + }); + }; + + function Plugin () { + global.add('autoresize', function (editor) { + if (!editor.settings.hasOwnProperty('resize')) { + editor.settings.resize = false; + } + if (!editor.inline) { + var oldSize = Cell(0); + register(editor, oldSize); + setup(editor, oldSize); + } + }); + } + + Plugin(); + +}()); diff --git a/src/main/resources/static/layui-ext/tinymce/tinymce/plugins/autoresize/plugin.min.js b/src/main/resources/static/layui-ext/tinymce/tinymce/plugins/autoresize/plugin.min.js new file mode 100644 index 0000000..be16b19 --- /dev/null +++ b/src/main/resources/static/layui-ext/tinymce/tinymce/plugins/autoresize/plugin.min.js @@ -0,0 +1,9 @@ +/** + * 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/ + * + * Version: 5.4.2 (2020-08-17) + */ +!function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager"),h=tinymce.util.Tools.resolve("tinymce.Env"),r=tinymce.util.Tools.resolve("tinymce.util.Delay"),v=function(e){return e.getParam("min_height",e.getElement().offsetHeight,"number")},s=function(e,t,n,i,o){r.setEditorTimeout(e,function(){b(e,t),n--?s(e,t,n,i,o):o&&o()},i)},y=function(e,t){var n=e.getBody();n&&(n.style.overflowY=t?"":"hidden",t||(n.scrollTop=0))},p=function(e,t,n,i){var o=parseInt(e.getStyle(t,n,i),10);return isNaN(o)?0:o},b=function(e,t){var n=e.dom,i=e.getDoc();if(i)if((o=e).plugins.fullscreen&&o.plugins.fullscreen.isFullscreen())y(e,!0);else{var o,r=i.documentElement,a=e.getParam("autoresize_bottom_margin",50,"number"),s=v(e),u=p(n,r,"margin-top",!0),g=p(n,r,"margin-bottom",!0),l=r.offsetHeight+u+g+a;l<0&&(l=0);var f=e.getContainer().offsetHeight-e.getContentAreaContainer().offsetHeight;l+f>v(e)&&(s=l+f);var c=e.getParam("max_height",0,"number");if(c&&c getAutoSaveRetention(editor)) { + removeDraft(editor, false); + return false; + } + return true; + }; + var removeDraft = function (editor, fire) { + var prefix = getAutoSavePrefix(editor); + global$2.removeItem(prefix + 'draft'); + global$2.removeItem(prefix + 'time'); + if (fire !== false) { + fireRemoveDraft(editor); + } + }; + var storeDraft = function (editor) { + var prefix = getAutoSavePrefix(editor); + if (!isEmpty(editor) && editor.isDirty()) { + global$2.setItem(prefix + 'draft', editor.getContent({ + format: 'raw', + no_events: true + })); + global$2.setItem(prefix + 'time', new Date().getTime().toString()); + fireStoreDraft(editor); + } + }; + var restoreDraft = function (editor) { + var prefix = getAutoSavePrefix(editor); + if (hasDraft(editor)) { + editor.setContent(global$2.getItem(prefix + 'draft'), { format: 'raw' }); + fireRestoreDraft(editor); + } + }; + var startStoreDraft = function (editor) { + var interval = getAutoSaveInterval(editor); + global$1.setInterval(function () { + if (!editor.removed) { + storeDraft(editor); + } + }, interval); + }; + var restoreLastDraft = function (editor) { + editor.undoManager.transact(function () { + restoreDraft(editor); + removeDraft(editor); + }); + editor.focus(); + }; + + var get = function (editor) { + return { + hasDraft: function () { + return hasDraft(editor); + }, + storeDraft: function () { + return storeDraft(editor); + }, + restoreDraft: function () { + return restoreDraft(editor); + }, + removeDraft: function (fire) { + return removeDraft(editor, fire); + }, + isEmpty: function (html) { + return isEmpty(editor, html); + } + }; + }; + + var global$4 = tinymce.util.Tools.resolve('tinymce.EditorManager'); + + var setup = function (editor) { + editor.editorManager.on('BeforeUnload', function (e) { + var msg; + global$3.each(global$4.get(), function (editor) { + if (editor.plugins.autosave) { + editor.plugins.autosave.storeDraft(); + } + if (!msg && editor.isDirty() && shouldAskBeforeUnload(editor)) { + msg = editor.translate('You have unsaved changes are you sure you want to navigate away?'); + } + }); + if (msg) { + e.preventDefault(); + e.returnValue = msg; + } + }); + }; + + var makeSetupHandler = function (editor) { + return function (api) { + api.setDisabled(!hasDraft(editor)); + var editorEventCallback = function () { + return api.setDisabled(!hasDraft(editor)); + }; + editor.on('StoreDraft RestoreDraft RemoveDraft', editorEventCallback); + return function () { + return editor.off('StoreDraft RestoreDraft RemoveDraft', editorEventCallback); + }; + }; + }; + var register = function (editor) { + startStoreDraft(editor); + editor.ui.registry.addButton('restoredraft', { + tooltip: 'Restore last draft', + icon: 'restore-draft', + onAction: function () { + restoreLastDraft(editor); + }, + onSetup: makeSetupHandler(editor) + }); + editor.ui.registry.addMenuItem('restoredraft', { + text: 'Restore last draft', + icon: 'restore-draft', + onAction: function () { + restoreLastDraft(editor); + }, + onSetup: makeSetupHandler(editor) + }); + }; + + function Plugin () { + global.add('autosave', function (editor) { + setup(editor); + register(editor); + editor.on('init', function () { + if (shouldRestoreWhenEmpty(editor) && editor.dom.isEmpty(editor.getBody())) { + restoreDraft(editor); + } + }); + return get(editor); + }); + } + + Plugin(); + +}(window)); diff --git a/src/main/resources/static/layui-ext/tinymce/tinymce/plugins/autosave/plugin.min.js b/src/main/resources/static/layui-ext/tinymce/tinymce/plugins/autosave/plugin.min.js new file mode 100644 index 0000000..11b294d --- /dev/null +++ b/src/main/resources/static/layui-ext/tinymce/tinymce/plugins/autosave/plugin.min.js @@ -0,0 +1,9 @@ +/** + * 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/ + * + * Version: 5.4.2 (2020-08-17) + */ +!function(a){"use strict";var e,t=tinymce.util.Tools.resolve("tinymce.PluginManager"),r=tinymce.util.Tools.resolve("tinymce.util.Delay"),n=tinymce.util.Tools.resolve("tinymce.util.LocalStorage"),o=tinymce.util.Tools.resolve("tinymce.util.Tools"),i=function(t,e){var r=t||e,n=/^(\d+)([ms]?)$/.exec(""+r);return(n[2]?{s:1e3,m:6e4}[n[2]]:1)*parseInt(r,10)},u=function(t){var e=a.document.location;return t.getParam("autosave_prefix","tinymce-autosave-{path}{query}{hash}-{id}-").replace(/{path}/g,e.pathname).replace(/{query}/g,e.search).replace(/{hash}/g,e.hash).replace(/{id}/g,t.id)},s=(e=undefined,function(t){return e===t}),f=function(t,e){if(s(e))return t.dom.isEmpty(t.getBody());var r=o.trim(e);if(""===r)return!0;var n=(new a.DOMParser).parseFromString(r,"text/html");return t.dom.isEmpty(n)},c=function(t){var e=parseInt(n.getItem(u(t)+"time"),10)||0;return!((new Date).getTime()-e>i(t.getParam("autosave_retention"),"20m"))||(m(t,!1),!1)},m=function(t,e){var r=u(t);n.removeItem(r+"draft"),n.removeItem(r+"time"),!1!==e&&t.fire("RemoveDraft")},l=function(t){var e=u(t);!f(t)&&t.isDirty()&&(n.setItem(e+"draft",t.getContent({format:"raw",no_events:!0})),n.setItem(e+"time",(new Date).getTime().toString()),t.fire("StoreDraft"))},v=function(t){var e=u(t);c(t)&&(t.setContent(n.getItem(e+"draft"),{format:"raw"}),t.fire("RestoreDraft"))},d=function(t){var e=i(t.getParam("autosave_interval"),"30s");r.setInterval(function(){t.removed||l(t)},e)},g=function(t){t.undoManager.transact(function(){v(t),m(t)}),t.focus()},y=tinymce.util.Tools.resolve("tinymce.EditorManager"),D=function(r){return function(t){t.setDisabled(!c(r));var e=function(){return t.setDisabled(!c(r))};return r.on("StoreDraft RestoreDraft RemoveDraft",e),function(){return r.off("StoreDraft RestoreDraft RemoveDraft",e)}}};!function p(){t.add("autosave",function(t){var e,r;return t.editorManager.on("BeforeUnload",function(t){var e;o.each(y.get(),function(t){t.plugins.autosave&&t.plugins.autosave.storeDraft(),!e&&t.isDirty()&&t.getParam("autosave_ask_before_unload",!0)&&(e=t.translate("You have unsaved changes are you sure you want to navigate away?"))}),e&&(t.preventDefault(),t.returnValue=e)}),d(e=t),e.ui.registry.addButton("restoredraft",{tooltip:"Restore last draft",icon:"restore-draft",onAction:function(){g(e)},onSetup:D(e)}),e.ui.registry.addMenuItem("restoredraft",{text:"Restore last draft",icon:"restore-draft",onAction:function(){g(e)},onSetup:D(e)}),t.on("init",function(){t.getParam("autosave_restore_when_empty",!1)&&t.dom.isEmpty(t.getBody())&&v(t)}),r=t,{hasDraft:function(){return c(r)},storeDraft:function(){return l(r)},restoreDraft:function(){return v(r)},removeDraft:function(t){return m(r,t)},isEmpty:function(t){return f(r,t)}}})}()}(window); \ No newline at end of file diff --git a/src/main/resources/static/layui-ext/tinymce/tinymce/plugins/bbcode/plugin.js b/src/main/resources/static/layui-ext/tinymce/tinymce/plugins/bbcode/plugin.js new file mode 100644 index 0000000..b9a3fc5 --- /dev/null +++ b/src/main/resources/static/layui-ext/tinymce/tinymce/plugins/bbcode/plugin.js @@ -0,0 +1,99 @@ +/** + * 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/ + * + * Version: 5.4.2 (2020-08-17) + */ +(function () { + 'use strict'; + + var global = tinymce.util.Tools.resolve('tinymce.PluginManager'); + + var global$1 = tinymce.util.Tools.resolve('tinymce.util.Tools'); + + var html2bbcode = function (s) { + s = global$1.trim(s); + var rep = function (re, str) { + s = s.replace(re, str); + }; + rep(/(.*?)<\/a>/gi, '[url=$1]$2[/url]'); + rep(/(.*?)<\/font>/gi, '[code][color=$1]$2[/color][/code]'); + rep(/(.*?)<\/font>/gi, '[quote][color=$1]$2[/color][/quote]'); + rep(/(.*?)<\/font>/gi, '[code][color=$1]$2[/color][/code]'); + rep(/(.*?)<\/font>/gi, '[quote][color=$1]$2[/color][/quote]'); + rep(/(.*?)<\/span>/gi, '[color=$1]$2[/color]'); + rep(/(.*?)<\/font>/gi, '[color=$1]$2[/color]'); + rep(/(.*?)<\/span>/gi, '[size=$1]$2[/size]'); + rep(/(.*?)<\/font>/gi, '$1'); + rep(//gi, '[img]$1[/img]'); + rep(/(.*?)<\/span>/gi, '[code]$1[/code]'); + rep(/(.*?)<\/span>/gi, '[quote]$1[/quote]'); + rep(/(.*?)<\/strong>/gi, '[code][b]$1[/b][/code]'); + rep(/(.*?)<\/strong>/gi, '[quote][b]$1[/b][/quote]'); + rep(/(.*?)<\/em>/gi, '[code][i]$1[/i][/code]'); + rep(/(.*?)<\/em>/gi, '[quote][i]$1[/i][/quote]'); + rep(/(.*?)<\/u>/gi, '[code][u]$1[/u][/code]'); + rep(/(.*?)<\/u>/gi, '[quote][u]$1[/u][/quote]'); + rep(/<\/(strong|b)>/gi, '[/b]'); + rep(/<(strong|b)>/gi, '[b]'); + rep(/<\/(em|i)>/gi, '[/i]'); + rep(/<(em|i)>/gi, '[i]'); + rep(/<\/u>/gi, '[/u]'); + rep(/(.*?)<\/span>/gi, '[u]$1[/u]'); + rep(//gi, '[u]'); + rep(/]*>/gi, '[quote]'); + rep(/<\/blockquote>/gi, '[/quote]'); + rep(/
    /gi, '\n'); + rep(//gi, '\n'); + rep(/
    /gi, '\n'); + rep(/

    /gi, ''); + rep(/<\/p>/gi, '\n'); + rep(/ |\u00a0/gi, ' '); + rep(/"/gi, '"'); + rep(/</gi, '<'); + rep(/>/gi, '>'); + rep(/&/gi, '&'); + return s; + }; + var bbcode2html = function (s) { + s = global$1.trim(s); + var rep = function (re, str) { + s = s.replace(re, str); + }; + rep(/\n/gi, '
    '); + rep(/\[b\]/gi, ''); + rep(/\[\/b\]/gi, ''); + rep(/\[i\]/gi, ''); + rep(/\[\/i\]/gi, ''); + rep(/\[u\]/gi, ''); + rep(/\[\/u\]/gi, ''); + rep(/\[url=([^\]]+)\](.*?)\[\/url\]/gi, '
    $2'); + rep(/\[url\](.*?)\[\/url\]/gi, '$1'); + rep(/\[img\](.*?)\[\/img\]/gi, ''); + rep(/\[color=(.*?)\](.*?)\[\/color\]/gi, '$2'); + rep(/\[code\](.*?)\[\/code\]/gi, '$1 '); + rep(/\[quote.*?\](.*?)\[\/quote\]/gi, '$1 '); + return s; + }; + + function Plugin () { + global.add('bbcode', function (editor) { + editor.on('BeforeSetContent', function (e) { + e.content = bbcode2html(e.content); + }); + editor.on('PostProcess', function (e) { + if (e.set) { + e.content = bbcode2html(e.content); + } + if (e.get) { + e.content = html2bbcode(e.content); + } + }); + }); + } + + Plugin(); + +}()); diff --git a/src/main/resources/static/layui-ext/tinymce/tinymce/plugins/bbcode/plugin.min.js b/src/main/resources/static/layui-ext/tinymce/tinymce/plugins/bbcode/plugin.min.js new file mode 100644 index 0000000..474b571 --- /dev/null +++ b/src/main/resources/static/layui-ext/tinymce/tinymce/plugins/bbcode/plugin.min.js @@ -0,0 +1,9 @@ +/** + * 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/ + * + * Version: 5.4.2 (2020-08-17) + */ +!function(){"use strict";var o=tinymce.util.Tools.resolve("tinymce.PluginManager"),e=tinymce.util.Tools.resolve("tinymce.util.Tools"),t=function(t){t=e.trim(t);var o=function(o,e){t=t.replace(o,e)};return o(/\n/gi,"
    "),o(/\[b\]/gi,""),o(/\[\/b\]/gi,""),o(/\[i\]/gi,""),o(/\[\/i\]/gi,""),o(/\[u\]/gi,""),o(/\[\/u\]/gi,""),o(/\[url=([^\]]+)\](.*?)\[\/url\]/gi,'$2'),o(/\[url\](.*?)\[\/url\]/gi,'$1'),o(/\[img\](.*?)\[\/img\]/gi,''),o(/\[color=(.*?)\](.*?)\[\/color\]/gi,'$2'),o(/\[code\](.*?)\[\/code\]/gi,'$1 '),o(/\[quote.*?\](.*?)\[\/quote\]/gi,'$1 '),t};!function i(){o.add("bbcode",function(o){o.on("BeforeSetContent",function(o){o.content=t(o.content)}),o.on("PostProcess",function(o){o.set&&(o.content=t(o.content)),o.get&&(o.content=function(t){t=e.trim(t);var o=function(o,e){t=t.replace(o,e)};return o(/(.*?)<\/a>/gi,"[url=$1]$2[/url]"),o(/(.*?)<\/font>/gi,"[code][color=$1]$2[/color][/code]"),o(/(.*?)<\/font>/gi,"[quote][color=$1]$2[/color][/quote]"),o(/(.*?)<\/font>/gi,"[code][color=$1]$2[/color][/code]"),o(/(.*?)<\/font>/gi,"[quote][color=$1]$2[/color][/quote]"),o(/(.*?)<\/span>/gi,"[color=$1]$2[/color]"),o(/(.*?)<\/font>/gi,"[color=$1]$2[/color]"),o(/(.*?)<\/span>/gi,"[size=$1]$2[/size]"),o(/(.*?)<\/font>/gi,"$1"),o(//gi,"[img]$1[/img]"),o(/(.*?)<\/span>/gi,"[code]$1[/code]"),o(/(.*?)<\/span>/gi,"[quote]$1[/quote]"),o(/(.*?)<\/strong>/gi,"[code][b]$1[/b][/code]"),o(/(.*?)<\/strong>/gi,"[quote][b]$1[/b][/quote]"),o(/(.*?)<\/em>/gi,"[code][i]$1[/i][/code]"),o(/(.*?)<\/em>/gi,"[quote][i]$1[/i][/quote]"),o(/(.*?)<\/u>/gi,"[code][u]$1[/u][/code]"),o(/(.*?)<\/u>/gi,"[quote][u]$1[/u][/quote]"),o(/<\/(strong|b)>/gi,"[/b]"),o(/<(strong|b)>/gi,"[b]"),o(/<\/(em|i)>/gi,"[/i]"),o(/<(em|i)>/gi,"[i]"),o(/<\/u>/gi,"[/u]"),o(/(.*?)<\/span>/gi,"[u]$1[/u]"),o(//gi,"[u]"),o(/]*>/gi,"[quote]"),o(/<\/blockquote>/gi,"[/quote]"),o(/
    /gi,"\n"),o(//gi,"\n"),o(/
    /gi,"\n"),o(/

    /gi,""),o(/<\/p>/gi,"\n"),o(/ |\u00a0/gi," "),o(/"/gi,'"'),o(/</gi,"<"),o(/>/gi,">"),o(/&/gi,"&"),t}(o.content))})})}()}(); \ No newline at end of file diff --git a/src/main/resources/static/layui-ext/tinymce/tinymce/plugins/charmap/plugin.js b/src/main/resources/static/layui-ext/tinymce/tinymce/plugins/charmap/plugin.js new file mode 100644 index 0000000..c8172f5 --- /dev/null +++ b/src/main/resources/static/layui-ext/tinymce/tinymce/plugins/charmap/plugin.js @@ -0,0 +1,1706 @@ +/** + * 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/ + * + * Version: 5.4.2 (2020-08-17) + */ +(function (domGlobals) { + 'use strict'; + + var global = tinymce.util.Tools.resolve('tinymce.PluginManager'); + + var fireInsertCustomChar = function (editor, chr) { + return editor.fire('insertCustomChar', { chr: chr }); + }; + + var insertChar = function (editor, chr) { + var evtChr = fireInsertCustomChar(editor, chr).chr; + editor.execCommand('mceInsertContent', false, evtChr); + }; + + var global$1 = tinymce.util.Tools.resolve('tinymce.util.Tools'); + + var getCharMap = function (editor) { + return editor.getParam('charmap'); + }; + var getCharMapAppend = function (editor) { + return editor.getParam('charmap_append'); + }; + + var noop = function () { + }; + var constant = function (value) { + return function () { + return value; + }; + }; + var never = constant(false); + var always = constant(true); + + var none = function () { + return NONE; + }; + var NONE = function () { + var eq = function (o) { + return o.isNone(); + }; + var call = function (thunk) { + return thunk(); + }; + var id = function (n) { + return n; + }; + var me = { + fold: function (n, _s) { + return n(); + }, + is: never, + isSome: never, + isNone: always, + getOr: id, + getOrThunk: call, + getOrDie: function (msg) { + throw new Error(msg || 'error: getOrDie called on none.'); + }, + getOrNull: constant(null), + getOrUndefined: constant(undefined), + or: id, + orThunk: call, + map: none, + each: noop, + bind: none, + exists: never, + forall: always, + filter: none, + equals: eq, + equals_: eq, + toArray: function () { + return []; + }, + toString: constant('none()') + }; + return me; + }(); + var some = function (a) { + var constant_a = constant(a); + var self = function () { + return me; + }; + var bind = function (f) { + return f(a); + }; + var me = { + fold: function (n, s) { + return s(a); + }, + is: function (v) { + return a === v; + }, + isSome: always, + isNone: never, + getOr: constant_a, + getOrThunk: constant_a, + getOrDie: constant_a, + getOrNull: constant_a, + getOrUndefined: constant_a, + or: self, + orThunk: self, + map: function (f) { + return some(f(a)); + }, + each: function (f) { + f(a); + }, + bind: bind, + exists: bind, + forall: bind, + filter: function (f) { + return f(a) ? me : NONE; + }, + toArray: function () { + return [a]; + }, + toString: function () { + return 'some(' + a + ')'; + }, + equals: function (o) { + return o.is(a); + }, + equals_: function (o, elementEq) { + return o.fold(never, function (b) { + return elementEq(a, b); + }); + } + }; + return me; + }; + var from = function (value) { + return value === null || value === undefined ? NONE : some(value); + }; + var Option = { + some: some, + none: none, + from: from + }; + + var typeOf = function (x) { + var t = typeof x; + if (x === null) { + return 'null'; + } else if (t === 'object' && (Array.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'Array')) { + return 'array'; + } else if (t === 'object' && (String.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'String')) { + return 'string'; + } else { + return t; + } + }; + var isType = function (type) { + return function (value) { + return typeOf(value) === type; + }; + }; + var isArray = isType('array'); + + var nativePush = Array.prototype.push; + var map = function (xs, f) { + var len = xs.length; + var r = new Array(len); + for (var i = 0; i < len; i++) { + var x = xs[i]; + r[i] = f(x, i); + } + return r; + }; + var each = function (xs, f) { + for (var i = 0, len = xs.length; i < len; i++) { + var x = xs[i]; + f(x, i); + } + }; + var findUntil = function (xs, pred, until) { + for (var i = 0, len = xs.length; i < len; i++) { + var x = xs[i]; + if (pred(x, i)) { + return Option.some(x); + } else if (until(x, i)) { + break; + } + } + return Option.none(); + }; + var find = function (xs, pred) { + return findUntil(xs, pred, never); + }; + var flatten = function (xs) { + var r = []; + for (var i = 0, len = xs.length; i < len; ++i) { + if (!isArray(xs[i])) { + throw new Error('Arr.flatten item ' + i + ' was not an array, input: ' + xs); + } + nativePush.apply(r, xs[i]); + } + return r; + }; + var bind = function (xs, f) { + return flatten(map(xs, f)); + }; + + var isArray$1 = global$1.isArray; + var UserDefined = 'User Defined'; + var getDefaultCharMap = function () { + return [ + { + name: 'Currency', + characters: [ + [ + 36, + 'dollar sign' + ], + [ + 162, + 'cent sign' + ], + [ + 8364, + 'euro sign' + ], + [ + 163, + 'pound sign' + ], + [ + 165, + 'yen sign' + ], + [ + 164, + 'currency sign' + ], + [ + 8352, + 'euro-currency sign' + ], + [ + 8353, + 'colon sign' + ], + [ + 8354, + 'cruzeiro sign' + ], + [ + 8355, + 'french franc sign' + ], + [ + 8356, + 'lira sign' + ], + [ + 8357, + 'mill sign' + ], + [ + 8358, + 'naira sign' + ], + [ + 8359, + 'peseta sign' + ], + [ + 8360, + 'rupee sign' + ], + [ + 8361, + 'won sign' + ], + [ + 8362, + 'new sheqel sign' + ], + [ + 8363, + 'dong sign' + ], + [ + 8365, + 'kip sign' + ], + [ + 8366, + 'tugrik sign' + ], + [ + 8367, + 'drachma sign' + ], + [ + 8368, + 'german penny symbol' + ], + [ + 8369, + 'peso sign' + ], + [ + 8370, + 'guarani sign' + ], + [ + 8371, + 'austral sign' + ], + [ + 8372, + 'hryvnia sign' + ], + [ + 8373, + 'cedi sign' + ], + [ + 8374, + 'livre tournois sign' + ], + [ + 8375, + 'spesmilo sign' + ], + [ + 8376, + 'tenge sign' + ], + [ + 8377, + 'indian rupee sign' + ], + [ + 8378, + 'turkish lira sign' + ], + [ + 8379, + 'nordic mark sign' + ], + [ + 8380, + 'manat sign' + ], + [ + 8381, + 'ruble sign' + ], + [ + 20870, + 'yen character' + ], + [ + 20803, + 'yuan character' + ], + [ + 22291, + 'yuan character, in hong kong and taiwan' + ], + [ + 22278, + 'yen/yuan character variant one' + ] + ] + }, + { + name: 'Text', + characters: [ + [ + 169, + 'copyright sign' + ], + [ + 174, + 'registered sign' + ], + [ + 8482, + 'trade mark sign' + ], + [ + 8240, + 'per mille sign' + ], + [ + 181, + 'micro sign' + ], + [ + 183, + 'middle dot' + ], + [ + 8226, + 'bullet' + ], + [ + 8230, + 'three dot leader' + ], + [ + 8242, + 'minutes / feet' + ], + [ + 8243, + 'seconds / inches' + ], + [ + 167, + 'section sign' + ], + [ + 182, + 'paragraph sign' + ], + [ + 223, + 'sharp s / ess-zed' + ] + ] + }, + { + name: 'Quotations', + characters: [ + [ + 8249, + 'single left-pointing angle quotation mark' + ], + [ + 8250, + 'single right-pointing angle quotation mark' + ], + [ + 171, + 'left pointing guillemet' + ], + [ + 187, + 'right pointing guillemet' + ], + [ + 8216, + 'left single quotation mark' + ], + [ + 8217, + 'right single quotation mark' + ], + [ + 8220, + 'left double quotation mark' + ], + [ + 8221, + 'right double quotation mark' + ], + [ + 8218, + 'single low-9 quotation mark' + ], + [ + 8222, + 'double low-9 quotation mark' + ], + [ + 60, + 'less-than sign' + ], + [ + 62, + 'greater-than sign' + ], + [ + 8804, + 'less-than or equal to' + ], + [ + 8805, + 'greater-than or equal to' + ], + [ + 8211, + 'en dash' + ], + [ + 8212, + 'em dash' + ], + [ + 175, + 'macron' + ], + [ + 8254, + 'overline' + ], + [ + 164, + 'currency sign' + ], + [ + 166, + 'broken bar' + ], + [ + 168, + 'diaeresis' + ], + [ + 161, + 'inverted exclamation mark' + ], + [ + 191, + 'turned question mark' + ], + [ + 710, + 'circumflex accent' + ], + [ + 732, + 'small tilde' + ], + [ + 176, + 'degree sign' + ], + [ + 8722, + 'minus sign' + ], + [ + 177, + 'plus-minus sign' + ], + [ + 247, + 'division sign' + ], + [ + 8260, + 'fraction slash' + ], + [ + 215, + 'multiplication sign' + ], + [ + 185, + 'superscript one' + ], + [ + 178, + 'superscript two' + ], + [ + 179, + 'superscript three' + ], + [ + 188, + 'fraction one quarter' + ], + [ + 189, + 'fraction one half' + ], + [ + 190, + 'fraction three quarters' + ] + ] + }, + { + name: 'Mathematical', + characters: [ + [ + 402, + 'function / florin' + ], + [ + 8747, + 'integral' + ], + [ + 8721, + 'n-ary sumation' + ], + [ + 8734, + 'infinity' + ], + [ + 8730, + 'square root' + ], + [ + 8764, + 'similar to' + ], + [ + 8773, + 'approximately equal to' + ], + [ + 8776, + 'almost equal to' + ], + [ + 8800, + 'not equal to' + ], + [ + 8801, + 'identical to' + ], + [ + 8712, + 'element of' + ], + [ + 8713, + 'not an element of' + ], + [ + 8715, + 'contains as member' + ], + [ + 8719, + 'n-ary product' + ], + [ + 8743, + 'logical and' + ], + [ + 8744, + 'logical or' + ], + [ + 172, + 'not sign' + ], + [ + 8745, + 'intersection' + ], + [ + 8746, + 'union' + ], + [ + 8706, + 'partial differential' + ], + [ + 8704, + 'for all' + ], + [ + 8707, + 'there exists' + ], + [ + 8709, + 'diameter' + ], + [ + 8711, + 'backward difference' + ], + [ + 8727, + 'asterisk operator' + ], + [ + 8733, + 'proportional to' + ], + [ + 8736, + 'angle' + ] + ] + }, + { + name: 'Extended Latin', + characters: [ + [ + 192, + 'A - grave' + ], + [ + 193, + 'A - acute' + ], + [ + 194, + 'A - circumflex' + ], + [ + 195, + 'A - tilde' + ], + [ + 196, + 'A - diaeresis' + ], + [ + 197, + 'A - ring above' + ], + [ + 256, + 'A - macron' + ], + [ + 198, + 'ligature AE' + ], + [ + 199, + 'C - cedilla' + ], + [ + 200, + 'E - grave' + ], + [ + 201, + 'E - acute' + ], + [ + 202, + 'E - circumflex' + ], + [ + 203, + 'E - diaeresis' + ], + [ + 274, + 'E - macron' + ], + [ + 204, + 'I - grave' + ], + [ + 205, + 'I - acute' + ], + [ + 206, + 'I - circumflex' + ], + [ + 207, + 'I - diaeresis' + ], + [ + 298, + 'I - macron' + ], + [ + 208, + 'ETH' + ], + [ + 209, + 'N - tilde' + ], + [ + 210, + 'O - grave' + ], + [ + 211, + 'O - acute' + ], + [ + 212, + 'O - circumflex' + ], + [ + 213, + 'O - tilde' + ], + [ + 214, + 'O - diaeresis' + ], + [ + 216, + 'O - slash' + ], + [ + 332, + 'O - macron' + ], + [ + 338, + 'ligature OE' + ], + [ + 352, + 'S - caron' + ], + [ + 217, + 'U - grave' + ], + [ + 218, + 'U - acute' + ], + [ + 219, + 'U - circumflex' + ], + [ + 220, + 'U - diaeresis' + ], + [ + 362, + 'U - macron' + ], + [ + 221, + 'Y - acute' + ], + [ + 376, + 'Y - diaeresis' + ], + [ + 562, + 'Y - macron' + ], + [ + 222, + 'THORN' + ], + [ + 224, + 'a - grave' + ], + [ + 225, + 'a - acute' + ], + [ + 226, + 'a - circumflex' + ], + [ + 227, + 'a - tilde' + ], + [ + 228, + 'a - diaeresis' + ], + [ + 229, + 'a - ring above' + ], + [ + 257, + 'a - macron' + ], + [ + 230, + 'ligature ae' + ], + [ + 231, + 'c - cedilla' + ], + [ + 232, + 'e - grave' + ], + [ + 233, + 'e - acute' + ], + [ + 234, + 'e - circumflex' + ], + [ + 235, + 'e - diaeresis' + ], + [ + 275, + 'e - macron' + ], + [ + 236, + 'i - grave' + ], + [ + 237, + 'i - acute' + ], + [ + 238, + 'i - circumflex' + ], + [ + 239, + 'i - diaeresis' + ], + [ + 299, + 'i - macron' + ], + [ + 240, + 'eth' + ], + [ + 241, + 'n - tilde' + ], + [ + 242, + 'o - grave' + ], + [ + 243, + 'o - acute' + ], + [ + 244, + 'o - circumflex' + ], + [ + 245, + 'o - tilde' + ], + [ + 246, + 'o - diaeresis' + ], + [ + 248, + 'o slash' + ], + [ + 333, + 'o macron' + ], + [ + 339, + 'ligature oe' + ], + [ + 353, + 's - caron' + ], + [ + 249, + 'u - grave' + ], + [ + 250, + 'u - acute' + ], + [ + 251, + 'u - circumflex' + ], + [ + 252, + 'u - diaeresis' + ], + [ + 363, + 'u - macron' + ], + [ + 253, + 'y - acute' + ], + [ + 254, + 'thorn' + ], + [ + 255, + 'y - diaeresis' + ], + [ + 563, + 'y - macron' + ], + [ + 913, + 'Alpha' + ], + [ + 914, + 'Beta' + ], + [ + 915, + 'Gamma' + ], + [ + 916, + 'Delta' + ], + [ + 917, + 'Epsilon' + ], + [ + 918, + 'Zeta' + ], + [ + 919, + 'Eta' + ], + [ + 920, + 'Theta' + ], + [ + 921, + 'Iota' + ], + [ + 922, + 'Kappa' + ], + [ + 923, + 'Lambda' + ], + [ + 924, + 'Mu' + ], + [ + 925, + 'Nu' + ], + [ + 926, + 'Xi' + ], + [ + 927, + 'Omicron' + ], + [ + 928, + 'Pi' + ], + [ + 929, + 'Rho' + ], + [ + 931, + 'Sigma' + ], + [ + 932, + 'Tau' + ], + [ + 933, + 'Upsilon' + ], + [ + 934, + 'Phi' + ], + [ + 935, + 'Chi' + ], + [ + 936, + 'Psi' + ], + [ + 937, + 'Omega' + ], + [ + 945, + 'alpha' + ], + [ + 946, + 'beta' + ], + [ + 947, + 'gamma' + ], + [ + 948, + 'delta' + ], + [ + 949, + 'epsilon' + ], + [ + 950, + 'zeta' + ], + [ + 951, + 'eta' + ], + [ + 952, + 'theta' + ], + [ + 953, + 'iota' + ], + [ + 954, + 'kappa' + ], + [ + 955, + 'lambda' + ], + [ + 956, + 'mu' + ], + [ + 957, + 'nu' + ], + [ + 958, + 'xi' + ], + [ + 959, + 'omicron' + ], + [ + 960, + 'pi' + ], + [ + 961, + 'rho' + ], + [ + 962, + 'final sigma' + ], + [ + 963, + 'sigma' + ], + [ + 964, + 'tau' + ], + [ + 965, + 'upsilon' + ], + [ + 966, + 'phi' + ], + [ + 967, + 'chi' + ], + [ + 968, + 'psi' + ], + [ + 969, + 'omega' + ] + ] + }, + { + name: 'Symbols', + characters: [ + [ + 8501, + 'alef symbol' + ], + [ + 982, + 'pi symbol' + ], + [ + 8476, + 'real part symbol' + ], + [ + 978, + 'upsilon - hook symbol' + ], + [ + 8472, + 'Weierstrass p' + ], + [ + 8465, + 'imaginary part' + ] + ] + }, + { + name: 'Arrows', + characters: [ + [ + 8592, + 'leftwards arrow' + ], + [ + 8593, + 'upwards arrow' + ], + [ + 8594, + 'rightwards arrow' + ], + [ + 8595, + 'downwards arrow' + ], + [ + 8596, + 'left right arrow' + ], + [ + 8629, + 'carriage return' + ], + [ + 8656, + 'leftwards double arrow' + ], + [ + 8657, + 'upwards double arrow' + ], + [ + 8658, + 'rightwards double arrow' + ], + [ + 8659, + 'downwards double arrow' + ], + [ + 8660, + 'left right double arrow' + ], + [ + 8756, + 'therefore' + ], + [ + 8834, + 'subset of' + ], + [ + 8835, + 'superset of' + ], + [ + 8836, + 'not a subset of' + ], + [ + 8838, + 'subset of or equal to' + ], + [ + 8839, + 'superset of or equal to' + ], + [ + 8853, + 'circled plus' + ], + [ + 8855, + 'circled times' + ], + [ + 8869, + 'perpendicular' + ], + [ + 8901, + 'dot operator' + ], + [ + 8968, + 'left ceiling' + ], + [ + 8969, + 'right ceiling' + ], + [ + 8970, + 'left floor' + ], + [ + 8971, + 'right floor' + ], + [ + 9001, + 'left-pointing angle bracket' + ], + [ + 9002, + 'right-pointing angle bracket' + ], + [ + 9674, + 'lozenge' + ], + [ + 9824, + 'black spade suit' + ], + [ + 9827, + 'black club suit' + ], + [ + 9829, + 'black heart suit' + ], + [ + 9830, + 'black diamond suit' + ], + [ + 8194, + 'en space' + ], + [ + 8195, + 'em space' + ], + [ + 8201, + 'thin space' + ], + [ + 8204, + 'zero width non-joiner' + ], + [ + 8205, + 'zero width joiner' + ], + [ + 8206, + 'left-to-right mark' + ], + [ + 8207, + 'right-to-left mark' + ] + ] + } + ]; + }; + var charmapFilter = function (charmap) { + return global$1.grep(charmap, function (item) { + return isArray$1(item) && item.length === 2; + }); + }; + var getCharsFromSetting = function (settingValue) { + if (isArray$1(settingValue)) { + return [].concat(charmapFilter(settingValue)); + } + if (typeof settingValue === 'function') { + return settingValue(); + } + return []; + }; + var extendCharMap = function (editor, charmap) { + var userCharMap = getCharMap(editor); + if (userCharMap) { + charmap = [{ + name: UserDefined, + characters: getCharsFromSetting(userCharMap) + }]; + } + var userCharMapAppend = getCharMapAppend(editor); + if (userCharMapAppend) { + var userDefinedGroup = global$1.grep(charmap, function (cg) { + return cg.name === UserDefined; + }); + if (userDefinedGroup.length) { + userDefinedGroup[0].characters = [].concat(userDefinedGroup[0].characters).concat(getCharsFromSetting(userCharMapAppend)); + return charmap; + } + return [].concat(charmap).concat({ + name: UserDefined, + characters: getCharsFromSetting(userCharMapAppend) + }); + } + return charmap; + }; + var getCharMap$1 = function (editor) { + var groups = extendCharMap(editor, getDefaultCharMap()); + return groups.length > 1 ? [{ + name: 'All', + characters: bind(groups, function (g) { + return g.characters; + }) + }].concat(groups) : groups; + }; + + var get = function (editor) { + var getCharMap = function () { + return getCharMap$1(editor); + }; + var insertChar$1 = function (chr) { + insertChar(editor, chr); + }; + return { + getCharMap: getCharMap, + insertChar: insertChar$1 + }; + }; + + var Cell = function (initial) { + var value = initial; + var get = function () { + return value; + }; + var set = function (v) { + value = v; + }; + return { + get: get, + set: set + }; + }; + + var last = function (fn, rate) { + var timer = null; + var cancel = function () { + if (timer !== null) { + domGlobals.clearTimeout(timer); + timer = null; + } + }; + var throttle = function () { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + if (timer !== null) { + domGlobals.clearTimeout(timer); + } + timer = domGlobals.setTimeout(function () { + fn.apply(null, args); + timer = null; + }, rate); + }; + return { + cancel: cancel, + throttle: throttle + }; + }; + + var nativeFromCodePoint = String.fromCodePoint; + var contains = function (str, substr) { + return str.indexOf(substr) !== -1; + }; + var fromCodePoint = function () { + var codePoints = []; + for (var _i = 0; _i < arguments.length; _i++) { + codePoints[_i] = arguments[_i]; + } + if (nativeFromCodePoint) { + return nativeFromCodePoint.apply(void 0, codePoints); + } else { + var codeUnits = []; + var codeLen = 0; + var result = ''; + for (var index = 0, len = codePoints.length; index !== len; ++index) { + var codePoint = +codePoints[index]; + if (!(codePoint < 1114111 && codePoint >>> 0 === codePoint)) { + throw RangeError('Invalid code point: ' + codePoint); + } + if (codePoint <= 65535) { + codeLen = codeUnits.push(codePoint); + } else { + codePoint -= 65536; + codeLen = codeUnits.push((codePoint >> 10) + 55296, codePoint % 1024 + 56320); + } + if (codeLen >= 16383) { + result += String.fromCharCode.apply(null, codeUnits); + codeUnits.length = 0; + } + } + return result + String.fromCharCode.apply(null, codeUnits); + } + }; + + var charMatches = function (charCode, name, lowerCasePattern) { + if (contains(fromCodePoint(charCode).toLowerCase(), lowerCasePattern)) { + return true; + } else { + return contains(name.toLowerCase(), lowerCasePattern) || contains(name.toLowerCase().replace(/\s+/g, ''), lowerCasePattern); + } + }; + var scan = function (group, pattern) { + var matches = []; + var lowerCasePattern = pattern.toLowerCase(); + each(group.characters, function (g) { + if (charMatches(g[0], g[1], lowerCasePattern)) { + matches.push(g); + } + }); + return map(matches, function (m) { + return { + text: m[1], + value: fromCodePoint(m[0]), + icon: fromCodePoint(m[0]) + }; + }); + }; + + var patternName = 'pattern'; + var open = function (editor, charMap) { + var makeGroupItems = function () { + return [ + { + label: 'Search', + type: 'input', + name: patternName + }, + { + type: 'collection', + name: 'results' + } + ]; + }; + var makeTabs = function () { + return map(charMap, function (charGroup) { + return { + title: charGroup.name, + name: charGroup.name, + items: makeGroupItems() + }; + }); + }; + var makePanel = function () { + return { + type: 'panel', + items: makeGroupItems() + }; + }; + var makeTabPanel = function () { + return { + type: 'tabpanel', + tabs: makeTabs() + }; + }; + var currentTab = charMap.length === 1 ? Cell(UserDefined) : Cell('All'); + var scanAndSet = function (dialogApi, pattern) { + find(charMap, function (group) { + return group.name === currentTab.get(); + }).each(function (f) { + var items = scan(f, pattern); + dialogApi.setData({ results: items }); + }); + }; + var SEARCH_DELAY = 40; + var updateFilter = last(function (dialogApi) { + var pattern = dialogApi.getData().pattern; + scanAndSet(dialogApi, pattern); + }, SEARCH_DELAY); + var body = charMap.length === 1 ? makePanel() : makeTabPanel(); + var initialData = { + pattern: '', + results: scan(charMap[0], '') + }; + var bridgeSpec = { + title: 'Special Character', + size: 'normal', + body: body, + buttons: [{ + type: 'cancel', + name: 'close', + text: 'Close', + primary: true + }], + initialData: initialData, + onAction: function (api, details) { + if (details.name === 'results') { + insertChar(editor, details.value); + api.close(); + } + }, + onTabChange: function (dialogApi, details) { + currentTab.set(details.newTabName); + updateFilter.throttle(dialogApi); + }, + onChange: function (dialogApi, changeData) { + if (changeData.name === patternName) { + updateFilter.throttle(dialogApi); + } + } + }; + var dialogApi = editor.windowManager.open(bridgeSpec); + dialogApi.focus(patternName); + }; + + var register = function (editor, charMap) { + editor.addCommand('mceShowCharmap', function () { + open(editor, charMap); + }); + }; + + var global$2 = tinymce.util.Tools.resolve('tinymce.util.Promise'); + + var init = function (editor, all) { + editor.ui.registry.addAutocompleter('charmap', { + ch: ':', + columns: 'auto', + minChars: 2, + fetch: function (pattern, _maxResults) { + return new global$2(function (resolve, _reject) { + resolve(scan(all, pattern)); + }); + }, + onAction: function (autocompleteApi, rng, value) { + editor.selection.setRng(rng); + editor.insertContent(value); + autocompleteApi.hide(); + } + }); + }; + + var register$1 = function (editor) { + editor.ui.registry.addButton('charmap', { + icon: 'insert-character', + tooltip: 'Special character', + onAction: function () { + return editor.execCommand('mceShowCharmap'); + } + }); + editor.ui.registry.addMenuItem('charmap', { + icon: 'insert-character', + text: 'Special character...', + onAction: function () { + return editor.execCommand('mceShowCharmap'); + } + }); + }; + + function Plugin () { + global.add('charmap', function (editor) { + var charMap = getCharMap$1(editor); + register(editor, charMap); + register$1(editor); + init(editor, charMap[0]); + return get(editor); + }); + } + + Plugin(); + +}(window)); diff --git a/src/main/resources/static/layui-ext/tinymce/tinymce/plugins/charmap/plugin.min.js b/src/main/resources/static/layui-ext/tinymce/tinymce/plugins/charmap/plugin.min.js new file mode 100644 index 0000000..18137aa --- /dev/null +++ b/src/main/resources/static/layui-ext/tinymce/tinymce/plugins/charmap/plugin.min.js @@ -0,0 +1,9 @@ +/** + * 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/ + * + * Version: 5.4.2 (2020-08-17) + */ +!function(s){"use strict";var e,n,r,t,a=tinymce.util.Tools.resolve("tinymce.PluginManager"),l=function(e,n){var r,t=(r=n,e.fire("insertCustomChar",{chr:r}).chr);e.execCommand("mceInsertContent",!1,t)},i=tinymce.util.Tools.resolve("tinymce.util.Tools"),o=function(e){return function(){return e}},c=o(!1),u=o(!0),g=function(){return m},m=(e=function(e){return e.isNone()},{fold:function(e,n){return e()},is:c,isSome:c,isNone:u,getOr:r=function(e){return e},getOrThunk:n=function(e){return e()},getOrDie:function(e){throw new Error(e||"error: getOrDie called on none.")},getOrNull:o(null),getOrUndefined:o(undefined),or:r,orThunk:n,map:g,each:function(){},bind:g,exists:c,forall:u,filter:g,equals:e,equals_:e,toArray:function(){return[]},toString:o("none()")}),f=function(r){var e=o(r),n=function(){return a},t=function(e){return e(r)},a={fold:function(e,n){return n(r)},is:function(e){return r===e},isSome:u,isNone:c,getOr:e,getOrThunk:e,getOrDie:e,getOrNull:e,getOrUndefined:e,or:n,orThunk:n,map:function(e){return f(e(r))},each:function(e){e(r)},bind:t,exists:t,forall:t,filter:function(e){return e(r)?a:m},toArray:function(){return[r]},toString:function(){return"some("+r+")"},equals:function(e){return e.is(r)},equals_:function(e,n){return e.fold(c,function(e){return n(r,e)})}};return a},h={some:f,none:g,from:function(e){return null===e||e===undefined?m:f(e)}},d=(t="array",function(e){return r=typeof(n=e),(null===n?"null":"object"==r&&(Array.prototype.isPrototypeOf(n)||n.constructor&&"Array"===n.constructor.name)?"array":"object"==r&&(String.prototype.isPrototypeOf(n)||n.constructor&&"String"===n.constructor.name)?"string":r)===t;var n,r}),p=Array.prototype.push,y=function(e,n){for(var r=e.length,t=new Array(r),a=0;a>>0===o))throw RangeError("Invalid code point: "+o);16383<=(o<=65535?r.push(o):(o-=65536,r.push(55296+(o>>10),o%1024+56320)))&&(t+=String.fromCharCode.apply(null,r),r.length=0)}return t+String.fromCharCode.apply(null,r)},T=function(e,n){var a=[],i=n.toLowerCase();return function(e,n){for(var r=0,t=e.length;r>=?|<<=?|->|([-+&|:])\1|[?:~]|[-+*/%&|^!=<>]=?/, + 'number': /(?:\b0x(?:[\da-f]+\.?[\da-f]*|\.[\da-f]+)(?:p[+-]?\d+)?|(?:\b\d+\.?\d*|\B\.\d+)(?:e[+-]?\d+)?)[ful]*/i + }); + Prism.languages.insertBefore('c', 'string', { + 'macro': { + pattern: /(^\s*)#\s*[a-z]+(?:[^\r\n\\]|\\(?:\r\n|[\s\S]))*/im, + lookbehind: true, + alias: 'property', + inside: { + 'string': { + pattern: /(#\s*include\s*)(?:<.+?>|("|')(?:\\?.)+?\2)/, + lookbehind: true + }, + 'directive': { + pattern: /(#\s*)\b(?:define|defined|elif|else|endif|error|ifdef|ifndef|if|import|include|line|pragma|undef|using)\b/, + lookbehind: true, + alias: 'keyword' + } + } + }, + 'constant': /\b(?:__FILE__|__LINE__|__DATE__|__TIME__|__TIMESTAMP__|__func__|EOF|NULL|SEEK_CUR|SEEK_END|SEEK_SET|stdin|stdout|stderr)\b/ + }); + delete Prism.languages.c['boolean']; + }, + {} + ], + 2: [ + function (require, module, exports) { + Prism.languages.clike = { + 'comment': [ + { + pattern: /(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/, + lookbehind: true + }, + { + pattern: /(^|[^\\:])\/\/.*/, + lookbehind: true, + greedy: true + } + ], + 'string': { + pattern: /(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/, + greedy: true + }, + 'class-name': { + pattern: /(\b(?:class|interface|extends|implements|trait|instanceof|new)\s+|\bcatch\s+\()[\w.\\]+/i, + lookbehind: true, + inside: { 'punctuation': /[.\\]/ } + }, + 'keyword': /\b(?:if|else|while|do|for|return|in|instanceof|function|new|try|throw|catch|finally|null|break|continue)\b/, + 'boolean': /\b(?:true|false)\b/, + 'function': /\w+(?=\()/, + 'number': /\b0x[\da-f]+\b|(?:\b\d+\.?\d*|\B\.\d+)(?:e[+-]?\d+)?/i, + 'operator': /[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/, + 'punctuation': /[{}[\];(),.:]/ + }; + }, + {} + ], + 3: [ + function (require, module, exports) { + (function (global) { + var _self = typeof window !== 'undefined' ? window : typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope ? self : {}; + var Prism = function (_self) { + var lang = /\blang(?:uage)?-([\w-]+)\b/i; + var uniqueId = 0; + var _ = { + manual: _self.Prism && _self.Prism.manual, + disableWorkerMessageHandler: _self.Prism && _self.Prism.disableWorkerMessageHandler, + util: { + encode: function (tokens) { + if (tokens instanceof Token) { + return new Token(tokens.type, _.util.encode(tokens.content), tokens.alias); + } else if (Array.isArray(tokens)) { + return tokens.map(_.util.encode); + } else { + return tokens.replace(/&/g, '&').replace(/ text.length) { + return; + } + if (str instanceof Token) { + continue; + } + if (greedy && i != strarr.length - 1) { + pattern.lastIndex = pos; + var match = pattern.exec(text); + if (!match) { + break; + } + var from = match.index + (lookbehind && match[1] ? match[1].length : 0), to = match.index + match[0].length, k = i, p = pos; + for (var len = strarr.length; k < len && (p < to || !strarr[k].type && !strarr[k - 1].greedy); ++k) { + p += strarr[k].length; + if (from >= p) { + ++i; + pos = p; + } + } + if (strarr[i] instanceof Token) { + continue; + } + delNum = k - i; + str = text.slice(pos, p); + match.index -= pos; + } else { + pattern.lastIndex = 0; + var match = pattern.exec(str), delNum = 1; + } + if (!match) { + if (oneshot) { + break; + } + continue; + } + if (lookbehind) { + lookbehindLength = match[1] ? match[1].length : 0; + } + var from = match.index + lookbehindLength, match = match[0].slice(lookbehindLength), to = from + match.length, before = str.slice(0, from), after = str.slice(to); + var args = [ + i, + delNum + ]; + if (before) { + ++i; + pos += before.length; + args.push(before); + } + var wrapped = new Token(token, inside ? _.tokenize(match, inside) : match, alias, match, greedy); + args.push(wrapped); + if (after) { + args.push(after); + } + Array.prototype.splice.apply(strarr, args); + if (delNum != 1) + _.matchGrammar(text, strarr, grammar, i, pos, true, token + ',' + j); + if (oneshot) + break; + } + } + } + }, + tokenize: function (text, grammar) { + var strarr = [text]; + var rest = grammar.rest; + if (rest) { + for (var token in rest) { + grammar[token] = rest[token]; + } + delete grammar.rest; + } + _.matchGrammar(text, strarr, grammar, 0, 0, false); + return strarr; + }, + hooks: { + all: {}, + add: function (name, callback) { + var hooks = _.hooks.all; + hooks[name] = hooks[name] || []; + hooks[name].push(callback); + }, + run: function (name, env) { + var callbacks = _.hooks.all[name]; + if (!callbacks || !callbacks.length) { + return; + } + for (var i = 0, callback; callback = callbacks[i++];) { + callback(env); + } + } + }, + Token: Token + }; + _self.Prism = _; + function Token(type, content, alias, matchedStr, greedy) { + this.type = type; + this.content = content; + this.alias = alias; + this.length = (matchedStr || '').length | 0; + this.greedy = !!greedy; + } + Token.stringify = function (o, language) { + if (typeof o == 'string') { + return o; + } + if (Array.isArray(o)) { + return o.map(function (element) { + return Token.stringify(element, language); + }).join(''); + } + var env = { + type: o.type, + content: Token.stringify(o.content, language), + tag: 'span', + classes: [ + 'token', + o.type + ], + attributes: {}, + language: language + }; + if (o.alias) { + var aliases = Array.isArray(o.alias) ? o.alias : [o.alias]; + Array.prototype.push.apply(env.classes, aliases); + } + _.hooks.run('wrap', env); + var attributes = Object.keys(env.attributes).map(function (name) { + return name + '="' + (env.attributes[name] || '').replace(/"/g, '"') + '"'; + }).join(' '); + return '<' + env.tag + ' class="' + env.classes.join(' ') + '"' + (attributes ? ' ' + attributes : '') + '>' + env.content + ''; + }; + if (!_self.document) { + if (!_self.addEventListener) { + return _; + } + if (!_.disableWorkerMessageHandler) { + _self.addEventListener('message', function (evt) { + var message = JSON.parse(evt.data), lang = message.language, code = message.code, immediateClose = message.immediateClose; + _self.postMessage(_.highlight(code, _.languages[lang], lang)); + if (immediateClose) { + _self.close(); + } + }, false); + } + return _; + } + var script = _.util.currentScript(); + if (script) { + _.filename = script.src; + if (script.hasAttribute('data-manual')) { + _.manual = true; + } + } + if (!_.manual) { + var highlightAutomaticallyCallback = function () { + if (!_.manual) { + _.highlightAll(); + } + }; + var readyState = document.readyState; + if (readyState === 'loading' || readyState === 'interactive' && script && script.defer) { + document.addEventListener('DOMContentLoaded', highlightAutomaticallyCallback); + } else { + if (window.requestAnimationFrame) { + window.requestAnimationFrame(highlightAutomaticallyCallback); + } else { + window.setTimeout(highlightAutomaticallyCallback, 16); + } + } + } + return _; + }(_self); + if (typeof module !== 'undefined' && module.exports) { + module.exports = Prism; + } + if (typeof global !== 'undefined') { + global.Prism = Prism; + } + }.call(this, typeof global$2 !== 'undefined' ? global$2 : typeof self !== 'undefined' ? self : typeof window !== 'undefined' ? window : {})); + }, + {} + ], + 4: [ + function (require, module, exports) { + Prism.languages.cpp = Prism.languages.extend('c', { + 'class-name': { + pattern: /(\b(?:class|enum|struct)\s+)\w+/, + lookbehind: true + }, + 'keyword': /\b(?:alignas|alignof|asm|auto|bool|break|case|catch|char|char16_t|char32_t|class|compl|const|constexpr|const_cast|continue|decltype|default|delete|do|double|dynamic_cast|else|enum|explicit|export|extern|float|for|friend|goto|if|inline|int|int8_t|int16_t|int32_t|int64_t|uint8_t|uint16_t|uint32_t|uint64_t|long|mutable|namespace|new|noexcept|nullptr|operator|private|protected|public|register|reinterpret_cast|return|short|signed|sizeof|static|static_assert|static_cast|struct|switch|template|this|thread_local|throw|try|typedef|typeid|typename|union|unsigned|using|virtual|void|volatile|wchar_t|while)\b/, + 'number': { + pattern: /(?:\b0b[01']+|\b0x(?:[\da-f']+\.?[\da-f']*|\.[\da-f']+)(?:p[+-]?[\d']+)?|(?:\b[\d']+\.?[\d']*|\B\.[\d']+)(?:e[+-]?[\d']+)?)[ful]*/i, + greedy: true + }, + 'operator': />>=?|<<=?|->|([-+&|:])\1|[?:~]|[-+*/%&|^!=<>]=?|\b(?:and|and_eq|bitand|bitor|not|not_eq|or|or_eq|xor|xor_eq)\b/, + 'boolean': /\b(?:true|false)\b/ + }); + Prism.languages.insertBefore('cpp', 'string', { + 'raw-string': { + pattern: /R"([^()\\ ]{0,16})\([\s\S]*?\)\1"/, + alias: 'string', + greedy: true + } + }); + }, + {} + ], + 5: [ + function (require, module, exports) { + Prism.languages.csharp = Prism.languages.extend('clike', { + 'keyword': /\b(?:abstract|add|alias|as|ascending|async|await|base|bool|break|byte|case|catch|char|checked|class|const|continue|decimal|default|delegate|descending|do|double|dynamic|else|enum|event|explicit|extern|false|finally|fixed|float|for|foreach|from|get|global|goto|group|if|implicit|in|int|interface|internal|into|is|join|let|lock|long|namespace|new|null|object|operator|orderby|out|override|params|partial|private|protected|public|readonly|ref|remove|return|sbyte|sealed|select|set|short|sizeof|stackalloc|static|string|struct|switch|this|throw|true|try|typeof|uint|ulong|unchecked|unsafe|ushort|using|value|var|virtual|void|volatile|where|while|yield)\b/, + 'string': [ + { + pattern: /@("|')(?:\1\1|\\[\s\S]|(?!\1)[^\\])*\1/, + greedy: true + }, + { + pattern: /("|')(?:\\.|(?!\1)[^\\\r\n])*?\1/, + greedy: true + } + ], + 'class-name': [ + { + pattern: /\b[A-Z]\w*(?:\.\w+)*\b(?=\s+\w+)/, + inside: { punctuation: /\./ } + }, + { + pattern: /(\[)[A-Z]\w*(?:\.\w+)*\b/, + lookbehind: true, + inside: { punctuation: /\./ } + }, + { + pattern: /(\b(?:class|interface)\s+[A-Z]\w*(?:\.\w+)*\s*:\s*)[A-Z]\w*(?:\.\w+)*\b/, + lookbehind: true, + inside: { punctuation: /\./ } + }, + { + pattern: /((?:\b(?:class|interface|new)\s+)|(?:catch\s+\())[A-Z]\w*(?:\.\w+)*\b/, + lookbehind: true, + inside: { punctuation: /\./ } + } + ], + 'number': /\b0x[\da-f]+\b|(?:\b\d+\.?\d*|\B\.\d+)f?/i, + 'operator': />>=?|<<=?|[-=]>|([-+&|?])\1|~|[-+*/%&|^!=<>]=?/, + 'punctuation': /\?\.?|::|[{}[\];(),.:]/ + }); + Prism.languages.insertBefore('csharp', 'class-name', { + 'generic-method': { + pattern: /\w+\s*<[^>\r\n]+?>\s*(?=\()/, + inside: { + function: /^\w+/, + 'class-name': { + pattern: /\b[A-Z]\w*(?:\.\w+)*\b/, + inside: { punctuation: /\./ } + }, + keyword: Prism.languages.csharp.keyword, + punctuation: /[<>(),.:]/ + } + }, + 'preprocessor': { + pattern: /(^\s*)#.*/m, + lookbehind: true, + alias: 'property', + inside: { + 'directive': { + pattern: /(\s*#)\b(?:define|elif|else|endif|endregion|error|if|line|pragma|region|undef|warning)\b/, + lookbehind: true, + alias: 'keyword' + } + } + } + }); + Prism.languages.dotnet = Prism.languages.cs = Prism.languages.csharp; + }, + {} + ], + 6: [ + function (require, module, exports) { + (function (Prism) { + var string = /("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/; + Prism.languages.css = { + 'comment': /\/\*[\s\S]*?\*\//, + 'atrule': { + pattern: /@[\w-]+[\s\S]*?(?:;|(?=\s*\{))/, + inside: { 'rule': /@[\w-]+/ } + }, + 'url': { + pattern: RegExp('url\\((?:' + string.source + '|[^\n\r()]*)\\)', 'i'), + inside: { + 'function': /^url/i, + 'punctuation': /^\(|\)$/ + } + }, + 'selector': RegExp('[^{}\\s](?:[^{};"\']|' + string.source + ')*?(?=\\s*\\{)'), + 'string': { + pattern: string, + greedy: true + }, + 'property': /[-_a-z\xA0-\uFFFF][-\w\xA0-\uFFFF]*(?=\s*:)/i, + 'important': /!important\b/i, + 'function': /[-a-z0-9]+(?=\()/i, + 'punctuation': /[(){};:,]/ + }; + Prism.languages.css['atrule'].inside.rest = Prism.languages.css; + var markup = Prism.languages.markup; + if (markup) { + markup.tag.addInlined('style', 'css'); + Prism.languages.insertBefore('inside', 'attr-value', { + 'style-attr': { + pattern: /\s*style=("|')(?:\\[\s\S]|(?!\1)[^\\])*\1/i, + inside: { + 'attr-name': { + pattern: /^\s*style/i, + inside: markup.tag.inside + }, + 'punctuation': /^\s*=\s*['"]|['"]\s*$/, + 'attr-value': { + pattern: /.+/i, + inside: Prism.languages.css + } + }, + alias: 'language-css' + } + }, markup.tag); + } + }(Prism)); + }, + {} + ], + 7: [ + function (require, module, exports) { + (function (Prism) { + var keywords = /\b(?:abstract|assert|boolean|break|byte|case|catch|char|class|const|continue|default|do|double|else|enum|exports|extends|final|finally|float|for|goto|if|implements|import|instanceof|int|interface|long|module|native|new|null|open|opens|package|private|protected|provides|public|requires|return|short|static|strictfp|super|switch|synchronized|this|throw|throws|to|transient|transitive|try|uses|var|void|volatile|while|with|yield)\b/; + var className = /\b[A-Z](?:\w*[a-z]\w*)?\b/; + Prism.languages.java = Prism.languages.extend('clike', { + 'class-name': [ + className, + /\b[A-Z]\w*(?=\s+\w+\s*[;,=())])/ + ], + 'keyword': keywords, + 'function': [ + Prism.languages.clike.function, + { + pattern: /(\:\:)[a-z_]\w*/, + lookbehind: true + } + ], + 'number': /\b0b[01][01_]*L?\b|\b0x[\da-f_]*\.?[\da-f_p+-]+\b|(?:\b\d[\d_]*\.?[\d_]*|\B\.\d[\d_]*)(?:e[+-]?\d[\d_]*)?[dfl]?/i, + 'operator': { + pattern: /(^|[^.])(?:<<=?|>>>?=?|->|--|\+\+|&&|\|\||::|[?:~]|[-+*/%&|^!=<>]=?)/m, + lookbehind: true + } + }); + Prism.languages.insertBefore('java', 'string', { + 'triple-quoted-string': { + pattern: /"""[ \t]*[\r\n](?:(?:"|"")?(?:\\.|[^"\\]))*"""/, + greedy: true, + alias: 'string' + } + }); + Prism.languages.insertBefore('java', 'class-name', { + 'annotation': { + alias: 'punctuation', + pattern: /(^|[^.])@\w+/, + lookbehind: true + }, + 'namespace': { + pattern: /(\b(?:exports|import(?:\s+static)?|module|open|opens|package|provides|requires|to|transitive|uses|with)\s+)[a-z]\w*(?:\.[a-z]\w*)+/, + lookbehind: true, + inside: { 'punctuation': /\./ } + }, + 'generics': { + pattern: /<(?:[\w\s,.&?]|<(?:[\w\s,.&?]|<(?:[\w\s,.&?]|<[\w\s,.&?]*>)*>)*>)*>/, + inside: { + 'class-name': className, + 'keyword': keywords, + 'punctuation': /[<>(),.:]/, + 'operator': /[?&|]/ + } + } + }); + }(Prism)); + }, + {} + ], + 8: [ + function (require, module, exports) { + Prism.languages.javascript = Prism.languages.extend('clike', { + 'class-name': [ + Prism.languages.clike['class-name'], + { + pattern: /(^|[^$\w\xA0-\uFFFF])[_$A-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\.(?:prototype|constructor))/, + lookbehind: true + } + ], + 'keyword': [ + { + pattern: /((?:^|})\s*)(?:catch|finally)\b/, + lookbehind: true + }, + { + pattern: /(^|[^.]|\.\.\.\s*)\b(?:as|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/, + lookbehind: true + } + ], + 'number': /\b(?:(?:0[xX](?:[\dA-Fa-f](?:_[\dA-Fa-f])?)+|0[bB](?:[01](?:_[01])?)+|0[oO](?:[0-7](?:_[0-7])?)+)n?|(?:\d(?:_\d)?)+n|NaN|Infinity)\b|(?:\b(?:\d(?:_\d)?)+\.?(?:\d(?:_\d)?)*|\B\.(?:\d(?:_\d)?)+)(?:[Ee][+-]?(?:\d(?:_\d)?)+)?/, + 'function': /#?[_$a-zA-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/, + 'operator': /--|\+\+|\*\*=?|=>|&&|\|\||[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?[.?]?|[~:]/ + }); + Prism.languages.javascript['class-name'][0].pattern = /(\b(?:class|interface|extends|implements|instanceof|new)\s+)[\w.\\]+/; + Prism.languages.insertBefore('javascript', 'keyword', { + 'regex': { + pattern: /((?:^|[^$\w\xA0-\uFFFF."'\])\s])\s*)\/(?:\[(?:[^\]\\\r\n]|\\.)*]|\\.|[^/\\\[\r\n])+\/[gimyus]{0,6}(?=(?:\s|\/\*[\s\S]*?\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/, + lookbehind: true, + greedy: true + }, + 'function-variable': { + pattern: /#?[_$a-zA-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|[_$a-zA-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*)\s*=>))/, + alias: 'function' + }, + 'parameter': [ + { + pattern: /(function(?:\s+[_$A-Za-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*)?\s*\(\s*)(?!\s)(?:[^()]|\([^()]*\))+?(?=\s*\))/, + lookbehind: true, + inside: Prism.languages.javascript + }, + { + pattern: /[_$a-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\s*=>)/i, + inside: Prism.languages.javascript + }, + { + pattern: /(\(\s*)(?!\s)(?:[^()]|\([^()]*\))+?(?=\s*\)\s*=>)/, + lookbehind: true, + inside: Prism.languages.javascript + }, + { + pattern: /((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:[_$A-Za-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*\s*)\(\s*)(?!\s)(?:[^()]|\([^()]*\))+?(?=\s*\)\s*\{)/, + lookbehind: true, + inside: Prism.languages.javascript + } + ], + 'constant': /\b[A-Z](?:[A-Z_]|\dx?)*\b/ + }); + Prism.languages.insertBefore('javascript', 'string', { + 'template-string': { + pattern: /`(?:\\[\s\S]|\${(?:[^{}]|{(?:[^{}]|{[^}]*})*})+}|(?!\${)[^\\`])*`/, + greedy: true, + inside: { + 'template-punctuation': { + pattern: /^`|`$/, + alias: 'string' + }, + 'interpolation': { + pattern: /((?:^|[^\\])(?:\\{2})*)\${(?:[^{}]|{(?:[^{}]|{[^}]*})*})+}/, + lookbehind: true, + inside: { + 'interpolation-punctuation': { + pattern: /^\${|}$/, + alias: 'punctuation' + }, + rest: Prism.languages.javascript + } + }, + 'string': /[\s\S]+/ + } + } + }); + if (Prism.languages.markup) { + Prism.languages.markup.tag.addInlined('script', 'javascript'); + } + Prism.languages.js = Prism.languages.javascript; + }, + {} + ], + 9: [ + function (require, module, exports) { + (function (Prism) { + function getPlaceholder(language, index) { + return '___' + language.toUpperCase() + index + '___'; + } + Object.defineProperties(Prism.languages['markup-templating'] = {}, { + buildPlaceholders: { + value: function (env, language, placeholderPattern, replaceFilter) { + if (env.language !== language) { + return; + } + var tokenStack = env.tokenStack = []; + env.code = env.code.replace(placeholderPattern, function (match) { + if (typeof replaceFilter === 'function' && !replaceFilter(match)) { + return match; + } + var i = tokenStack.length; + var placeholder; + while (env.code.indexOf(placeholder = getPlaceholder(language, i)) !== -1) + ++i; + tokenStack[i] = match; + return placeholder; + }); + env.grammar = Prism.languages.markup; + } + }, + tokenizePlaceholders: { + value: function (env, language) { + if (env.language !== language || !env.tokenStack) { + return; + } + env.grammar = Prism.languages[language]; + var j = 0; + var keys = Object.keys(env.tokenStack); + function walkTokens(tokens) { + for (var i = 0; i < tokens.length; i++) { + if (j >= keys.length) { + break; + } + var token = tokens[i]; + if (typeof token === 'string' || token.content && typeof token.content === 'string') { + var k = keys[j]; + var t = env.tokenStack[k]; + var s = typeof token === 'string' ? token : token.content; + var placeholder = getPlaceholder(language, k); + var index = s.indexOf(placeholder); + if (index > -1) { + ++j; + var before = s.substring(0, index); + var middle = new Prism.Token(language, Prism.tokenize(t, env.grammar), 'language-' + language, t); + var after = s.substring(index + placeholder.length); + var replacement = []; + if (before) { + replacement.push.apply(replacement, walkTokens([before])); + } + replacement.push(middle); + if (after) { + replacement.push.apply(replacement, walkTokens([after])); + } + if (typeof token === 'string') { + tokens.splice.apply(tokens, [ + i, + 1 + ].concat(replacement)); + } else { + token.content = replacement; + } + } + } else if (token.content) { + walkTokens(token.content); + } + } + return tokens; + } + walkTokens(env.tokens); + } + } + }); + }(Prism)); + }, + {} + ], + 10: [ + function (require, module, exports) { + Prism.languages.markup = { + 'comment': //, + 'prolog': /<\?[\s\S]+?\?>/, + 'doctype': { + pattern: /"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:(?!)*\]\s*)?>/i, + greedy: true + }, + 'cdata': //i, + 'tag': { + pattern: /<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/i, + greedy: true, + inside: { + 'tag': { + pattern: /^<\/?[^\s>\/]+/i, + inside: { + 'punctuation': /^<\/?/, + 'namespace': /^[^\s>\/:]+:/ + } + }, + 'attr-value': { + pattern: /=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/i, + inside: { + 'punctuation': [ + /^=/, + { + pattern: /^(\s*)["']|["']$/, + lookbehind: true + } + ] + } + }, + 'punctuation': /\/?>/, + 'attr-name': { + pattern: /[^\s>\/]+/, + inside: { 'namespace': /^[^\s>\/:]+:/ } + } + } + }, + 'entity': /&#?[\da-z]{1,8};/i + }; + Prism.languages.markup['tag'].inside['attr-value'].inside['entity'] = Prism.languages.markup['entity']; + Prism.hooks.add('wrap', function (env) { + if (env.type === 'entity') { + env.attributes['title'] = env.content.replace(/&/, '&'); + } + }); + Object.defineProperty(Prism.languages.markup.tag, 'addInlined', { + value: function addInlined(tagName, lang) { + var includedCdataInside = {}; + includedCdataInside['language-' + lang] = { + pattern: /(^$)/i, + lookbehind: true, + inside: Prism.languages[lang] + }; + includedCdataInside['cdata'] = /^$/i; + var inside = { + 'included-cdata': { + pattern: //i, + inside: includedCdataInside + } + }; + inside['language-' + lang] = { + pattern: /[\s\S]+/, + inside: Prism.languages[lang] + }; + var def = {}; + def[tagName] = { + pattern: RegExp(/(<__[\s\S]*?>)(?:\s*|[\s\S])*?(?=<\/__>)/.source.replace(/__/g, tagName), 'i'), + lookbehind: true, + greedy: true, + inside: inside + }; + Prism.languages.insertBefore('markup', 'cdata', def); + } + }); + Prism.languages.xml = Prism.languages.extend('markup', {}); + Prism.languages.html = Prism.languages.markup; + Prism.languages.mathml = Prism.languages.markup; + Prism.languages.svg = Prism.languages.markup; + }, + {} + ], + 11: [ + function (require, module, exports) { + (function (Prism) { + Prism.languages.php = Prism.languages.extend('clike', { + 'keyword': /\b(?:__halt_compiler|abstract|and|array|as|break|callable|case|catch|class|clone|const|continue|declare|default|die|do|echo|else|elseif|empty|enddeclare|endfor|endforeach|endif|endswitch|endwhile|eval|exit|extends|final|finally|for|foreach|function|global|goto|if|implements|include|include_once|instanceof|insteadof|interface|isset|list|namespace|new|or|parent|print|private|protected|public|require|require_once|return|static|switch|throw|trait|try|unset|use|var|while|xor|yield)\b/i, + 'boolean': { + pattern: /\b(?:false|true)\b/i, + alias: 'constant' + }, + 'constant': [ + /\b[A-Z_][A-Z0-9_]*\b/, + /\b(?:null)\b/i + ], + 'comment': { + pattern: /(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/, + lookbehind: true + } + }); + Prism.languages.insertBefore('php', 'string', { + 'shell-comment': { + pattern: /(^|[^\\])#.*/, + lookbehind: true, + alias: 'comment' + } + }); + Prism.languages.insertBefore('php', 'comment', { + 'delimiter': { + pattern: /\?>$|^<\?(?:php(?=\s)|=)?/i, + alias: 'important' + } + }); + Prism.languages.insertBefore('php', 'keyword', { + 'variable': /\$+(?:\w+\b|(?={))/i, + 'package': { + pattern: /(\\|namespace\s+|use\s+)[\w\\]+/, + lookbehind: true, + inside: { punctuation: /\\/ } + } + }); + Prism.languages.insertBefore('php', 'operator', { + 'property': { + pattern: /(->)[\w]+/, + lookbehind: true + } + }); + var string_interpolation = { + pattern: /{\$(?:{(?:{[^{}]+}|[^{}]+)}|[^{}])+}|(^|[^\\{])\$+(?:\w+(?:\[.+?]|->\w+)*)/, + lookbehind: true, + inside: Prism.languages.php + }; + Prism.languages.insertBefore('php', 'string', { + 'nowdoc-string': { + pattern: /<<<'([^']+)'(?:\r\n?|\n)(?:.*(?:\r\n?|\n))*?\1;/, + greedy: true, + alias: 'string', + inside: { + 'delimiter': { + pattern: /^<<<'[^']+'|[a-z_]\w*;$/i, + alias: 'symbol', + inside: { 'punctuation': /^<<<'?|[';]$/ } + } + } + }, + 'heredoc-string': { + pattern: /<<<(?:"([^"]+)"(?:\r\n?|\n)(?:.*(?:\r\n?|\n))*?\1;|([a-z_]\w*)(?:\r\n?|\n)(?:.*(?:\r\n?|\n))*?\2;)/i, + greedy: true, + alias: 'string', + inside: { + 'delimiter': { + pattern: /^<<<(?:"[^"]+"|[a-z_]\w*)|[a-z_]\w*;$/i, + alias: 'symbol', + inside: { 'punctuation': /^<<<"?|[";]$/ } + }, + 'interpolation': string_interpolation + } + }, + 'single-quoted-string': { + pattern: /'(?:\\[\s\S]|[^\\'])*'/, + greedy: true, + alias: 'string' + }, + 'double-quoted-string': { + pattern: /"(?:\\[\s\S]|[^\\"])*"/, + greedy: true, + alias: 'string', + inside: { 'interpolation': string_interpolation } + } + }); + delete Prism.languages.php['string']; + Prism.hooks.add('before-tokenize', function (env) { + if (!/<\?/.test(env.code)) { + return; + } + var phpPattern = /<\?(?:[^"'/#]|\/(?![*/])|("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|(?:\/\/|#)(?:[^?\n\r]|\?(?!>))*(?=$|\?>|[\r\n])|\/\*[\s\S]*?(?:\*\/|$))*?(?:\?>|$)/ig; + Prism.languages['markup-templating'].buildPlaceholders(env, 'php', phpPattern); + }); + Prism.hooks.add('after-tokenize', function (env) { + Prism.languages['markup-templating'].tokenizePlaceholders(env, 'php'); + }); + }(Prism)); + }, + {} + ], + 12: [ + function (require, module, exports) { + Prism.languages.python = { + 'comment': { + pattern: /(^|[^\\])#.*/, + lookbehind: true + }, + 'string-interpolation': { + pattern: /(?:f|rf|fr)(?:("""|''')[\s\S]+?\1|("|')(?:\\.|(?!\2)[^\\\r\n])*\2)/i, + greedy: true, + inside: { + 'interpolation': { + pattern: /((?:^|[^{])(?:{{)*){(?!{)(?:[^{}]|{(?!{)(?:[^{}]|{(?!{)(?:[^{}])+})+})+}/, + lookbehind: true, + inside: { + 'format-spec': { + pattern: /(:)[^:(){}]+(?=}$)/, + lookbehind: true + }, + 'conversion-option': { + pattern: /![sra](?=[:}]$)/, + alias: 'punctuation' + }, + rest: null + } + }, + 'string': /[\s\S]+/ + } + }, + 'triple-quoted-string': { + pattern: /(?:[rub]|rb|br)?("""|''')[\s\S]+?\1/i, + greedy: true, + alias: 'string' + }, + 'string': { + pattern: /(?:[rub]|rb|br)?("|')(?:\\.|(?!\1)[^\\\r\n])*\1/i, + greedy: true + }, + 'function': { + pattern: /((?:^|\s)def[ \t]+)[a-zA-Z_]\w*(?=\s*\()/g, + lookbehind: true + }, + 'class-name': { + pattern: /(\bclass\s+)\w+/i, + lookbehind: true + }, + 'decorator': { + pattern: /(^\s*)@\w+(?:\.\w+)*/im, + lookbehind: true, + alias: [ + 'annotation', + 'punctuation' + ], + inside: { 'punctuation': /\./ } + }, + 'keyword': /\b(?:and|as|assert|async|await|break|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|nonlocal|not|or|pass|print|raise|return|try|while|with|yield)\b/, + 'builtin': /\b(?:__import__|abs|all|any|apply|ascii|basestring|bin|bool|buffer|bytearray|bytes|callable|chr|classmethod|cmp|coerce|compile|complex|delattr|dict|dir|divmod|enumerate|eval|execfile|file|filter|float|format|frozenset|getattr|globals|hasattr|hash|help|hex|id|input|int|intern|isinstance|issubclass|iter|len|list|locals|long|map|max|memoryview|min|next|object|oct|open|ord|pow|property|range|raw_input|reduce|reload|repr|reversed|round|set|setattr|slice|sorted|staticmethod|str|sum|super|tuple|type|unichr|unicode|vars|xrange|zip)\b/, + 'boolean': /\b(?:True|False|None)\b/, + 'number': /(?:\b(?=\d)|\B(?=\.))(?:0[bo])?(?:(?:\d|0x[\da-f])[\da-f]*\.?\d*|\.\d+)(?:e[+-]?\d+)?j?\b/i, + 'operator': /[-+%=]=?|!=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/, + 'punctuation': /[{}[\];(),.:]/ + }; + Prism.languages.python['string-interpolation'].inside['interpolation'].inside.rest = Prism.languages.python; + Prism.languages.py = Prism.languages.python; + }, + {} + ], + 13: [ + function (require, module, exports) { + (function (Prism) { + Prism.languages.ruby = Prism.languages.extend('clike', { + 'comment': [ + /#.*/, + { + pattern: /^=begin\s[\s\S]*?^=end/m, + greedy: true + } + ], + 'class-name': { + pattern: /(\b(?:class)\s+|\bcatch\s+\()[\w.\\]+/i, + lookbehind: true, + inside: { 'punctuation': /[.\\]/ } + }, + 'keyword': /\b(?:alias|and|BEGIN|begin|break|case|class|def|define_method|defined|do|each|else|elsif|END|end|ensure|extend|for|if|in|include|module|new|next|nil|not|or|prepend|protected|private|public|raise|redo|require|rescue|retry|return|self|super|then|throw|undef|unless|until|when|while|yield)\b/ + }); + var interpolation = { + pattern: /#\{[^}]+\}/, + inside: { + 'delimiter': { + pattern: /^#\{|\}$/, + alias: 'tag' + }, + rest: Prism.languages.ruby + } + }; + delete Prism.languages.ruby.function; + Prism.languages.insertBefore('ruby', 'keyword', { + 'regex': [ + { + pattern: /%r([^a-zA-Z0-9\s{(\[<])(?:(?!\1)[^\\]|\\[\s\S])*\1[gim]{0,3}/, + greedy: true, + inside: { 'interpolation': interpolation } + }, + { + pattern: /%r\((?:[^()\\]|\\[\s\S])*\)[gim]{0,3}/, + greedy: true, + inside: { 'interpolation': interpolation } + }, + { + pattern: /%r\{(?:[^#{}\\]|#(?:\{[^}]+\})?|\\[\s\S])*\}[gim]{0,3}/, + greedy: true, + inside: { 'interpolation': interpolation } + }, + { + pattern: /%r\[(?:[^\[\]\\]|\\[\s\S])*\][gim]{0,3}/, + greedy: true, + inside: { 'interpolation': interpolation } + }, + { + pattern: /%r<(?:[^<>\\]|\\[\s\S])*>[gim]{0,3}/, + greedy: true, + inside: { 'interpolation': interpolation } + }, + { + pattern: /(^|[^/])\/(?!\/)(?:\[.+?]|\\.|[^/\\\r\n])+\/[gim]{0,3}(?=\s*(?:$|[\r\n,.;})]))/, + lookbehind: true, + greedy: true + } + ], + 'variable': /[@$]+[a-zA-Z_]\w*(?:[?!]|\b)/, + 'symbol': { + pattern: /(^|[^:]):[a-zA-Z_]\w*(?:[?!]|\b)/, + lookbehind: true + }, + 'method-definition': { + pattern: /(\bdef\s+)[\w.]+/, + lookbehind: true, + inside: { + 'function': /\w+$/, + rest: Prism.languages.ruby + } + } + }); + Prism.languages.insertBefore('ruby', 'number', { + 'builtin': /\b(?:Array|Bignum|Binding|Class|Continuation|Dir|Exception|FalseClass|File|Stat|Fixnum|Float|Hash|Integer|IO|MatchData|Method|Module|NilClass|Numeric|Object|Proc|Range|Regexp|String|Struct|TMS|Symbol|ThreadGroup|Thread|Time|TrueClass)\b/, + 'constant': /\b[A-Z]\w*(?:[?!]|\b)/ + }); + Prism.languages.ruby.string = [ + { + pattern: /%[qQiIwWxs]?([^a-zA-Z0-9\s{(\[<])(?:(?!\1)[^\\]|\\[\s\S])*\1/, + greedy: true, + inside: { 'interpolation': interpolation } + }, + { + pattern: /%[qQiIwWxs]?\((?:[^()\\]|\\[\s\S])*\)/, + greedy: true, + inside: { 'interpolation': interpolation } + }, + { + pattern: /%[qQiIwWxs]?\{(?:[^#{}\\]|#(?:\{[^}]+\})?|\\[\s\S])*\}/, + greedy: true, + inside: { 'interpolation': interpolation } + }, + { + pattern: /%[qQiIwWxs]?\[(?:[^\[\]\\]|\\[\s\S])*\]/, + greedy: true, + inside: { 'interpolation': interpolation } + }, + { + pattern: /%[qQiIwWxs]?<(?:[^<>\\]|\\[\s\S])*>/, + greedy: true, + inside: { 'interpolation': interpolation } + }, + { + pattern: /("|')(?:#\{[^}]+\}|\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/, + greedy: true, + inside: { 'interpolation': interpolation } + } + ]; + Prism.languages.rb = Prism.languages.ruby; + }(Prism)); + }, + {} + ], + 14: [ + function (require, module, exports) { + var Prism = require('prismjs/components/prism-core'); + require('prismjs/components/prism-clike'); + require('prismjs/components/prism-markup-templating'); + require('prismjs/components/prism-c'); + require('prismjs/components/prism-cpp'); + require('prismjs/components/prism-csharp'); + require('prismjs/components/prism-css'); + require('prismjs/components/prism-java'); + require('prismjs/components/prism-javascript'); + require('prismjs/components/prism-markup'); + require('prismjs/components/prism-php'); + require('prismjs/components/prism-python'); + require('prismjs/components/prism-ruby'); + module.exports = { boltExport: Prism }; + }, + { + 'prismjs/components/prism-c': 1, + 'prismjs/components/prism-clike': 2, + 'prismjs/components/prism-core': 3, + 'prismjs/components/prism-cpp': 4, + 'prismjs/components/prism-csharp': 5, + 'prismjs/components/prism-css': 6, + 'prismjs/components/prism-java': 7, + 'prismjs/components/prism-javascript': 8, + 'prismjs/components/prism-markup': 10, + 'prismjs/components/prism-markup-templating': 9, + 'prismjs/components/prism-php': 11, + 'prismjs/components/prism-python': 12, + 'prismjs/components/prism-ruby': 13 + } + ] + }, {}, [14])(14); + })); + var prism = window.Prism; + window.Prism = oldprism; + return prism; + }(undefined, exports$1, module, undefined)); + var Prism$1 = module.exports.boltExport; + + var getLanguages = function (editor) { + return editor.getParam('codesample_languages'); + }; + var useGlobalPrismJS = function (editor) { + return editor.getParam('codesample_global_prismjs', false, 'boolean'); + }; + + var get = function (editor) { + return Global.Prism && useGlobalPrismJS(editor) ? Global.Prism : Prism$1; + }; + + var getSelectedCodeSample = function (editor) { + var node = editor.selection ? editor.selection.getNode() : null; + if (isCodeSample(node)) { + return Option.some(node); + } + return Option.none(); + }; + var insertCodeSample = function (editor, language, code) { + editor.undoManager.transact(function () { + var node = getSelectedCodeSample(editor); + code = global$1.DOM.encode(code); + return node.fold(function () { + editor.insertContent('

    ' + code + '
    '); + editor.selection.select(editor.$('#__new').removeAttr('id')[0]); + }, function (n) { + editor.dom.setAttrib(n, 'class', 'language-' + language); + n.innerHTML = code; + get(editor).highlightElement(n); + editor.selection.select(n); + }); + }); + }; + var getCurrentCode = function (editor) { + var node = getSelectedCodeSample(editor); + return node.fold(function () { + return ''; + }, function (n) { + return n.textContent; + }); + }; + + var getLanguages$1 = function (editor) { + var defaultLanguages = [ + { + text: 'HTML/XML', + value: 'markup' + }, + { + text: 'JavaScript', + value: 'javascript' + }, + { + text: 'CSS', + value: 'css' + }, + { + text: 'PHP', + value: 'php' + }, + { + text: 'Ruby', + value: 'ruby' + }, + { + text: 'Python', + value: 'python' + }, + { + text: 'Java', + value: 'java' + }, + { + text: 'C', + value: 'c' + }, + { + text: 'C#', + value: 'csharp' + }, + { + text: 'C++', + value: 'cpp' + } + ]; + var customLanguages = getLanguages(editor); + return customLanguages ? customLanguages : defaultLanguages; + }; + var getCurrentLanguage = function (editor, fallback) { + var node = getSelectedCodeSample(editor); + return node.fold(function () { + return fallback; + }, function (n) { + var matches = n.className.match(/language-(\w+)/); + return matches ? matches[1] : fallback; + }); + }; + + var open = function (editor) { + var languages = getLanguages$1(editor); + var defaultLanguage = head(languages).fold(function () { + return ''; + }, function (l) { + return l.value; + }); + var currentLanguage = getCurrentLanguage(editor, defaultLanguage); + var currentCode = getCurrentCode(editor); + editor.windowManager.open({ + title: 'Insert/Edit Code Sample', + size: 'large', + body: { + type: 'panel', + items: [ + { + type: 'selectbox', + name: 'language', + label: 'Language', + items: languages + }, + { + type: 'textarea', + name: 'code', + label: 'Code view' + } + ] + }, + buttons: [ + { + type: 'cancel', + name: 'cancel', + text: 'Cancel' + }, + { + type: 'submit', + name: 'save', + text: 'Save', + primary: true + } + ], + initialData: { + language: currentLanguage, + code: currentCode + }, + onSubmit: function (api) { + var data = api.getData(); + insertCodeSample(editor, data.language, data.code); + api.close(); + } + }); + }; + + var register = function (editor) { + editor.addCommand('codesample', function () { + var node = editor.selection.getNode(); + if (editor.selection.isCollapsed() || isCodeSample(node)) { + open(editor); + } else { + editor.formatter.toggle('code'); + } + }); + }; + + var setup = function (editor) { + var $ = editor.$; + editor.on('PreProcess', function (e) { + $('pre[contenteditable=false]', e.node).filter(trimArg(isCodeSample)).each(function (idx, elm) { + var $elm = $(elm), code = elm.textContent; + $elm.attr('class', $.trim($elm.attr('class'))); + $elm.removeAttr('contentEditable'); + $elm.empty().append($('').each(function () { + this.textContent = code; + })); + }); + }); + editor.on('SetContent', function () { + var unprocessedCodeSamples = $('pre').filter(trimArg(isCodeSample)).filter(function (idx, elm) { + return elm.contentEditable !== 'false'; + }); + if (unprocessedCodeSamples.length) { + editor.undoManager.transact(function () { + unprocessedCodeSamples.each(function (idx, elm) { + $(elm).find('br').each(function (idx, elm) { + elm.parentNode.replaceChild(editor.getDoc().createTextNode('\n'), elm); + }); + elm.contentEditable = 'false'; + elm.innerHTML = editor.dom.encode(elm.textContent); + get(editor).highlightElement(elm); + elm.className = $.trim(elm.className); + }); + }); + } + }); + }; + + var isCodeSampleSelection = function (editor) { + var node = editor.selection.getStart(); + return editor.dom.is(node, 'pre[class*="language-"]'); + }; + var register$1 = function (editor) { + editor.ui.registry.addToggleButton('codesample', { + icon: 'code-sample', + tooltip: 'Insert/edit code sample', + onAction: function () { + return open(editor); + }, + onSetup: function (api) { + var nodeChangeHandler = function () { + api.setActive(isCodeSampleSelection(editor)); + }; + editor.on('NodeChange', nodeChangeHandler); + return function () { + return editor.off('NodeChange', nodeChangeHandler); + }; + } + }); + editor.ui.registry.addMenuItem('codesample', { + text: 'Code sample...', + icon: 'code-sample', + onAction: function () { + return open(editor); + } + }); + }; + + function Plugin () { + global.add('codesample', function (editor) { + setup(editor); + register$1(editor); + register(editor); + editor.on('dblclick', function (ev) { + if (isCodeSample(ev.target)) { + open(editor); + } + }); + }); + } + + Plugin(); + +}(window)); diff --git a/src/main/resources/static/layui-ext/tinymce/tinymce/plugins/codesample/plugin.min.js b/src/main/resources/static/layui-ext/tinymce/tinymce/plugins/codesample/plugin.min.js new file mode 100644 index 0000000..fa22f5a --- /dev/null +++ b/src/main/resources/static/layui-ext/tinymce/tinymce/plugins/codesample/plugin.min.js @@ -0,0 +1,9 @@ +/** + * 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/ + * + * Version: 5.4.2 (2020-08-17) + */ +!function(e){"use strict";var n,t,a,r=tinymce.util.Tools.resolve("tinymce.PluginManager"),i=function(e){return function(){return e}},s=i(!1),o=i(!0),l=function(){return u},u=(n=function(e){return e.isNone()},{fold:function(e,n){return e()},is:s,isSome:s,isNone:o,getOr:a=function(e){return e},getOrThunk:t=function(e){return e()},getOrDie:function(e){throw new Error(e||"error: getOrDie called on none.")},getOrNull:i(null),getOrUndefined:i(undefined),or:a,orThunk:t,map:l,each:function(){},bind:l,exists:s,forall:o,filter:l,equals:n,equals_:n,toArray:function(){return[]},toString:i("none()")}),c=function(t){var e=i(t),n=function(){return r},a=function(e){return e(t)},r={fold:function(e,n){return n(t)},is:function(e){return t===e},isSome:o,isNone:s,getOr:e,getOrThunk:e,getOrDie:e,getOrNull:e,getOrUndefined:e,or:n,orThunk:n,map:function(e){return c(e(t))},each:function(e){e(t)},bind:a,exists:a,forall:a,filter:function(e){return e(t)?r:u},toArray:function(){return[t]},toString:function(){return"some("+t+")"},equals:function(e){return e.is(t)},equals_:function(e,n){return e.fold(s,function(e){return n(t,e)})}};return r},d={some:c,none:l,from:function(e){return null===e||e===undefined?u:c(e)}},p=tinymce.util.Tools.resolve("tinymce.dom.DOMUtils");function g(e){return e&&"PRE"===e.nodeName&&-1!==e.className.indexOf("language-")}function m(t){return function(e,n){return t(n)}}var f="undefined"!=typeof e.window?e.window:Function("return this;")(),h={},b={exports:h},y={};!function(n,t,a,d){var e=window.Prism;window.Prism={manual:!0},function(e){if("object"==typeof t&&void 0!==a)a.exports=e();else if("function"==typeof n&&n.amd)n([],e);else{("undefined"!=typeof window?window:void 0!==y?y:"undefined"!=typeof self?self:this).EphoxContactWrapper=e()}}(function(){return function c(i,s,o){function l(n,e){if(!s[n]){if(!i[n]){var t="function"==typeof d&&d;if(!e&&t)return t(n,!0);if(u)return u(n,!0);var a=new Error("Cannot find module '"+n+"'");throw a.code="MODULE_NOT_FOUND",a}var r=s[n]={exports:{}};i[n][0].call(r.exports,function(e){return l(i[n][1][e]||e)},r,r.exports,c,i,s,o)}return s[n].exports}for(var u="function"==typeof d&&d,e=0;e>=?|<<=?|->|([-+&|:])\1|[?:~]|[-+*/%&|^!=<>]=?/,number:/(?:\b0x(?:[\da-f]+\.?[\da-f]*|\.[\da-f]+)(?:p[+-]?\d+)?|(?:\b\d+\.?\d*|\B\.\d+)(?:e[+-]?\d+)?)[ful]*/i}),Prism.languages.insertBefore("c","string",{macro:{pattern:/(^\s*)#\s*[a-z]+(?:[^\r\n\\]|\\(?:\r\n|[\s\S]))*/im,lookbehind:!0,alias:"property",inside:{string:{pattern:/(#\s*include\s*)(?:<.+?>|("|')(?:\\?.)+?\2)/,lookbehind:!0},directive:{pattern:/(#\s*)\b(?:define|defined|elif|else|endif|error|ifdef|ifndef|if|import|include|line|pragma|undef|using)\b/,lookbehind:!0,alias:"keyword"}}},constant:/\b(?:__FILE__|__LINE__|__DATE__|__TIME__|__TIMESTAMP__|__func__|EOF|NULL|SEEK_CUR|SEEK_END|SEEK_SET|stdin|stdout|stderr)\b/}),delete Prism.languages.c["boolean"]},{}],2:[function(e,n,t){Prism.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"class-name":{pattern:/(\b(?:class|interface|extends|implements|trait|instanceof|new)\s+|\bcatch\s+\()[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:if|else|while|do|for|return|in|instanceof|function|new|try|throw|catch|finally|null|break|continue)\b/,"boolean":/\b(?:true|false)\b/,"function":/\w+(?=\()/,number:/\b0x[\da-f]+\b|(?:\b\d+\.?\d*|\B\.\d+)(?:e[+-]?\d+)?/i,operator:/[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/}},{}],3:[function(e,t,n){(function(e){var n=function(u){var c=/\blang(?:uage)?-([\w-]+)\b/i,n=0,C={manual:u.Prism&&u.Prism.manual,disableWorkerMessageHandler:u.Prism&&u.Prism.disableWorkerMessageHandler,util:{encode:function(e){return e instanceof O?new O(e.type,C.util.encode(e.content),e.alias):Array.isArray(e)?e.map(C.util.encode):e.replace(/&/g,"&").replace(/e.length)return;if(!(w instanceof O)){if(g&&b!=n.length-1){if(c.lastIndex=y,!(P=c.exec(e)))break;for(var v=P.index+(p&&P[1]?P[1].length:0),k=P.index+P[0].length,x=b,_=y,F=n.length;x"+t.content+""},!u.document)return u.addEventListener&&(C.disableWorkerMessageHandler||u.addEventListener("message",function(e){var n=JSON.parse(e.data),t=n.language,a=n.code,r=n.immediateClose;u.postMessage(C.highlight(a,C.languages[t],t)),r&&u.close()},!1)),C;var e=C.util.currentScript();if(e&&(C.filename=e.src,e.hasAttribute("data-manual")&&(C.manual=!0)),!C.manual){var t=function(){C.manual||C.highlightAll()},a=document.readyState;"loading"===a||"interactive"===a&&e&&e.defer?document.addEventListener("DOMContentLoaded",t):window.requestAnimationFrame?window.requestAnimationFrame(t):window.setTimeout(t,16)}return C}("undefined"!=typeof window?window:"undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?self:{});void 0!==t&&t.exports&&(t.exports=n),void 0!==e&&(e.Prism=n)}).call(this,void 0!==y?y:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}],4:[function(e,n,t){Prism.languages.cpp=Prism.languages.extend("c",{"class-name":{pattern:/(\b(?:class|enum|struct)\s+)\w+/,lookbehind:!0},keyword:/\b(?:alignas|alignof|asm|auto|bool|break|case|catch|char|char16_t|char32_t|class|compl|const|constexpr|const_cast|continue|decltype|default|delete|do|double|dynamic_cast|else|enum|explicit|export|extern|float|for|friend|goto|if|inline|int|int8_t|int16_t|int32_t|int64_t|uint8_t|uint16_t|uint32_t|uint64_t|long|mutable|namespace|new|noexcept|nullptr|operator|private|protected|public|register|reinterpret_cast|return|short|signed|sizeof|static|static_assert|static_cast|struct|switch|template|this|thread_local|throw|try|typedef|typeid|typename|union|unsigned|using|virtual|void|volatile|wchar_t|while)\b/,number:{pattern:/(?:\b0b[01']+|\b0x(?:[\da-f']+\.?[\da-f']*|\.[\da-f']+)(?:p[+-]?[\d']+)?|(?:\b[\d']+\.?[\d']*|\B\.[\d']+)(?:e[+-]?[\d']+)?)[ful]*/i,greedy:!0},operator:/>>=?|<<=?|->|([-+&|:])\1|[?:~]|[-+*/%&|^!=<>]=?|\b(?:and|and_eq|bitand|bitor|not|not_eq|or|or_eq|xor|xor_eq)\b/,"boolean":/\b(?:true|false)\b/}),Prism.languages.insertBefore("cpp","string",{"raw-string":{pattern:/R"([^()\\ ]{0,16})\([\s\S]*?\)\1"/,alias:"string",greedy:!0}})},{}],5:[function(e,n,t){Prism.languages.csharp=Prism.languages.extend("clike",{keyword:/\b(?:abstract|add|alias|as|ascending|async|await|base|bool|break|byte|case|catch|char|checked|class|const|continue|decimal|default|delegate|descending|do|double|dynamic|else|enum|event|explicit|extern|false|finally|fixed|float|for|foreach|from|get|global|goto|group|if|implicit|in|int|interface|internal|into|is|join|let|lock|long|namespace|new|null|object|operator|orderby|out|override|params|partial|private|protected|public|readonly|ref|remove|return|sbyte|sealed|select|set|short|sizeof|stackalloc|static|string|struct|switch|this|throw|true|try|typeof|uint|ulong|unchecked|unsafe|ushort|using|value|var|virtual|void|volatile|where|while|yield)\b/,string:[{pattern:/@("|')(?:\1\1|\\[\s\S]|(?!\1)[^\\])*\1/,greedy:!0},{pattern:/("|')(?:\\.|(?!\1)[^\\\r\n])*?\1/,greedy:!0}],"class-name":[{pattern:/\b[A-Z]\w*(?:\.\w+)*\b(?=\s+\w+)/,inside:{punctuation:/\./}},{pattern:/(\[)[A-Z]\w*(?:\.\w+)*\b/,lookbehind:!0,inside:{punctuation:/\./}},{pattern:/(\b(?:class|interface)\s+[A-Z]\w*(?:\.\w+)*\s*:\s*)[A-Z]\w*(?:\.\w+)*\b/,lookbehind:!0,inside:{punctuation:/\./}},{pattern:/((?:\b(?:class|interface|new)\s+)|(?:catch\s+\())[A-Z]\w*(?:\.\w+)*\b/,lookbehind:!0,inside:{punctuation:/\./}}],number:/\b0x[\da-f]+\b|(?:\b\d+\.?\d*|\B\.\d+)f?/i,operator:/>>=?|<<=?|[-=]>|([-+&|?])\1|~|[-+*/%&|^!=<>]=?/,punctuation:/\?\.?|::|[{}[\];(),.:]/}),Prism.languages.insertBefore("csharp","class-name",{"generic-method":{pattern:/\w+\s*<[^>\r\n]+?>\s*(?=\()/,inside:{"function":/^\w+/,"class-name":{pattern:/\b[A-Z]\w*(?:\.\w+)*\b/,inside:{punctuation:/\./}},keyword:Prism.languages.csharp.keyword,punctuation:/[<>(),.:]/}},preprocessor:{pattern:/(^\s*)#.*/m,lookbehind:!0,alias:"property",inside:{directive:{pattern:/(\s*#)\b(?:define|elif|else|endif|endregion|error|if|line|pragma|region|undef|warning)\b/,lookbehind:!0,alias:"keyword"}}}}),Prism.languages.dotnet=Prism.languages.cs=Prism.languages.csharp},{}],6:[function(e,n,t){!function(e){var n=/("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/;e.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:/@[\w-]+[\s\S]*?(?:;|(?=\s*\{))/,inside:{rule:/@[\w-]+/}},url:{pattern:RegExp("url\\((?:"+n.source+"|[^\n\r()]*)\\)","i"),inside:{"function":/^url/i,punctuation:/^\(|\)$/}},selector:RegExp("[^{}\\s](?:[^{};\"']|"+n.source+")*?(?=\\s*\\{)"),string:{pattern:n,greedy:!0},property:/[-_a-z\xA0-\uFFFF][-\w\xA0-\uFFFF]*(?=\s*:)/i,important:/!important\b/i,"function":/[-a-z0-9]+(?=\()/i,punctuation:/[(){};:,]/},e.languages.css.atrule.inside.rest=e.languages.css;var t=e.languages.markup;t&&(t.tag.addInlined("style","css"),e.languages.insertBefore("inside","attr-value",{"style-attr":{pattern:/\s*style=("|')(?:\\[\s\S]|(?!\1)[^\\])*\1/i,inside:{"attr-name":{pattern:/^\s*style/i,inside:t.tag.inside},punctuation:/^\s*=\s*['"]|['"]\s*$/,"attr-value":{pattern:/.+/i,inside:e.languages.css}},alias:"language-css"}},t.tag))}(Prism)},{}],7:[function(e,n,t){var a,r,i;a=Prism,r=/\b(?:abstract|assert|boolean|break|byte|case|catch|char|class|const|continue|default|do|double|else|enum|exports|extends|final|finally|float|for|goto|if|implements|import|instanceof|int|interface|long|module|native|new|null|open|opens|package|private|protected|provides|public|requires|return|short|static|strictfp|super|switch|synchronized|this|throw|throws|to|transient|transitive|try|uses|var|void|volatile|while|with|yield)\b/,i=/\b[A-Z](?:\w*[a-z]\w*)?\b/,a.languages.java=a.languages.extend("clike",{"class-name":[i,/\b[A-Z]\w*(?=\s+\w+\s*[;,=())])/],keyword:r,"function":[a.languages.clike["function"],{pattern:/(\:\:)[a-z_]\w*/,lookbehind:!0}],number:/\b0b[01][01_]*L?\b|\b0x[\da-f_]*\.?[\da-f_p+-]+\b|(?:\b\d[\d_]*\.?[\d_]*|\B\.\d[\d_]*)(?:e[+-]?\d[\d_]*)?[dfl]?/i,operator:{pattern:/(^|[^.])(?:<<=?|>>>?=?|->|--|\+\+|&&|\|\||::|[?:~]|[-+*/%&|^!=<>]=?)/m,lookbehind:!0}}),a.languages.insertBefore("java","string",{"triple-quoted-string":{pattern:/"""[ \t]*[\r\n](?:(?:"|"")?(?:\\.|[^"\\]))*"""/,greedy:!0,alias:"string"}}),a.languages.insertBefore("java","class-name",{annotation:{alias:"punctuation",pattern:/(^|[^.])@\w+/,lookbehind:!0},namespace:{pattern:/(\b(?:exports|import(?:\s+static)?|module|open|opens|package|provides|requires|to|transitive|uses|with)\s+)[a-z]\w*(?:\.[a-z]\w*)+/,lookbehind:!0,inside:{punctuation:/\./}},generics:{pattern:/<(?:[\w\s,.&?]|<(?:[\w\s,.&?]|<(?:[\w\s,.&?]|<[\w\s,.&?]*>)*>)*>)*>/,inside:{"class-name":i,keyword:r,punctuation:/[<>(),.:]/,operator:/[?&|]/}}})},{}],8:[function(e,n,t){Prism.languages.javascript=Prism.languages.extend("clike",{"class-name":[Prism.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])[_$A-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\.(?:prototype|constructor))/,lookbehind:!0}],keyword:[{pattern:/((?:^|})\s*)(?:catch|finally)\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],number:/\b(?:(?:0[xX](?:[\dA-Fa-f](?:_[\dA-Fa-f])?)+|0[bB](?:[01](?:_[01])?)+|0[oO](?:[0-7](?:_[0-7])?)+)n?|(?:\d(?:_\d)?)+n|NaN|Infinity)\b|(?:\b(?:\d(?:_\d)?)+\.?(?:\d(?:_\d)?)*|\B\.(?:\d(?:_\d)?)+)(?:[Ee][+-]?(?:\d(?:_\d)?)+)?/,"function":/#?[_$a-zA-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,operator:/--|\+\+|\*\*=?|=>|&&|\|\||[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?[.?]?|[~:]/}),Prism.languages.javascript["class-name"][0].pattern=/(\b(?:class|interface|extends|implements|instanceof|new)\s+)[\w.\\]+/,Prism.languages.insertBefore("javascript","keyword",{regex:{pattern:/((?:^|[^$\w\xA0-\uFFFF."'\])\s])\s*)\/(?:\[(?:[^\]\\\r\n]|\\.)*]|\\.|[^/\\\[\r\n])+\/[gimyus]{0,6}(?=(?:\s|\/\*[\s\S]*?\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/,lookbehind:!0,greedy:!0},"function-variable":{pattern:/#?[_$a-zA-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|[_$a-zA-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+[_$A-Za-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*)?\s*\(\s*)(?!\s)(?:[^()]|\([^()]*\))+?(?=\s*\))/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/[_$a-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\s*=>)/i,inside:Prism.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()]|\([^()]*\))+?(?=\s*\)\s*=>)/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:[_$A-Za-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*\s*)\(\s*)(?!\s)(?:[^()]|\([^()]*\))+?(?=\s*\)\s*\{)/,lookbehind:!0,inside:Prism.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),Prism.languages.insertBefore("javascript","string",{"template-string":{pattern:/`(?:\\[\s\S]|\${(?:[^{}]|{(?:[^{}]|{[^}]*})*})+}|(?!\${)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\${(?:[^{}]|{(?:[^{}]|{[^}]*})*})+}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\${|}$/,alias:"punctuation"},rest:Prism.languages.javascript}},string:/[\s\S]+/}}}),Prism.languages.markup&&Prism.languages.markup.tag.addInlined("script","javascript"),Prism.languages.js=Prism.languages.javascript},{}],9:[function(e,n,t){function b(e,n){return"___"+e.toUpperCase()+n+"___"}var y;y=Prism,Object.defineProperties(y.languages["markup-templating"]={},{buildPlaceholders:{value:function(a,r,e,i){if(a.language===r){var s=a.tokenStack=[];a.code=a.code.replace(e,function(e){if("function"==typeof i&&!i(e))return e;for(var n,t=s.length;-1!==a.code.indexOf(n=b(r,t));)++t;return s[t]=e,n}),a.grammar=y.languages.markup}}},tokenizePlaceholders:{value:function(p,g){if(p.language===g&&p.tokenStack){p.grammar=y.languages[g];var m=0,f=Object.keys(p.tokenStack);!function h(e){for(var n=0;n=f.length);n++){var t=e[n];if("string"==typeof t||t.content&&"string"==typeof t.content){var a=f[m],r=p.tokenStack[a],i="string"==typeof t?t:t.content,s=b(g,a),o=i.indexOf(s);if(-1/,prolog:/<\?[\s\S]+?\?>/,doctype:{pattern:/"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:(?!)*\]\s*)?>/i,greedy:!0},cdata://i,tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/i,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/i,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/i,inside:{punctuation:[/^=/,{pattern:/^(\s*)["']|["']$/,lookbehind:!0}]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:/&#?[\da-z]{1,8};/i},Prism.languages.markup.tag.inside["attr-value"].inside.entity=Prism.languages.markup.entity,Prism.hooks.add("wrap",function(e){"entity"===e.type&&(e.attributes.title=e.content.replace(/&/,"&"))}),Object.defineProperty(Prism.languages.markup.tag,"addInlined",{value:function(e,n){var t={};t["language-"+n]={pattern:/(^$)/i,lookbehind:!0,inside:Prism.languages[n]},t.cdata=/^$/i;var a={"included-cdata":{pattern://i,inside:t}};a["language-"+n]={pattern:/[\s\S]+/,inside:Prism.languages[n]};var r={};r[e]={pattern:RegExp(/(<__[\s\S]*?>)(?:\s*|[\s\S])*?(?=<\/__>)/.source.replace(/__/g,e),"i"),lookbehind:!0,greedy:!0,inside:a},Prism.languages.insertBefore("markup","cdata",r)}}),Prism.languages.xml=Prism.languages.extend("markup",{}),Prism.languages.html=Prism.languages.markup,Prism.languages.mathml=Prism.languages.markup,Prism.languages.svg=Prism.languages.markup},{}],11:[function(e,n,t){!function(n){n.languages.php=n.languages.extend("clike",{keyword:/\b(?:__halt_compiler|abstract|and|array|as|break|callable|case|catch|class|clone|const|continue|declare|default|die|do|echo|else|elseif|empty|enddeclare|endfor|endforeach|endif|endswitch|endwhile|eval|exit|extends|final|finally|for|foreach|function|global|goto|if|implements|include|include_once|instanceof|insteadof|interface|isset|list|namespace|new|or|parent|print|private|protected|public|require|require_once|return|static|switch|throw|trait|try|unset|use|var|while|xor|yield)\b/i,"boolean":{pattern:/\b(?:false|true)\b/i,alias:"constant"},constant:[/\b[A-Z_][A-Z0-9_]*\b/,/\b(?:null)\b/i],comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0}}),n.languages.insertBefore("php","string",{"shell-comment":{pattern:/(^|[^\\])#.*/,lookbehind:!0,alias:"comment"}}),n.languages.insertBefore("php","comment",{delimiter:{pattern:/\?>$|^<\?(?:php(?=\s)|=)?/i,alias:"important"}}),n.languages.insertBefore("php","keyword",{variable:/\$+(?:\w+\b|(?={))/i,"package":{pattern:/(\\|namespace\s+|use\s+)[\w\\]+/,lookbehind:!0,inside:{punctuation:/\\/}}}),n.languages.insertBefore("php","operator",{property:{pattern:/(->)[\w]+/,lookbehind:!0}});var e={pattern:/{\$(?:{(?:{[^{}]+}|[^{}]+)}|[^{}])+}|(^|[^\\{])\$+(?:\w+(?:\[.+?]|->\w+)*)/,lookbehind:!0,inside:n.languages.php};n.languages.insertBefore("php","string",{"nowdoc-string":{pattern:/<<<'([^']+)'(?:\r\n?|\n)(?:.*(?:\r\n?|\n))*?\1;/,greedy:!0,alias:"string",inside:{delimiter:{pattern:/^<<<'[^']+'|[a-z_]\w*;$/i,alias:"symbol",inside:{punctuation:/^<<<'?|[';]$/}}}},"heredoc-string":{pattern:/<<<(?:"([^"]+)"(?:\r\n?|\n)(?:.*(?:\r\n?|\n))*?\1;|([a-z_]\w*)(?:\r\n?|\n)(?:.*(?:\r\n?|\n))*?\2;)/i,greedy:!0,alias:"string",inside:{delimiter:{pattern:/^<<<(?:"[^"]+"|[a-z_]\w*)|[a-z_]\w*;$/i,alias:"symbol",inside:{punctuation:/^<<<"?|[";]$/}},interpolation:e}},"single-quoted-string":{pattern:/'(?:\\[\s\S]|[^\\'])*'/,greedy:!0,alias:"string"},"double-quoted-string":{pattern:/"(?:\\[\s\S]|[^\\"])*"/,greedy:!0,alias:"string",inside:{interpolation:e}}}),delete n.languages.php.string,n.hooks.add("before-tokenize",function(e){if(/<\?/.test(e.code)){n.languages["markup-templating"].buildPlaceholders(e,"php",/<\?(?:[^"'/#]|\/(?![*/])|("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|(?:\/\/|#)(?:[^?\n\r]|\?(?!>))*(?=$|\?>|[\r\n])|\/\*[\s\S]*?(?:\*\/|$))*?(?:\?>|$)/gi)}}),n.hooks.add("after-tokenize",function(e){n.languages["markup-templating"].tokenizePlaceholders(e,"php")})}(Prism)},{}],12:[function(e,n,t){Prism.languages.python={comment:{pattern:/(^|[^\\])#.*/,lookbehind:!0},"string-interpolation":{pattern:/(?:f|rf|fr)(?:("""|''')[\s\S]+?\1|("|')(?:\\.|(?!\2)[^\\\r\n])*\2)/i,greedy:!0,inside:{interpolation:{pattern:/((?:^|[^{])(?:{{)*){(?!{)(?:[^{}]|{(?!{)(?:[^{}]|{(?!{)(?:[^{}])+})+})+}/,lookbehind:!0,inside:{"format-spec":{pattern:/(:)[^:(){}]+(?=}$)/,lookbehind:!0},"conversion-option":{pattern:/![sra](?=[:}]$)/,alias:"punctuation"},rest:null}},string:/[\s\S]+/}},"triple-quoted-string":{pattern:/(?:[rub]|rb|br)?("""|''')[\s\S]+?\1/i,greedy:!0,alias:"string"},string:{pattern:/(?:[rub]|rb|br)?("|')(?:\\.|(?!\1)[^\\\r\n])*\1/i,greedy:!0},"function":{pattern:/((?:^|\s)def[ \t]+)[a-zA-Z_]\w*(?=\s*\()/g,lookbehind:!0},"class-name":{pattern:/(\bclass\s+)\w+/i,lookbehind:!0},decorator:{pattern:/(^\s*)@\w+(?:\.\w+)*/im,lookbehind:!0,alias:["annotation","punctuation"],inside:{punctuation:/\./}},keyword:/\b(?:and|as|assert|async|await|break|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|nonlocal|not|or|pass|print|raise|return|try|while|with|yield)\b/,builtin:/\b(?:__import__|abs|all|any|apply|ascii|basestring|bin|bool|buffer|bytearray|bytes|callable|chr|classmethod|cmp|coerce|compile|complex|delattr|dict|dir|divmod|enumerate|eval|execfile|file|filter|float|format|frozenset|getattr|globals|hasattr|hash|help|hex|id|input|int|intern|isinstance|issubclass|iter|len|list|locals|long|map|max|memoryview|min|next|object|oct|open|ord|pow|property|range|raw_input|reduce|reload|repr|reversed|round|set|setattr|slice|sorted|staticmethod|str|sum|super|tuple|type|unichr|unicode|vars|xrange|zip)\b/,"boolean":/\b(?:True|False|None)\b/,number:/(?:\b(?=\d)|\B(?=\.))(?:0[bo])?(?:(?:\d|0x[\da-f])[\da-f]*\.?\d*|\.\d+)(?:e[+-]?\d+)?j?\b/i,operator:/[-+%=]=?|!=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/,punctuation:/[{}[\];(),.:]/},Prism.languages.python["string-interpolation"].inside.interpolation.inside.rest=Prism.languages.python,Prism.languages.py=Prism.languages.python},{}],13:[function(e,n,t){!function(e){e.languages.ruby=e.languages.extend("clike",{comment:[/#.*/,{pattern:/^=begin\s[\s\S]*?^=end/m,greedy:!0}],"class-name":{pattern:/(\b(?:class)\s+|\bcatch\s+\()[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:alias|and|BEGIN|begin|break|case|class|def|define_method|defined|do|each|else|elsif|END|end|ensure|extend|for|if|in|include|module|new|next|nil|not|or|prepend|protected|private|public|raise|redo|require|rescue|retry|return|self|super|then|throw|undef|unless|until|when|while|yield)\b/});var n={pattern:/#\{[^}]+\}/,inside:{delimiter:{pattern:/^#\{|\}$/,alias:"tag"},rest:e.languages.ruby}};delete e.languages.ruby["function"],e.languages.insertBefore("ruby","keyword",{regex:[{pattern:/%r([^a-zA-Z0-9\s{(\[<])(?:(?!\1)[^\\]|\\[\s\S])*\1[gim]{0,3}/,greedy:!0,inside:{interpolation:n}},{pattern:/%r\((?:[^()\\]|\\[\s\S])*\)[gim]{0,3}/,greedy:!0,inside:{interpolation:n}},{pattern:/%r\{(?:[^#{}\\]|#(?:\{[^}]+\})?|\\[\s\S])*\}[gim]{0,3}/,greedy:!0,inside:{interpolation:n}},{pattern:/%r\[(?:[^\[\]\\]|\\[\s\S])*\][gim]{0,3}/,greedy:!0,inside:{interpolation:n}},{pattern:/%r<(?:[^<>\\]|\\[\s\S])*>[gim]{0,3}/,greedy:!0,inside:{interpolation:n}},{pattern:/(^|[^/])\/(?!\/)(?:\[.+?]|\\.|[^/\\\r\n])+\/[gim]{0,3}(?=\s*(?:$|[\r\n,.;})]))/,lookbehind:!0,greedy:!0}],variable:/[@$]+[a-zA-Z_]\w*(?:[?!]|\b)/,symbol:{pattern:/(^|[^:]):[a-zA-Z_]\w*(?:[?!]|\b)/,lookbehind:!0},"method-definition":{pattern:/(\bdef\s+)[\w.]+/,lookbehind:!0,inside:{"function":/\w+$/,rest:e.languages.ruby}}}),e.languages.insertBefore("ruby","number",{builtin:/\b(?:Array|Bignum|Binding|Class|Continuation|Dir|Exception|FalseClass|File|Stat|Fixnum|Float|Hash|Integer|IO|MatchData|Method|Module|NilClass|Numeric|Object|Proc|Range|Regexp|String|Struct|TMS|Symbol|ThreadGroup|Thread|Time|TrueClass)\b/,constant:/\b[A-Z]\w*(?:[?!]|\b)/}),e.languages.ruby.string=[{pattern:/%[qQiIwWxs]?([^a-zA-Z0-9\s{(\[<])(?:(?!\1)[^\\]|\\[\s\S])*\1/,greedy:!0,inside:{interpolation:n}},{pattern:/%[qQiIwWxs]?\((?:[^()\\]|\\[\s\S])*\)/,greedy:!0,inside:{interpolation:n}},{pattern:/%[qQiIwWxs]?\{(?:[^#{}\\]|#(?:\{[^}]+\})?|\\[\s\S])*\}/,greedy:!0,inside:{interpolation:n}},{pattern:/%[qQiIwWxs]?\[(?:[^\[\]\\]|\\[\s\S])*\]/,greedy:!0,inside:{interpolation:n}},{pattern:/%[qQiIwWxs]?<(?:[^<>\\]|\\[\s\S])*>/,greedy:!0,inside:{interpolation:n}},{pattern:/("|')(?:#\{[^}]+\}|\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0,inside:{interpolation:n}}],e.languages.rb=e.languages.ruby}(Prism)},{}],14:[function(e,n,t){var a=e("prismjs/components/prism-core");e("prismjs/components/prism-clike"),e("prismjs/components/prism-markup-templating"),e("prismjs/components/prism-c"),e("prismjs/components/prism-cpp"),e("prismjs/components/prism-csharp"),e("prismjs/components/prism-css"),e("prismjs/components/prism-java"),e("prismjs/components/prism-javascript"),e("prismjs/components/prism-markup"),e("prismjs/components/prism-php"),e("prismjs/components/prism-python"),e("prismjs/components/prism-ruby"),n.exports={boltExport:a}},{"prismjs/components/prism-c":1,"prismjs/components/prism-clike":2,"prismjs/components/prism-core":3,"prismjs/components/prism-cpp":4,"prismjs/components/prism-csharp":5,"prismjs/components/prism-css":6,"prismjs/components/prism-java":7,"prismjs/components/prism-javascript":8,"prismjs/components/prism-markup":10,"prismjs/components/prism-markup-templating":9,"prismjs/components/prism-php":11,"prismjs/components/prism-python":12,"prismjs/components/prism-ruby":13}]},{},[14])(14)});var r=window.Prism;window.Prism=e}(undefined,h,b,undefined);var w=b.exports.boltExport,v=function(e){return f.Prism&&e.getParam("codesample_global_prismjs",!1,"boolean")?f.Prism:w},k=function(e){var n=e.selection?e.selection.getNode():null;return g(n)?d.some(n):d.none()},x=function(i){var e,t,n=i.getParam("codesample_languages")||[{text:"HTML/XML",value:"markup"},{text:"JavaScript",value:"javascript"},{text:"CSS",value:"css"},{text:"PHP",value:"php"},{text:"Ruby",value:"ruby"},{text:"Python",value:"python"},{text:"Java",value:"java"},{text:"C",value:"c"},{text:"C#",value:"csharp"},{text:"C++",value:"cpp"}],a=(0===(e=n).length?d.none():d.some(e[0])).fold(function(){return""},function(e){return e.value}),r=(t=a,k(i).fold(function(){return t},function(e){var n=e.className.match(/language-(\w+)/);return n?n[1]:t})),s=k(i).fold(function(){return""},function(e){return e.textContent});i.windowManager.open({title:"Insert/Edit Code Sample",size:"large",body:{type:"panel",items:[{type:"selectbox",name:"language",label:"Language",items:n},{type:"textarea",name:"code",label:"Code view"}]},buttons:[{type:"cancel",name:"cancel",text:"Cancel"},{type:"submit",name:"save",text:"Save",primary:!0}],initialData:{language:r,code:s},onSubmit:function(e){var n,t,a,r=e.getData();n=i,t=r.language,a=r.code,n.undoManager.transact(function(){var e=k(n);return a=p.DOM.encode(a),e.fold(function(){n.insertContent('
    '+a+"
    "),n.selection.select(n.$("#__new").removeAttr("id")[0])},function(e){n.dom.setAttrib(e,"class","language-"+t),e.innerHTML=a,v(n).highlightElement(e),n.selection.select(e)})}),e.close()}})},_=function(a){a.ui.registry.addToggleButton("codesample",{icon:"code-sample",tooltip:"Insert/edit code sample",onAction:function(){return x(a)},onSetup:function(t){var e=function(){var e,n;t.setActive((n=(e=a).selection.getStart(),e.dom.is(n,'pre[class*="language-"]')))};return a.on("NodeChange",e),function(){return a.off("NodeChange",e)}}}),a.ui.registry.addMenuItem("codesample",{text:"Code sample...",icon:"code-sample",onAction:function(){return x(a)}})};!function F(){r.add("codesample",function(n){var t,r,a;r=(t=n).$,t.on("PreProcess",function(e){r("pre[contenteditable=false]",e.node).filter(m(g)).each(function(e,n){var t=r(n),a=n.textContent;t.attr("class",r.trim(t.attr("class"))),t.removeAttr("contentEditable"),t.empty().append(r("").each(function(){this.textContent=a}))})}),t.on("SetContent",function(){var e=r("pre").filter(m(g)).filter(function(e,n){return"false"!==n.contentEditable});e.length&&t.undoManager.transact(function(){e.each(function(e,n){r(n).find("br").each(function(e,n){n.parentNode.replaceChild(t.getDoc().createTextNode("\n"),n)}),n.contentEditable="false",n.innerHTML=t.dom.encode(n.textContent),v(t).highlightElement(n),n.className=r.trim(n.className)})})}),_(n),(a=n).addCommand("codesample",function(){var e=a.selection.getNode();a.selection.isCollapsed()||g(e)?x(a):a.formatter.toggle("code")}),n.on("dblclick",function(e){g(e.target)&&x(n)})})}()}(window); \ No newline at end of file diff --git a/src/main/resources/static/layui-ext/tinymce/tinymce/plugins/colorpicker/plugin.js b/src/main/resources/static/layui-ext/tinymce/tinymce/plugins/colorpicker/plugin.js new file mode 100644 index 0000000..1236486 --- /dev/null +++ b/src/main/resources/static/layui-ext/tinymce/tinymce/plugins/colorpicker/plugin.js @@ -0,0 +1,22 @@ +/** + * 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/ + * + * Version: 5.4.2 (2020-08-17) + */ +(function (domGlobals) { + 'use strict'; + + var global = tinymce.util.Tools.resolve('tinymce.PluginManager'); + + function Plugin () { + global.add('colorpicker', function () { + domGlobals.console.warn('Color picker plugin is now built in to the core editor, please remove it from your editor configuration'); + }); + } + + Plugin(); + +}(window)); diff --git a/src/main/resources/static/layui-ext/tinymce/tinymce/plugins/colorpicker/plugin.min.js b/src/main/resources/static/layui-ext/tinymce/tinymce/plugins/colorpicker/plugin.min.js new file mode 100644 index 0000000..11cf140 --- /dev/null +++ b/src/main/resources/static/layui-ext/tinymce/tinymce/plugins/colorpicker/plugin.min.js @@ -0,0 +1,9 @@ +/** + * 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/ + * + * Version: 5.4.2 (2020-08-17) + */ +!function(o){"use strict";var i=tinymce.util.Tools.resolve("tinymce.PluginManager");!function n(){i.add("colorpicker",function(){o.console.warn("Color picker plugin is now built in to the core editor, please remove it from your editor configuration")})}()}(window); \ No newline at end of file diff --git a/src/main/resources/static/layui-ext/tinymce/tinymce/plugins/contextmenu/plugin.js b/src/main/resources/static/layui-ext/tinymce/tinymce/plugins/contextmenu/plugin.js new file mode 100644 index 0000000..827c83b --- /dev/null +++ b/src/main/resources/static/layui-ext/tinymce/tinymce/plugins/contextmenu/plugin.js @@ -0,0 +1,22 @@ +/** + * 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/ + * + * Version: 5.4.2 (2020-08-17) + */ +(function (domGlobals) { + 'use strict'; + + var global = tinymce.util.Tools.resolve('tinymce.PluginManager'); + + function Plugin () { + global.add('contextmenu', function () { + domGlobals.console.warn('Context menu plugin is now built in to the core editor, please remove it from your editor configuration'); + }); + } + + Plugin(); + +}(window)); diff --git a/src/main/resources/static/layui-ext/tinymce/tinymce/plugins/contextmenu/plugin.min.js b/src/main/resources/static/layui-ext/tinymce/tinymce/plugins/contextmenu/plugin.min.js new file mode 100644 index 0000000..ea22928 --- /dev/null +++ b/src/main/resources/static/layui-ext/tinymce/tinymce/plugins/contextmenu/plugin.min.js @@ -0,0 +1,9 @@ +/** + * 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/ + * + * Version: 5.4.2 (2020-08-17) + */ +!function(n){"use strict";var o=tinymce.util.Tools.resolve("tinymce.PluginManager");!function e(){o.add("contextmenu",function(){n.console.warn("Context menu plugin is now built in to the core editor, please remove it from your editor configuration")})}()}(window); \ No newline at end of file diff --git a/src/main/resources/static/layui-ext/tinymce/tinymce/plugins/directionality/plugin.js b/src/main/resources/static/layui-ext/tinymce/tinymce/plugins/directionality/plugin.js new file mode 100644 index 0000000..7563710 --- /dev/null +++ b/src/main/resources/static/layui-ext/tinymce/tinymce/plugins/directionality/plugin.js @@ -0,0 +1,314 @@ +/** + * 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/ + * + * Version: 5.4.2 (2020-08-17) + */ +(function (domGlobals) { + 'use strict'; + + var global = tinymce.util.Tools.resolve('tinymce.PluginManager'); + + var global$1 = tinymce.util.Tools.resolve('tinymce.util.Tools'); + + var setDir = function (editor, dir) { + var dom = editor.dom; + var curDir; + var blocks = editor.selection.getSelectedBlocks(); + if (blocks.length) { + curDir = dom.getAttrib(blocks[0], 'dir'); + global$1.each(blocks, function (block) { + if (!dom.getParent(block.parentNode, '*[dir="' + dir + '"]', dom.getRoot())) { + dom.setAttrib(block, 'dir', curDir !== dir ? dir : null); + } + }); + editor.nodeChanged(); + } + }; + + var register = function (editor) { + editor.addCommand('mceDirectionLTR', function () { + setDir(editor, 'ltr'); + }); + editor.addCommand('mceDirectionRTL', function () { + setDir(editor, 'rtl'); + }); + }; + + var noop = function () { + }; + var compose1 = function (fbc, fab) { + return function (a) { + return fbc(fab(a)); + }; + }; + var constant = function (value) { + return function () { + return value; + }; + }; + var never = constant(false); + var always = constant(true); + + var none = function () { + return NONE; + }; + var NONE = function () { + var eq = function (o) { + return o.isNone(); + }; + var call = function (thunk) { + return thunk(); + }; + var id = function (n) { + return n; + }; + var me = { + fold: function (n, _s) { + return n(); + }, + is: never, + isSome: never, + isNone: always, + getOr: id, + getOrThunk: call, + getOrDie: function (msg) { + throw new Error(msg || 'error: getOrDie called on none.'); + }, + getOrNull: constant(null), + getOrUndefined: constant(undefined), + or: id, + orThunk: call, + map: none, + each: noop, + bind: none, + exists: never, + forall: always, + filter: none, + equals: eq, + equals_: eq, + toArray: function () { + return []; + }, + toString: constant('none()') + }; + return me; + }(); + var some = function (a) { + var constant_a = constant(a); + var self = function () { + return me; + }; + var bind = function (f) { + return f(a); + }; + var me = { + fold: function (n, s) { + return s(a); + }, + is: function (v) { + return a === v; + }, + isSome: always, + isNone: never, + getOr: constant_a, + getOrThunk: constant_a, + getOrDie: constant_a, + getOrNull: constant_a, + getOrUndefined: constant_a, + or: self, + orThunk: self, + map: function (f) { + return some(f(a)); + }, + each: function (f) { + f(a); + }, + bind: bind, + exists: bind, + forall: bind, + filter: function (f) { + return f(a) ? me : NONE; + }, + toArray: function () { + return [a]; + }, + toString: function () { + return 'some(' + a + ')'; + }, + equals: function (o) { + return o.is(a); + }, + equals_: function (o, elementEq) { + return o.fold(never, function (b) { + return elementEq(a, b); + }); + } + }; + return me; + }; + var from = function (value) { + return value === null || value === undefined ? NONE : some(value); + }; + var Option = { + some: some, + none: none, + from: from + }; + + var fromHtml = function (html, scope) { + var doc = scope || domGlobals.document; + var div = doc.createElement('div'); + div.innerHTML = html; + if (!div.hasChildNodes() || div.childNodes.length > 1) { + domGlobals.console.error('HTML does not have a single root node', html); + throw new Error('HTML must have a single root node'); + } + return fromDom(div.childNodes[0]); + }; + var fromTag = function (tag, scope) { + var doc = scope || domGlobals.document; + var node = doc.createElement(tag); + return fromDom(node); + }; + var fromText = function (text, scope) { + var doc = scope || domGlobals.document; + var node = doc.createTextNode(text); + return fromDom(node); + }; + var fromDom = function (node) { + if (node === null || node === undefined) { + throw new Error('Node cannot be null or undefined'); + } + return { dom: constant(node) }; + }; + var fromPoint = function (docElm, x, y) { + var doc = docElm.dom(); + return Option.from(doc.elementFromPoint(x, y)).map(fromDom); + }; + var Element = { + fromHtml: fromHtml, + fromTag: fromTag, + fromText: fromText, + fromDom: fromDom, + fromPoint: fromPoint + }; + + var isSimpleType = function (type) { + return function (value) { + return typeof value === type; + }; + }; + var isFunction = isSimpleType('function'); + + var isSupported = function (dom) { + return dom.style !== undefined && isFunction(dom.style.getPropertyValue); + }; + + var Global = typeof domGlobals.window !== 'undefined' ? domGlobals.window : Function('return this;')(); + + var DOCUMENT = 9; + var DOCUMENT_FRAGMENT = 11; + var TEXT = 3; + + var type = function (element) { + return element.dom().nodeType; + }; + var isType = function (t) { + return function (element) { + return type(element) === t; + }; + }; + var isText = isType(TEXT); + var isDocument = isType(DOCUMENT); + var isDocumentFragment = isType(DOCUMENT_FRAGMENT); + + var owner = function (element) { + return Element.fromDom(element.dom().ownerDocument); + }; + var documentOrOwner = function (dos) { + return isDocument(dos) ? dos : owner(dos); + }; + + var isShadowRoot = function (dos) { + return isDocumentFragment(dos); + }; + var supported = isFunction(domGlobals.Element.prototype.attachShadow) && isFunction(domGlobals.Node.prototype.getRootNode); + var getRootNode = supported ? function (e) { + return Element.fromDom(e.dom().getRootNode()); + } : documentOrOwner; + var getShadowRoot = function (e) { + var r = getRootNode(e); + return isShadowRoot(r) ? Option.some(r) : Option.none(); + }; + var getShadowHost = function (e) { + return Element.fromDom(e.dom().host); + }; + + var inBody = function (element) { + var dom = isText(element) ? element.dom().parentNode : element.dom(); + if (dom === undefined || dom === null || dom.ownerDocument === null) { + return false; + } + return getShadowRoot(Element.fromDom(dom)).fold(function () { + return dom.ownerDocument.body.contains(dom); + }, compose1(inBody, getShadowHost)); + }; + + var get = function (element, property) { + var dom = element.dom(); + var styles = domGlobals.window.getComputedStyle(dom); + var r = styles.getPropertyValue(property); + return r === '' && !inBody(element) ? getUnsafeProperty(dom, property) : r; + }; + var getUnsafeProperty = function (dom, property) { + return isSupported(dom) ? dom.style.getPropertyValue(property) : ''; + }; + + var getDirection = function (element) { + return get(element, 'direction') === 'rtl' ? 'rtl' : 'ltr'; + }; + + var getNodeChangeHandler = function (editor, dir) { + return function (api) { + var nodeChangeHandler = function (e) { + var element = Element.fromDom(e.element); + api.setActive(getDirection(element) === dir); + }; + editor.on('NodeChange', nodeChangeHandler); + return function () { + return editor.off('NodeChange', nodeChangeHandler); + }; + }; + }; + var register$1 = function (editor) { + editor.ui.registry.addToggleButton('ltr', { + tooltip: 'Left to right', + icon: 'ltr', + onAction: function () { + return editor.execCommand('mceDirectionLTR'); + }, + onSetup: getNodeChangeHandler(editor, 'ltr') + }); + editor.ui.registry.addToggleButton('rtl', { + tooltip: 'Right to left', + icon: 'rtl', + onAction: function () { + return editor.execCommand('mceDirectionRTL'); + }, + onSetup: getNodeChangeHandler(editor, 'rtl') + }); + }; + + function Plugin () { + global.add('directionality', function (editor) { + register(editor); + register$1(editor); + }); + } + + Plugin(); + +}(window)); diff --git a/src/main/resources/static/layui-ext/tinymce/tinymce/plugins/directionality/plugin.min.js b/src/main/resources/static/layui-ext/tinymce/tinymce/plugins/directionality/plugin.min.js new file mode 100644 index 0000000..f0dccdc --- /dev/null +++ b/src/main/resources/static/layui-ext/tinymce/tinymce/plugins/directionality/plugin.min.js @@ -0,0 +1,9 @@ +/** + * 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/ + * + * Version: 5.4.2 (2020-08-17) + */ +!function(u){"use strict";var n,t,e,o,r=tinymce.util.Tools.resolve("tinymce.PluginManager"),i=tinymce.util.Tools.resolve("tinymce.util.Tools"),c=function(n,t){var e,o=n.dom,r=n.selection.getSelectedBlocks();r.length&&(e=o.getAttrib(r[0],"dir"),i.each(r,function(n){o.getParent(n.parentNode,'*[dir="'+t+'"]',o.getRoot())||o.setAttrib(n,"dir",e!==t?t:null)}),n.nodeChanged())},f=function(n){return function(){return n}},d=f(!1),l=f(!0),m=function(){return a},a=(n=function(n){return n.isNone()},{fold:function(n,t){return n()},is:d,isSome:d,isNone:l,getOr:e=function(n){return n},getOrThunk:t=function(n){return n()},getOrDie:function(n){throw new Error(n||"error: getOrDie called on none.")},getOrNull:f(null),getOrUndefined:f(undefined),or:e,orThunk:t,map:m,each:function(){},bind:m,exists:d,forall:l,filter:m,equals:n,equals_:n,toArray:function(){return[]},toString:f("none()")}),s=function(e){var n=f(e),t=function(){return r},o=function(n){return n(e)},r={fold:function(n,t){return t(e)},is:function(n){return e===n},isSome:l,isNone:d,getOr:n,getOrThunk:n,getOrDie:n,getOrNull:n,getOrUndefined:n,or:t,orThunk:t,map:function(n){return s(n(e))},each:function(n){n(e)},bind:o,exists:o,forall:o,filter:function(n){return n(e)?r:a},toArray:function(){return[e]},toString:function(){return"some("+e+")"},equals:function(n){return n.is(e)},equals_:function(n,t){return n.fold(d,function(n){return t(e,n)})}};return r},g={some:s,none:m,from:function(n){return null===n||n===undefined?a:s(n)}},h=function(n){if(null===n||n===undefined)throw new Error("Node cannot be null or undefined");return{dom:f(n)}},y={fromHtml:function(n,t){var e=(t||u.document).createElement("div");if(e.innerHTML=n,!e.hasChildNodes()||1= max; + }; + }); + for (var i = 0; i < list.length; i++) { + if (pattern.length === 0 || emojiMatches(list[i], lowerCasePattern)) { + matches.push({ + value: list[i].char, + text: list[i].title, + icon: list[i].char + }); + if (reachedLimit(matches.length)) { + break; + } + } + } + return matches; + }; + + var init = function (editor, database) { + editor.ui.registry.addAutocompleter('emoticons', { + ch: ':', + columns: 'auto', + minChars: 2, + fetch: function (pattern, maxResults) { + return database.waitForLoad().then(function () { + var candidates = database.listAll(); + return emojisFrom(candidates, pattern, Option.some(maxResults)); + }); + }, + onAction: function (autocompleteApi, rng, value) { + editor.selection.setRng(rng); + editor.insertContent(value); + autocompleteApi.hide(); + } + }); + }; + + var Cell = function (initial) { + var value = initial; + var get = function () { + return value; + }; + var set = function (v) { + value = v; + }; + return { + get: get, + set: set + }; + }; + + var last = function (fn, rate) { + var timer = null; + var cancel = function () { + if (timer !== null) { + domGlobals.clearTimeout(timer); + timer = null; + } + }; + var throttle = function () { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + if (timer !== null) { + domGlobals.clearTimeout(timer); + } + timer = domGlobals.setTimeout(function () { + fn.apply(null, args); + timer = null; + }, rate); + }; + return { + cancel: cancel, + throttle: throttle + }; + }; + + var insertEmoticon = function (editor, ch) { + editor.insertContent(ch); + }; + + var __assign = function () { + __assign = Object.assign || function __assign(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) + if (Object.prototype.hasOwnProperty.call(s, p)) + t[p] = s[p]; + } + return t; + }; + return __assign.apply(this, arguments); + }; + + var hasOwnProperty = Object.prototype.hasOwnProperty; + var shallow = function (old, nu) { + return nu; + }; + var baseMerge = function (merger) { + return function () { + var objects = new Array(arguments.length); + for (var i = 0; i < objects.length; i++) { + objects[i] = arguments[i]; + } + if (objects.length === 0) { + throw new Error('Can\'t merge zero objects'); + } + var ret = {}; + for (var j = 0; j < objects.length; j++) { + var curObject = objects[j]; + for (var key in curObject) { + if (hasOwnProperty.call(curObject, key)) { + ret[key] = merger(ret[key], curObject[key]); + } + } + } + return ret; + }; + }; + var merge = baseMerge(shallow); + + var keys = Object.keys; + var hasOwnProperty$1 = Object.hasOwnProperty; + var each = function (obj, f) { + var props = keys(obj); + for (var k = 0, len = props.length; k < len; k++) { + var i = props[k]; + var x = obj[i]; + f(x, i); + } + }; + var map$1 = function (obj, f) { + return tupleMap(obj, function (x, i) { + return { + k: i, + v: f(x, i) + }; + }); + }; + var tupleMap = function (obj, f) { + var r = {}; + each(obj, function (x, i) { + var tuple = f(x, i); + r[tuple.k] = tuple.v; + }); + return r; + }; + var has = function (obj, key) { + return hasOwnProperty$1.call(obj, key); + }; + + var global$1 = tinymce.util.Tools.resolve('tinymce.Resource'); + + var global$2 = tinymce.util.Tools.resolve('tinymce.util.Delay'); + + var global$3 = tinymce.util.Tools.resolve('tinymce.util.Promise'); + + var DEFAULT_ID = 'tinymce.plugins.emoticons'; + var getEmoticonDatabaseUrl = function (editor, pluginUrl) { + return editor.getParam('emoticons_database_url', pluginUrl + '/js/emojis' + editor.suffix + '.js'); + }; + var getEmoticonDatabaseId = function (editor) { + return editor.getParam('emoticons_database_id', DEFAULT_ID, 'string'); + }; + var getAppendedEmoticons = function (editor) { + return editor.getParam('emoticons_append', {}, 'object'); + }; + + var ALL_CATEGORY = 'All'; + var categoryNameMap = { + symbols: 'Symbols', + people: 'People', + animals_and_nature: 'Animals and Nature', + food_and_drink: 'Food and Drink', + activity: 'Activity', + travel_and_places: 'Travel and Places', + objects: 'Objects', + flags: 'Flags', + user: 'User Defined' + }; + var translateCategory = function (categories, name) { + return has(categories, name) ? categories[name] : name; + }; + var getUserDefinedEmoticons = function (editor) { + var userDefinedEmoticons = getAppendedEmoticons(editor); + return map$1(userDefinedEmoticons, function (value) { + return __assign({ + keywords: [], + category: 'user' + }, value); + }); + }; + var initDatabase = function (editor, databaseUrl, databaseId) { + var categories = Cell(Option.none()); + var all = Cell(Option.none()); + var processEmojis = function (emojis) { + var cats = {}; + var everything = []; + each(emojis, function (lib, title) { + var entry = { + title: title, + keywords: lib.keywords, + char: lib.char, + category: translateCategory(categoryNameMap, lib.category) + }; + var current = cats[entry.category] !== undefined ? cats[entry.category] : []; + cats[entry.category] = current.concat([entry]); + everything.push(entry); + }); + categories.set(Option.some(cats)); + all.set(Option.some(everything)); + }; + editor.on('init', function () { + global$1.load(databaseId, databaseUrl).then(function (emojis) { + var userEmojis = getUserDefinedEmoticons(editor); + processEmojis(merge(emojis, userEmojis)); + }, function (err) { + domGlobals.console.log('Failed to load emoticons: ' + err); + categories.set(Option.some({})); + all.set(Option.some([])); + }); + }); + var listCategory = function (category) { + if (category === ALL_CATEGORY) { + return listAll(); + } + return categories.get().bind(function (cats) { + return Option.from(cats[category]); + }).getOr([]); + }; + var listAll = function () { + return all.get().getOr([]); + }; + var listCategories = function () { + return [ALL_CATEGORY].concat(keys(categories.get().getOr({}))); + }; + var waitForLoad = function () { + if (hasLoaded()) { + return global$3.resolve(true); + } else { + return new global$3(function (resolve, reject) { + var numRetries = 15; + var interval = global$2.setInterval(function () { + if (hasLoaded()) { + global$2.clearInterval(interval); + resolve(true); + } else { + numRetries--; + if (numRetries < 0) { + domGlobals.console.log('Could not load emojis from url: ' + databaseUrl); + global$2.clearInterval(interval); + reject(false); + } + } + }, 100); + }); + } + }; + var hasLoaded = function () { + return categories.get().isSome() && all.get().isSome(); + }; + return { + listCategories: listCategories, + hasLoaded: hasLoaded, + waitForLoad: waitForLoad, + listAll: listAll, + listCategory: listCategory + }; + }; + + var patternName = 'pattern'; + var open = function (editor, database) { + var initialState = { + pattern: '', + results: emojisFrom(database.listAll(), '', Option.some(300)) + }; + var currentTab = Cell(ALL_CATEGORY); + var scan = function (dialogApi) { + var dialogData = dialogApi.getData(); + var category = currentTab.get(); + var candidates = database.listCategory(category); + var results = emojisFrom(candidates, dialogData[patternName], category === ALL_CATEGORY ? Option.some(300) : Option.none()); + dialogApi.setData({ results: results }); + }; + var updateFilter = last(function (dialogApi) { + scan(dialogApi); + }, 200); + var searchField = { + label: 'Search', + type: 'input', + name: patternName + }; + var resultsField = { + type: 'collection', + name: 'results' + }; + var getInitialState = function () { + var body = { + type: 'tabpanel', + tabs: map(database.listCategories(), function (cat) { + return { + title: cat, + name: cat, + items: [ + searchField, + resultsField + ] + }; + }) + }; + return { + title: 'Emoticons', + size: 'normal', + body: body, + initialData: initialState, + onTabChange: function (dialogApi, details) { + currentTab.set(details.newTabName); + updateFilter.throttle(dialogApi); + }, + onChange: updateFilter.throttle, + onAction: function (dialogApi, actionData) { + if (actionData.name === 'results') { + insertEmoticon(editor, actionData.value); + dialogApi.close(); + } + }, + buttons: [{ + type: 'cancel', + text: 'Close', + primary: true + }] + }; + }; + var dialogApi = editor.windowManager.open(getInitialState()); + dialogApi.focus(patternName); + if (!database.hasLoaded()) { + dialogApi.block('Loading emoticons...'); + database.waitForLoad().then(function () { + dialogApi.redial(getInitialState()); + updateFilter.throttle(dialogApi); + dialogApi.focus(patternName); + dialogApi.unblock(); + }).catch(function (_err) { + dialogApi.redial({ + title: 'Emoticons', + body: { + type: 'panel', + items: [{ + type: 'alertbanner', + level: 'error', + icon: 'warning', + text: '

    Could not load emoticons

    ' + }] + }, + buttons: [{ + type: 'cancel', + text: 'Close', + primary: true + }], + initialData: { + pattern: '', + results: [] + } + }); + dialogApi.focus(patternName); + dialogApi.unblock(); + }); + } + }; + + var register = function (editor, database) { + var onAction = function () { + return open(editor, database); + }; + editor.ui.registry.addButton('emoticons', { + tooltip: 'Emoticons', + icon: 'emoji', + onAction: onAction + }); + editor.ui.registry.addMenuItem('emoticons', { + text: 'Emoticons...', + icon: 'emoji', + onAction: onAction + }); + }; + + function Plugin () { + global.add('emoticons', function (editor, pluginUrl) { + var databaseUrl = getEmoticonDatabaseUrl(editor, pluginUrl); + var databaseId = getEmoticonDatabaseId(editor); + var database = initDatabase(editor, databaseUrl, databaseId); + register(editor, database); + init(editor, database); + }); + } + + Plugin(); + +}(window)); diff --git a/src/main/resources/static/layui-ext/tinymce/tinymce/plugins/emoticons/plugin.min.js b/src/main/resources/static/layui-ext/tinymce/tinymce/plugins/emoticons/plugin.min.js new file mode 100644 index 0000000..49bd7b0 --- /dev/null +++ b/src/main/resources/static/layui-ext/tinymce/tinymce/plugins/emoticons/plugin.min.js @@ -0,0 +1,9 @@ +/** + * 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/ + * + * Version: 5.4.2 (2020-08-17) + */ +!function(m){"use strict";var n,t,e,u,o=tinymce.util.Tools.resolve("tinymce.PluginManager"),i=function(n){return function(){return n}},a=i(!1),c=i(!0),r=function(){return l},l=(n=function(n){return n.isNone()},{fold:function(n,t){return n()},is:a,isSome:a,isNone:c,getOr:e=function(n){return n},getOrThunk:t=function(n){return n()},getOrDie:function(n){throw new Error(n||"error: getOrDie called on none.")},getOrNull:i(null),getOrUndefined:i(undefined),or:e,orThunk:t,map:r,each:function(){},bind:r,exists:a,forall:c,filter:r,equals:n,equals_:n,toArray:function(){return[]},toString:i("none()")}),s=function(e){var n=i(e),t=function(){return r},o=function(n){return n(e)},r={fold:function(n,t){return t(e)},is:function(n){return e===n},isSome:c,isNone:a,getOr:n,getOrThunk:n,getOrDie:n,getOrNull:n,getOrUndefined:n,or:t,orThunk:t,map:function(n){return s(n(e))},each:function(n){n(e)},bind:o,exists:o,forall:o,filter:function(n){return n(e)?r:l},toArray:function(){return[e]},toString:function(){return"some("+e+")"},equals:function(n){return n.is(e)},equals_:function(n,t){return n.fold(a,function(n){return t(e,n)})}};return r},g={some:s,none:r,from:function(n){return null===n||n===undefined?l:s(n)}},f=function(n,t){return-1!==n.indexOf(t)},d=function(n,t){return f(n.title.toLowerCase(),t)||function(n,t){for(var e=0,o=n.length;eCould not load emoticons

    "}]},buttons:[{type:"cancel",text:"Close",primary:!0}],initialData:{pattern:"",results:[]}}),f.focus(S),f.unblock()}))};!function E(){o.add("emoticons",function(n,t){var e,o,r,i,u,a,c,l=(o=t,(e=n).getParam("emoticons_database_url",o+"/js/emojis"+e.suffix+".js")),s=n.getParam("emoticons_database_id","tinymce.plugins.emoticons","string"),f=L(n,l,s);i=f,u=function(){return N(r,i)},(r=n).ui.registry.addButton("emoticons",{tooltip:"Emoticons",icon:"emoji",onAction:u}),r.ui.registry.addMenuItem("emoticons",{text:"Emoticons...",icon:"emoji",onAction:u}),c=f,(a=n).ui.registry.addAutocompleter("emoticons",{ch:":",columns:"auto",minChars:2,fetch:function(t,e){return c.waitForLoad().then(function(){var n=c.listAll();return y(n,t,g.some(e))})},onAction:function(n,t,e){a.selection.setRng(t),a.insertContent(e),n.hide()}})})}()}(window); \ No newline at end of file diff --git a/src/main/resources/static/layui-ext/tinymce/tinymce/plugins/fullpage/plugin.js b/src/main/resources/static/layui-ext/tinymce/tinymce/plugins/fullpage/plugin.js new file mode 100644 index 0000000..7483de6 --- /dev/null +++ b/src/main/resources/static/layui-ext/tinymce/tinymce/plugins/fullpage/plugin.js @@ -0,0 +1,544 @@ +/** + * 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/ + * + * Version: 5.4.2 (2020-08-17) + */ +(function (domGlobals) { + 'use strict'; + + var Cell = function (initial) { + var value = initial; + var get = function () { + return value; + }; + var set = function (v) { + value = v; + }; + return { + get: get, + set: set + }; + }; + + var global = tinymce.util.Tools.resolve('tinymce.PluginManager'); + + var __assign = function () { + __assign = Object.assign || function __assign(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) + if (Object.prototype.hasOwnProperty.call(s, p)) + t[p] = s[p]; + } + return t; + }; + return __assign.apply(this, arguments); + }; + + var global$1 = tinymce.util.Tools.resolve('tinymce.util.Tools'); + + var global$2 = tinymce.util.Tools.resolve('tinymce.html.DomParser'); + + var global$3 = tinymce.util.Tools.resolve('tinymce.html.Node'); + + var global$4 = tinymce.util.Tools.resolve('tinymce.html.Serializer'); + + var shouldHideInSourceView = function (editor) { + return editor.getParam('fullpage_hide_in_source_view'); + }; + var getDefaultXmlPi = function (editor) { + return editor.getParam('fullpage_default_xml_pi'); + }; + var getDefaultEncoding = function (editor) { + return editor.getParam('fullpage_default_encoding'); + }; + var getDefaultFontFamily = function (editor) { + return editor.getParam('fullpage_default_font_family'); + }; + var getDefaultFontSize = function (editor) { + return editor.getParam('fullpage_default_font_size'); + }; + var getDefaultTextColor = function (editor) { + return editor.getParam('fullpage_default_text_color'); + }; + var getDefaultTitle = function (editor) { + return editor.getParam('fullpage_default_title'); + }; + var getDefaultDocType = function (editor) { + return editor.getParam('fullpage_default_doctype', ''); + }; + var getProtect = function (editor) { + return editor.getParam('protect'); + }; + + var parseHeader = function (head) { + return global$2({ + validate: false, + root_name: '#document' + }).parse(head, { format: 'xhtml' }); + }; + var htmlToData = function (editor, head) { + var headerFragment = parseHeader(head); + var data = {}; + var elm, matches; + function getAttr(elm, name) { + var value = elm.attr(name); + return value || ''; + } + data.fontface = getDefaultFontFamily(editor); + data.fontsize = getDefaultFontSize(editor); + elm = headerFragment.firstChild; + if (elm.type === 7) { + data.xml_pi = true; + matches = /encoding="([^"]+)"/.exec(elm.value); + if (matches) { + data.docencoding = matches[1]; + } + } + elm = headerFragment.getAll('#doctype')[0]; + if (elm) { + data.doctype = ''; + } + elm = headerFragment.getAll('title')[0]; + if (elm && elm.firstChild) { + data.title = elm.firstChild.value; + } + global$1.each(headerFragment.getAll('meta'), function (meta) { + var name = meta.attr('name'); + var httpEquiv = meta.attr('http-equiv'); + var matches; + if (name) { + data[name.toLowerCase()] = meta.attr('content'); + } else if (httpEquiv === 'Content-Type') { + matches = /charset\s*=\s*(.*)\s*/gi.exec(meta.attr('content')); + if (matches) { + data.docencoding = matches[1]; + } + } + }); + elm = headerFragment.getAll('html')[0]; + if (elm) { + data.langcode = getAttr(elm, 'lang') || getAttr(elm, 'xml:lang'); + } + data.stylesheets = []; + global$1.each(headerFragment.getAll('link'), function (link) { + if (link.attr('rel') === 'stylesheet') { + data.stylesheets.push(link.attr('href')); + } + }); + elm = headerFragment.getAll('body')[0]; + if (elm) { + data.langdir = getAttr(elm, 'dir'); + data.style = getAttr(elm, 'style'); + data.visited_color = getAttr(elm, 'vlink'); + data.link_color = getAttr(elm, 'link'); + data.active_color = getAttr(elm, 'alink'); + } + return data; + }; + var dataToHtml = function (editor, data, head) { + var headElement, elm, value; + var dom = editor.dom; + function setAttr(elm, name, value) { + elm.attr(name, value ? value : undefined); + } + function addHeadNode(node) { + if (headElement.firstChild) { + headElement.insert(node, headElement.firstChild); + } else { + headElement.append(node); + } + } + var headerFragment = parseHeader(head); + headElement = headerFragment.getAll('head')[0]; + if (!headElement) { + elm = headerFragment.getAll('html')[0]; + headElement = new global$3('head', 1); + if (elm.firstChild) { + elm.insert(headElement, elm.firstChild, true); + } else { + elm.append(headElement); + } + } + elm = headerFragment.firstChild; + if (data.xml_pi) { + value = 'version="1.0"'; + if (data.docencoding) { + value += ' encoding="' + data.docencoding + '"'; + } + if (elm.type !== 7) { + elm = new global$3('xml', 7); + headerFragment.insert(elm, headerFragment.firstChild, true); + } + elm.value = value; + } else if (elm && elm.type === 7) { + elm.remove(); + } + elm = headerFragment.getAll('#doctype')[0]; + if (data.doctype) { + if (!elm) { + elm = new global$3('#doctype', 10); + if (data.xml_pi) { + headerFragment.insert(elm, headerFragment.firstChild); + } else { + addHeadNode(elm); + } + } + elm.value = data.doctype.substring(9, data.doctype.length - 1); + } else if (elm) { + elm.remove(); + } + elm = null; + global$1.each(headerFragment.getAll('meta'), function (meta) { + if (meta.attr('http-equiv') === 'Content-Type') { + elm = meta; + } + }); + if (data.docencoding) { + if (!elm) { + elm = new global$3('meta', 1); + elm.attr('http-equiv', 'Content-Type'); + elm.shortEnded = true; + addHeadNode(elm); + } + elm.attr('content', 'text/html; charset=' + data.docencoding); + } else if (elm) { + elm.remove(); + } + elm = headerFragment.getAll('title')[0]; + if (data.title) { + if (!elm) { + elm = new global$3('title', 1); + addHeadNode(elm); + } else { + elm.empty(); + } + elm.append(new global$3('#text', 3)).value = data.title; + } else if (elm) { + elm.remove(); + } + global$1.each('keywords,description,author,copyright,robots'.split(','), function (name) { + var nodes = headerFragment.getAll('meta'); + var i, meta; + var value = data[name]; + for (i = 0; i < nodes.length; i++) { + meta = nodes[i]; + if (meta.attr('name') === name) { + if (value) { + meta.attr('content', value); + } else { + meta.remove(); + } + return; + } + } + if (value) { + elm = new global$3('meta', 1); + elm.attr('name', name); + elm.attr('content', value); + elm.shortEnded = true; + addHeadNode(elm); + } + }); + var currentStyleSheetsMap = {}; + global$1.each(headerFragment.getAll('link'), function (stylesheet) { + if (stylesheet.attr('rel') === 'stylesheet') { + currentStyleSheetsMap[stylesheet.attr('href')] = stylesheet; + } + }); + global$1.each(data.stylesheets, function (stylesheet) { + if (!currentStyleSheetsMap[stylesheet]) { + elm = new global$3('link', 1); + elm.attr({ + rel: 'stylesheet', + text: 'text/css', + href: stylesheet + }); + elm.shortEnded = true; + addHeadNode(elm); + } + delete currentStyleSheetsMap[stylesheet]; + }); + global$1.each(currentStyleSheetsMap, function (stylesheet) { + stylesheet.remove(); + }); + elm = headerFragment.getAll('body')[0]; + if (elm) { + setAttr(elm, 'dir', data.langdir); + setAttr(elm, 'style', data.style); + setAttr(elm, 'vlink', data.visited_color); + setAttr(elm, 'link', data.link_color); + setAttr(elm, 'alink', data.active_color); + dom.setAttribs(editor.getBody(), { + style: data.style, + dir: data.dir, + vLink: data.visited_color, + link: data.link_color, + aLink: data.active_color + }); + } + elm = headerFragment.getAll('html')[0]; + if (elm) { + setAttr(elm, 'lang', data.langcode); + setAttr(elm, 'xml:lang', data.langcode); + } + if (!headElement.firstChild) { + headElement.remove(); + } + var html = global$4({ + validate: false, + indent: true, + indent_before: 'head,html,body,meta,title,script,link,style', + indent_after: 'head,html,body,meta,title,script,link,style' + }).serialize(headerFragment); + return html.substring(0, html.indexOf('')); + }; + + var open = function (editor, headState) { + var data = htmlToData(editor, headState.get()); + var defaultData = { + title: '', + keywords: '', + description: '', + robots: '', + author: '', + docencoding: '' + }; + var initialData = __assign(__assign({}, defaultData), data); + editor.windowManager.open({ + title: 'Metadata and Document Properties', + size: 'normal', + body: { + type: 'panel', + items: [ + { + name: 'title', + type: 'input', + label: 'Title' + }, + { + name: 'keywords', + type: 'input', + label: 'Keywords' + }, + { + name: 'description', + type: 'input', + label: 'Description' + }, + { + name: 'robots', + type: 'input', + label: 'Robots' + }, + { + name: 'author', + type: 'input', + label: 'Author' + }, + { + name: 'docencoding', + type: 'input', + label: 'Encoding' + } + ] + }, + buttons: [ + { + type: 'cancel', + name: 'cancel', + text: 'Cancel' + }, + { + type: 'submit', + name: 'save', + text: 'Save', + primary: true + } + ], + initialData: initialData, + onSubmit: function (api) { + var nuData = api.getData(); + var headHtml = dataToHtml(editor, global$1.extend(data, nuData), headState.get()); + headState.set(headHtml); + api.close(); + } + }); + }; + + var register = function (editor, headState) { + editor.addCommand('mceFullPageProperties', function () { + open(editor, headState); + }); + }; + + var protectHtml = function (protect, html) { + global$1.each(protect, function (pattern) { + html = html.replace(pattern, function (str) { + return ''; + }); + }); + return html; + }; + var unprotectHtml = function (html) { + return html.replace(//g, function (a, m) { + return unescape(m); + }); + }; + + var each = global$1.each; + var low = function (s) { + return s.replace(/<\/?[A-Z]+/g, function (a) { + return a.toLowerCase(); + }); + }; + var handleSetContent = function (editor, headState, footState, evt) { + var startPos, endPos, content, styles = ''; + var dom = editor.dom; + if (evt.selection) { + return; + } + content = protectHtml(getProtect(editor), evt.content); + if (evt.format === 'raw' && headState.get()) { + return; + } + if (evt.source_view && shouldHideInSourceView(editor)) { + return; + } + if (content.length === 0 && !evt.source_view) { + content = global$1.trim(headState.get()) + '\n' + global$1.trim(content) + '\n' + global$1.trim(footState.get()); + } + content = content.replace(/<(\/?)BODY/gi, '<$1body'); + startPos = content.indexOf('', startPos); + headState.set(low(content.substring(0, startPos + 1))); + endPos = content.indexOf('\n'); + } + var headerFragment = parseHeader(headState.get()); + each(headerFragment.getAll('style'), function (node) { + if (node.firstChild) { + styles += node.firstChild.value; + } + }); + var bodyElm = headerFragment.getAll('body')[0]; + if (bodyElm) { + dom.setAttribs(editor.getBody(), { + style: bodyElm.attr('style') || '', + dir: bodyElm.attr('dir') || '', + vLink: bodyElm.attr('vlink') || '', + link: bodyElm.attr('link') || '', + aLink: bodyElm.attr('alink') || '' + }); + } + dom.remove('fullpage_styles'); + var headElm = editor.getDoc().getElementsByTagName('head')[0]; + if (styles) { + var styleElm = dom.add(headElm, 'style', { id: 'fullpage_styles' }); + styleElm.appendChild(domGlobals.document.createTextNode(styles)); + } + var currentStyleSheetsMap = {}; + global$1.each(headElm.getElementsByTagName('link'), function (stylesheet) { + if (stylesheet.rel === 'stylesheet' && stylesheet.getAttribute('data-mce-fullpage')) { + currentStyleSheetsMap[stylesheet.href] = stylesheet; + } + }); + global$1.each(headerFragment.getAll('link'), function (stylesheet) { + var href = stylesheet.attr('href'); + if (!href) { + return true; + } + if (!currentStyleSheetsMap[href] && stylesheet.attr('rel') === 'stylesheet') { + dom.add(headElm, 'link', { + 'rel': 'stylesheet', + 'text': 'text/css', + href: href, + 'data-mce-fullpage': '1' + }); + } + delete currentStyleSheetsMap[href]; + }); + global$1.each(currentStyleSheetsMap, function (stylesheet) { + stylesheet.parentNode.removeChild(stylesheet); + }); + }; + var getDefaultHeader = function (editor) { + var header = '', value, styles = ''; + if (getDefaultXmlPi(editor)) { + var piEncoding = getDefaultEncoding(editor); + header += '\n'; + } + header += getDefaultDocType(editor); + header += '\n\n\n'; + if (value = getDefaultTitle(editor)) { + header += '' + value + '\n'; + } + if (value = getDefaultEncoding(editor)) { + header += '\n'; + } + if (value = getDefaultFontFamily(editor)) { + styles += 'font-family: ' + value + ';'; + } + if (value = getDefaultFontSize(editor)) { + styles += 'font-size: ' + value + ';'; + } + if (value = getDefaultTextColor(editor)) { + styles += 'color: ' + value + ';'; + } + header += '\n\n'; + return header; + }; + var handleGetContent = function (editor, head, foot, evt) { + if (!evt.selection && (!evt.source_view || !shouldHideInSourceView(editor))) { + evt.content = unprotectHtml(global$1.trim(head) + '\n' + global$1.trim(evt.content) + '\n' + global$1.trim(foot)); + } + }; + var setup = function (editor, headState, footState) { + editor.on('BeforeSetContent', function (evt) { + handleSetContent(editor, headState, footState, evt); + }); + editor.on('GetContent', function (evt) { + handleGetContent(editor, headState.get(), footState.get(), evt); + }); + }; + + var register$1 = function (editor) { + editor.ui.registry.addButton('fullpage', { + tooltip: 'Metadata and document properties', + icon: 'document-properties', + onAction: function () { + editor.execCommand('mceFullPageProperties'); + } + }); + editor.ui.registry.addMenuItem('fullpage', { + text: 'Metadata and document properties', + icon: 'document-properties', + onAction: function () { + editor.execCommand('mceFullPageProperties'); + } + }); + }; + + function Plugin () { + global.add('fullpage', function (editor) { + var headState = Cell(''), footState = Cell(''); + register(editor, headState); + register$1(editor); + setup(editor, headState, footState); + }); + } + + Plugin(); + +}(window)); diff --git a/src/main/resources/static/layui-ext/tinymce/tinymce/plugins/fullpage/plugin.min.js b/src/main/resources/static/layui-ext/tinymce/tinymce/plugins/fullpage/plugin.min.js new file mode 100644 index 0000000..478e16e --- /dev/null +++ b/src/main/resources/static/layui-ext/tinymce/tinymce/plugins/fullpage/plugin.min.js @@ -0,0 +1,9 @@ +/** + * 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/ + * + * Version: 5.4.2 (2020-08-17) + */ +!function(p){"use strict";var s=function(e){var t=e;return{get:function(){return t},set:function(e){t=e}}},e=tinymce.util.Tools.resolve("tinymce.PluginManager"),u=function(){return(u=Object.assign||function(e){for(var t,n=1,l=arguments.length;n"),(n=o.getAll("title")[0])&&n.firstChild&&(a.title=n.firstChild.value),y.each(o.getAll("meta"),function(e){var t,n=e.attr("name"),l=e.attr("http-equiv");n?a[n.toLowerCase()]=e.attr("content"):"Content-Type"===l&&(t=/charset\s*=\s*(.*)\s*/gi.exec(e.attr("content")))&&(a.docencoding=t[1])}),(n=o.getAll("html")[0])&&(a.langcode=s(n,"lang")||s(n,"xml:lang")),a.stylesheets=[],y.each(o.getAll("link"),function(e){"stylesheet"===e.attr("rel")&&a.stylesheets.push(e.attr("href"))}),(n=o.getAll("body")[0])&&(a.langdir=s(n,"dir"),a.style=s(n,"style"),a.visited_color=s(n,"vlink"),a.link_color=s(n,"link"),a.active_color=s(n,"alink")),a);function s(e,t){return e.attr(t)||""}var d=u(u({},{title:"",keywords:"",description:"",robots:"",author:"",docencoding:""}),c);l.windowManager.open({title:"Metadata and Document Properties",size:"normal",body:{type:"panel",items:[{name:"title",type:"input",label:"Title"},{name:"keywords",type:"input",label:"Keywords"},{name:"description",type:"input",label:"Description"},{name:"robots",type:"input",label:"Robots"},{name:"author",type:"input",label:"Author"},{name:"docencoding",type:"input",label:"Encoding"}]},buttons:[{type:"cancel",name:"cancel",text:"Cancel"},{type:"submit",name:"save",text:"Save",primary:!0}],initialData:d,onSubmit:function(e){var t=e.getData(),n=function(e,r,t){var n,o,l,i=e.dom;function a(e,t,n){e.attr(t,n||undefined)}function c(e){n.firstChild?n.insert(e,n.firstChild):n.append(e)}var s=_(t);(n=s.getAll("head")[0])||(o=s.getAll("html")[0],n=new m("head",1),o.firstChild?o.insert(n,o.firstChild,!0):o.append(n)),o=s.firstChild,r.xml_pi?(l='version="1.0"',r.docencoding&&(l+=' encoding="'+r.docencoding+'"'),7!==o.type&&(o=new m("xml",7),s.insert(o,s.firstChild,!0)),o.value=l):o&&7===o.type&&o.remove(),o=s.getAll("#doctype")[0],r.doctype?(o||(o=new m("#doctype",10),r.xml_pi?s.insert(o,s.firstChild):c(o)),o.value=r.doctype.substring(9,r.doctype.length-1)):o&&o.remove(),o=null,y.each(s.getAll("meta"),function(e){"Content-Type"===e.attr("http-equiv")&&(o=e)}),r.docencoding?(o||((o=new m("meta",1)).attr("http-equiv","Content-Type"),o.shortEnded=!0,c(o)),o.attr("content","text/html; charset="+r.docencoding)):o&&o.remove(),o=s.getAll("title")[0],r.title?(o?o.empty():c(o=new m("title",1)),o.append(new m("#text",3)).value=r.title):o&&o.remove(),y.each("keywords,description,author,copyright,robots".split(","),function(e){var t,n,l=s.getAll("meta"),i=r[e];for(t=0;t"))}(l,y.extend(c,t),i.get());i.set(n),e.close()}})},b=y.each,x=function(e){return e.replace(/<\/?[A-Z]+/g,function(e){return e.toLowerCase()})},k=function(e,t,n,l){var i,r,o,a,c,s="",d=e.dom;if(!l.selection&&(a=e.getParam("protect"),c=l.content,y.each(a,function(e){c=c.replace(e,function(e){return"\x3c!--mce:protected "+escape(e)+"--\x3e"})}),o=c,!("raw"===l.format&&t.get()||l.source_view&&h(e)))){0!==o.length||l.source_view||(o=y.trim(t.get())+"\n"+y.trim(o)+"\n"+y.trim(n.get())),-1!==(i=(o=o.replace(/<(\/?)BODY/gi,"<$1body")).indexOf("",i),t.set(x(o.substring(0,i+1))),-1===(r=o.indexOf("\n"));var u=_(t.get());b(u.getAll("style"),function(e){e.firstChild&&(s+=e.firstChild.value)});var m=u.getAll("body")[0];m&&d.setAttribs(e.getBody(),{style:m.attr("style")||"",dir:m.attr("dir")||"",vLink:m.attr("vlink")||"",link:m.attr("link")||"",aLink:m.attr("alink")||""}),d.remove("fullpage_styles");var f=e.getDoc().getElementsByTagName("head")[0];if(s)d.add(f,"style",{id:"fullpage_styles"}).appendChild(p.document.createTextNode(s));var g={};y.each(f.getElementsByTagName("link"),function(e){"stylesheet"===e.rel&&e.getAttribute("data-mce-fullpage")&&(g[e.href]=e)}),y.each(u.getAll("link"),function(e){var t=e.attr("href");if(!t)return!0;g[t]||"stylesheet"!==e.attr("rel")||d.add(f,"link",{rel:"stylesheet",text:"text/css",href:t,"data-mce-fullpage":"1"}),delete g[t]}),y.each(g,function(e){e.parentNode.removeChild(e)})}},C=function(e){var t,n="",l="";if(e.getParam("fullpage_default_xml_pi")){var i=r(e);n+='\n'}return n+=e.getParam("fullpage_default_doctype",""),n+="\n\n\n",(t=e.getParam("fullpage_default_title"))&&(n+=""+t+"\n"),(t=r(e))&&(n+='\n'),(t=g(e))&&(l+="font-family: "+t+";"),(t=v(e))&&(l+="font-size: "+t+";"),(t=e.getParam("fullpage_default_text_color"))&&(l+="color: "+t+";"),n+="\n\n"},A=function(e,t,n,l){l.selection||l.source_view&&h(e)||(l.content=(y.trim(t)+"\n"+y.trim(l.content)+"\n"+y.trim(n)).replace(//g,function(e,t){return unescape(t)}))};!function n(){e.add("fullpage",function(e){var t,n,l,i,r,o,a=s(""),c=s("");n=a,(t=e).addCommand("mceFullPageProperties",function(){d(t,n)}),(l=e).ui.registry.addButton("fullpage",{tooltip:"Metadata and document properties",icon:"document-properties",onAction:function(){l.execCommand("mceFullPageProperties")}}),l.ui.registry.addMenuItem("fullpage",{text:"Metadata and document properties",icon:"document-properties",onAction:function(){l.execCommand("mceFullPageProperties")}}),r=a,o=c,(i=e).on("BeforeSetContent",function(e){k(i,r,o,e)}),i.on("GetContent",function(e){A(i,r.get(),o.get(),e)})})}()}(window); \ No newline at end of file diff --git a/src/main/resources/static/layui-ext/tinymce/tinymce/plugins/fullscreen/plugin.js b/src/main/resources/static/layui-ext/tinymce/tinymce/plugins/fullscreen/plugin.js new file mode 100644 index 0000000..3748ce8 --- /dev/null +++ b/src/main/resources/static/layui-ext/tinymce/tinymce/plugins/fullscreen/plugin.js @@ -0,0 +1,851 @@ +/** + * 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/ + * + * Version: 5.4.2 (2020-08-17) + */ +(function (domGlobals) { + 'use strict'; + + var Cell = function (initial) { + var value = initial; + var get = function () { + return value; + }; + var set = function (v) { + value = v; + }; + return { + get: get, + set: set + }; + }; + + var global = tinymce.util.Tools.resolve('tinymce.PluginManager'); + + var get = function (fullscreenState) { + return { + isFullscreen: function () { + return fullscreenState.get() !== null; + } + }; + }; + + var noop = function () { + }; + var compose = function (fa, fb) { + return function () { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + return fa(fb.apply(null, args)); + }; + }; + var compose1 = function (fbc, fab) { + return function (a) { + return fbc(fab(a)); + }; + }; + var constant = function (value) { + return function () { + return value; + }; + }; + var never = constant(false); + var always = constant(true); + + var none = function () { + return NONE; + }; + var NONE = function () { + var eq = function (o) { + return o.isNone(); + }; + var call = function (thunk) { + return thunk(); + }; + var id = function (n) { + return n; + }; + var me = { + fold: function (n, _s) { + return n(); + }, + is: never, + isSome: never, + isNone: always, + getOr: id, + getOrThunk: call, + getOrDie: function (msg) { + throw new Error(msg || 'error: getOrDie called on none.'); + }, + getOrNull: constant(null), + getOrUndefined: constant(undefined), + or: id, + orThunk: call, + map: none, + each: noop, + bind: none, + exists: never, + forall: always, + filter: none, + equals: eq, + equals_: eq, + toArray: function () { + return []; + }, + toString: constant('none()') + }; + return me; + }(); + var some = function (a) { + var constant_a = constant(a); + var self = function () { + return me; + }; + var bind = function (f) { + return f(a); + }; + var me = { + fold: function (n, s) { + return s(a); + }, + is: function (v) { + return a === v; + }, + isSome: always, + isNone: never, + getOr: constant_a, + getOrThunk: constant_a, + getOrDie: constant_a, + getOrNull: constant_a, + getOrUndefined: constant_a, + or: self, + orThunk: self, + map: function (f) { + return some(f(a)); + }, + each: function (f) { + f(a); + }, + bind: bind, + exists: bind, + forall: bind, + filter: function (f) { + return f(a) ? me : NONE; + }, + toArray: function () { + return [a]; + }, + toString: function () { + return 'some(' + a + ')'; + }, + equals: function (o) { + return o.is(a); + }, + equals_: function (o, elementEq) { + return o.fold(never, function (b) { + return elementEq(a, b); + }); + } + }; + return me; + }; + var from = function (value) { + return value === null || value === undefined ? NONE : some(value); + }; + var Option = { + some: some, + none: none, + from: from + }; + + var revocable = function (doRevoke) { + var subject = Cell(Option.none()); + var revoke = function () { + subject.get().each(doRevoke); + }; + var clear = function () { + revoke(); + subject.set(Option.none()); + }; + var set = function (s) { + revoke(); + subject.set(Option.some(s)); + }; + var isSet = function () { + return subject.get().isSome(); + }; + return { + clear: clear, + isSet: isSet, + set: set + }; + }; + var unbindable = function () { + return revocable(function (s) { + s.unbind(); + }); + }; + var value = function () { + var subject = Cell(Option.none()); + var clear = function () { + subject.set(Option.none()); + }; + var set = function (s) { + subject.set(Option.some(s)); + }; + var on = function (f) { + subject.get().each(f); + }; + var isSet = function () { + return subject.get().isSome(); + }; + return { + clear: clear, + set: set, + isSet: isSet, + on: on + }; + }; + + var typeOf = function (x) { + var t = typeof x; + if (x === null) { + return 'null'; + } else if (t === 'object' && (Array.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'Array')) { + return 'array'; + } else if (t === 'object' && (String.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'String')) { + return 'string'; + } else { + return t; + } + }; + var isType = function (type) { + return function (value) { + return typeOf(value) === type; + }; + }; + var isSimpleType = function (type) { + return function (value) { + return typeof value === type; + }; + }; + var isString = isType('string'); + var isArray = isType('array'); + var isBoolean = isSimpleType('boolean'); + var isNullable = function (a) { + return a === null || a === undefined; + }; + var isNonNullable = function (a) { + return !isNullable(a); + }; + var isFunction = isSimpleType('function'); + var isNumber = isSimpleType('number'); + + var nativePush = Array.prototype.push; + var map = function (xs, f) { + var len = xs.length; + var r = new Array(len); + for (var i = 0; i < len; i++) { + var x = xs[i]; + r[i] = f(x, i); + } + return r; + }; + var each = function (xs, f) { + for (var i = 0, len = xs.length; i < len; i++) { + var x = xs[i]; + f(x, i); + } + }; + var filter = function (xs, pred) { + var r = []; + for (var i = 0, len = xs.length; i < len; i++) { + var x = xs[i]; + if (pred(x, i)) { + r.push(x); + } + } + return r; + }; + var flatten = function (xs) { + var r = []; + for (var i = 0, len = xs.length; i < len; ++i) { + if (!isArray(xs[i])) { + throw new Error('Arr.flatten item ' + i + ' was not an array, input: ' + xs); + } + nativePush.apply(r, xs[i]); + } + return r; + }; + var bind = function (xs, f) { + return flatten(map(xs, f)); + }; + var head = function (xs) { + return xs.length === 0 ? Option.none() : Option.some(xs[0]); + }; + + var keys = Object.keys; + var each$1 = function (obj, f) { + var props = keys(obj); + for (var k = 0, len = props.length; k < len; k++) { + var i = props[k]; + var x = obj[i]; + f(x, i); + } + }; + + var isSupported = function (dom) { + return dom.style !== undefined && isFunction(dom.style.getPropertyValue); + }; + + var fromHtml = function (html, scope) { + var doc = scope || domGlobals.document; + var div = doc.createElement('div'); + div.innerHTML = html; + if (!div.hasChildNodes() || div.childNodes.length > 1) { + domGlobals.console.error('HTML does not have a single root node', html); + throw new Error('HTML must have a single root node'); + } + return fromDom(div.childNodes[0]); + }; + var fromTag = function (tag, scope) { + var doc = scope || domGlobals.document; + var node = doc.createElement(tag); + return fromDom(node); + }; + var fromText = function (text, scope) { + var doc = scope || domGlobals.document; + var node = doc.createTextNode(text); + return fromDom(node); + }; + var fromDom = function (node) { + if (node === null || node === undefined) { + throw new Error('Node cannot be null or undefined'); + } + return { dom: constant(node) }; + }; + var fromPoint = function (docElm, x, y) { + var doc = docElm.dom(); + return Option.from(doc.elementFromPoint(x, y)).map(fromDom); + }; + var Element = { + fromHtml: fromHtml, + fromTag: fromTag, + fromText: fromText, + fromDom: fromDom, + fromPoint: fromPoint + }; + + var Global = typeof domGlobals.window !== 'undefined' ? domGlobals.window : Function('return this;')(); + + var DOCUMENT = 9; + var DOCUMENT_FRAGMENT = 11; + var ELEMENT = 1; + var TEXT = 3; + + var type = function (element) { + return element.dom().nodeType; + }; + var isType$1 = function (t) { + return function (element) { + return type(element) === t; + }; + }; + var isElement = isType$1(ELEMENT); + var isText = isType$1(TEXT); + var isDocument = isType$1(DOCUMENT); + var isDocumentFragment = isType$1(DOCUMENT_FRAGMENT); + + var is = function (element, selector) { + var dom = element.dom(); + if (dom.nodeType !== ELEMENT) { + return false; + } else { + var elem = dom; + if (elem.matches !== undefined) { + return elem.matches(selector); + } else if (elem.msMatchesSelector !== undefined) { + return elem.msMatchesSelector(selector); + } else if (elem.webkitMatchesSelector !== undefined) { + return elem.webkitMatchesSelector(selector); + } else if (elem.mozMatchesSelector !== undefined) { + return elem.mozMatchesSelector(selector); + } else { + throw new Error('Browser lacks native selectors'); + } + } + }; + var bypassSelector = function (dom) { + return dom.nodeType !== ELEMENT && dom.nodeType !== DOCUMENT && dom.nodeType !== DOCUMENT_FRAGMENT || dom.childElementCount === 0; + }; + var all = function (selector, scope) { + var base = scope === undefined ? domGlobals.document : scope.dom(); + return bypassSelector(base) ? [] : map(base.querySelectorAll(selector), Element.fromDom); + }; + + var eq = function (e1, e2) { + return e1.dom() === e2.dom(); + }; + + var owner = function (element) { + return Element.fromDom(element.dom().ownerDocument); + }; + var documentOrOwner = function (dos) { + return isDocument(dos) ? dos : owner(dos); + }; + var parent = function (element) { + return Option.from(element.dom().parentNode).map(Element.fromDom); + }; + var parents = function (element, isRoot) { + var stop = isFunction(isRoot) ? isRoot : never; + var dom = element.dom(); + var ret = []; + while (dom.parentNode !== null && dom.parentNode !== undefined) { + var rawParent = dom.parentNode; + var p = Element.fromDom(rawParent); + ret.push(p); + if (stop(p) === true) { + break; + } else { + dom = rawParent; + } + } + return ret; + }; + var siblings = function (element) { + var filterSelf = function (elements) { + return filter(elements, function (x) { + return !eq(element, x); + }); + }; + return parent(element).map(children).map(filterSelf).getOr([]); + }; + var children = function (element) { + return map(element.dom().childNodes, Element.fromDom); + }; + + var isShadowRoot = function (dos) { + return isDocumentFragment(dos); + }; + var supported = isFunction(domGlobals.Element.prototype.attachShadow) && isFunction(domGlobals.Node.prototype.getRootNode); + var isSupported$1 = constant(supported); + var getRootNode = supported ? function (e) { + return Element.fromDom(e.dom().getRootNode()); + } : documentOrOwner; + var getShadowRoot = function (e) { + var r = getRootNode(e); + return isShadowRoot(r) ? Option.some(r) : Option.none(); + }; + var getShadowHost = function (e) { + return Element.fromDom(e.dom().host); + }; + var getOriginalEventTarget = function (event) { + if (isSupported$1() && isNonNullable(event.target)) { + var el = Element.fromDom(event.target); + if (isElement(el) && isOpenShadowHost(Element.fromDom(event.target))) { + var eventAny = event; + if (eventAny.composed && eventAny.composedPath) { + var composedPath = eventAny.composedPath(); + if (composedPath) { + return head(composedPath); + } + } + } + } + return Option.from(event.target); + }; + var isOpenShadowHost = function (element) { + return isNonNullable(element.dom().shadowRoot); + }; + + var inBody = function (element) { + var dom = isText(element) ? element.dom().parentNode : element.dom(); + if (dom === undefined || dom === null || dom.ownerDocument === null) { + return false; + } + return getShadowRoot(Element.fromDom(dom)).fold(function () { + return dom.ownerDocument.body.contains(dom); + }, compose1(inBody, getShadowHost)); + }; + + var rawSet = function (dom, key, value) { + if (isString(value) || isBoolean(value) || isNumber(value)) { + dom.setAttribute(key, value + ''); + } else { + domGlobals.console.error('Invalid call to Attr.set. Key ', key, ':: Value ', value, ':: Element ', dom); + throw new Error('Attribute value was not simple'); + } + }; + var set = function (element, key, value) { + rawSet(element.dom(), key, value); + }; + var get$1 = function (element, key) { + var v = element.dom().getAttribute(key); + return v === null ? undefined : v; + }; + var remove = function (element, key) { + element.dom().removeAttribute(key); + }; + + var internalSet = function (dom, property, value) { + if (!isString(value)) { + domGlobals.console.error('Invalid call to CSS.set. Property ', property, ':: Value ', value, ':: Element ', dom); + throw new Error('CSS value must be a string: ' + value); + } + if (isSupported(dom)) { + dom.style.setProperty(property, value); + } + }; + var setAll = function (element, css) { + var dom = element.dom(); + each$1(css, function (v, k) { + internalSet(dom, k, v); + }); + }; + var get$2 = function (element, property) { + var dom = element.dom(); + var styles = domGlobals.window.getComputedStyle(dom); + var r = styles.getPropertyValue(property); + return r === '' && !inBody(element) ? getUnsafeProperty(dom, property) : r; + }; + var getUnsafeProperty = function (dom, property) { + return isSupported(dom) ? dom.style.getPropertyValue(property) : ''; + }; + + var mkEvent = function (target, x, y, stop, prevent, kill, raw) { + return { + target: constant(target), + x: constant(x), + y: constant(y), + stop: stop, + prevent: prevent, + kill: kill, + raw: constant(raw) + }; + }; + var fromRawEvent = function (rawEvent) { + var target = Element.fromDom(getOriginalEventTarget(rawEvent).getOr(rawEvent.target)); + var stop = function () { + return rawEvent.stopPropagation(); + }; + var prevent = function () { + return rawEvent.preventDefault(); + }; + var kill = compose(prevent, stop); + return mkEvent(target, rawEvent.clientX, rawEvent.clientY, stop, prevent, kill, rawEvent); + }; + + var r = function (left, top) { + var translate = function (x, y) { + return r(left + x, top + y); + }; + return { + left: constant(left), + top: constant(top), + translate: translate + }; + }; + var Position = r; + + var get$3 = function (_DOC) { + var doc = _DOC !== undefined ? _DOC.dom() : domGlobals.document; + var x = doc.body.scrollLeft || doc.documentElement.scrollLeft; + var y = doc.body.scrollTop || doc.documentElement.scrollTop; + return Position(x, y); + }; + + var get$4 = function (_win) { + var win = _win === undefined ? domGlobals.window : _win; + return Option.from(win['visualViewport']); + }; + var bounds = function (x, y, width, height) { + return { + x: x, + y: y, + width: width, + height: height, + right: x + width, + bottom: y + height + }; + }; + var getBounds = function (_win) { + var win = _win === undefined ? domGlobals.window : _win; + var doc = win.document; + var scroll = get$3(Element.fromDom(doc)); + return get$4(win).fold(function () { + var html = win.document.documentElement; + var width = html.clientWidth; + var height = html.clientHeight; + return bounds(scroll.left(), scroll.top(), width, height); + }, function (visualViewport) { + return bounds(Math.max(visualViewport.pageLeft, scroll.left()), Math.max(visualViewport.pageTop, scroll.top()), visualViewport.width, visualViewport.height); + }); + }; + var bind$1 = function (name, callback, _win) { + return get$4(_win).map(function (visualViewport) { + var handler = function (e) { + return callback(fromRawEvent(e)); + }; + visualViewport.addEventListener(name, handler); + return { + unbind: function () { + return visualViewport.removeEventListener(name, handler); + } + }; + }).getOrThunk(function () { + return { unbind: noop }; + }); + }; + + var global$1 = tinymce.util.Tools.resolve('tinymce.dom.DOMUtils'); + + var global$2 = tinymce.util.Tools.resolve('tinymce.Env'); + + var global$3 = tinymce.util.Tools.resolve('tinymce.util.Delay'); + + var fireFullscreenStateChanged = function (editor, state) { + editor.fire('FullscreenStateChanged', { state: state }); + }; + + var ancestors = function (scope, predicate, isRoot) { + return filter(parents(scope, isRoot), predicate); + }; + var siblings$1 = function (scope, predicate) { + return filter(siblings(scope), predicate); + }; + + var all$1 = function (selector) { + return all(selector); + }; + var ancestors$1 = function (scope, selector, isRoot) { + return ancestors(scope, function (e) { + return is(e, selector); + }, isRoot); + }; + var siblings$2 = function (scope, selector) { + return siblings$1(scope, function (e) { + return is(e, selector); + }); + }; + + var attr = 'data-ephox-mobile-fullscreen-style'; + var siblingStyles = 'display:none!important;'; + var ancestorPosition = 'position:absolute!important;'; + var ancestorStyles = 'top:0!important;left:0!important;margin:0!important;padding:0!important;width:100%!important;height:100%!important;overflow:visible!important;'; + var bgFallback = 'background-color:rgb(255,255,255)!important;'; + var isAndroid = global$2.os.isAndroid(); + var matchColor = function (editorBody) { + var color = get$2(editorBody, 'background-color'); + return color !== undefined && color !== '' ? 'background-color:' + color + '!important' : bgFallback; + }; + var clobberStyles = function (dom, container, editorBody) { + var gatherSibilings = function (element) { + return siblings$2(element, '*:not(.tox-silver-sink)'); + }; + var clobber = function (clobberStyle) { + return function (element) { + var styles = get$1(element, 'style'); + var backup = styles === undefined ? 'no-styles' : styles.trim(); + if (backup === clobberStyle) { + return; + } else { + set(element, attr, backup); + setAll(element, dom.parseStyle(clobberStyle)); + } + }; + }; + var ancestors = ancestors$1(container, '*'); + var siblings = bind(ancestors, gatherSibilings); + var bgColor = matchColor(editorBody); + each(siblings, clobber(siblingStyles)); + each(ancestors, clobber(ancestorPosition + ancestorStyles + bgColor)); + var containerStyles = isAndroid === true ? '' : ancestorPosition; + clobber(containerStyles + ancestorStyles + bgColor)(container); + }; + var restoreStyles = function (dom) { + var clobberedEls = all$1('[' + attr + ']'); + each(clobberedEls, function (element) { + var restore = get$1(element, attr); + if (restore !== 'no-styles') { + setAll(element, dom.parseStyle(restore)); + } else { + remove(element, 'style'); + } + remove(element, attr); + }); + }; + + var DOM = global$1.DOM; + var getScrollPos = function () { + var vp = getBounds(domGlobals.window); + return { + x: vp.x, + y: vp.y + }; + }; + var setScrollPos = function (pos) { + domGlobals.window.scrollTo(pos.x, pos.y); + }; + var viewportUpdate = get$4().fold(function () { + return { + bind: noop, + unbind: noop + }; + }, function (visualViewport) { + var editorContainer = value(); + var resizeBinder = unbindable(); + var scrollBinder = unbindable(); + var refreshScroll = function () { + domGlobals.document.body.scrollTop = 0; + domGlobals.document.documentElement.scrollTop = 0; + }; + var refreshVisualViewport = function () { + domGlobals.window.requestAnimationFrame(function () { + editorContainer.on(function (container) { + return setAll(container, { + top: visualViewport.offsetTop + 'px', + left: visualViewport.offsetLeft + 'px', + height: visualViewport.height + 'px', + width: visualViewport.width + 'px' + }); + }); + }); + }; + var update = global$3.throttle(function () { + refreshScroll(); + refreshVisualViewport(); + }, 50); + var bind = function (element) { + editorContainer.set(element); + update(); + resizeBinder.set(bind$1('resize', update)); + scrollBinder.set(bind$1('scroll', update)); + }; + var unbind = function () { + editorContainer.on(function () { + resizeBinder.clear(); + scrollBinder.clear(); + }); + editorContainer.clear(); + }; + return { + bind: bind, + unbind: unbind + }; + }); + var toggleFullscreen = function (editor, fullscreenState) { + var body = domGlobals.document.body; + var documentElement = domGlobals.document.documentElement; + var editorContainer = editor.getContainer(); + var editorContainerS = Element.fromDom(editorContainer); + var fullscreenInfo = fullscreenState.get(); + var editorBody = Element.fromDom(editor.getBody()); + var isTouch = global$2.deviceType.isTouch(); + var editorContainerStyle = editorContainer.style; + var iframe = editor.iframeElement; + var iframeStyle = iframe.style; + var cleanup = function () { + if (isTouch) { + restoreStyles(editor.dom); + } + DOM.removeClass(body, 'tox-fullscreen'); + DOM.removeClass(documentElement, 'tox-fullscreen'); + DOM.removeClass(editorContainer, 'tox-fullscreen'); + viewportUpdate.unbind(); + }; + if (!fullscreenInfo) { + var newFullScreenInfo = { + scrollPos: getScrollPos(), + containerWidth: editorContainerStyle.width, + containerHeight: editorContainerStyle.height, + containerTop: editorContainerStyle.top, + containerLeft: editorContainerStyle.left, + iframeWidth: iframeStyle.width, + iframeHeight: iframeStyle.height + }; + if (isTouch) { + clobberStyles(editor.dom, editorContainerS, editorBody); + } + iframeStyle.width = iframeStyle.height = '100%'; + editorContainerStyle.width = editorContainerStyle.height = ''; + DOM.addClass(body, 'tox-fullscreen'); + DOM.addClass(documentElement, 'tox-fullscreen'); + DOM.addClass(editorContainer, 'tox-fullscreen'); + viewportUpdate.bind(editorContainerS); + editor.on('remove', cleanup); + fullscreenState.set(newFullScreenInfo); + fireFullscreenStateChanged(editor, true); + } else { + iframeStyle.width = fullscreenInfo.iframeWidth; + iframeStyle.height = fullscreenInfo.iframeHeight; + editorContainerStyle.width = fullscreenInfo.containerWidth; + editorContainerStyle.height = fullscreenInfo.containerHeight; + editorContainerStyle.top = fullscreenInfo.containerTop; + editorContainerStyle.left = fullscreenInfo.containerLeft; + setScrollPos(fullscreenInfo.scrollPos); + fullscreenState.set(null); + fireFullscreenStateChanged(editor, false); + cleanup(); + editor.off('remove', cleanup); + } + }; + + var register = function (editor, fullscreenState) { + editor.addCommand('mceFullScreen', function () { + toggleFullscreen(editor, fullscreenState); + }); + }; + + var makeSetupHandler = function (editor, fullscreenState) { + return function (api) { + api.setActive(fullscreenState.get() !== null); + var editorEventCallback = function (e) { + return api.setActive(e.state); + }; + editor.on('FullscreenStateChanged', editorEventCallback); + return function () { + return editor.off('FullscreenStateChanged', editorEventCallback); + }; + }; + }; + var register$1 = function (editor, fullscreenState) { + editor.ui.registry.addToggleMenuItem('fullscreen', { + text: 'Fullscreen', + icon: 'fullscreen', + shortcut: 'Meta+Shift+F', + onAction: function () { + return editor.execCommand('mceFullScreen'); + }, + onSetup: makeSetupHandler(editor, fullscreenState) + }); + editor.ui.registry.addToggleButton('fullscreen', { + tooltip: 'Fullscreen', + icon: 'fullscreen', + onAction: function () { + return editor.execCommand('mceFullScreen'); + }, + onSetup: makeSetupHandler(editor, fullscreenState) + }); + }; + + function Plugin () { + global.add('fullscreen', function (editor) { + var fullscreenState = Cell(null); + if (editor.inline) { + return get(fullscreenState); + } + register(editor, fullscreenState); + register$1(editor, fullscreenState); + editor.addShortcut('Meta+Shift+F', '', 'mceFullScreen'); + return get(fullscreenState); + }); + } + + Plugin(); + +}(window)); diff --git a/src/main/resources/static/layui-ext/tinymce/tinymce/plugins/fullscreen/plugin.min.js b/src/main/resources/static/layui-ext/tinymce/tinymce/plugins/fullscreen/plugin.min.js new file mode 100644 index 0000000..5915f97 --- /dev/null +++ b/src/main/resources/static/layui-ext/tinymce/tinymce/plugins/fullscreen/plugin.min.js @@ -0,0 +1,9 @@ +/** + * 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/ + * + * Version: 5.4.2 (2020-08-17) + */ +!function(p){"use strict";var n,t,e,c=function(n){var t=n;return{get:function(){return t},set:function(n){t=n}}},r=tinymce.util.Tools.resolve("tinymce.PluginManager"),i=function(n){return{isFullscreen:function(){return null!==n.get()}}},o=function(){},a=function(n){return function(){return n}},f=a(!1),u=a(!0),l=function(){return d},d=(n=function(n){return n.isNone()},{fold:function(n,t){return n()},is:f,isSome:f,isNone:u,getOr:e=function(n){return n},getOrThunk:t=function(n){return n()},getOrDie:function(n){throw new Error(n||"error: getOrDie called on none.")},getOrNull:a(null),getOrUndefined:a(undefined),or:e,orThunk:t,map:l,each:o,bind:l,exists:f,forall:u,filter:l,equals:n,equals_:n,toArray:function(){return[]},toString:a("none()")}),s=function(e){var n=a(e),t=function(){return o},r=function(n){return n(e)},o={fold:function(n,t){return t(e)},is:function(n){return e===n},isSome:u,isNone:f,getOr:n,getOrThunk:n,getOrDie:n,getOrNull:n,getOrUndefined:n,or:t,orThunk:t,map:function(n){return s(n(e))},each:function(n){n(e)},bind:r,exists:r,forall:r,filter:function(n){return n(e)?o:d},toArray:function(){return[e]},toString:function(){return"some("+e+")"},equals:function(n){return n.is(e)},equals_:function(n,t){return n.fold(f,function(n){return t(e,n)})}};return o},m={some:s,none:l,from:function(n){return null===n||n===undefined?d:s(n)}},h=function(){return n=function(n){n.unbind()},t=c(m.none()),e=function(){t.get().each(n)},{clear:function(){e(),t.set(m.none())},isSet:function(){return t.get().isSome()},set:function(n){e(),t.set(m.some(n))}};var n,t,e},g=function(r){return function(n){return e=typeof(t=n),(null===t?"null":"object"==e&&(Array.prototype.isPrototypeOf(t)||t.constructor&&"Array"===t.constructor.name)?"array":"object"==e&&(String.prototype.isPrototypeOf(t)||t.constructor&&"String"===t.constructor.name)?"string":e)===r;var t,e}},v=function(t){return function(n){return typeof n===t}},y=g("string"),w=g("array"),b=v("boolean"),S=function(n){return!(null===(t=n)||t===undefined);var t},T=v("function"),x=v("number"),D=Array.prototype.push,E=function(n,t){for(var e=n.length,r=new Array(e),o=0;o -1; + }; + var map = function (xs, f) { + var len = xs.length; + var r = new Array(len); + for (var i = 0; i < len; i++) { + var x = xs[i]; + r[i] = f(x, i); + } + return r; + }; + var filter = function (xs, pred) { + var r = []; + for (var i = 0, len = xs.length; i < len; i++) { + var x = xs[i]; + if (pred(x, i)) { + r.push(x); + } + } + return r; + }; + var findUntil = function (xs, pred, until) { + for (var i = 0, len = xs.length; i < len; i++) { + var x = xs[i]; + if (pred(x, i)) { + return Option.some(x); + } else if (until(x, i)) { + break; + } + } + return Option.none(); + }; + var find = function (xs, pred) { + return findUntil(xs, pred, never); + }; + + var keys = Object.keys; + var hasOwnProperty = Object.hasOwnProperty; + var get$1 = function (obj, key) { + return has(obj, key) ? Option.from(obj[key]) : Option.none(); + }; + var has = function (obj, key) { + return hasOwnProperty.call(obj, key); + }; + + var cat = function (arr) { + var r = []; + var push = function (x) { + r.push(x); + }; + for (var i = 0; i < arr.length; i++) { + arr[i].each(push); + } + return r; + }; + + var getHelpTabs = function (editor) { + return Option.from(editor.getParam('help_tabs')); + }; + var getForcedPlugins = function (editor) { + return editor.getParam('forced_plugins'); + }; + + var shortcuts = [ + { + shortcuts: ['Meta + B'], + action: 'Bold' + }, + { + shortcuts: ['Meta + I'], + action: 'Italic' + }, + { + shortcuts: ['Meta + U'], + action: 'Underline' + }, + { + shortcuts: ['Meta + A'], + action: 'Select all' + }, + { + shortcuts: [ + 'Meta + Y', + 'Meta + Shift + Z' + ], + action: 'Redo' + }, + { + shortcuts: ['Meta + Z'], + action: 'Undo' + }, + { + shortcuts: ['Access + 1'], + action: 'Header 1' + }, + { + shortcuts: ['Access + 2'], + action: 'Header 2' + }, + { + shortcuts: ['Access + 3'], + action: 'Header 3' + }, + { + shortcuts: ['Access + 4'], + action: 'Header 4' + }, + { + shortcuts: ['Access + 5'], + action: 'Header 5' + }, + { + shortcuts: ['Access + 6'], + action: 'Header 6' + }, + { + shortcuts: ['Access + 7'], + action: 'Paragraph' + }, + { + shortcuts: ['Access + 8'], + action: 'Div' + }, + { + shortcuts: ['Access + 9'], + action: 'Address' + }, + { + shortcuts: ['Alt + 0'], + action: 'Open help dialog' + }, + { + shortcuts: ['Alt + F9'], + action: 'Focus to menubar' + }, + { + shortcuts: ['Alt + F10'], + action: 'Focus to toolbar' + }, + { + shortcuts: ['Alt + F11'], + action: 'Focus to element path' + }, + { + shortcuts: ['Ctrl + F9'], + action: 'Focus to contextual toolbar' + }, + { + shortcuts: ['Shift + Enter'], + action: 'Open popup menu for split buttons' + }, + { + shortcuts: ['Meta + K'], + action: 'Insert link (if link plugin activated)' + }, + { + shortcuts: ['Meta + S'], + action: 'Save (if save plugin activated)' + }, + { + shortcuts: ['Meta + F'], + action: 'Find (if searchreplace plugin activated)' + }, + { + shortcuts: ['Meta + Shift + F'], + action: 'Switch to or from fullscreen mode' + } + ]; + + var global$1 = tinymce.util.Tools.resolve('tinymce.Env'); + + var convertText = function (source) { + var mac = { + alt: '⌥', + ctrl: '⌃', + shift: '⇧', + meta: '⌘', + access: '⌃⌥' + }; + var other = { + meta: 'Ctrl ', + access: 'Shift + Alt ' + }; + var replace = global$1.mac ? mac : other; + var shortcut = source.split('+'); + var updated = map(shortcut, function (segment) { + var search = segment.toLowerCase().trim(); + return has(replace, search) ? replace[search] : segment; + }); + return global$1.mac ? updated.join('').replace(/\s/, '') : updated.join('+'); + }; + + var tab = function () { + var shortcutList = map(shortcuts, function (shortcut) { + var shortcutText = map(shortcut.shortcuts, convertText).join(' or '); + return [ + shortcut.action, + shortcutText + ]; + }); + var tablePanel = { + type: 'table', + header: [ + 'Action', + 'Shortcut' + ], + cells: shortcutList + }; + return { + name: 'shortcuts', + title: 'Handy Shortcuts', + items: [tablePanel] + }; + }; + + var global$2 = tinymce.util.Tools.resolve('tinymce.util.I18n'); + + var urls = [ + { + key: 'advlist', + name: 'Advanced List' + }, + { + key: 'anchor', + name: 'Anchor' + }, + { + key: 'autolink', + name: 'Autolink' + }, + { + key: 'autoresize', + name: 'Autoresize' + }, + { + key: 'autosave', + name: 'Autosave' + }, + { + key: 'bbcode', + name: 'BBCode' + }, + { + key: 'charmap', + name: 'Character Map' + }, + { + key: 'code', + name: 'Code' + }, + { + key: 'codesample', + name: 'Code Sample' + }, + { + key: 'colorpicker', + name: 'Color Picker' + }, + { + key: 'directionality', + name: 'Directionality' + }, + { + key: 'emoticons', + name: 'Emoticons' + }, + { + key: 'fullpage', + name: 'Full Page' + }, + { + key: 'fullscreen', + name: 'Full Screen' + }, + { + key: 'help', + name: 'Help' + }, + { + key: 'hr', + name: 'Horizontal Rule' + }, + { + key: 'image', + name: 'Image' + }, + { + key: 'imagetools', + name: 'Image Tools' + }, + { + key: 'importcss', + name: 'Import CSS' + }, + { + key: 'insertdatetime', + name: 'Insert Date/Time' + }, + { + key: 'legacyoutput', + name: 'Legacy Output' + }, + { + key: 'link', + name: 'Link' + }, + { + key: 'lists', + name: 'Lists' + }, + { + key: 'media', + name: 'Media' + }, + { + key: 'nonbreaking', + name: 'Nonbreaking' + }, + { + key: 'noneditable', + name: 'Noneditable' + }, + { + key: 'pagebreak', + name: 'Page Break' + }, + { + key: 'paste', + name: 'Paste' + }, + { + key: 'preview', + name: 'Preview' + }, + { + key: 'print', + name: 'Print' + }, + { + key: 'save', + name: 'Save' + }, + { + key: 'searchreplace', + name: 'Search and Replace' + }, + { + key: 'spellchecker', + name: 'Spell Checker' + }, + { + key: 'tabfocus', + name: 'Tab Focus' + }, + { + key: 'table', + name: 'Table' + }, + { + key: 'template', + name: 'Template' + }, + { + key: 'textcolor', + name: 'Text Color' + }, + { + key: 'textpattern', + name: 'Text Pattern' + }, + { + key: 'toc', + name: 'Table of Contents' + }, + { + key: 'visualblocks', + name: 'Visual Blocks' + }, + { + key: 'visualchars', + name: 'Visual Characters' + }, + { + key: 'wordcount', + name: 'Word Count' + }, + { + key: 'advcode', + name: 'Advanced Code Editor*' + }, + { + key: 'formatpainter', + name: 'Format Painter*' + }, + { + key: 'powerpaste', + name: 'PowerPaste*' + }, + { + key: 'tinydrive', + name: 'Tiny Drive*', + slug: 'drive' + }, + { + key: 'tinymcespellchecker', + name: 'Spell Checker Pro*' + }, + { + key: 'a11ychecker', + name: 'Accessibility Checker*' + }, + { + key: 'linkchecker', + name: 'Link Checker*' + }, + { + key: 'mentions', + name: 'Mentions*' + }, + { + key: 'mediaembed', + name: 'Enhanced Media Embed*' + }, + { + key: 'checklist', + name: 'Checklist*' + }, + { + key: 'casechange', + name: 'Case Change*' + }, + { + key: 'permanentpen', + name: 'Permanent Pen*' + }, + { + key: 'pageembed', + name: 'Page Embed*' + }, + { + key: 'tinycomments', + name: 'Tiny Comments*', + slug: 'comments' + }, + { + key: 'advtable', + name: 'Advanced Tables*' + }, + { + key: 'autocorrect', + name: 'Autocorrect*' + } + ]; + + var tab$1 = function (editor) { + var availablePlugins = function () { + var premiumPlugins = [ + 'Accessibility Checker', + 'Advanced Code Editor', + 'Advanced Tables', + 'Case Change', + 'Checklist', + 'Tiny Comments', + 'Tiny Drive', + 'Enhanced Media Embed', + 'Format Painter', + 'Link Checker', + 'Mentions', + 'MoxieManager', + 'Page Embed', + 'Permanent Pen', + 'PowerPaste', + 'Spell Checker Pro' + ]; + var premiumPluginList = map(premiumPlugins, function (plugin) { + return '
  • ' + global$2.translate(plugin) + '
  • '; + }).join(''); + return '
    ' + '

    ' + global$2.translate('Premium plugins:') + '

    ' + '' + '
    '; + }; + var makeLink = function (p) { + return '' + p.name + ''; + }; + var maybeUrlize = function (editor, key) { + return find(urls, function (x) { + return x.key === key; + }).fold(function () { + var getMetadata = editor.plugins[key].getMetadata; + return typeof getMetadata === 'function' ? makeLink(getMetadata()) : key; + }, function (x) { + var urlSlug = x.slug || x.key; + return makeLink({ + name: x.name, + url: 'https://www.tiny.cloud/docs/plugins/' + urlSlug + }); + }); + }; + var getPluginKeys = function (editor) { + var keys$1 = keys(editor.plugins); + var forced_plugins = getForcedPlugins(editor); + return forced_plugins === undefined ? keys$1 : filter(keys$1, function (k) { + return !contains(forced_plugins, k); + }); + }; + var pluginLister = function (editor) { + var pluginKeys = getPluginKeys(editor); + var pluginLis = map(pluginKeys, function (key) { + return '
  • ' + maybeUrlize(editor, key) + '
  • '; + }); + var count = pluginLis.length; + var pluginsString = pluginLis.join(''); + var html = '

    ' + global$2.translate([ + 'Plugins installed ({0}):', + count + ]) + '

    ' + '
      ' + pluginsString + '
    '; + return html; + }; + var installedPlugins = function (editor) { + if (editor == null) { + return ''; + } + return '
    ' + pluginLister(editor) + '
    '; + }; + var htmlPanel = { + type: 'htmlpanel', + presets: 'document', + html: [ + installedPlugins(editor), + availablePlugins() + ].join('') + }; + return { + name: 'plugins', + title: 'Plugins', + items: [htmlPanel] + }; + }; + + var global$3 = tinymce.util.Tools.resolve('tinymce.EditorManager'); + + var tab$2 = function () { + var getVersion = function (major, minor) { + return major.indexOf('@') === 0 ? 'X.X.X' : major + '.' + minor; + }; + var version = getVersion(global$3.majorVersion, global$3.minorVersion); + var changeLogLink = 'TinyMCE ' + version + ''; + var htmlPanel = { + type: 'htmlpanel', + html: '

    ' + global$2.translate([ + 'You are using {0}', + changeLogLink + ]) + '

    ', + presets: 'document' + }; + return { + name: 'versions', + title: 'Version', + items: [htmlPanel] + }; + }; + + var description = '

    Editor UI keyboard navigation

    \n\n

    Activating keyboard navigation

    \n\n

    The sections of the outer UI of the editor - the menubar, toolbar, sidebar and footer - are all keyboard navigable. As such, there are multiple ways to activate keyboard navigation:

    \n
      \n
    • Focus the menubar: Alt + F9 (Windows) or ⌥F9 (MacOS)
    • \n
    • Focus the toolbar: Alt + F10 (Windows) or ⌥F10 (MacOS)
    • \n
    • Focus the footer: Alt + F11 (Windows) or ⌥F11 (MacOS)
    • \n
    \n\n

    Focusing the menubar or toolbar will start keyboard navigation at the first item in the menubar or toolbar, which will be highlighted with a gray background. Focusing the footer will start keyboard navigation at the first item in the element path, which will be highlighted with an underline.

    \n\n

    Moving between UI sections

    \n\n

    When keyboard navigation is active, pressing tab will move the focus to the next major section of the UI, where applicable. These sections are:

    \n
      \n
    • the menubar
    • \n
    • each group of the toolbar
    • \n
    • the sidebar
    • \n
    • the element path in the footer
    • \n
    • the wordcount toggle button in the footer
    • \n
    • the branding link in the footer
    • \n
    \n\n

    Pressing shift + tab will move backwards through the same sections, except when moving from the footer to the toolbar. Focusing the element path then pressing shift + tab will move focus to the first toolbar group, not the last.

    \n\n

    Moving within UI sections

    \n\n

    Keyboard navigation within UI sections can usually be achieved using the left and right arrow keys. This includes:

    \n
      \n
    • moving between menus in the menubar
    • \n
    • moving between buttons in a toolbar group
    • \n
    • moving between items in the element path
    • \n
    \n\n

    In all these UI sections, keyboard navigation will cycle within the section. For example, focusing the last button in a toolbar group then pressing right arrow will move focus to the first item in the same toolbar group.

    \n\n

    Executing buttons

    \n\n

    To execute a button, navigate the selection to the desired button and hit space or enter.

    \n\n

    Opening, navigating and closing menus

    \n\n

    When focusing a menubar button or a toolbar button with a menu, pressing space, enter or down arrow will open the menu. When the menu opens the first item will be selected. To move up or down the menu, press the up or down arrow key respectively. This is the same for submenus, which can also be opened and closed using the left and right arrow keys.

    \n\n

    To close any active menu, hit the escape key. When a menu is closed the selection will be restored to its previous selection. This also works for closing submenus.

    \n\n

    Context toolbars and menus

    \n\n

    To focus an open context toolbar such as the table context toolbar, press Ctrl + F9 (Windows) or ⌃F9 (MacOS).

    \n\n

    Context toolbar navigation is the same as toolbar navigation, and context menu navigation is the same as standard menu navigation.

    \n\n

    Dialog navigation

    \n\n

    There are two types of dialog UIs in TinyMCE: tabbed dialogs and non-tabbed dialogs.

    \n\n

    When a non-tabbed dialog is opened, the first interactive component in the dialog will be focused. Users can navigate between interactive components by pressing tab. This includes any footer buttons. Navigation will cycle back to the first dialog component if tab is pressed while focusing the last component in the dialog. Pressing shift + tab will navigate backwards.

    \n\n

    When a tabbed dialog is opened, the first button in the tab menu is focused. Pressing tab will navigate to the first interactive component in that tab, and will cycle through the tab\u2019s components, the footer buttons, then back to the tab button. To switch to another tab, focus the tab button for the current tab, then use the arrow keys to cycle through the tab buttons.

    '; + var tab$3 = function () { + var body = { + type: 'htmlpanel', + presets: 'document', + html: description + }; + return { + name: 'keyboardnav', + title: 'Keyboard Navigation', + items: [body] + }; + }; + + var parseHelpTabsSetting = function (tabsFromSettings, tabs) { + var newTabs = {}; + var names = map(tabsFromSettings, function (t) { + if (typeof t === 'string') { + if (has(tabs, t)) { + newTabs[t] = tabs[t]; + } + return t; + } else { + newTabs[t.name] = t; + return t.name; + } + }); + return { + tabs: newTabs, + names: names + }; + }; + var getNamesFromTabs = function (tabs) { + var names = keys(tabs); + var idx = names.indexOf('versions'); + if (idx !== -1) { + names.splice(idx, 1); + names.push('versions'); + } + return { + tabs: tabs, + names: names + }; + }; + var parseCustomTabs = function (editor, customTabs) { + var _a; + var shortcuts = tab(); + var nav = tab$3(); + var plugins = tab$1(editor); + var versions = tab$2(); + var tabs = __assign((_a = {}, _a[shortcuts.name] = shortcuts, _a[nav.name] = nav, _a[plugins.name] = plugins, _a[versions.name] = versions, _a), customTabs.get()); + return getHelpTabs(editor).fold(function () { + return getNamesFromTabs(tabs); + }, function (tabsFromSettings) { + return parseHelpTabsSetting(tabsFromSettings, tabs); + }); + }; + var init = function (editor, customTabs) { + return function () { + var _a = parseCustomTabs(editor, customTabs), tabs = _a.tabs, names = _a.names; + var foundTabs = map(names, function (name) { + return get$1(tabs, name); + }); + var dialogTabs = cat(foundTabs); + var body = { + type: 'tabpanel', + tabs: dialogTabs + }; + editor.windowManager.open({ + title: 'Help', + size: 'medium', + body: body, + buttons: [{ + type: 'cancel', + name: 'close', + text: 'Close', + primary: true + }], + initialData: {} + }); + }; + }; + + function Plugin () { + global.add('help', function (editor) { + var customTabs = Cell({}); + var api = get(customTabs); + var dialogOpener = init(editor, customTabs); + register$1(editor, dialogOpener); + register(editor, dialogOpener); + editor.shortcuts.add('Alt+0', 'Open help dialog', 'mceHelp'); + return api; + }); + } + + Plugin(); + +}()); diff --git a/src/main/resources/static/layui-ext/tinymce/tinymce/plugins/help/plugin.min.js b/src/main/resources/static/layui-ext/tinymce/tinymce/plugins/help/plugin.min.js new file mode 100644 index 0000000..6cbee8e --- /dev/null +++ b/src/main/resources/static/layui-ext/tinymce/tinymce/plugins/help/plugin.min.js @@ -0,0 +1,9 @@ +/** + * 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/ + * + * Version: 5.4.2 (2020-08-17) + */ +!function(){"use strict";var e,t,n,a=tinymce.util.Tools.resolve("tinymce.PluginManager"),m=function(){return(m=Object.assign||function(e){for(var t,n=1,a=arguments.length;n'+e.name+""};return{name:"plugins",title:"Plugins",items:[{type:"htmlpanel",presets:"document",html:[null==(n=e)?"":'
    '+function(a){var e,t,n,o=(t=f((e=a).plugins),(n=e.getParam("forced_plugins"))===undefined?t:function(e,t){for(var n=[],a=0,o=e.length;a"+(t=a,n=e,g(C,function(e){return e.key===n}).fold(function(){var e=t.plugins[n].getMetadata;return"function"==typeof e?c(e()):n},function(e){var t=e.slug||e.key;return c({name:e.name,url:"https://www.tiny.cloud/docs/plugins/"+t})}))+"";var t,n}),r=i.length,s=i.join("");return"

    "+A.translate(["Plugins installed ({0}):",r])+"

      "+s+"
    "}(n)+"
    ",(t=p(["Accessibility Checker","Advanced Code Editor","Advanced Tables","Case Change","Checklist","Tiny Comments","Tiny Drive","Enhanced Media Embed","Format Painter","Link Checker","Mentions","MoxieManager","Page Embed","Permanent Pen","PowerPaste","Spell Checker Pro"],function(e){return"
  • "+A.translate(e)+"
  • "}).join(""),'

    '+A.translate("Premium plugins:")+"

    ")].join("")}]}},x=tinymce.util.Tools.resolve("tinymce.EditorManager"),P=function(e,t){var n,a,o,i,r,s={name:"shortcuts",title:"Handy Shortcuts",items:[{type:"table",header:["Action","Shortcut"],cells:p(k,function(e){var t=p(e.shortcuts,w).join(" or ");return[e.action,t]})}]},c={name:"keyboardnav",title:"Keyboard Navigation",items:[{type:"htmlpanel",presets:"document",html:"

    Editor UI keyboard navigation

    \n\n

    Activating keyboard navigation

    \n\n

    The sections of the outer UI of the editor - the menubar, toolbar, sidebar and footer - are all keyboard navigable. As such, there are multiple ways to activate keyboard navigation:

    \n
      \n
    • Focus the menubar: Alt + F9 (Windows) or ⌥F9 (MacOS)
    • \n
    • Focus the toolbar: Alt + F10 (Windows) or ⌥F10 (MacOS)
    • \n
    • Focus the footer: Alt + F11 (Windows) or ⌥F11 (MacOS)
    • \n
    \n\n

    Focusing the menubar or toolbar will start keyboard navigation at the first item in the menubar or toolbar, which will be highlighted with a gray background. Focusing the footer will start keyboard navigation at the first item in the element path, which will be highlighted with an underline.

    \n\n

    Moving between UI sections

    \n\n

    When keyboard navigation is active, pressing tab will move the focus to the next major section of the UI, where applicable. These sections are:

    \n
      \n
    • the menubar
    • \n
    • each group of the toolbar
    • \n
    • the sidebar
    • \n
    • the element path in the footer
    • \n
    • the wordcount toggle button in the footer
    • \n
    • the branding link in the footer
    • \n
    \n\n

    Pressing shift + tab will move backwards through the same sections, except when moving from the footer to the toolbar. Focusing the element path then pressing shift + tab will move focus to the first toolbar group, not the last.

    \n\n

    Moving within UI sections

    \n\n

    Keyboard navigation within UI sections can usually be achieved using the left and right arrow keys. This includes:

    \n
      \n
    • moving between menus in the menubar
    • \n
    • moving between buttons in a toolbar group
    • \n
    • moving between items in the element path
    • \n
    \n\n

    In all these UI sections, keyboard navigation will cycle within the section. For example, focusing the last button in a toolbar group then pressing right arrow will move focus to the first item in the same toolbar group.

    \n\n

    Executing buttons

    \n\n

    To execute a button, navigate the selection to the desired button and hit space or enter.

    \n\n

    Opening, navigating and closing menus

    \n\n

    When focusing a menubar button or a toolbar button with a menu, pressing space, enter or down arrow will open the menu. When the menu opens the first item will be selected. To move up or down the menu, press the up or down arrow key respectively. This is the same for submenus, which can also be opened and closed using the left and right arrow keys.

    \n\n

    To close any active menu, hit the escape key. When a menu is closed the selection will be restored to its previous selection. This also works for closing submenus.

    \n\n

    Context toolbars and menus

    \n\n

    To focus an open context toolbar such as the table context toolbar, press Ctrl + F9 (Windows) or ⌃F9 (MacOS).

    \n\n

    Context toolbar navigation is the same as toolbar navigation, and context menu navigation is the same as standard menu navigation.

    \n\n

    Dialog navigation

    \n\n

    There are two types of dialog UIs in TinyMCE: tabbed dialogs and non-tabbed dialogs.

    \n\n

    When a non-tabbed dialog is opened, the first interactive component in the dialog will be focused. Users can navigate between interactive components by pressing tab. This includes any footer buttons. Navigation will cycle back to the first dialog component if tab is pressed while focusing the last component in the dialog. Pressing shift + tab will navigate backwards.

    \n\n

    When a tabbed dialog is opened, the first button in the tab menu is focused. Pressing tab will navigate to the first interactive component in that tab, and will cycle through the tab\u2019s components, the footer buttons, then back to the tab button. To switch to another tab, focus the tab button for the current tab, then use the arrow keys to cycle through the tab buttons.

    "}]},l=T(e),u=(i='TinyMCE '+(a=x.majorVersion,o=x.minorVersion,0===a.indexOf("@")?"X.X.X":a+"."+o)+"",{name:"versions",title:"Version",items:[{type:"htmlpanel",html:"

    "+A.translate(["You are using {0}",i])+"

    ",presets:"document"}]}),h=m(((n={})[s.name]=s,n[c.name]=c,n[l.name]=l,n[u.name]=u,n),t.get());return r=e,d.from(r.getParam("help_tabs")).fold(function(){return t=f(e=h),-1!==(n=t.indexOf("versions"))&&(t.splice(n,1),t.push("versions")),{tabs:e,names:t};var e,t,n},function(e){return t=h,n={},a=p(e,function(e){return"string"==typeof e?(y(t,e)&&(n[e]=t[e]),e):(n[e.name]=e).name}),{tabs:n,names:a};var t,n,a})},M=function(o,i){return function(){var e=P(o,i),a=e.tabs,t=e.names,n={type:"tabpanel",tabs:function(e){for(var t=[],n=function(e){t.push(e)},a=0;a'); + }); + }; + + var register$1 = function (editor) { + editor.ui.registry.addButton('hr', { + icon: 'horizontal-rule', + tooltip: 'Horizontal line', + onAction: function () { + return editor.execCommand('InsertHorizontalRule'); + } + }); + editor.ui.registry.addMenuItem('hr', { + icon: 'horizontal-rule', + text: 'Horizontal line', + onAction: function () { + return editor.execCommand('InsertHorizontalRule'); + } + }); + }; + + function Plugin () { + global.add('hr', function (editor) { + register(editor); + register$1(editor); + }); + } + + Plugin(); + +}()); diff --git a/src/main/resources/static/layui-ext/tinymce/tinymce/plugins/hr/plugin.min.js b/src/main/resources/static/layui-ext/tinymce/tinymce/plugins/hr/plugin.min.js new file mode 100644 index 0000000..dc75df1 --- /dev/null +++ b/src/main/resources/static/layui-ext/tinymce/tinymce/plugins/hr/plugin.min.js @@ -0,0 +1,9 @@ +/** + * 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/ + * + * Version: 5.4.2 (2020-08-17) + */ +!function(){"use strict";var n=tinymce.util.Tools.resolve("tinymce.PluginManager");!function o(){n.add("hr",function(n){var o,t;(o=n).addCommand("InsertHorizontalRule",function(){o.execCommand("mceInsertContent",!1,"
    ")}),(t=n).ui.registry.addButton("hr",{icon:"horizontal-rule",tooltip:"Horizontal line",onAction:function(){return t.execCommand("InsertHorizontalRule")}}),t.ui.registry.addMenuItem("hr",{icon:"horizontal-rule",text:"Horizontal line",onAction:function(){return t.execCommand("InsertHorizontalRule")}})})}()}(); \ No newline at end of file diff --git a/src/main/resources/static/layui-ext/tinymce/tinymce/plugins/image/plugin.js b/src/main/resources/static/layui-ext/tinymce/tinymce/plugins/image/plugin.js new file mode 100644 index 0000000..e1a71ac --- /dev/null +++ b/src/main/resources/static/layui-ext/tinymce/tinymce/plugins/image/plugin.js @@ -0,0 +1,1660 @@ +/** + * 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/ + * + * Version: 5.4.2 (2020-08-17) + */ +(function (domGlobals) { + 'use strict'; + + var global = tinymce.util.Tools.resolve('tinymce.PluginManager'); + + var noop = function () { + }; + var constant = function (value) { + return function () { + return value; + }; + }; + var never = constant(false); + var always = constant(true); + + var none = function () { + return NONE; + }; + var NONE = function () { + var eq = function (o) { + return o.isNone(); + }; + var call = function (thunk) { + return thunk(); + }; + var id = function (n) { + return n; + }; + var me = { + fold: function (n, _s) { + return n(); + }, + is: never, + isSome: never, + isNone: always, + getOr: id, + getOrThunk: call, + getOrDie: function (msg) { + throw new Error(msg || 'error: getOrDie called on none.'); + }, + getOrNull: constant(null), + getOrUndefined: constant(undefined), + or: id, + orThunk: call, + map: none, + each: noop, + bind: none, + exists: never, + forall: always, + filter: none, + equals: eq, + equals_: eq, + toArray: function () { + return []; + }, + toString: constant('none()') + }; + return me; + }(); + var some = function (a) { + var constant_a = constant(a); + var self = function () { + return me; + }; + var bind = function (f) { + return f(a); + }; + var me = { + fold: function (n, s) { + return s(a); + }, + is: function (v) { + return a === v; + }, + isSome: always, + isNone: never, + getOr: constant_a, + getOrThunk: constant_a, + getOrDie: constant_a, + getOrNull: constant_a, + getOrUndefined: constant_a, + or: self, + orThunk: self, + map: function (f) { + return some(f(a)); + }, + each: function (f) { + f(a); + }, + bind: bind, + exists: bind, + forall: bind, + filter: function (f) { + return f(a) ? me : NONE; + }, + toArray: function () { + return [a]; + }, + toString: function () { + return 'some(' + a + ')'; + }, + equals: function (o) { + return o.is(a); + }, + equals_: function (o, elementEq) { + return o.fold(never, function (b) { + return elementEq(a, b); + }); + } + }; + return me; + }; + var from = function (value) { + return value === null || value === undefined ? NONE : some(value); + }; + var Option = { + some: some, + none: none, + from: from + }; + + var typeOf = function (x) { + var t = typeof x; + if (x === null) { + return 'null'; + } else if (t === 'object' && (Array.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'Array')) { + return 'array'; + } else if (t === 'object' && (String.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'String')) { + return 'string'; + } else { + return t; + } + }; + var isType = function (type) { + return function (value) { + return typeOf(value) === type; + }; + }; + var isSimpleType = function (type) { + return function (value) { + return typeof value === type; + }; + }; + var eq = function (t) { + return function (a) { + return t === a; + }; + }; + var isString = isType('string'); + var isObject = isType('object'); + var isArray = isType('array'); + var isNull = eq(null); + var isBoolean = isSimpleType('boolean'); + var isNumber = isSimpleType('number'); + + var nativePush = Array.prototype.push; + var flatten = function (xs) { + var r = []; + for (var i = 0, len = xs.length; i < len; ++i) { + if (!isArray(xs[i])) { + throw new Error('Arr.flatten item ' + i + ' was not an array, input: ' + xs); + } + nativePush.apply(r, xs[i]); + } + return r; + }; + var head = function (xs) { + return xs.length === 0 ? Option.none() : Option.some(xs[0]); + }; + var findMap = function (arr, f) { + for (var i = 0; i < arr.length; i++) { + var r = f(arr[i], i); + if (r.isSome()) { + return r; + } + } + return Option.none(); + }; + + var hasOwnProperty = Object.prototype.hasOwnProperty; + var deep = function (old, nu) { + var bothObjects = isObject(old) && isObject(nu); + return bothObjects ? deepMerge(old, nu) : nu; + }; + var baseMerge = function (merger) { + return function () { + var objects = new Array(arguments.length); + for (var i = 0; i < objects.length; i++) { + objects[i] = arguments[i]; + } + if (objects.length === 0) { + throw new Error('Can\'t merge zero objects'); + } + var ret = {}; + for (var j = 0; j < objects.length; j++) { + var curObject = objects[j]; + for (var key in curObject) { + if (hasOwnProperty.call(curObject, key)) { + ret[key] = merger(ret[key], curObject[key]); + } + } + } + return ret; + }; + }; + var deepMerge = baseMerge(deep); + + var __assign = function () { + __assign = Object.assign || function __assign(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) + if (Object.prototype.hasOwnProperty.call(s, p)) + t[p] = s[p]; + } + return t; + }; + return __assign.apply(this, arguments); + }; + + var Global = typeof domGlobals.window !== 'undefined' ? domGlobals.window : Function('return this;')(); + + var rawSet = function (dom, key, value) { + if (isString(value) || isBoolean(value) || isNumber(value)) { + dom.setAttribute(key, value + ''); + } else { + domGlobals.console.error('Invalid call to Attr.set. Key ', key, ':: Value ', value, ':: Element ', dom); + throw new Error('Attribute value was not simple'); + } + }; + var set = function (element, key, value) { + rawSet(element.dom(), key, value); + }; + var remove = function (element, key) { + element.dom().removeAttribute(key); + }; + + var fromHtml = function (html, scope) { + var doc = scope || domGlobals.document; + var div = doc.createElement('div'); + div.innerHTML = html; + if (!div.hasChildNodes() || div.childNodes.length > 1) { + domGlobals.console.error('HTML does not have a single root node', html); + throw new Error('HTML must have a single root node'); + } + return fromDom(div.childNodes[0]); + }; + var fromTag = function (tag, scope) { + var doc = scope || domGlobals.document; + var node = doc.createElement(tag); + return fromDom(node); + }; + var fromText = function (text, scope) { + var doc = scope || domGlobals.document; + var node = doc.createTextNode(text); + return fromDom(node); + }; + var fromDom = function (node) { + if (node === null || node === undefined) { + throw new Error('Node cannot be null or undefined'); + } + return { dom: constant(node) }; + }; + var fromPoint = function (docElm, x, y) { + var doc = docElm.dom(); + return Option.from(doc.elementFromPoint(x, y)).map(fromDom); + }; + var Element = { + fromHtml: fromHtml, + fromTag: fromTag, + fromText: fromText, + fromDom: fromDom, + fromPoint: fromPoint + }; + + var global$1 = tinymce.util.Tools.resolve('tinymce.dom.DOMUtils'); + + var global$2 = tinymce.util.Tools.resolve('tinymce.util.Promise'); + + var global$3 = tinymce.util.Tools.resolve('tinymce.util.XHR'); + + var hasDimensions = function (editor) { + return editor.getParam('image_dimensions', true, 'boolean'); + }; + var hasAdvTab = function (editor) { + return editor.getParam('image_advtab', false, 'boolean'); + }; + var hasUploadTab = function (editor) { + return editor.getParam('image_uploadtab', true, 'boolean'); + }; + var getPrependUrl = function (editor) { + return editor.getParam('image_prepend_url', '', 'string'); + }; + var getClassList = function (editor) { + return editor.getParam('image_class_list'); + }; + var hasDescription = function (editor) { + return editor.getParam('image_description', true, 'boolean'); + }; + var hasImageTitle = function (editor) { + return editor.getParam('image_title', false, 'boolean'); + }; + var hasImageCaption = function (editor) { + return editor.getParam('image_caption', false, 'boolean'); + }; + var getImageList = function (editor) { + return editor.getParam('image_list', false); + }; + var hasUploadUrl = function (editor) { + return !!getUploadUrl(editor); + }; + var hasUploadHandler = function (editor) { + return !!getUploadHandler(editor); + }; + var getUploadUrl = function (editor) { + return editor.getParam('images_upload_url', '', 'string'); + }; + var getUploadHandler = function (editor) { + return editor.getParam('images_upload_handler', undefined, 'function'); + }; + var getUploadBasePath = function (editor) { + return editor.getParam('images_upload_base_path', undefined, 'string'); + }; + var getUploadCredentials = function (editor) { + return editor.getParam('images_upload_credentials', false, 'boolean'); + }; + var showAccessibilityOptions = function (editor) { + return editor.getParam('a11y_advanced_options', false, 'boolean'); + }; + var isAutomaticUploadsEnabled = function (editor) { + return editor.getParam('automatic_uploads', true, 'boolean'); + }; + + var parseIntAndGetMax = function (val1, val2) { + return Math.max(parseInt(val1, 10), parseInt(val2, 10)); + }; + var getImageSize = function (url) { + return new global$2(function (callback) { + var img = domGlobals.document.createElement('img'); + var done = function (dimensions) { + if (img.parentNode) { + img.parentNode.removeChild(img); + } + callback(dimensions); + }; + img.onload = function () { + var width = parseIntAndGetMax(img.width, img.clientWidth); + var height = parseIntAndGetMax(img.height, img.clientHeight); + var dimensions = { + width: width, + height: height + }; + done(global$2.resolve(dimensions)); + }; + img.onerror = function () { + done(global$2.reject('Failed to get image dimensions for: ' + url)); + }; + var style = img.style; + style.visibility = 'hidden'; + style.position = 'fixed'; + style.bottom = style.left = '0px'; + style.width = style.height = 'auto'; + domGlobals.document.body.appendChild(img); + img.src = url; + }); + }; + var removePixelSuffix = function (value) { + if (value) { + value = value.replace(/px$/, ''); + } + return value; + }; + var addPixelSuffix = function (value) { + if (value.length > 0 && /^[0-9]+$/.test(value)) { + value += 'px'; + } + return value; + }; + var mergeMargins = function (css) { + if (css.margin) { + var splitMargin = String(css.margin).split(' '); + switch (splitMargin.length) { + case 1: + css['margin-top'] = css['margin-top'] || splitMargin[0]; + css['margin-right'] = css['margin-right'] || splitMargin[0]; + css['margin-bottom'] = css['margin-bottom'] || splitMargin[0]; + css['margin-left'] = css['margin-left'] || splitMargin[0]; + break; + case 2: + css['margin-top'] = css['margin-top'] || splitMargin[0]; + css['margin-right'] = css['margin-right'] || splitMargin[1]; + css['margin-bottom'] = css['margin-bottom'] || splitMargin[0]; + css['margin-left'] = css['margin-left'] || splitMargin[1]; + break; + case 3: + css['margin-top'] = css['margin-top'] || splitMargin[0]; + css['margin-right'] = css['margin-right'] || splitMargin[1]; + css['margin-bottom'] = css['margin-bottom'] || splitMargin[2]; + css['margin-left'] = css['margin-left'] || splitMargin[1]; + break; + case 4: + css['margin-top'] = css['margin-top'] || splitMargin[0]; + css['margin-right'] = css['margin-right'] || splitMargin[1]; + css['margin-bottom'] = css['margin-bottom'] || splitMargin[2]; + css['margin-left'] = css['margin-left'] || splitMargin[3]; + } + delete css.margin; + } + return css; + }; + var createImageList = function (editor, callback) { + var imageList = getImageList(editor); + if (typeof imageList === 'string') { + global$3.send({ + url: imageList, + success: function (text) { + callback(JSON.parse(text)); + } + }); + } else if (typeof imageList === 'function') { + imageList(callback); + } else { + callback(imageList); + } + }; + var waitLoadImage = function (editor, data, imgElm) { + var selectImage = function () { + imgElm.onload = imgElm.onerror = null; + if (editor.selection) { + editor.selection.select(imgElm); + editor.nodeChanged(); + } + }; + imgElm.onload = function () { + if (!data.width && !data.height && hasDimensions(editor)) { + editor.dom.setAttribs(imgElm, { + width: String(imgElm.clientWidth), + height: String(imgElm.clientHeight) + }); + } + selectImage(); + }; + imgElm.onerror = selectImage; + }; + var blobToDataUri = function (blob) { + return new global$2(function (resolve, reject) { + var reader = new domGlobals.FileReader(); + reader.onload = function () { + resolve(reader.result); + }; + reader.onerror = function () { + reject(reader.error.message); + }; + reader.readAsDataURL(blob); + }); + }; + var isPlaceholderImage = function (imgElm) { + return imgElm.nodeName === 'IMG' && (imgElm.hasAttribute('data-mce-object') || imgElm.hasAttribute('data-mce-placeholder')); + }; + + var DOM = global$1.DOM; + var getHspace = function (image) { + if (image.style.marginLeft && image.style.marginRight && image.style.marginLeft === image.style.marginRight) { + return removePixelSuffix(image.style.marginLeft); + } else { + return ''; + } + }; + var getVspace = function (image) { + if (image.style.marginTop && image.style.marginBottom && image.style.marginTop === image.style.marginBottom) { + return removePixelSuffix(image.style.marginTop); + } else { + return ''; + } + }; + var getBorder = function (image) { + if (image.style.borderWidth) { + return removePixelSuffix(image.style.borderWidth); + } else { + return ''; + } + }; + var getAttrib = function (image, name) { + if (image.hasAttribute(name)) { + return image.getAttribute(name); + } else { + return ''; + } + }; + var getStyle = function (image, name) { + return image.style[name] ? image.style[name] : ''; + }; + var hasCaption = function (image) { + return image.parentNode !== null && image.parentNode.nodeName === 'FIGURE'; + }; + var updateAttrib = function (image, name, value) { + if (value === '') { + image.removeAttribute(name); + } else { + image.setAttribute(name, value); + } + }; + var wrapInFigure = function (image) { + var figureElm = DOM.create('figure', { class: 'image' }); + DOM.insertAfter(figureElm, image); + figureElm.appendChild(image); + figureElm.appendChild(DOM.create('figcaption', { contentEditable: 'true' }, 'Caption')); + figureElm.contentEditable = 'false'; + }; + var removeFigure = function (image) { + var figureElm = image.parentNode; + DOM.insertAfter(image, figureElm); + DOM.remove(figureElm); + }; + var toggleCaption = function (image) { + if (hasCaption(image)) { + removeFigure(image); + } else { + wrapInFigure(image); + } + }; + var normalizeStyle = function (image, normalizeCss) { + var attrValue = image.getAttribute('style'); + var value = normalizeCss(attrValue !== null ? attrValue : ''); + if (value.length > 0) { + image.setAttribute('style', value); + image.setAttribute('data-mce-style', value); + } else { + image.removeAttribute('style'); + } + }; + var setSize = function (name, normalizeCss) { + return function (image, name, value) { + if (image.style[name]) { + image.style[name] = addPixelSuffix(value); + normalizeStyle(image, normalizeCss); + } else { + updateAttrib(image, name, value); + } + }; + }; + var getSize = function (image, name) { + if (image.style[name]) { + return removePixelSuffix(image.style[name]); + } else { + return getAttrib(image, name); + } + }; + var setHspace = function (image, value) { + var pxValue = addPixelSuffix(value); + image.style.marginLeft = pxValue; + image.style.marginRight = pxValue; + }; + var setVspace = function (image, value) { + var pxValue = addPixelSuffix(value); + image.style.marginTop = pxValue; + image.style.marginBottom = pxValue; + }; + var setBorder = function (image, value) { + var pxValue = addPixelSuffix(value); + image.style.borderWidth = pxValue; + }; + var setBorderStyle = function (image, value) { + image.style.borderStyle = value; + }; + var getBorderStyle = function (image) { + return getStyle(image, 'borderStyle'); + }; + var isFigure = function (elm) { + return elm.nodeName === 'FIGURE'; + }; + var isImage = function (elm) { + return elm.nodeName === 'IMG'; + }; + var getIsDecorative = function (image) { + return DOM.getAttrib(image, 'alt').length === 0 && DOM.getAttrib(image, 'role') === 'presentation'; + }; + var getAlt = function (image) { + if (getIsDecorative(image)) { + return ''; + } else { + return getAttrib(image, 'alt'); + } + }; + var defaultData = function () { + return { + src: '', + alt: '', + title: '', + width: '', + height: '', + class: '', + style: '', + caption: false, + hspace: '', + vspace: '', + border: '', + borderStyle: '', + isDecorative: false + }; + }; + var getStyleValue = function (normalizeCss, data) { + var image = domGlobals.document.createElement('img'); + updateAttrib(image, 'style', data.style); + if (getHspace(image) || data.hspace !== '') { + setHspace(image, data.hspace); + } + if (getVspace(image) || data.vspace !== '') { + setVspace(image, data.vspace); + } + if (getBorder(image) || data.border !== '') { + setBorder(image, data.border); + } + if (getBorderStyle(image) || data.borderStyle !== '') { + setBorderStyle(image, data.borderStyle); + } + return normalizeCss(image.getAttribute('style')); + }; + var create = function (normalizeCss, data) { + var image = domGlobals.document.createElement('img'); + write(normalizeCss, __assign(__assign({}, data), { caption: false }), image); + setAlt(image, data.alt, data.isDecorative); + if (data.caption) { + var figure = DOM.create('figure', { class: 'image' }); + figure.appendChild(image); + figure.appendChild(DOM.create('figcaption', { contentEditable: 'true' }, 'Caption')); + figure.contentEditable = 'false'; + return figure; + } else { + return image; + } + }; + var read = function (normalizeCss, image) { + return { + src: getAttrib(image, 'src'), + alt: getAlt(image), + title: getAttrib(image, 'title'), + width: getSize(image, 'width'), + height: getSize(image, 'height'), + class: getAttrib(image, 'class'), + style: normalizeCss(getAttrib(image, 'style')), + caption: hasCaption(image), + hspace: getHspace(image), + vspace: getVspace(image), + border: getBorder(image), + borderStyle: getStyle(image, 'borderStyle'), + isDecorative: getIsDecorative(image) + }; + }; + var updateProp = function (image, oldData, newData, name, set) { + if (newData[name] !== oldData[name]) { + set(image, name, newData[name]); + } + }; + var setAlt = function (image, alt, isDecorative) { + if (isDecorative) { + DOM.setAttrib(image, 'role', 'presentation'); + var sugarImage = Element.fromDom(image); + set(sugarImage, 'alt', ''); + } else { + if (isNull(alt)) { + var sugarImage = Element.fromDom(image); + remove(sugarImage, 'alt'); + } else { + var sugarImage = Element.fromDom(image); + set(sugarImage, 'alt', alt); + } + if (DOM.getAttrib(image, 'role') === 'presentation') { + DOM.setAttrib(image, 'role', ''); + } + } + }; + var updateAlt = function (image, oldData, newData) { + if (newData.alt !== oldData.alt || newData.isDecorative !== oldData.isDecorative) { + setAlt(image, newData.alt, newData.isDecorative); + } + }; + var normalized = function (set, normalizeCss) { + return function (image, name, value) { + set(image, value); + normalizeStyle(image, normalizeCss); + }; + }; + var write = function (normalizeCss, newData, image) { + var oldData = read(normalizeCss, image); + updateProp(image, oldData, newData, 'caption', function (image, _name, _value) { + return toggleCaption(image); + }); + updateProp(image, oldData, newData, 'src', updateAttrib); + updateProp(image, oldData, newData, 'title', updateAttrib); + updateProp(image, oldData, newData, 'width', setSize('width', normalizeCss)); + updateProp(image, oldData, newData, 'height', setSize('height', normalizeCss)); + updateProp(image, oldData, newData, 'class', updateAttrib); + updateProp(image, oldData, newData, 'style', normalized(function (image, value) { + return updateAttrib(image, 'style', value); + }, normalizeCss)); + updateProp(image, oldData, newData, 'hspace', normalized(setHspace, normalizeCss)); + updateProp(image, oldData, newData, 'vspace', normalized(setVspace, normalizeCss)); + updateProp(image, oldData, newData, 'border', normalized(setBorder, normalizeCss)); + updateProp(image, oldData, newData, 'borderStyle', normalized(setBorderStyle, normalizeCss)); + updateAlt(image, oldData, newData); + }; + + var normalizeCss = function (editor, cssText) { + var css = editor.dom.styles.parse(cssText); + var mergedCss = mergeMargins(css); + var compressed = editor.dom.styles.parse(editor.dom.styles.serialize(mergedCss)); + return editor.dom.styles.serialize(compressed); + }; + var getSelectedImage = function (editor) { + var imgElm = editor.selection.getNode(); + var figureElm = editor.dom.getParent(imgElm, 'figure.image'); + if (figureElm) { + return editor.dom.select('img', figureElm)[0]; + } + if (imgElm && (imgElm.nodeName !== 'IMG' || isPlaceholderImage(imgElm))) { + return null; + } + return imgElm; + }; + var splitTextBlock = function (editor, figure) { + var dom = editor.dom; + var textBlock = dom.getParent(figure.parentNode, function (node) { + return !!editor.schema.getTextBlockElements()[node.nodeName]; + }, editor.getBody()); + if (textBlock) { + return dom.split(textBlock, figure); + } else { + return figure; + } + }; + var readImageDataFromSelection = function (editor) { + var image = getSelectedImage(editor); + return image ? read(function (css) { + return normalizeCss(editor, css); + }, image) : defaultData(); + }; + var insertImageAtCaret = function (editor, data) { + var elm = create(function (css) { + return normalizeCss(editor, css); + }, data); + editor.dom.setAttrib(elm, 'data-mce-id', '__mcenew'); + editor.focus(); + editor.selection.setContent(elm.outerHTML); + var insertedElm = editor.dom.select('*[data-mce-id="__mcenew"]')[0]; + editor.dom.setAttrib(insertedElm, 'data-mce-id', null); + if (isFigure(insertedElm)) { + var figure = splitTextBlock(editor, insertedElm); + editor.selection.select(figure); + } else { + editor.selection.select(insertedElm); + } + }; + var syncSrcAttr = function (editor, image) { + editor.dom.setAttrib(image, 'src', image.getAttribute('src')); + }; + var deleteImage = function (editor, image) { + if (image) { + var elm = editor.dom.is(image.parentNode, 'figure.image') ? image.parentNode : image; + editor.dom.remove(elm); + editor.focus(); + editor.nodeChanged(); + if (editor.dom.isEmpty(editor.getBody())) { + editor.setContent(''); + editor.selection.setCursorLocation(); + } + } + }; + var writeImageDataToSelection = function (editor, data) { + var image = getSelectedImage(editor); + write(function (css) { + return normalizeCss(editor, css); + }, data, image); + syncSrcAttr(editor, image); + if (isFigure(image.parentNode)) { + var figure = image.parentNode; + splitTextBlock(editor, figure); + editor.selection.select(image.parentNode); + } else { + editor.selection.select(image); + waitLoadImage(editor, data, image); + } + }; + var insertOrUpdateImage = function (editor, partialData) { + var image = getSelectedImage(editor); + if (image) { + var selectedImageData = read(function (css) { + return normalizeCss(editor, css); + }, image); + var data = __assign(__assign({}, selectedImageData), partialData); + if (data.src) { + writeImageDataToSelection(editor, data); + } else { + deleteImage(editor, image); + } + } else if (partialData.src) { + insertImageAtCaret(editor, __assign(__assign({}, defaultData()), partialData)); + } + }; + + var global$4 = tinymce.util.Tools.resolve('tinymce.util.Tools'); + + var getValue = function (item) { + return isString(item.value) ? item.value : ''; + }; + var sanitizeList = function (list, extractValue) { + var out = []; + global$4.each(list, function (item) { + var text = isString(item.text) ? item.text : isString(item.title) ? item.title : ''; + if (item.menu !== undefined) { + var items = sanitizeList(item.menu, extractValue); + out.push({ + text: text, + items: items + }); + } else { + var value = extractValue(item); + out.push({ + text: text, + value: value + }); + } + }); + return out; + }; + var sanitizer = function (extracter) { + if (extracter === void 0) { + extracter = getValue; + } + return function (list) { + if (list) { + return Option.from(list).map(function (list) { + return sanitizeList(list, extracter); + }); + } else { + return Option.none(); + } + }; + }; + var sanitize = function (list) { + return sanitizer(getValue)(list); + }; + var isGroup = function (item) { + return Object.prototype.hasOwnProperty.call(item, 'items'); + }; + var findEntryDelegate = function (list, value) { + return findMap(list, function (item) { + if (isGroup(item)) { + return findEntryDelegate(item.items, value); + } else if (item.value === value) { + return Option.some(item); + } else { + return Option.none(); + } + }); + }; + var findEntry = function (optList, value) { + return optList.bind(function (list) { + return findEntryDelegate(list, value); + }); + }; + var ListUtils = { + sanitizer: sanitizer, + sanitize: sanitize, + findEntry: findEntry + }; + + var pathJoin = function (path1, path2) { + if (path1) { + return path1.replace(/\/$/, '') + '/' + path2.replace(/^\//, ''); + } + return path2; + }; + function Uploader (settings) { + var defaultHandler = function (blobInfo, success, failure, progress) { + var xhr = new domGlobals.XMLHttpRequest(); + xhr.open('POST', settings.url); + xhr.withCredentials = settings.credentials; + xhr.upload.onprogress = function (e) { + progress(e.loaded / e.total * 100); + }; + xhr.onerror = function () { + failure('Image upload failed due to a XHR Transport error. Code: ' + xhr.status); + }; + xhr.onload = function () { + if (xhr.status < 200 || xhr.status >= 300) { + failure('HTTP Error: ' + xhr.status); + return; + } + var json = JSON.parse(xhr.responseText); + if (!json || typeof json.location !== 'string') { + failure('Invalid JSON: ' + xhr.responseText); + return; + } + success(pathJoin(settings.basePath, json.location)); + }; + var formData = new domGlobals.FormData(); + formData.append('file', blobInfo.blob(), blobInfo.filename()); + xhr.send(formData); + }; + var uploadBlob = function (blobInfo, handler) { + return new global$2(function (resolve, reject) { + try { + handler(blobInfo, resolve, reject, noop); + } catch (ex) { + reject(ex.message); + } + }); + }; + var isDefaultHandler = function (handler) { + return handler === defaultHandler; + }; + var upload = function (blobInfo) { + return !settings.url && isDefaultHandler(settings.handler) ? global$2.reject('Upload url missing from the settings.') : uploadBlob(blobInfo, settings.handler); + }; + settings = global$4.extend({ + credentials: false, + handler: defaultHandler + }, settings); + return { upload: upload }; + } + + var makeTab = function (_info) { + return { + title: 'Advanced', + name: 'advanced', + items: [ + { + type: 'input', + label: 'Style', + name: 'style' + }, + { + type: 'grid', + columns: 2, + items: [ + { + type: 'input', + label: 'Vertical space', + name: 'vspace', + inputMode: 'numeric' + }, + { + type: 'input', + label: 'Horizontal space', + name: 'hspace', + inputMode: 'numeric' + }, + { + type: 'input', + label: 'Border width', + name: 'border', + inputMode: 'numeric' + }, + { + type: 'selectbox', + name: 'borderstyle', + label: 'Border style', + items: [ + { + text: 'Select...', + value: '' + }, + { + text: 'Solid', + value: 'solid' + }, + { + text: 'Dotted', + value: 'dotted' + }, + { + text: 'Dashed', + value: 'dashed' + }, + { + text: 'Double', + value: 'double' + }, + { + text: 'Groove', + value: 'groove' + }, + { + text: 'Ridge', + value: 'ridge' + }, + { + text: 'Inset', + value: 'inset' + }, + { + text: 'Outset', + value: 'outset' + }, + { + text: 'None', + value: 'none' + }, + { + text: 'Hidden', + value: 'hidden' + } + ] + } + ] + } + ] + }; + }; + var AdvTab = { makeTab: makeTab }; + + var collect = function (editor) { + var urlListSanitizer = ListUtils.sanitizer(function (item) { + return editor.convertURL(item.value || item.url, 'src'); + }); + var futureImageList = new global$2(function (completer) { + createImageList(editor, function (imageList) { + completer(urlListSanitizer(imageList).map(function (items) { + return flatten([ + [{ + text: 'None', + value: '' + }], + items + ]); + })); + }); + }); + var classList = ListUtils.sanitize(getClassList(editor)); + var hasAdvTab$1 = hasAdvTab(editor); + var hasUploadTab$1 = hasUploadTab(editor); + var hasUploadUrl$1 = hasUploadUrl(editor); + var hasUploadHandler$1 = hasUploadHandler(editor); + var image = readImageDataFromSelection(editor); + var hasDescription$1 = hasDescription(editor); + var hasImageTitle$1 = hasImageTitle(editor); + var hasDimensions$1 = hasDimensions(editor); + var hasImageCaption$1 = hasImageCaption(editor); + var hasAccessibilityOptions = showAccessibilityOptions(editor); + var url = getUploadUrl(editor); + var basePath = getUploadBasePath(editor); + var credentials = getUploadCredentials(editor); + var handler = getUploadHandler(editor); + var automaticUploads = isAutomaticUploadsEnabled(editor); + var prependURL = Option.some(getPrependUrl(editor)).filter(function (preUrl) { + return isString(preUrl) && preUrl.length > 0; + }); + return futureImageList.then(function (imageList) { + return { + image: image, + imageList: imageList, + classList: classList, + hasAdvTab: hasAdvTab$1, + hasUploadTab: hasUploadTab$1, + hasUploadUrl: hasUploadUrl$1, + hasUploadHandler: hasUploadHandler$1, + hasDescription: hasDescription$1, + hasImageTitle: hasImageTitle$1, + hasDimensions: hasDimensions$1, + hasImageCaption: hasImageCaption$1, + url: url, + basePath: basePath, + credentials: credentials, + handler: handler, + prependURL: prependURL, + hasAccessibilityOptions: hasAccessibilityOptions, + automaticUploads: automaticUploads + }; + }); + }; + + var makeItems = function (info) { + var imageUrl = { + name: 'src', + type: 'urlinput', + filetype: 'image', + label: 'Source' + }; + var imageList = info.imageList.map(function (items) { + return { + name: 'images', + type: 'selectbox', + label: 'Image list', + items: items + }; + }); + var imageDescription = { + name: 'alt', + type: 'input', + label: 'Alternative description', + disabled: info.hasAccessibilityOptions && info.image.isDecorative + }; + var imageTitle = { + name: 'title', + type: 'input', + label: 'Image title' + }; + var imageDimensions = { + name: 'dimensions', + type: 'sizeinput' + }; + var isDecorative = { + type: 'label', + label: 'Accessibility', + items: [{ + name: 'isDecorative', + type: 'checkbox', + label: 'Image is decorative' + }] + }; + var classList = info.classList.map(function (items) { + return { + name: 'classes', + type: 'selectbox', + label: 'Class', + items: items + }; + }); + var caption = { + type: 'label', + label: 'Caption', + items: [{ + type: 'checkbox', + name: 'caption', + label: 'Show caption' + }] + }; + return flatten([ + [imageUrl], + imageList.toArray(), + info.hasAccessibilityOptions && info.hasDescription ? [isDecorative] : [], + info.hasDescription ? [imageDescription] : [], + info.hasImageTitle ? [imageTitle] : [], + info.hasDimensions ? [imageDimensions] : [], + [{ + type: 'grid', + columns: 2, + items: flatten([ + classList.toArray(), + info.hasImageCaption ? [caption] : [] + ]) + }] + ]); + }; + var makeTab$1 = function (info) { + return { + title: 'General', + name: 'general', + items: makeItems(info) + }; + }; + var MainTab = { + makeTab: makeTab$1, + makeItems: makeItems + }; + + var makeTab$2 = function (_info) { + var items = [{ + type: 'dropzone', + name: 'fileinput' + }]; + return { + title: 'Upload', + name: 'upload', + items: items + }; + }; + var UploadTab = { makeTab: makeTab$2 }; + + var createState = function (info) { + return { + prevImage: ListUtils.findEntry(info.imageList, info.image.src), + prevAlt: info.image.alt, + open: true + }; + }; + var fromImageData = function (image) { + return { + src: { + value: image.src, + meta: {} + }, + images: image.src, + alt: image.alt, + title: image.title, + dimensions: { + width: image.width, + height: image.height + }, + classes: image.class, + caption: image.caption, + style: image.style, + vspace: image.vspace, + border: image.border, + hspace: image.hspace, + borderstyle: image.borderStyle, + fileinput: [], + isDecorative: image.isDecorative + }; + }; + var toImageData = function (data, removeEmptyAlt) { + return { + src: data.src.value, + alt: data.alt.length === 0 && removeEmptyAlt ? null : data.alt, + title: data.title, + width: data.dimensions.width, + height: data.dimensions.height, + class: data.classes, + style: data.style, + caption: data.caption, + hspace: data.hspace, + vspace: data.vspace, + border: data.border, + borderStyle: data.borderstyle, + isDecorative: data.isDecorative + }; + }; + var addPrependUrl2 = function (info, srcURL) { + if (!/^(?:[a-zA-Z]+:)?\/\//.test(srcURL)) { + return info.prependURL.bind(function (prependUrl) { + if (srcURL.substring(0, prependUrl.length) !== prependUrl) { + return Option.some(prependUrl + srcURL); + } + return Option.none(); + }); + } + return Option.none(); + }; + var addPrependUrl = function (info, api) { + var data = api.getData(); + addPrependUrl2(info, data.src.value).each(function (srcURL) { + api.setData({ + src: { + value: srcURL, + meta: data.src.meta + } + }); + }); + }; + var formFillFromMeta2 = function (info, data, meta) { + if (info.hasDescription && isString(meta.alt)) { + data.alt = meta.alt; + } + if (info.hasAccessibilityOptions) { + data.isDecorative = meta.isDecorative || data.isDecorative || false; + } + if (info.hasImageTitle && isString(meta.title)) { + data.title = meta.title; + } + if (info.hasDimensions) { + if (isString(meta.width)) { + data.dimensions.width = meta.width; + } + if (isString(meta.height)) { + data.dimensions.height = meta.height; + } + } + if (isString(meta.class)) { + ListUtils.findEntry(info.classList, meta.class).each(function (entry) { + data.classes = entry.value; + }); + } + if (info.hasImageCaption) { + if (isBoolean(meta.caption)) { + data.caption = meta.caption; + } + } + if (info.hasAdvTab) { + if (isString(meta.style)) { + data.style = meta.style; + } + if (isString(meta.vspace)) { + data.vspace = meta.vspace; + } + if (isString(meta.border)) { + data.border = meta.border; + } + if (isString(meta.hspace)) { + data.hspace = meta.hspace; + } + if (isString(meta.borderstyle)) { + data.borderstyle = meta.borderstyle; + } + } + }; + var formFillFromMeta = function (info, api) { + var data = api.getData(); + var meta = data.src.meta; + if (meta !== undefined) { + var newData = deepMerge({}, data); + formFillFromMeta2(info, newData, meta); + api.setData(newData); + } + }; + var calculateImageSize = function (helpers, info, state, api) { + var data = api.getData(); + var url = data.src.value; + var meta = data.src.meta || {}; + if (!meta.width && !meta.height && info.hasDimensions) { + helpers.imageSize(url).then(function (size) { + if (state.open) { + api.setData({ dimensions: size }); + } + }); + } + }; + var updateImagesDropdown = function (info, state, api) { + var data = api.getData(); + var image = ListUtils.findEntry(info.imageList, data.src.value); + state.prevImage = image; + api.setData({ + images: image.map(function (entry) { + return entry.value; + }).getOr('') + }); + }; + var changeSrc = function (helpers, info, state, api) { + addPrependUrl(info, api); + formFillFromMeta(info, api); + calculateImageSize(helpers, info, state, api); + updateImagesDropdown(info, state, api); + }; + var changeImages = function (helpers, info, state, api) { + var data = api.getData(); + var image = ListUtils.findEntry(info.imageList, data.images); + image.each(function (img) { + var updateAlt = data.alt === '' || state.prevImage.map(function (image) { + return image.text === data.alt; + }).getOr(false); + if (updateAlt) { + if (img.value === '') { + api.setData({ + src: img, + alt: state.prevAlt + }); + } else { + api.setData({ + src: img, + alt: img.text + }); + } + } else { + api.setData({ src: img }); + } + }); + state.prevImage = image; + changeSrc(helpers, info, state, api); + }; + var calcVSpace = function (css) { + var matchingTopBottom = css['margin-top'] && css['margin-bottom'] && css['margin-top'] === css['margin-bottom']; + return matchingTopBottom ? removePixelSuffix(String(css['margin-top'])) : ''; + }; + var calcHSpace = function (css) { + var matchingLeftRight = css['margin-right'] && css['margin-left'] && css['margin-right'] === css['margin-left']; + return matchingLeftRight ? removePixelSuffix(String(css['margin-right'])) : ''; + }; + var calcBorderWidth = function (css) { + return css['border-width'] ? removePixelSuffix(String(css['border-width'])) : ''; + }; + var calcBorderStyle = function (css) { + return css['border-style'] ? String(css['border-style']) : ''; + }; + var calcStyle = function (parseStyle, serializeStyle, css) { + return serializeStyle(parseStyle(serializeStyle(css))); + }; + var changeStyle2 = function (parseStyle, serializeStyle, data) { + var css = mergeMargins(parseStyle(data.style)); + var dataCopy = deepMerge({}, data); + dataCopy.vspace = calcVSpace(css); + dataCopy.hspace = calcHSpace(css); + dataCopy.border = calcBorderWidth(css); + dataCopy.borderstyle = calcBorderStyle(css); + dataCopy.style = calcStyle(parseStyle, serializeStyle, css); + return dataCopy; + }; + var changeStyle = function (helpers, api) { + var data = api.getData(); + var newData = changeStyle2(helpers.parseStyle, helpers.serializeStyle, data); + api.setData(newData); + }; + var changeAStyle = function (helpers, info, api) { + var data = deepMerge(fromImageData(info.image), api.getData()); + var style = getStyleValue(helpers.normalizeCss, toImageData(data, false)); + api.setData({ style: style }); + }; + var changeFileInput = function (helpers, info, state, api) { + var data = api.getData(); + api.block('Uploading image'); + head(data.fileinput).fold(function () { + api.unblock(); + }, function (file) { + var blobUri = domGlobals.URL.createObjectURL(file); + var uploader = Uploader({ + url: info.url, + basePath: info.basePath, + credentials: info.credentials, + handler: info.handler + }); + var finalize = function () { + api.unblock(); + domGlobals.URL.revokeObjectURL(blobUri); + }; + var updateSrcAndSwitchTab = function (url) { + api.setData({ + src: { + value: url, + meta: {} + } + }); + api.showTab('general'); + changeSrc(helpers, info, state, api); + }; + blobToDataUri(file).then(function (dataUrl) { + var blobInfo = helpers.createBlobCache(file, blobUri, dataUrl); + if (info.automaticUploads) { + uploader.upload(blobInfo).then(function (url) { + updateSrcAndSwitchTab(url); + finalize(); + }).catch(function (err) { + finalize(); + helpers.alertErr(err); + }); + } else { + helpers.addToBlobCache(blobInfo); + updateSrcAndSwitchTab(blobInfo.blobUri()); + api.unblock(); + } + }); + }); + }; + var changeHandler = function (helpers, info, state) { + return function (api, evt) { + if (evt.name === 'src') { + changeSrc(helpers, info, state, api); + } else if (evt.name === 'images') { + changeImages(helpers, info, state, api); + } else if (evt.name === 'alt') { + state.prevAlt = api.getData().alt; + } else if (evt.name === 'style') { + changeStyle(helpers, api); + } else if (evt.name === 'vspace' || evt.name === 'hspace' || evt.name === 'border' || evt.name === 'borderstyle') { + changeAStyle(helpers, info, api); + } else if (evt.name === 'fileinput') { + changeFileInput(helpers, info, state, api); + } else if (evt.name === 'isDecorative') { + if (api.getData().isDecorative) { + api.disable('alt'); + } else { + api.enable('alt'); + } + } + }; + }; + var closeHandler = function (state) { + return function () { + state.open = false; + }; + }; + var makeDialogBody = function (info) { + if (info.hasAdvTab || info.hasUploadUrl || info.hasUploadHandler) { + var tabPanel = { + type: 'tabpanel', + tabs: flatten([ + [MainTab.makeTab(info)], + info.hasAdvTab ? [AdvTab.makeTab(info)] : [], + info.hasUploadTab && (info.hasUploadUrl || info.hasUploadHandler) ? [UploadTab.makeTab(info)] : [] + ]) + }; + return tabPanel; + } else { + var panel = { + type: 'panel', + items: MainTab.makeItems(info) + }; + return panel; + } + }; + var makeDialog = function (helpers) { + return function (info) { + var state = createState(info); + return { + title: 'Insert/Edit Image', + size: 'normal', + body: makeDialogBody(info), + buttons: [ + { + type: 'cancel', + name: 'cancel', + text: 'Cancel' + }, + { + type: 'submit', + name: 'save', + text: 'Save', + primary: true + } + ], + initialData: fromImageData(info.image), + onSubmit: helpers.onSubmit(info), + onChange: changeHandler(helpers, info, state), + onClose: closeHandler(state) + }; + }; + }; + var submitHandler = function (editor) { + return function (info) { + return function (api) { + var data = deepMerge(fromImageData(info.image), api.getData()); + editor.execCommand('mceUpdateImage', false, toImageData(data, info.hasAccessibilityOptions)); + editor.editorUpload.uploadImagesAuto(); + api.close(); + }; + }; + }; + var imageSize = function (editor) { + return function (url) { + return getImageSize(editor.documentBaseURI.toAbsolute(url)).then(function (dimensions) { + return { + width: String(dimensions.width), + height: String(dimensions.height) + }; + }); + }; + }; + var createBlobCache = function (editor) { + return function (file, blobUri, dataUrl) { + return editor.editorUpload.blobCache.create({ + blob: file, + blobUri: blobUri, + name: file.name ? file.name.replace(/\.[^\.]+$/, '') : null, + base64: dataUrl.split(',')[1] + }); + }; + }; + var addToBlobCache = function (editor) { + return function (blobInfo) { + editor.editorUpload.blobCache.add(blobInfo); + }; + }; + var alertErr = function (editor) { + return function (message) { + editor.windowManager.alert(message); + }; + }; + var normalizeCss$1 = function (editor) { + return function (cssText) { + return normalizeCss(editor, cssText); + }; + }; + var parseStyle = function (editor) { + return function (cssText) { + return editor.dom.parseStyle(cssText); + }; + }; + var serializeStyle = function (editor) { + return function (stylesArg, name) { + return editor.dom.serializeStyle(stylesArg, name); + }; + }; + var Dialog = function (editor) { + var helpers = { + onSubmit: submitHandler(editor), + imageSize: imageSize(editor), + addToBlobCache: addToBlobCache(editor), + createBlobCache: createBlobCache(editor), + alertErr: alertErr(editor), + normalizeCss: normalizeCss$1(editor), + parseStyle: parseStyle(editor), + serializeStyle: serializeStyle(editor) + }; + var open = function () { + return collect(editor).then(makeDialog(helpers)).then(function (spec) { + return editor.windowManager.open(spec); + }); + }; + var openLater = function () { + open(); + }; + return { + open: open, + openLater: openLater + }; + }; + + var register = function (editor) { + editor.addCommand('mceImage', Dialog(editor).openLater); + editor.addCommand('mceUpdateImage', function (_ui, data) { + editor.undoManager.transact(function () { + return insertOrUpdateImage(editor, data); + }); + }); + }; + + var hasImageClass = function (node) { + var className = node.attr('class'); + return className && /\bimage\b/.test(className); + }; + var toggleContentEditableState = function (state) { + return function (nodes) { + var i = nodes.length; + var toggleContentEditable = function (node) { + node.attr('contenteditable', state ? 'true' : null); + }; + while (i--) { + var node = nodes[i]; + if (hasImageClass(node)) { + node.attr('contenteditable', state ? 'false' : null); + global$4.each(node.getAll('figcaption'), toggleContentEditable); + } + } + }; + }; + var setup = function (editor) { + editor.on('PreInit', function () { + editor.parser.addNodeFilter('figure', toggleContentEditableState(true)); + editor.serializer.addNodeFilter('figure', toggleContentEditableState(false)); + }); + }; + + var register$1 = function (editor) { + editor.ui.registry.addToggleButton('image', { + icon: 'image', + tooltip: 'Insert/edit image', + onAction: Dialog(editor).openLater, + onSetup: function (buttonApi) { + return editor.selection.selectorChangedWithUnbind('img:not([data-mce-object],[data-mce-placeholder]),figure.image', buttonApi.setActive).unbind; + } + }); + editor.ui.registry.addMenuItem('image', { + icon: 'image', + text: 'Image...', + onAction: Dialog(editor).openLater + }); + editor.ui.registry.addContextMenu('image', { + update: function (element) { + return isFigure(element) || isImage(element) && !isPlaceholderImage(element) ? ['image'] : []; + } + }); + }; + + function Plugin () { + global.add('image', function (editor) { + setup(editor); + register$1(editor); + register(editor); + }); + } + + Plugin(); + +}(window)); diff --git a/src/main/resources/static/layui-ext/tinymce/tinymce/plugins/image/plugin.min.js b/src/main/resources/static/layui-ext/tinymce/tinymce/plugins/image/plugin.min.js new file mode 100644 index 0000000..b187901 --- /dev/null +++ b/src/main/resources/static/layui-ext/tinymce/tinymce/plugins/image/plugin.min.js @@ -0,0 +1,9 @@ +/** + * 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/ + * + * Version: 5.4.2 (2020-08-17) + */ +!function(m){"use strict";var e,t,n,r,o,a=tinymce.util.Tools.resolve("tinymce.PluginManager"),i=function(){},l=function(e){return function(){return e}},s=l(!1),u=l(!0),c=function(){return d},d=(e=function(e){return e.isNone()},{fold:function(e,t){return e()},is:s,isSome:s,isNone:u,getOr:n=function(e){return e},getOrThunk:t=function(e){return e()},getOrDie:function(e){throw new Error(e||"error: getOrDie called on none.")},getOrNull:l(null),getOrUndefined:l(undefined),or:n,orThunk:t,map:c,each:i,bind:c,exists:s,forall:u,filter:c,equals:e,equals_:e,toArray:function(){return[]},toString:l("none()")}),g=function(n){var e=l(n),t=function(){return a},r=function(e){return e(n)},a={fold:function(e,t){return t(n)},is:function(e){return n===e},isSome:u,isNone:s,getOr:e,getOrThunk:e,getOrDie:e,getOrNull:e,getOrUndefined:e,or:t,orThunk:t,map:function(e){return g(e(n))},each:function(e){e(n)},bind:r,exists:r,forall:r,filter:function(e){return e(n)?a:d},toArray:function(){return[n]},toString:function(){return"some("+n+")"},equals:function(e){return e.is(n)},equals_:function(e,t){return e.fold(s,function(e){return t(n,e)})}};return a},A={some:g,none:c,from:function(e){return null===e||e===undefined?d:g(e)}},f=function(r){return function(e){return n=typeof(t=e),(null===t?"null":"object"==n&&(Array.prototype.isPrototypeOf(t)||t.constructor&&"Array"===t.constructor.name)?"array":"object"==n&&(String.prototype.isPrototypeOf(t)||t.constructor&&"String"===t.constructor.name)?"string":n)===r;var t,n}},p=function(t){return function(e){return typeof e===t}},S=f("string"),h=f("object"),b=f("array"),v=(r=null,function(e){return r===e}),y=p("boolean"),w=p("number"),D=Array.prototype.push,x=function(e){for(var t=[],n=0,r=e.length;n 1) { + domGlobals.console.error('HTML does not have a single root node', html); + throw new Error('HTML must have a single root node'); + } + return fromDom(div.childNodes[0]); + }; + var fromTag = function (tag, scope) { + var doc = scope || domGlobals.document; + var node = doc.createElement(tag); + return fromDom(node); + }; + var fromText = function (text, scope) { + var doc = scope || domGlobals.document; + var node = doc.createTextNode(text); + return fromDom(node); + }; + var fromDom = function (node) { + if (node === null || node === undefined) { + throw new Error('Node cannot be null or undefined'); + } + return { dom: constant(node) }; + }; + var fromPoint = function (docElm, x, y) { + var doc = docElm.dom(); + return Option.from(doc.elementFromPoint(x, y)).map(fromDom); + }; + var Element = { + fromHtml: fromHtml, + fromTag: fromTag, + fromText: fromText, + fromDom: fromDom, + fromPoint: fromPoint + }; + + var ELEMENT = 1; + + var is = function (element, selector) { + var dom = element.dom(); + if (dom.nodeType !== ELEMENT) { + return false; + } else { + var elem = dom; + if (elem.matches !== undefined) { + return elem.matches(selector); + } else if (elem.msMatchesSelector !== undefined) { + return elem.msMatchesSelector(selector); + } else if (elem.webkitMatchesSelector !== undefined) { + return elem.webkitMatchesSelector(selector); + } else if (elem.mozMatchesSelector !== undefined) { + return elem.mozMatchesSelector(selector); + } else { + throw new Error('Browser lacks native selectors'); + } + } + }; + + var Global = typeof domGlobals.window !== 'undefined' ? domGlobals.window : Function('return this;')(); + + var supported = isFunction(domGlobals.Element.prototype.attachShadow) && isFunction(domGlobals.Node.prototype.getRootNode); + + var child = function (scope, predicate) { + var pred = function (node) { + return predicate(Element.fromDom(node)); + }; + var result = find(scope.dom().childNodes, pred); + return result.map(Element.fromDom); + }; + + var child$1 = function (scope, selector) { + return child(scope, function (e) { + return is(e, selector); + }); + }; + + var global$2 = tinymce.util.Tools.resolve('tinymce.util.Delay'); + + var global$3 = tinymce.util.Tools.resolve('tinymce.util.Promise'); + + var global$4 = tinymce.util.Tools.resolve('tinymce.util.URI'); + + var getToolbarItems = function (editor) { + return editor.getParam('imagetools_toolbar', 'rotateleft rotateright flipv fliph editimage imageoptions'); + }; + var getProxyUrl = function (editor) { + return editor.getParam('imagetools_proxy'); + }; + var getCorsHosts = function (editor) { + return editor.getParam('imagetools_cors_hosts', [], 'string[]'); + }; + var getCredentialsHosts = function (editor) { + return editor.getParam('imagetools_credentials_hosts', [], 'string[]'); + }; + var getFetchImage = function (editor) { + return Option.from(editor.getParam('imagetools_fetch_image', null, 'function')); + }; + var getApiKey = function (editor) { + return editor.getParam('api_key', editor.getParam('imagetools_api_key', '', 'string'), 'string'); + }; + var getUploadTimeout = function (editor) { + return editor.getParam('images_upload_timeout', 30000, 'number'); + }; + var shouldReuseFilename = function (editor) { + return editor.getParam('images_reuse_filename', false, 'boolean'); + }; + + function getImageSize(img) { + var width, height; + function isPxValue(value) { + return /^[0-9\.]+px$/.test(value); + } + width = img.style.width; + height = img.style.height; + if (width || height) { + if (isPxValue(width) && isPxValue(height)) { + return { + w: parseInt(width, 10), + h: parseInt(height, 10) + }; + } + return null; + } + width = img.width; + height = img.height; + if (width && height) { + return { + w: parseInt(width, 10), + h: parseInt(height, 10) + }; + } + return null; + } + function setImageSize(img, size) { + var width, height; + if (size) { + width = img.style.width; + height = img.style.height; + if (width || height) { + img.style.width = size.w + 'px'; + img.style.height = size.h + 'px'; + img.removeAttribute('data-mce-style'); + } + width = img.width; + height = img.height; + if (width || height) { + img.setAttribute('width', size.w); + img.setAttribute('height', size.h); + } + } + } + function getNaturalImageSize(img) { + return { + w: img.naturalWidth, + h: img.naturalHeight + }; + } + + var isValue = function (obj) { + return obj !== null && obj !== undefined; + }; + var traverse = function (json, path) { + var value = path.reduce(function (result, key) { + return isValue(result) ? result[key] : undefined; + }, json); + return isValue(value) ? value : null; + }; + var requestUrlAsBlob = function (url, headers, withCredentials) { + return new global$3(function (resolve) { + var xhr = new domGlobals.XMLHttpRequest(); + xhr.onreadystatechange = function () { + if (xhr.readyState === 4) { + resolve({ + status: xhr.status, + blob: this.response + }); + } + }; + xhr.open('GET', url, true); + xhr.withCredentials = withCredentials; + global$1.each(headers, function (value, key) { + xhr.setRequestHeader(key, value); + }); + xhr.responseType = 'blob'; + xhr.send(); + }); + }; + var readBlob = function (blob) { + return new global$3(function (resolve) { + var fr = new domGlobals.FileReader(); + fr.onload = function (e) { + var data = e.target; + resolve(data.result); + }; + fr.readAsText(blob); + }); + }; + var parseJson = function (text) { + var json; + try { + json = JSON.parse(text); + } catch (ex) { + } + return json; + }; + + var friendlyHttpErrors = [ + { + code: 404, + message: 'Could not find Image Proxy' + }, + { + code: 403, + message: 'Rejected request' + }, + { + code: 0, + message: 'Incorrect Image Proxy URL' + } + ]; + var friendlyServiceErrors = [ + { + type: 'key_missing', + message: 'The request did not include an api key.' + }, + { + type: 'key_not_found', + message: 'The provided api key could not be found.' + }, + { + type: 'domain_not_trusted', + message: 'The api key is not valid for the request origins.' + } + ]; + var isServiceErrorCode = function (code) { + return code === 400 || code === 403 || code === 500; + }; + var getHttpErrorMsg = function (status) { + var message = find(friendlyHttpErrors, function (error) { + return status === error.code; + }).fold(constant('Unknown ImageProxy error'), function (error) { + return error.message; + }); + return 'ImageProxy HTTP error: ' + message; + }; + var handleHttpError = function (status) { + var message = getHttpErrorMsg(status); + return global$3.reject(message); + }; + var getServiceErrorMsg = function (type) { + return find(friendlyServiceErrors, function (error) { + return error.type === type; + }).fold(constant('Unknown service error'), function (error) { + return error.message; + }); + }; + var getServiceError = function (text) { + var serviceError = parseJson(text); + var errorType = traverse(serviceError, [ + 'error', + 'type' + ]); + var errorMsg = errorType ? getServiceErrorMsg(errorType) : 'Invalid JSON in service error message'; + return 'ImageProxy Service error: ' + errorMsg; + }; + var handleServiceError = function (status, blob) { + return readBlob(blob).then(function (text) { + var serviceError = getServiceError(text); + return global$3.reject(serviceError); + }); + }; + var handleServiceErrorResponse = function (status, blob) { + return isServiceErrorCode(status) ? handleServiceError(status, blob) : handleHttpError(status); + }; + + var appendApiKey = function (url, apiKey) { + var separator = url.indexOf('?') === -1 ? '?' : '&'; + if (/[?&]apiKey=/.test(url) || !apiKey) { + return url; + } else { + return url + separator + 'apiKey=' + encodeURIComponent(apiKey); + } + }; + var requestServiceBlob = function (url, apiKey) { + var headers = { + 'Content-Type': 'application/json;charset=UTF-8', + 'tiny-api-key': apiKey + }; + return requestUrlAsBlob(appendApiKey(url, apiKey), headers, false).then(function (result) { + return result.status < 200 || result.status >= 300 ? handleServiceErrorResponse(result.status, result.blob) : global$3.resolve(result.blob); + }); + }; + function requestBlob(url, withCredentials) { + return requestUrlAsBlob(url, {}, withCredentials).then(function (result) { + return result.status < 200 || result.status >= 300 ? handleHttpError(result.status) : global$3.resolve(result.blob); + }); + } + var getUrl = function (url, apiKey, withCredentials) { + return apiKey ? requestServiceBlob(url, apiKey) : requestBlob(url, withCredentials); + }; + + var count = 0; + var getFigureImg = function (elem) { + return child$1(Element.fromDom(elem), 'img'); + }; + var isFigure = function (editor, elem) { + return editor.dom.is(elem, 'figure'); + }; + var getEditableImage = function (editor, elem) { + var isImage = function (imgNode) { + return editor.dom.is(imgNode, 'img:not([data-mce-object],[data-mce-placeholder])'); + }; + var isEditable = function (imgNode) { + return isImage(imgNode) && (isLocalImage(editor, imgNode) || isCorsImage(editor, imgNode) || getProxyUrl(editor)); + }; + if (isFigure(editor, elem)) { + var imgOpt = getFigureImg(elem); + return imgOpt.map(function (img) { + return isEditable(img.dom()) ? Option.some(img.dom()) : Option.none(); + }); + } + return isEditable(elem) ? Option.some(elem) : Option.none(); + }; + var displayError = function (editor, error) { + editor.notificationManager.open({ + text: error, + type: 'error' + }); + }; + var getSelectedImage = function (editor) { + var elem = editor.selection.getNode(); + if (isFigure(editor, elem)) { + return getFigureImg(elem); + } else { + return Option.some(Element.fromDom(elem)); + } + }; + var extractFilename = function (editor, url) { + var m = url.match(/\/([^\/\?]+)?\.(?:jpeg|jpg|png|gif)(?:\?|$)/i); + if (m) { + return editor.dom.encode(m[1]); + } + return null; + }; + var createId = function () { + return 'imagetools' + count++; + }; + var isLocalImage = function (editor, img) { + var url = img.src; + return url.indexOf('data:') === 0 || url.indexOf('blob:') === 0 || new global$4(url).host === editor.documentBaseURI.host; + }; + var isCorsImage = function (editor, img) { + return global$1.inArray(getCorsHosts(editor), new global$4(img.src).host) !== -1; + }; + var isCorsWithCredentialsImage = function (editor, img) { + return global$1.inArray(getCredentialsHosts(editor), new global$4(img.src).host) !== -1; + }; + var defaultFetchImage = function (editor, img) { + var src = img.src, apiKey; + if (isCorsImage(editor, img)) { + return getUrl(img.src, null, isCorsWithCredentialsImage(editor, img)); + } + if (!isLocalImage(editor, img)) { + src = getProxyUrl(editor); + src += (src.indexOf('?') === -1 ? '?' : '&') + 'url=' + encodeURIComponent(img.src); + apiKey = getApiKey(editor); + return getUrl(src, apiKey, false); + } + return imageToBlob$1(img); + }; + var imageToBlob$2 = function (editor, img) { + return getFetchImage(editor).fold(function () { + return defaultFetchImage(editor, img); + }, function (customFetchImage) { + return customFetchImage(img); + }); + }; + var findBlob = function (editor, img) { + var blobInfo = editor.editorUpload.blobCache.getByUri(img.src); + if (blobInfo) { + return global$3.resolve(blobInfo.blob()); + } + return imageToBlob$2(editor, img); + }; + var startTimedUpload = function (editor, imageUploadTimerState) { + var imageUploadTimer = global$2.setEditorTimeout(editor, function () { + editor.editorUpload.uploadImagesAuto(); + }, getUploadTimeout(editor)); + imageUploadTimerState.set(imageUploadTimer); + }; + var cancelTimedUpload = function (imageUploadTimerState) { + global$2.clearTimeout(imageUploadTimerState.get()); + }; + var updateSelectedImage = function (editor, ir, uploadImmediately, imageUploadTimerState, selectedImage, size) { + return ir.toBlob().then(function (blob) { + var uri, name, blobInfo; + var blobCache = editor.editorUpload.blobCache; + uri = selectedImage.src; + if (shouldReuseFilename(editor)) { + blobInfo = blobCache.getByUri(uri); + if (blobInfo) { + uri = blobInfo.uri(); + name = blobInfo.name(); + } else { + name = extractFilename(editor, uri); + } + } + blobInfo = blobCache.create({ + id: createId(), + blob: blob, + base64: ir.toBase64(), + uri: uri, + name: name + }); + blobCache.add(blobInfo); + editor.undoManager.transact(function () { + function imageLoadedHandler() { + editor.$(selectedImage).off('load', imageLoadedHandler); + editor.nodeChanged(); + if (uploadImmediately) { + editor.editorUpload.uploadImagesAuto(); + } else { + cancelTimedUpload(imageUploadTimerState); + startTimedUpload(editor, imageUploadTimerState); + } + } + editor.$(selectedImage).on('load', imageLoadedHandler); + if (size) { + editor.$(selectedImage).attr({ + width: size.w, + height: size.h + }); + } + editor.$(selectedImage).attr({ src: blobInfo.blobUri() }).removeAttr('data-mce-src'); + }); + return blobInfo; + }); + }; + var selectedImageOperation = function (editor, imageUploadTimerState, fn, size) { + return function () { + var imgOpt = getSelectedImage(editor); + return imgOpt.fold(function () { + displayError(editor, 'Could not find selected image'); + }, function (img) { + return editor._scanForImages().then(function () { + return findBlob(editor, img.dom()); + }).then(blobToImageResult).then(fn).then(function (imageResult) { + return updateSelectedImage(editor, imageResult, false, imageUploadTimerState, img.dom(), size); + }, function (error) { + displayError(editor, error); + }); + }); + }; + }; + var rotate$2 = function (editor, imageUploadTimerState, angle) { + return function () { + var imgOpt = getSelectedImage(editor); + var flippedSize = imgOpt.fold(function () { + return null; + }, function (img) { + var size = getImageSize(img.dom()); + return size ? { + w: size.h, + h: size.w + } : null; + }); + return selectedImageOperation(editor, imageUploadTimerState, function (imageResult) { + return rotate$1(imageResult, angle); + }, flippedSize)(); + }; + }; + var flip$2 = function (editor, imageUploadTimerState, axis) { + return function () { + return selectedImageOperation(editor, imageUploadTimerState, function (imageResult) { + return flip$1(imageResult, axis); + })(); + }; + }; + var handleDialogBlob = function (editor, imageUploadTimerState, img, originalSize, blob) { + return blobToImage$1(blob).then(function (newImage) { + var newSize = getNaturalImageSize(newImage); + if (originalSize.w !== newSize.w || originalSize.h !== newSize.h) { + if (getImageSize(img)) { + setImageSize(img, newSize); + } + } + domGlobals.URL.revokeObjectURL(newImage.src); + return blob; + }).then(blobToImageResult).then(function (imageResult) { + return updateSelectedImage(editor, imageResult, true, imageUploadTimerState, img); + }, function () { + }); + }; + + var saveState = 'save-state'; + var disable = 'disable'; + var enable = 'enable'; + + var createState = function (blob) { + return { + blob: blob, + url: domGlobals.URL.createObjectURL(blob) + }; + }; + var makeOpen = function (editor, imageUploadTimerState) { + return function () { + var getLoadedSpec = function (currentState) { + return { + title: 'Edit Image', + size: 'large', + body: { + type: 'panel', + items: [{ + type: 'imagetools', + name: 'imagetools', + label: 'Edit Image', + currentState: currentState + }] + }, + buttons: [ + { + type: 'cancel', + name: 'cancel', + text: 'Cancel' + }, + { + type: 'submit', + name: 'save', + text: 'Save', + primary: true, + disabled: true + } + ], + onSubmit: function (api) { + var blob = api.getData().imagetools.blob; + originalImgOpt.each(function (originalImg) { + originalSizeOpt.each(function (originalSize) { + handleDialogBlob(editor, imageUploadTimerState, originalImg.dom(), originalSize, blob); + }); + }); + api.close(); + }, + onCancel: function () { + }, + onAction: function (api, details) { + switch (details.name) { + case saveState: + if (details.value) { + api.enable('save'); + } else { + api.disable('save'); + } + break; + case disable: + api.disable('save'); + api.disable('cancel'); + break; + case enable: + api.enable('cancel'); + break; + } + } + }; + }; + var originalImgOpt = getSelectedImage(editor); + var originalSizeOpt = originalImgOpt.map(function (origImg) { + return getNaturalImageSize(origImg.dom()); + }); + var imgOpt = getSelectedImage(editor); + imgOpt.each(function (img) { + getEditableImage(editor, img.dom()).each(function (_) { + findBlob(editor, img.dom()).then(function (blob) { + var state = createState(blob); + editor.windowManager.open(getLoadedSpec(state)); + }); + }); + }); + }; + }; + + var register = function (editor, imageUploadTimerState) { + global$1.each({ + mceImageRotateLeft: rotate$2(editor, imageUploadTimerState, -90), + mceImageRotateRight: rotate$2(editor, imageUploadTimerState, 90), + mceImageFlipVertical: flip$2(editor, imageUploadTimerState, 'v'), + mceImageFlipHorizontal: flip$2(editor, imageUploadTimerState, 'h'), + mceEditImage: makeOpen(editor, imageUploadTimerState) + }, function (fn, cmd) { + editor.addCommand(cmd, fn); + }); + }; + + var setup = function (editor, imageUploadTimerState, lastSelectedImageState) { + editor.on('NodeChange', function (e) { + var lastSelectedImage = lastSelectedImageState.get(); + if (lastSelectedImage && lastSelectedImage.src !== e.element.src) { + cancelTimedUpload(imageUploadTimerState); + editor.editorUpload.uploadImagesAuto(); + lastSelectedImageState.set(null); + } + getEditableImage(editor, e.element).each(lastSelectedImageState.set); + }); + }; + + var register$1 = function (editor) { + var cmd = function (command) { + return function () { + return editor.execCommand(command); + }; + }; + editor.ui.registry.addButton('rotateleft', { + tooltip: 'Rotate counterclockwise', + icon: 'rotate-left', + onAction: cmd('mceImageRotateLeft') + }); + editor.ui.registry.addButton('rotateright', { + tooltip: 'Rotate clockwise', + icon: 'rotate-right', + onAction: cmd('mceImageRotateRight') + }); + editor.ui.registry.addButton('flipv', { + tooltip: 'Flip vertically', + icon: 'flip-vertically', + onAction: cmd('mceImageFlipVertical') + }); + editor.ui.registry.addButton('fliph', { + tooltip: 'Flip horizontally', + icon: 'flip-horizontally', + onAction: cmd('mceImageFlipHorizontal') + }); + editor.ui.registry.addButton('editimage', { + tooltip: 'Edit image', + icon: 'edit-image', + onAction: cmd('mceEditImage'), + onSetup: function (buttonApi) { + var setDisabled = function () { + var elementOpt = getSelectedImage(editor); + elementOpt.each(function (element) { + var disabled = getEditableImage(editor, element.dom()).isNone(); + buttonApi.setDisabled(disabled); + }); + }; + editor.on('NodeChange', setDisabled); + return function () { + editor.off('NodeChange', setDisabled); + }; + } + }); + editor.ui.registry.addButton('imageoptions', { + tooltip: 'Image options', + icon: 'image-options', + onAction: cmd('mceImage') + }); + editor.ui.registry.addContextMenu('imagetools', { + update: function (element) { + return getEditableImage(editor, element).fold(function () { + return []; + }, function (_) { + return [{ + text: 'Edit image', + icon: 'edit-image', + onAction: cmd('mceEditImage') + }]; + }); + } + }); + }; + + var register$2 = function (editor) { + editor.ui.registry.addContextToolbar('imagetools', { + items: getToolbarItems(editor), + predicate: function (elem) { + return getEditableImage(editor, elem).isSome(); + }, + position: 'node', + scope: 'node' + }); + }; + + function Plugin () { + global.add('imagetools', function (editor) { + var imageUploadTimerState = Cell(0); + var lastSelectedImageState = Cell(null); + register(editor, imageUploadTimerState); + register$1(editor); + register$2(editor); + setup(editor, imageUploadTimerState, lastSelectedImageState); + }); + } + + Plugin(); + +}(window)); diff --git a/src/main/resources/static/layui-ext/tinymce/tinymce/plugins/imagetools/plugin.min.js b/src/main/resources/static/layui-ext/tinymce/tinymce/plugins/imagetools/plugin.min.js new file mode 100644 index 0000000..352e2e5 --- /dev/null +++ b/src/main/resources/static/layui-ext/tinymce/tinymce/plugins/imagetools/plugin.min.js @@ -0,0 +1,9 @@ +/** + * 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/ + * + * Version: 5.4.2 (2020-08-17) + */ +!function(p){"use strict";var t,e,n,l=function(t){var e=t;return{get:function(){return e},set:function(t){e=t}}},r=tinymce.util.Tools.resolve("tinymce.PluginManager"),d=tinymce.util.Tools.resolve("tinymce.util.Tools"),o=function(){},f=function(t){return function(){return t}},i=f(!1),u=f(!0),a=function(){return c},c=(t=function(t){return t.isNone()},{fold:function(t,e){return t()},is:i,isSome:i,isNone:u,getOr:n=function(t){return t},getOrThunk:e=function(t){return t()},getOrDie:function(t){throw new Error(t||"error: getOrDie called on none.")},getOrNull:f(null),getOrUndefined:f(undefined),or:n,orThunk:e,map:a,each:o,bind:a,exists:i,forall:u,filter:a,equals:t,equals_:t,toArray:function(){return[]},toString:f("none()")}),s=function(n){var t=f(n),e=function(){return o},r=function(t){return t(n)},o={fold:function(t,e){return e(n)},is:function(t){return n===t},isSome:u,isNone:i,getOr:t,getOrThunk:t,getOrDie:t,getOrNull:t,getOrUndefined:t,or:e,orThunk:e,map:function(t){return s(t(n))},each:function(t){t(n)},bind:r,exists:r,forall:r,filter:function(t){return t(n)?o:c},toArray:function(){return[n]},toString:function(){return"some("+n+")"},equals:function(t){return t.is(n)},equals_:function(t,e){return t.fold(i,function(t){return e(n,t)})}};return o},v={some:s,none:a,from:function(t){return null===t||t===undefined?c:s(t)}};function m(t,e){return y(p.document.createElement("canvas"),t,e)}function h(t){var e=m(t.width,t.height);return g(e).drawImage(t,0,0),e}function g(t){return t.getContext("2d")}function y(t,e,n){return t.width=e,t.height=n,t}var w,b,I,T=window.Promise?window.Promise:(b=(w=function(t){if("object"!=typeof this)throw new TypeError("Promises must be constructed via new");if("function"!=typeof t)throw new TypeError("not a function");this._state=null,this._value=null,this._deferreds=[],L(t,_(U,this),_(A,this))}).immediateFn||"function"==typeof window.setImmediate&&window.setImmediate||function(t){p.setTimeout(t,1)},I=Array.isArray||function(t){return"[object Array]"===Object.prototype.toString.call(t)},w.prototype["catch"]=function(t){return this.then(null,t)},w.prototype.then=function(n,r){var o=this;return new w(function(t,e){R.call(o,new x(n,r,t,e))})},w.all=function(){for(var t=[],e=0;e 0) { + global$4.each(selectorGroups, function (group) { + var menuItem = processSelector(selector, group); + if (menuItem) { + model.addItemToGroup(group.title, menuItem); + } + }); + } else { + var menuItem = processSelector(selector, null); + if (menuItem) { + model.addItem(menuItem); + } + } + } + } + }); + var items = model.toFormats(); + editor.fire('addStyleModifications', { + items: items, + replace: !shouldAppend(editor) + }); + }); + }; + + var get = function (editor) { + var convertSelectorToFormat = function (selectorText) { + return defaultConvertSelectorToFormat(editor, selectorText); + }; + return { convertSelectorToFormat: convertSelectorToFormat }; + }; + + function Plugin () { + global.add('importcss', function (editor) { + setup(editor); + return get(editor); + }); + } + + Plugin(); + +}()); diff --git a/src/main/resources/static/layui-ext/tinymce/tinymce/plugins/importcss/plugin.min.js b/src/main/resources/static/layui-ext/tinymce/tinymce/plugins/importcss/plugin.min.js new file mode 100644 index 0000000..67bd091 --- /dev/null +++ b/src/main/resources/static/layui-ext/tinymce/tinymce/plugins/importcss/plugin.min.js @@ -0,0 +1,9 @@ +/** + * 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/ + * + * Version: 5.4.2 (2020-08-17) + */ +!function(){"use strict";var n,t=tinymce.util.Tools.resolve("tinymce.PluginManager"),y=tinymce.util.Tools.resolve("tinymce.dom.DOMUtils"),f=tinymce.util.Tools.resolve("tinymce.EditorManager"),m=tinymce.util.Tools.resolve("tinymce.Env"),h=tinymce.util.Tools.resolve("tinymce.util.Tools"),d=function(t){return t.getParam("importcss_selector_converter")},i=(n="array",function(t){return r=typeof(e=t),(null===e?"null":"object"==r&&(Array.prototype.isPrototypeOf(e)||e.constructor&&"Array"===e.constructor.name)?"array":"object"==r&&(String.prototype.isPrototypeOf(e)||e.constructor&&"String"===e.constructor.name)?"string":r)===n;var e,r}),o=Array.prototype.push,l=function(t,e){return function(t){for(var e=[],r=0,n=t.length;r'); + + var stateSelectorAdapter = function (editor, selector) { + return function (buttonApi) { + return editor.selection.selectorChangedWithUnbind(selector.join(','), buttonApi.setActive).unbind; + }; + }; + + editor.ui.registry.addToggleButton('indent2em', { + icon: 'indent2em', + tooltip: pluginName, + onAction: function () { + doAct(); + }, + onSetup: stateSelectorAdapter(editor, [ + '*[style*="text-indent"]', + '*[data-mce-style*="text-indent"]', + ]) + }); + + editor.ui.registry.addMenuItem('indent2em', { + text: pluginName, + onAction: function() { + doAct(); + } + }); + + editor.addCommand('indent2em', doAct ); + + return { + getMetadata: function () { + return { + name: pluginName, + url: "http://tinymce.ax-z.cn/more-plugins/indent2em.php", + }; + } + }; +}); diff --git a/src/main/resources/static/layui-ext/tinymce/tinymce/plugins/indent2em/plugin.min.js b/src/main/resources/static/layui-ext/tinymce/tinymce/plugins/indent2em/plugin.min.js new file mode 100644 index 0000000..b9d8382 --- /dev/null +++ b/src/main/resources/static/layui-ext/tinymce/tinymce/plugins/indent2em/plugin.min.js @@ -0,0 +1,62 @@ +tinymce.PluginManager.add('indent2em', function(editor, url) { + var pluginName='首行缩进'; + var global$1 = tinymce.util.Tools.resolve('tinymce.util.Tools'); + var indent2em_val = editor.getParam('indent2em_val', '2em'); + var doAct = function () { + var dom = editor.dom; + var blocks = editor.selection.getSelectedBlocks(); + var act = ''; + global$1.each(blocks, function (block) { + if(act==''){ + act = dom.getStyle(block,'text-indent')==indent2em_val ? 'remove' : 'add'; + } + if( act=='add' ){ + dom.setStyle(block, 'text-indent', indent2em_val); + }else{ + var style=dom.getAttrib(block,'style'); + var reg = new RegExp('text-indent:[\\s]*' + indent2em_val + ';', 'ig'); + style = style.replace(reg, ''); + dom.setAttrib(block,'style',style); + } + + }); + }; + + editor.ui.registry.getAll().icons.indent2em || editor.ui.registry.addIcon('indent2em',''); + + var stateSelectorAdapter = function (editor, selector) { + return function (buttonApi) { + return editor.selection.selectorChangedWithUnbind(selector.join(','), buttonApi.setActive).unbind; + }; + }; + + editor.ui.registry.addToggleButton('indent2em', { + icon: 'indent2em', + tooltip: pluginName, + onAction: function () { + doAct(); + }, + onSetup: stateSelectorAdapter(editor, [ + '*[style*="text-indent"]', + '*[data-mce-style*="text-indent"]', + ]) + }); + + editor.ui.registry.addMenuItem('indent2em', { + text: pluginName, + onAction: function() { + doAct(); + } + }); + + editor.addCommand('indent2em', doAct ); + + return { + getMetadata: function () { + return { + name: pluginName, + url: "http://tinymce.ax-z.cn/more-plugins/indent2em.php", + }; + } + }; +}); diff --git a/src/main/resources/static/layui-ext/tinymce/tinymce/plugins/insertdatetime/plugin.js b/src/main/resources/static/layui-ext/tinymce/tinymce/plugins/insertdatetime/plugin.js new file mode 100644 index 0000000..be1af02 --- /dev/null +++ b/src/main/resources/static/layui-ext/tinymce/tinymce/plugins/insertdatetime/plugin.js @@ -0,0 +1,177 @@ +/** + * 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/ + * + * Version: 5.4.2 (2020-08-17) + */ +(function () { + 'use strict'; + + var global = tinymce.util.Tools.resolve('tinymce.PluginManager'); + + var getDateFormat = function (editor) { + return editor.getParam('insertdatetime_dateformat', editor.translate('%Y-%m-%d')); + }; + var getTimeFormat = function (editor) { + return editor.getParam('insertdatetime_timeformat', editor.translate('%H:%M:%S')); + }; + var getFormats = function (editor) { + return editor.getParam('insertdatetime_formats', [ + '%H:%M:%S', + '%Y-%m-%d', + '%I:%M:%S %p', + '%D' + ]); + }; + var getDefaultDateTime = function (editor) { + var formats = getFormats(editor); + return formats.length > 0 ? formats[0] : getTimeFormat(editor); + }; + var shouldInsertTimeElement = function (editor) { + return editor.getParam('insertdatetime_element', false); + }; + + var daysShort = 'Sun Mon Tue Wed Thu Fri Sat Sun'.split(' '); + var daysLong = 'Sunday Monday Tuesday Wednesday Thursday Friday Saturday Sunday'.split(' '); + var monthsShort = 'Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec'.split(' '); + var monthsLong = 'January February March April May June July August September October November December'.split(' '); + var addZeros = function (value, len) { + value = '' + value; + if (value.length < len) { + for (var i = 0; i < len - value.length; i++) { + value = '0' + value; + } + } + return value; + }; + var getDateTime = function (editor, fmt, date) { + date = date || new Date(); + fmt = fmt.replace('%D', '%m/%d/%Y'); + fmt = fmt.replace('%r', '%I:%M:%S %p'); + fmt = fmt.replace('%Y', '' + date.getFullYear()); + fmt = fmt.replace('%y', '' + date.getYear()); + fmt = fmt.replace('%m', addZeros(date.getMonth() + 1, 2)); + fmt = fmt.replace('%d', addZeros(date.getDate(), 2)); + fmt = fmt.replace('%H', '' + addZeros(date.getHours(), 2)); + fmt = fmt.replace('%M', '' + addZeros(date.getMinutes(), 2)); + fmt = fmt.replace('%S', '' + addZeros(date.getSeconds(), 2)); + fmt = fmt.replace('%I', '' + ((date.getHours() + 11) % 12 + 1)); + fmt = fmt.replace('%p', '' + (date.getHours() < 12 ? 'AM' : 'PM')); + fmt = fmt.replace('%B', '' + editor.translate(monthsLong[date.getMonth()])); + fmt = fmt.replace('%b', '' + editor.translate(monthsShort[date.getMonth()])); + fmt = fmt.replace('%A', '' + editor.translate(daysLong[date.getDay()])); + fmt = fmt.replace('%a', '' + editor.translate(daysShort[date.getDay()])); + fmt = fmt.replace('%%', '%'); + return fmt; + }; + var updateElement = function (editor, timeElm, computerTime, userTime) { + var newTimeElm = editor.dom.create('time', { datetime: computerTime }, userTime); + timeElm.parentNode.insertBefore(newTimeElm, timeElm); + editor.dom.remove(timeElm); + editor.selection.select(newTimeElm, true); + editor.selection.collapse(false); + }; + var insertDateTime = function (editor, format) { + if (shouldInsertTimeElement(editor)) { + var userTime = getDateTime(editor, format); + var computerTime = void 0; + if (/%[HMSIp]/.test(format)) { + computerTime = getDateTime(editor, '%Y-%m-%dT%H:%M'); + } else { + computerTime = getDateTime(editor, '%Y-%m-%d'); + } + var timeElm = editor.dom.getParent(editor.selection.getStart(), 'time'); + if (timeElm) { + updateElement(editor, timeElm, computerTime, userTime); + } else { + editor.insertContent(''); + } + } else { + editor.insertContent(getDateTime(editor, format)); + } + }; + + var register = function (editor) { + editor.addCommand('mceInsertDate', function () { + insertDateTime(editor, getDateFormat(editor)); + }); + editor.addCommand('mceInsertTime', function () { + insertDateTime(editor, getTimeFormat(editor)); + }); + }; + + var Cell = function (initial) { + var value = initial; + var get = function () { + return value; + }; + var set = function (v) { + value = v; + }; + return { + get: get, + set: set + }; + }; + + var global$1 = tinymce.util.Tools.resolve('tinymce.util.Tools'); + + var register$1 = function (editor) { + var formats = getFormats(editor); + var defaultFormat = Cell(getDefaultDateTime(editor)); + editor.ui.registry.addSplitButton('insertdatetime', { + icon: 'insert-time', + tooltip: 'Insert date/time', + select: function (value) { + return value === defaultFormat.get(); + }, + fetch: function (done) { + done(global$1.map(formats, function (format) { + return { + type: 'choiceitem', + text: getDateTime(editor, format), + value: format + }; + })); + }, + onAction: function (_api) { + insertDateTime(editor, defaultFormat.get()); + }, + onItemAction: function (_api, value) { + defaultFormat.set(value); + insertDateTime(editor, value); + } + }); + var makeMenuItemHandler = function (format) { + return function () { + defaultFormat.set(format); + insertDateTime(editor, format); + }; + }; + editor.ui.registry.addNestedMenuItem('insertdatetime', { + icon: 'insert-time', + text: 'Date/time', + getSubmenuItems: function () { + return global$1.map(formats, function (format) { + return { + type: 'menuitem', + text: getDateTime(editor, format), + onAction: makeMenuItemHandler(format) + }; + }); + } + }); + }; + + function Plugin () { + global.add('insertdatetime', function (editor) { + register(editor); + register$1(editor); + }); + } + + Plugin(); + +}()); diff --git a/src/main/resources/static/layui-ext/tinymce/tinymce/plugins/insertdatetime/plugin.min.js b/src/main/resources/static/layui-ext/tinymce/tinymce/plugins/insertdatetime/plugin.min.js new file mode 100644 index 0000000..67a9871 --- /dev/null +++ b/src/main/resources/static/layui-ext/tinymce/tinymce/plugins/insertdatetime/plugin.min.js @@ -0,0 +1,9 @@ +/** + * 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/ + * + * Version: 5.4.2 (2020-08-17) + */ +!function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager"),u=function(e){return e.getParam("insertdatetime_timeformat",e.translate("%H:%M:%S"))},c=function(e){return e.getParam("insertdatetime_formats",["%H:%M:%S","%Y-%m-%d","%I:%M:%S %p","%D"])},r="Sun Mon Tue Wed Thu Fri Sat Sun".split(" "),a="Sunday Monday Tuesday Wednesday Thursday Friday Saturday Sunday".split(" "),i="Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec".split(" "),o="January February March April May June July August September October November December".split(" "),m=function(e,t){if((e=""+e).length'+n+"")}else e.insertContent(s(e,t));var i,o,u,c,m},t=function(t){t.addCommand("mceInsertDate",function(){var e;l(t,(e=t).getParam("insertdatetime_dateformat",e.translate("%Y-%m-%d")))}),t.addCommand("mceInsertTime",function(){l(t,u(t))})},d=tinymce.util.Tools.resolve("tinymce.util.Tools"),n=function(n){var e,t,r,a,i=c(n),o=(a=c(r=n),e=0 -1; + }; + var map = function (xs, f) { + var len = xs.length; + var r = new Array(len); + for (var i = 0; i < len; i++) { + var x = xs[i]; + r[i] = f(x, i); + } + return r; + }; + var each = function (xs, f) { + for (var i = 0, len = xs.length; i < len; i++) { + var x = xs[i]; + f(x, i); + } + }; + var foldl = function (xs, f, acc) { + each(xs, function (x) { + acc = f(acc, x); + }); + return acc; + }; + var flatten = function (xs) { + var r = []; + for (var i = 0, len = xs.length; i < len; ++i) { + if (!isArray(xs[i])) { + throw new Error('Arr.flatten item ' + i + ' was not an array, input: ' + xs); + } + nativePush.apply(r, xs[i]); + } + return r; + }; + var bind = function (xs, f) { + return flatten(map(xs, f)); + }; + var findMap = function (arr, f) { + for (var i = 0; i < arr.length; i++) { + var r = f(arr[i], i); + if (r.isSome()) { + return r; + } + } + return Option.none(); + }; + + var cat = function (arr) { + var r = []; + var push = function (x) { + r.push(x); + }; + for (var i = 0; i < arr.length; i++) { + arr[i].each(push); + } + return r; + }; + var someIf = function (b, a) { + return b ? Option.some(a) : Option.none(); + }; + + var global$2 = tinymce.util.Tools.resolve('tinymce.util.Tools'); + + var getValue = function (item) { + return isString(item.value) ? item.value : ''; + }; + var sanitizeList = function (list, extractValue) { + var out = []; + global$2.each(list, function (item) { + var text = isString(item.text) ? item.text : isString(item.title) ? item.title : ''; + if (item.menu !== undefined) ; else { + var value = extractValue(item); + out.push({ + text: text, + value: value + }); + } + }); + return out; + }; + var sanitizeWith = function (extracter) { + if (extracter === void 0) { + extracter = getValue; + } + return function (list) { + return Option.from(list).map(function (list) { + return sanitizeList(list, extracter); + }); + }; + }; + var sanitize = function (list) { + return sanitizeWith(getValue)(list); + }; + var createUi = function (name, label) { + return function (items) { + return { + name: name, + type: 'selectbox', + label: label, + items: items + }; + }; + }; + var ListOptions = { + sanitize: sanitize, + sanitizeWith: sanitizeWith, + createUi: createUi, + getValue: getValue + }; + + var __assign = function () { + __assign = Object.assign || function __assign(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) + if (Object.prototype.hasOwnProperty.call(s, p)) + t[p] = s[p]; + } + return t; + }; + return __assign.apply(this, arguments); + }; + + var keys = Object.keys; + var each$1 = function (obj, f) { + var props = keys(obj); + for (var k = 0, len = props.length; k < len; k++) { + var i = props[k]; + var x = obj[i]; + f(x, i); + } + }; + var objAcc = function (r) { + return function (x, i) { + r[i] = x; + }; + }; + var internalFilter = function (obj, pred, onTrue, onFalse) { + var r = {}; + each$1(obj, function (x, i) { + (pred(x, i) ? onTrue : onFalse)(x, i); + }); + return r; + }; + var filter = function (obj, pred) { + var t = {}; + internalFilter(obj, pred, objAcc(t), noop); + return t; + }; + + var hasRtcPlugin = function (editor) { + if (/(^|[ ,])rtc([, ]|$)/.test(editor.getParam('plugins', '', 'string')) && global.get('rtc')) { + return true; + } else { + return false; + } + }; + + var hasProtocol = function (url) { + return /^\w+:/i.test(url); + }; + var getHref = function (elm) { + var href = elm.getAttribute('data-mce-href'); + return href ? href : elm.getAttribute('href'); + }; + var applyRelTargetRules = function (rel, isUnsafe) { + var rules = ['noopener']; + var rels = rel ? rel.split(/\s+/) : []; + var toString = function (rels) { + return global$2.trim(rels.sort().join(' ')); + }; + var addTargetRules = function (rels) { + rels = removeTargetRules(rels); + return rels.length > 0 ? rels.concat(rules) : rules; + }; + var removeTargetRules = function (rels) { + return rels.filter(function (val) { + return global$2.inArray(rules, val) === -1; + }); + }; + var newRels = isUnsafe ? addTargetRules(rels) : removeTargetRules(rels); + return newRels.length > 0 ? toString(newRels) : ''; + }; + var trimCaretContainers = function (text) { + return text.replace(/\uFEFF/g, ''); + }; + var getAnchorElement = function (editor, selectedElm) { + selectedElm = selectedElm || editor.selection.getNode(); + if (isImageFigure(selectedElm)) { + return editor.dom.select('a[href]', selectedElm)[0]; + } else { + return editor.dom.getParent(selectedElm, 'a[href]'); + } + }; + var getAnchorText = function (selection, anchorElm) { + var text = anchorElm ? anchorElm.innerText || anchorElm.textContent : selection.getContent({ format: 'text' }); + return trimCaretContainers(text); + }; + var isLink = function (elm) { + return elm && elm.nodeName === 'A' && !!getHref(elm); + }; + var hasLinks = function (elements) { + return global$2.grep(elements, isLink).length > 0; + }; + var isOnlyTextSelected = function (html) { + if (/]+>[^<]+<\/a>$/.test(html) || html.indexOf('href=') === -1)) { + return false; + } + return true; + }; + var isImageFigure = function (elm) { + return elm && elm.nodeName === 'FIGURE' && /\bimage\b/i.test(elm.className); + }; + var getLinkAttrs = function (data) { + return foldl([ + 'title', + 'rel', + 'class', + 'target' + ], function (acc, key) { + data[key].each(function (value) { + acc[key] = value.length > 0 ? value : null; + }); + return acc; + }, { href: data.href }); + }; + var handleExternalTargets = function (href, assumeExternalTargets) { + if ((assumeExternalTargets === 'http' || assumeExternalTargets === 'https') && !hasProtocol(href)) { + return assumeExternalTargets + '://' + href; + } + return href; + }; + var applyLinkOverrides = function (editor, linkAttrs) { + var newLinkAttrs = __assign({}, linkAttrs); + if (!(getRelList(editor).length > 0) && allowUnsafeLinkTarget(editor) === false) { + var newRel = applyRelTargetRules(newLinkAttrs.rel, newLinkAttrs.target === '_blank'); + newLinkAttrs.rel = newRel ? newRel : null; + } + if (Option.from(newLinkAttrs.target).isNone() && getTargetList(editor) === false) { + newLinkAttrs.target = getDefaultLinkTarget(editor); + } + newLinkAttrs.href = handleExternalTargets(newLinkAttrs.href, assumeExternalTargets(editor)); + return newLinkAttrs; + }; + var updateLink = function (editor, anchorElm, text, linkAttrs) { + text.each(function (text) { + if (anchorElm.hasOwnProperty('innerText')) { + anchorElm.innerText = text; + } else { + anchorElm.textContent = text; + } + }); + editor.dom.setAttribs(anchorElm, linkAttrs); + editor.selection.select(anchorElm); + }; + var createLink = function (editor, selectedElm, text, linkAttrs) { + if (isImageFigure(selectedElm)) { + linkImageFigure(editor, selectedElm, linkAttrs); + } else { + text.fold(function () { + editor.execCommand('mceInsertLink', false, linkAttrs); + }, function (text) { + editor.insertContent(editor.dom.createHTML('a', linkAttrs, editor.dom.encode(text))); + }); + } + }; + var linkDomMutation = function (editor, attachState, data) { + var selectedElm = editor.selection.getNode(); + var anchorElm = getAnchorElement(editor, selectedElm); + var linkAttrs = applyLinkOverrides(editor, getLinkAttrs(data)); + editor.undoManager.transact(function () { + if (data.href === attachState.href) { + attachState.attach(); + } + if (anchorElm) { + editor.focus(); + updateLink(editor, anchorElm, data.text, linkAttrs); + } else { + createLink(editor, selectedElm, data.text, linkAttrs); + } + }); + }; + var unlinkDomMutation = function (editor) { + editor.undoManager.transact(function () { + var node = editor.selection.getNode(); + if (isImageFigure(node)) { + unlinkImageFigure(editor, node); + } else { + var anchorElm = editor.dom.getParent(node, 'a[href]', editor.getBody()); + if (anchorElm) { + editor.dom.remove(anchorElm, true); + } + } + editor.focus(); + }); + }; + var unwrapOptions = function (data) { + var cls = data.class, href = data.href, rel = data.rel, target = data.target, text = data.text, title = data.title; + return filter({ + class: cls.getOrNull(), + href: href, + rel: rel.getOrNull(), + target: target.getOrNull(), + text: text.getOrNull(), + title: title.getOrNull() + }, function (v, _k) { + return isNull(v) === false; + }); + }; + var link = function (editor, attachState, data) { + hasRtcPlugin(editor) ? editor.execCommand('createlink', false, unwrapOptions(data)) : linkDomMutation(editor, attachState, data); + }; + var unlink = function (editor) { + hasRtcPlugin(editor) ? editor.execCommand('unlink') : unlinkDomMutation(editor); + }; + var unlinkImageFigure = function (editor, fig) { + var img = editor.dom.select('img', fig)[0]; + if (img) { + var a = editor.dom.getParents(img, 'a[href]', fig)[0]; + if (a) { + a.parentNode.insertBefore(img, a); + editor.dom.remove(a); + } + } + }; + var linkImageFigure = function (editor, fig, attrs) { + var img = editor.dom.select('img', fig)[0]; + if (img) { + var a = editor.dom.create('a', attrs); + img.parentNode.insertBefore(a, img); + a.appendChild(img); + } + }; + + var findTextByValue = function (value, catalog) { + return findMap(catalog, function (item) { + return someIf(item.value === value, item); + }); + }; + var getDelta = function (persistentText, fieldName, catalog, data) { + var value = data[fieldName]; + var hasPersistentText = persistentText.length > 0; + return value !== undefined ? findTextByValue(value, catalog).map(function (i) { + return { + url: { + value: i.value, + meta: { + text: hasPersistentText ? persistentText : i.text, + attach: noop + } + }, + text: hasPersistentText ? persistentText : i.text + }; + }) : Option.none(); + }; + var findCatalog = function (catalogs, fieldName) { + if (fieldName === 'link') { + return catalogs.link; + } else if (fieldName === 'anchor') { + return catalogs.anchor; + } else { + return Option.none(); + } + }; + var init = function (initialData, linkCatalog) { + var persistentData = { + text: initialData.text, + title: initialData.title + }; + var getTitleFromUrlChange = function (url) { + return someIf(persistentData.title.length <= 0, Option.from(url.meta.title).getOr('')); + }; + var getTextFromUrlChange = function (url) { + return someIf(persistentData.text.length <= 0, Option.from(url.meta.text).getOr(url.value)); + }; + var onUrlChange = function (data) { + var text = getTextFromUrlChange(data.url); + var title = getTitleFromUrlChange(data.url); + if (text.isSome() || title.isSome()) { + return Option.some(__assign(__assign({}, text.map(function (text) { + return { text: text }; + }).getOr({})), title.map(function (title) { + return { title: title }; + }).getOr({}))); + } else { + return Option.none(); + } + }; + var onCatalogChange = function (data, change) { + var catalog = findCatalog(linkCatalog, change.name).getOr([]); + return getDelta(persistentData.text, change.name, catalog, data); + }; + var onChange = function (getData, change) { + var name = change.name; + if (name === 'url') { + return onUrlChange(getData()); + } else if (contains([ + 'anchor', + 'link' + ], name)) { + return onCatalogChange(getData(), change); + } else if (name === 'text' || name === 'title') { + persistentData[name] = getData()[name]; + return Option.none(); + } else { + return Option.none(); + } + }; + return { onChange: onChange }; + }; + var DialogChanges = { + init: init, + getDelta: getDelta + }; + + var global$3 = tinymce.util.Tools.resolve('tinymce.util.Delay'); + + var global$4 = tinymce.util.Tools.resolve('tinymce.util.Promise'); + + var delayedConfirm = function (editor, message, callback) { + var rng = editor.selection.getRng(); + global$3.setEditorTimeout(editor, function () { + editor.windowManager.confirm(message, function (state) { + editor.selection.setRng(rng); + callback(state); + }); + }); + }; + var tryEmailTransform = function (data) { + var url = data.href; + var suggestMailTo = url.indexOf('@') > 0 && url.indexOf('/') === -1 && url.indexOf('mailto:') === -1; + return suggestMailTo ? Option.some({ + message: 'The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?', + preprocess: function (oldData) { + return __assign(__assign({}, oldData), { href: 'mailto:' + url }); + } + }) : Option.none(); + }; + var tryProtocolTransform = function (assumeExternalTargets, defaultLinkProtocol) { + return function (data) { + var url = data.href; + var suggestProtocol = assumeExternalTargets === 1 && !hasProtocol(url) || assumeExternalTargets === 0 && /^\s*www[\.|\d\.]/i.test(url); + return suggestProtocol ? Option.some({ + message: 'The URL you entered seems to be an external link. Do you want to add the required ' + defaultLinkProtocol + ':// prefix?', + preprocess: function (oldData) { + return __assign(__assign({}, oldData), { href: defaultLinkProtocol + '://' + url }); + } + }) : Option.none(); + }; + }; + var preprocess = function (editor, data) { + return findMap([ + tryEmailTransform, + tryProtocolTransform(assumeExternalTargets(editor), getDefaultLinkProtocol(editor)) + ], function (f) { + return f(data); + }).fold(function () { + return global$4.resolve(data); + }, function (transform) { + return new global$4(function (callback) { + delayedConfirm(editor, transform.message, function (state) { + callback(state ? transform.preprocess(data) : data); + }); + }); + }); + }; + var DialogConfirms = { preprocess: preprocess }; + + var getAnchors = function (editor) { + var anchorNodes = editor.dom.select('a:not([href])'); + var anchors = bind(anchorNodes, function (anchor) { + var id = anchor.name || anchor.id; + return id ? [{ + text: id, + value: '#' + id + }] : []; + }); + return anchors.length > 0 ? Option.some([{ + text: 'None', + value: '' + }].concat(anchors)) : Option.none(); + }; + var AnchorListOptions = { getAnchors: getAnchors }; + + var getClasses = function (editor) { + var list = getLinkClassList(editor); + if (list.length > 0) { + return ListOptions.sanitize(list); + } + return Option.none(); + }; + var ClassListOptions = { getClasses: getClasses }; + + var global$5 = tinymce.util.Tools.resolve('tinymce.util.XHR'); + + var parseJson = function (text) { + try { + return Option.some(JSON.parse(text)); + } catch (err) { + return Option.none(); + } + }; + var getLinks = function (editor) { + var extractor = function (item) { + return editor.convertURL(item.value || item.url, 'href'); + }; + var linkList = getLinkList(editor); + return new global$4(function (callback) { + if (isString(linkList)) { + global$5.send({ + url: linkList, + success: function (text) { + return callback(parseJson(text)); + }, + error: function (_) { + return callback(Option.none()); + } + }); + } else if (isFunction(linkList)) { + linkList(function (output) { + return callback(Option.some(output)); + }); + } else { + callback(Option.from(linkList)); + } + }).then(function (optItems) { + return optItems.bind(ListOptions.sanitizeWith(extractor)).map(function (items) { + if (items.length > 0) { + return [{ + text: 'None', + value: '' + }].concat(items); + } else { + return items; + } + }); + }); + }; + var LinkListOptions = { getLinks: getLinks }; + + var getRels = function (editor, initialTarget) { + var list = getRelList(editor); + if (list.length > 0) { + var isTargetBlank_1 = initialTarget.is('_blank'); + var enforceSafe = allowUnsafeLinkTarget(editor) === false; + var safeRelExtractor = function (item) { + return applyRelTargetRules(ListOptions.getValue(item), isTargetBlank_1); + }; + var sanitizer = enforceSafe ? ListOptions.sanitizeWith(safeRelExtractor) : ListOptions.sanitize; + return sanitizer(list); + } + return Option.none(); + }; + var RelOptions = { getRels: getRels }; + + var fallbacks = [ + { + text: 'Current window', + value: '' + }, + { + text: 'New window', + value: '_blank' + } + ]; + var getTargets = function (editor) { + var list = getTargetList(editor); + if (isArray(list)) { + return ListOptions.sanitize(list).orThunk(function () { + return Option.some(fallbacks); + }); + } else if (list === false) { + return Option.none(); + } + return Option.some(fallbacks); + }; + var TargetOptions = { getTargets: getTargets }; + + var nonEmptyAttr = function (dom, elem, name) { + var val = dom.getAttrib(elem, name); + return val !== null && val.length > 0 ? Option.some(val) : Option.none(); + }; + var extractFromAnchor = function (editor, anchor) { + var dom = editor.dom; + var onlyText = isOnlyTextSelected(editor.selection.getContent()); + var text = onlyText ? Option.some(getAnchorText(editor.selection, anchor)) : Option.none(); + var url = anchor ? Option.some(dom.getAttrib(anchor, 'href')) : Option.none(); + var target = anchor ? Option.from(dom.getAttrib(anchor, 'target')) : Option.none(); + var rel = nonEmptyAttr(dom, anchor, 'rel'); + var linkClass = nonEmptyAttr(dom, anchor, 'class'); + var title = nonEmptyAttr(dom, anchor, 'title'); + return { + url: url, + text: text, + title: title, + target: target, + rel: rel, + linkClass: linkClass + }; + }; + var collect = function (editor, linkNode) { + return LinkListOptions.getLinks(editor).then(function (links) { + var anchor = extractFromAnchor(editor, linkNode); + return { + anchor: anchor, + catalogs: { + targets: TargetOptions.getTargets(editor), + rels: RelOptions.getRels(editor, anchor.target), + classes: ClassListOptions.getClasses(editor), + anchor: AnchorListOptions.getAnchors(editor), + link: links + }, + optNode: Option.from(linkNode), + flags: { titleEnabled: shouldShowLinkTitle(editor) } + }; + }); + }; + var DialogInfo = { collect: collect }; + + var handleSubmit = function (editor, info) { + return function (api) { + var data = api.getData(); + if (!data.url.value) { + unlink(editor); + api.close(); + return; + } + var getChangedValue = function (key) { + return Option.from(data[key]).filter(function (value) { + return !info.anchor[key].is(value); + }); + }; + var changedData = { + href: data.url.value, + text: getChangedValue('text'), + target: getChangedValue('target'), + rel: getChangedValue('rel'), + class: getChangedValue('linkClass'), + title: getChangedValue('title') + }; + var attachState = { + href: data.url.value, + attach: data.url.meta !== undefined && data.url.meta.attach ? data.url.meta.attach : function () { + } + }; + DialogConfirms.preprocess(editor, changedData).then(function (pData) { + link(editor, attachState, pData); + }); + api.close(); + }; + }; + var collectData = function (editor) { + var anchorNode = getAnchorElement(editor); + return DialogInfo.collect(editor, anchorNode); + }; + var getInitialData = function (info, defaultTarget) { + var anchor = info.anchor; + var url = anchor.url.getOr(''); + return { + url: { + value: url, + meta: { original: { value: url } } + }, + text: anchor.text.getOr(''), + title: anchor.title.getOr(''), + anchor: url, + link: url, + rel: anchor.rel.getOr(''), + target: anchor.target.or(defaultTarget).getOr(''), + linkClass: anchor.linkClass.getOr('') + }; + }; + var makeDialog = function (settings, onSubmit, editor) { + var urlInput = [{ + name: 'url', + type: 'urlinput', + filetype: 'file', + label: 'URL' + }]; + var displayText = settings.anchor.text.map(function () { + return { + name: 'text', + type: 'input', + label: 'Text to display' + }; + }).toArray(); + var titleText = settings.flags.titleEnabled ? [{ + name: 'title', + type: 'input', + label: 'Title' + }] : []; + var defaultTarget = Option.from(getDefaultLinkTarget(editor)); + var initialData = getInitialData(settings, defaultTarget); + var catalogs = settings.catalogs; + var dialogDelta = DialogChanges.init(initialData, catalogs); + var body = { + type: 'panel', + items: flatten([ + urlInput, + displayText, + titleText, + cat([ + catalogs.anchor.map(ListOptions.createUi('anchor', 'Anchors')), + catalogs.rels.map(ListOptions.createUi('rel', 'Rel')), + catalogs.targets.map(ListOptions.createUi('target', 'Open link in...')), + catalogs.link.map(ListOptions.createUi('link', 'Link list')), + catalogs.classes.map(ListOptions.createUi('linkClass', 'Class')) + ]) + ]) + }; + return { + title: 'Insert/Edit Link', + size: 'normal', + body: body, + buttons: [ + { + type: 'cancel', + name: 'cancel', + text: 'Cancel' + }, + { + type: 'submit', + name: 'save', + text: 'Save', + primary: true + } + ], + initialData: initialData, + onChange: function (api, _a) { + var name = _a.name; + dialogDelta.onChange(api.getData, { name: name }).each(function (newData) { + api.setData(newData); + }); + }, + onSubmit: onSubmit + }; + }; + var open = function (editor) { + var data = collectData(editor); + data.then(function (info) { + var onSubmit = handleSubmit(editor, info); + return makeDialog(info, onSubmit, editor); + }).then(function (spec) { + editor.windowManager.open(spec); + }); + }; + + var appendClickRemove = function (link, evt) { + domGlobals.document.body.appendChild(link); + link.dispatchEvent(evt); + domGlobals.document.body.removeChild(link); + }; + var open$1 = function (url) { + var link = domGlobals.document.createElement('a'); + link.target = '_blank'; + link.href = url; + link.rel = 'noreferrer noopener'; + var evt = domGlobals.document.createEvent('MouseEvents'); + evt.initMouseEvent('click', true, true, domGlobals.window, 0, 0, 0, 0, 0, false, false, false, false, 0, null); + appendClickRemove(link, evt); + }; + + var getLink = function (editor, elm) { + return editor.dom.getParent(elm, 'a[href]'); + }; + var getSelectedLink = function (editor) { + return getLink(editor, editor.selection.getStart()); + }; + var hasOnlyAltModifier = function (e) { + return e.altKey === true && e.shiftKey === false && e.ctrlKey === false && e.metaKey === false; + }; + var gotoLink = function (editor, a) { + if (a) { + var href = getHref(a); + if (/^#/.test(href)) { + var targetEl = editor.$(href); + if (targetEl.length) { + editor.selection.scrollIntoView(targetEl[0], true); + } + } else { + open$1(a.href); + } + } + }; + var openDialog = function (editor) { + return function () { + open(editor); + }; + }; + var gotoSelectedLink = function (editor) { + return function () { + gotoLink(editor, getSelectedLink(editor)); + }; + }; + var setupGotoLinks = function (editor) { + editor.on('click', function (e) { + var link = getLink(editor, e.target); + if (link && global$1.metaKeyPressed(e)) { + e.preventDefault(); + gotoLink(editor, link); + } + }); + editor.on('keydown', function (e) { + var link = getSelectedLink(editor); + if (link && e.keyCode === 13 && hasOnlyAltModifier(e)) { + e.preventDefault(); + gotoLink(editor, link); + } + }); + }; + var toggleActiveState = function (editor) { + return function (api) { + var nodeChangeHandler = function (e) { + return api.setActive(!editor.mode.isReadOnly() && !!getAnchorElement(editor, e.element)); + }; + editor.on('NodeChange', nodeChangeHandler); + return function () { + return editor.off('NodeChange', nodeChangeHandler); + }; + }; + }; + var toggleEnabledState = function (editor) { + return function (api) { + var parents = editor.dom.getParents(editor.selection.getStart()); + api.setDisabled(!hasLinks(parents)); + var nodeChangeHandler = function (e) { + return api.setDisabled(!hasLinks(e.parents)); + }; + editor.on('NodeChange', nodeChangeHandler); + return function () { + return editor.off('NodeChange', nodeChangeHandler); + }; + }; + }; + + var register = function (editor) { + editor.addCommand('mceLink', function () { + if (useQuickLink(editor)) { + editor.fire('contexttoolbar-show', { toolbarKey: 'quicklink' }); + } else { + openDialog(editor)(); + } + }); + }; + + var setup = function (editor) { + editor.addShortcut('Meta+K', '', function () { + editor.execCommand('mceLink'); + }); + }; + + var setupButtons = function (editor) { + editor.ui.registry.addToggleButton('link', { + icon: 'link', + tooltip: 'Insert/edit link', + onAction: openDialog(editor), + onSetup: toggleActiveState(editor) + }); + editor.ui.registry.addButton('openlink', { + icon: 'new-tab', + tooltip: 'Open link', + onAction: gotoSelectedLink(editor), + onSetup: toggleEnabledState(editor) + }); + editor.ui.registry.addButton('unlink', { + icon: 'unlink', + tooltip: 'Remove link', + onAction: function () { + return unlink(editor); + }, + onSetup: toggleEnabledState(editor) + }); + }; + var setupMenuItems = function (editor) { + editor.ui.registry.addMenuItem('openlink', { + text: 'Open link', + icon: 'new-tab', + onAction: gotoSelectedLink(editor), + onSetup: toggleEnabledState(editor) + }); + editor.ui.registry.addMenuItem('link', { + icon: 'link', + text: 'Link...', + shortcut: 'Meta+K', + onAction: openDialog(editor) + }); + editor.ui.registry.addMenuItem('unlink', { + icon: 'unlink', + text: 'Remove link', + onAction: function () { + return unlink(editor); + }, + onSetup: toggleEnabledState(editor) + }); + }; + var setupContextMenu = function (editor) { + var inLink = 'link unlink openlink'; + var noLink = 'link'; + editor.ui.registry.addContextMenu('link', { + update: function (element) { + return hasLinks(editor.dom.getParents(element, 'a')) ? inLink : noLink; + } + }); + }; + var setupContextToolbars = function (editor) { + var collapseSelectionToEnd = function (editor) { + editor.selection.collapse(false); + }; + var onSetupLink = function (buttonApi) { + var node = editor.selection.getNode(); + buttonApi.setDisabled(!getAnchorElement(editor, node)); + return function () { + }; + }; + editor.ui.registry.addContextForm('quicklink', { + launch: { + type: 'contextformtogglebutton', + icon: 'link', + tooltip: 'Link', + onSetup: toggleActiveState(editor) + }, + label: 'Link', + predicate: function (node) { + return !!getAnchorElement(editor, node) && hasContextToolbar(editor); + }, + initValue: function () { + var elm = getAnchorElement(editor); + return !!elm ? getHref(elm) : ''; + }, + commands: [ + { + type: 'contextformtogglebutton', + icon: 'link', + tooltip: 'Link', + primary: true, + onSetup: function (buttonApi) { + var node = editor.selection.getNode(); + buttonApi.setActive(!!getAnchorElement(editor, node)); + return toggleActiveState(editor)(buttonApi); + }, + onAction: function (formApi) { + var anchor = getAnchorElement(editor); + var value = formApi.getValue(); + if (!anchor) { + var attachState = { + href: value, + attach: function () { + } + }; + var onlyText = isOnlyTextSelected(editor.selection.getContent()); + var text = onlyText ? Option.some(getAnchorText(editor.selection, anchor)).filter(function (t) { + return t.length > 0; + }).or(Option.from(value)) : Option.none(); + link(editor, attachState, { + href: value, + text: text, + title: Option.none(), + rel: Option.none(), + target: Option.none(), + class: Option.none() + }); + formApi.hide(); + } else { + editor.undoManager.transact(function () { + editor.dom.setAttrib(anchor, 'href', value); + collapseSelectionToEnd(editor); + formApi.hide(); + }); + } + } + }, + { + type: 'contextformbutton', + icon: 'unlink', + tooltip: 'Remove link', + onSetup: onSetupLink, + onAction: function (formApi) { + unlink(editor); + formApi.hide(); + } + }, + { + type: 'contextformbutton', + icon: 'new-tab', + tooltip: 'Open link', + onSetup: onSetupLink, + onAction: function (formApi) { + gotoSelectedLink(editor)(); + formApi.hide(); + } + } + ] + }); + }; + + function Plugin () { + global.add('link', function (editor) { + setupButtons(editor); + setupMenuItems(editor); + setupContextMenu(editor); + setupContextToolbars(editor); + setupGotoLinks(editor); + register(editor); + setup(editor); + }); + } + + Plugin(); + +}(window)); diff --git a/src/main/resources/static/layui-ext/tinymce/tinymce/plugins/link/plugin.min.js b/src/main/resources/static/layui-ext/tinymce/tinymce/plugins/link/plugin.min.js new file mode 100644 index 0000000..a20d0a8 --- /dev/null +++ b/src/main/resources/static/layui-ext/tinymce/tinymce/plugins/link/plugin.min.js @@ -0,0 +1,9 @@ +/** + * 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/ + * + * Version: 5.4.2 (2020-08-17) + */ +!function(i){"use strict";var n,t,e,r,o=tinymce.util.Tools.resolve("tinymce.PluginManager"),u=tinymce.util.Tools.resolve("tinymce.util.VK"),a=function(r){return function(t){return e=typeof(n=t),(null===n?"null":"object"==e&&(Array.prototype.isPrototypeOf(n)||n.constructor&&"Array"===n.constructor.name)?"array":"object"==e&&(String.prototype.isPrototypeOf(n)||n.constructor&&"String"===n.constructor.name)?"string":e)===r;var n,e}},l=function(n){return function(t){return typeof t===n}},c=a("string"),f=a("array"),s=function(t){return n===t},m=l("boolean"),g=l("function"),d=function(t){var n=t.getParam("link_assume_external_targets",!1);return m(n)&&n?1:!c(n)||"http"!==n&&"https"!==n?0:n},v=function(t){return t.getParam("default_link_target")},h=function(t){return t.getParam("target_list",!0)},p=function(t){return t.getParam("rel_list",[],"array")},y=function(t){return t.getParam("allow_unsafe_link_target",!1,"boolean")},k=function(){},x=function(t){return function(){return t}},b=x(!1),O=x(!(n=null)),w=function(){return C},C=(t=function(t){return t.isNone()},{fold:function(t,n){return t()},is:b,isSome:b,isNone:O,getOr:r=function(t){return t},getOrThunk:e=function(t){return t()},getOrDie:function(t){throw new Error(t||"error: getOrDie called on none.")},getOrNull:x(null),getOrUndefined:x(undefined),or:r,orThunk:e,map:w,each:k,bind:w,exists:b,forall:O,filter:w,equals:t,equals_:t,toArray:function(){return[]},toString:x("none()")}),A=function(e){var t=x(e),n=function(){return o},r=function(t){return t(e)},o={fold:function(t,n){return n(e)},is:function(t){return e===t},isSome:O,isNone:b,getOr:t,getOrThunk:t,getOrDie:t,getOrNull:t,getOrUndefined:t,or:n,orThunk:n,map:function(t){return A(t(e))},each:function(t){t(e)},bind:r,exists:r,forall:r,filter:function(t){return t(e)?o:C},toArray:function(){return[e]},toString:function(){return"some("+e+")"},equals:function(t){return t.is(e)},equals_:function(t,n){return t.fold(b,function(t){return n(e,t)})}};return o},N={some:A,none:w,from:function(t){return null===t||t===undefined?C:A(t)}},P=Array.prototype.indexOf,_=Array.prototype.push,S=function(t,n){return e=t,r=n,-1]+>[^<]+<\/a>$/.test(t)||-1===t.indexOf("href=")))},Q=function(t){return t&&"FIGURE"===t.nodeName&&/\bimage\b/i.test(t.className)},Y=function(t){return n=["title","rel","class","target"],e=function(n,e){return t[e].each(function(t){n[e]=0 1) { + domGlobals.console.error('HTML does not have a single root node', html); + throw new Error('HTML must have a single root node'); + } + return fromDom(div.childNodes[0]); + }; + var fromTag = function (tag, scope) { + var doc = scope || domGlobals.document; + var node = doc.createElement(tag); + return fromDom(node); + }; + var fromText = function (text, scope) { + var doc = scope || domGlobals.document; + var node = doc.createTextNode(text); + return fromDom(node); + }; + var fromDom = function (node) { + if (node === null || node === undefined) { + throw new Error('Node cannot be null or undefined'); + } + return { dom: constant(node) }; + }; + var fromPoint = function (docElm, x, y) { + var doc = docElm.dom(); + return Option.from(doc.elementFromPoint(x, y)).map(fromDom); + }; + var Element = { + fromHtml: fromHtml, + fromTag: fromTag, + fromText: fromText, + fromDom: fromDom, + fromPoint: fromPoint + }; + + var ELEMENT = 1; + + var is = function (element, selector) { + var dom = element.dom(); + if (dom.nodeType !== ELEMENT) { + return false; + } else { + var elem = dom; + if (elem.matches !== undefined) { + return elem.matches(selector); + } else if (elem.msMatchesSelector !== undefined) { + return elem.msMatchesSelector(selector); + } else if (elem.webkitMatchesSelector !== undefined) { + return elem.webkitMatchesSelector(selector); + } else if (elem.mozMatchesSelector !== undefined) { + return elem.mozMatchesSelector(selector); + } else { + throw new Error('Browser lacks native selectors'); + } + } + }; + + var eq = function (e1, e2) { + return e1.dom() === e2.dom(); + }; + var regularContains = function (e1, e2) { + var d1 = e1.dom(); + var d2 = e2.dom(); + return d1 === d2 ? false : d1.contains(d2); + }; + var ieContains = function (e1, e2) { + return documentPositionContainedBy(e1.dom(), e2.dom()); + }; + var contains$1 = function (e1, e2) { + return detect$3().browser.isIE() ? ieContains(e1, e2) : regularContains(e1, e2); + }; + var is$1 = is; + + var global$1 = tinymce.util.Tools.resolve('tinymce.dom.RangeUtils'); + + var global$2 = tinymce.util.Tools.resolve('tinymce.dom.TreeWalker'); + + var global$3 = tinymce.util.Tools.resolve('tinymce.util.VK'); + + var lift2 = function (oa, ob, f) { + return oa.isSome() && ob.isSome() ? Option.some(f(oa.getOrDie(), ob.getOrDie())) : Option.none(); + }; + + var fromElements = function (elements, scope) { + var doc = scope || domGlobals.document; + var fragment = doc.createDocumentFragment(); + each(elements, function (element) { + fragment.appendChild(element.dom()); + }); + return Element.fromDom(fragment); + }; + + var Global = typeof domGlobals.window !== 'undefined' ? domGlobals.window : Function('return this;')(); + + var name = function (element) { + var r = element.dom().nodeName; + return r.toLowerCase(); + }; + var type = function (element) { + return element.dom().nodeType; + }; + var isType$1 = function (t) { + return function (element) { + return type(element) === t; + }; + }; + var isElement = isType$1(ELEMENT); + + var parent = function (element) { + return Option.from(element.dom().parentNode).map(Element.fromDom); + }; + var children = function (element) { + return map(element.dom().childNodes, Element.fromDom); + }; + var child = function (element, index) { + var cs = element.dom().childNodes; + return Option.from(cs[index]).map(Element.fromDom); + }; + var firstChild = function (element) { + return child(element, 0); + }; + var lastChild = function (element) { + return child(element, element.dom().childNodes.length - 1); + }; + + var before = function (marker, element) { + var parent$1 = parent(marker); + parent$1.each(function (v) { + v.dom().insertBefore(element.dom(), marker.dom()); + }); + }; + var append = function (parent, element) { + parent.dom().appendChild(element.dom()); + }; + + var before$1 = function (marker, elements) { + each(elements, function (x) { + before(marker, x); + }); + }; + var append$1 = function (parent, elements) { + each(elements, function (x) { + append(parent, x); + }); + }; + + var remove = function (element) { + var dom = element.dom(); + if (dom.parentNode !== null) { + dom.parentNode.removeChild(dom); + } + }; + + var fireListEvent = function (editor, action, element) { + return editor.fire('ListMutation', { + action: action, + element: element + }); + }; + + var global$4 = tinymce.util.Tools.resolve('tinymce.dom.DomQuery'); + + var global$5 = tinymce.util.Tools.resolve('tinymce.util.Tools'); + + var matchNodeName = function (name) { + return function (node) { + return node && node.nodeName.toLowerCase() === name; + }; + }; + var matchNodeNames = function (regex) { + return function (node) { + return node && regex.test(node.nodeName); + }; + }; + var isTextNode = function (node) { + return node && node.nodeType === 3; + }; + var isListNode = matchNodeNames(/^(OL|UL|DL)$/); + var isOlUlNode = matchNodeNames(/^(OL|UL)$/); + var isOlNode = matchNodeName('ol'); + var isListItemNode = matchNodeNames(/^(LI|DT|DD)$/); + var isDlItemNode = matchNodeNames(/^(DT|DD)$/); + var isTableCellNode = matchNodeNames(/^(TH|TD)$/); + var isBr = matchNodeName('br'); + var isFirstChild = function (node) { + return node.parentNode.firstChild === node; + }; + var isTextBlock = function (editor, node) { + return node && !!editor.schema.getTextBlockElements()[node.nodeName]; + }; + var isBlock = function (node, blockElements) { + return node && node.nodeName in blockElements; + }; + var isBogusBr = function (dom, node) { + if (!isBr(node)) { + return false; + } + if (dom.isBlock(node.nextSibling) && !isBr(node.previousSibling)) { + return true; + } + return false; + }; + var isEmpty = function (dom, elm, keepBookmarks) { + var empty = dom.isEmpty(elm); + if (keepBookmarks && dom.select('span[data-mce-type=bookmark]', elm).length > 0) { + return false; + } + return empty; + }; + var isChildOfBody = function (dom, elm) { + return dom.isChildOf(elm, dom.getRoot()); + }; + + var getParentList = function (editor, node) { + var selectionStart = node || editor.selection.getStart(true); + return editor.dom.getParent(selectionStart, 'OL,UL,DL', getClosestListRootElm(editor, selectionStart)); + }; + var isParentListSelected = function (parentList, selectedBlocks) { + return parentList && selectedBlocks.length === 1 && selectedBlocks[0] === parentList; + }; + var findSubLists = function (parentList) { + return global$5.grep(parentList.querySelectorAll('ol,ul,dl'), function (elm) { + return isListNode(elm); + }); + }; + var getSelectedSubLists = function (editor) { + var parentList = getParentList(editor); + var selectedBlocks = editor.selection.getSelectedBlocks(); + if (isParentListSelected(parentList, selectedBlocks)) { + return findSubLists(parentList); + } else { + return global$5.grep(selectedBlocks, function (elm) { + return isListNode(elm) && parentList !== elm; + }); + } + }; + var findParentListItemsNodes = function (editor, elms) { + var listItemsElms = global$5.map(elms, function (elm) { + var parentLi = editor.dom.getParent(elm, 'li,dd,dt', getClosestListRootElm(editor, elm)); + return parentLi ? parentLi : elm; + }); + return global$4.unique(listItemsElms); + }; + var getSelectedListItems = function (editor) { + var selectedBlocks = editor.selection.getSelectedBlocks(); + return global$5.grep(findParentListItemsNodes(editor, selectedBlocks), function (block) { + return isListItemNode(block); + }); + }; + var getSelectedDlItems = function (editor) { + return filter(getSelectedListItems(editor), isDlItemNode); + }; + var getClosestListRootElm = function (editor, elm) { + var parentTableCell = editor.dom.getParents(elm, 'TD,TH'); + var root = parentTableCell.length > 0 ? parentTableCell[0] : editor.getBody(); + return root; + }; + var findLastParentListNode = function (editor, elm) { + var parentLists = editor.dom.getParents(elm, 'ol,ul', getClosestListRootElm(editor, elm)); + return last(parentLists); + }; + var getSelectedLists = function (editor) { + var firstList = findLastParentListNode(editor, editor.selection.getStart()); + var subsequentLists = filter(editor.selection.getSelectedBlocks(), isOlUlNode); + return firstList.toArray().concat(subsequentLists); + }; + var getSelectedListRoots = function (editor) { + var selectedLists = getSelectedLists(editor); + return getUniqueListRoots(editor, selectedLists); + }; + var getUniqueListRoots = function (editor, lists) { + var listRoots = map(lists, function (list) { + return findLastParentListNode(editor, list).getOr(list); + }); + return global$4.unique(listRoots); + }; + + var shouldIndentOnTab = function (editor) { + return editor.getParam('lists_indent_on_tab', true); + }; + var getForcedRootBlock = function (editor) { + var block = editor.getParam('forced_root_block', 'p'); + if (block === false) { + return ''; + } else if (block === true) { + return 'p'; + } else { + return block; + } + }; + var getForcedRootBlockAttrs = function (editor) { + return editor.getParam('forced_root_block_attrs', {}); + }; + + var createTextBlock = function (editor, contentNode) { + var dom = editor.dom; + var blockElements = editor.schema.getBlockElements(); + var fragment = dom.createFragment(); + var blockName = getForcedRootBlock(editor); + var node, textBlock, hasContentNode; + if (blockName) { + textBlock = dom.create(blockName); + if (textBlock.tagName === blockName.toUpperCase()) { + dom.setAttribs(textBlock, getForcedRootBlockAttrs(editor)); + } + if (!isBlock(contentNode.firstChild, blockElements)) { + fragment.appendChild(textBlock); + } + } + if (contentNode) { + while (node = contentNode.firstChild) { + var nodeName = node.nodeName; + if (!hasContentNode && (nodeName !== 'SPAN' || node.getAttribute('data-mce-type') !== 'bookmark')) { + hasContentNode = true; + } + if (isBlock(node, blockElements)) { + fragment.appendChild(node); + textBlock = null; + } else { + if (blockName) { + if (!textBlock) { + textBlock = dom.create(blockName); + fragment.appendChild(textBlock); + } + textBlock.appendChild(node); + } else { + fragment.appendChild(node); + } + } + } + } + if (!blockName) { + fragment.appendChild(dom.create('br')); + } else { + if (!hasContentNode) { + textBlock.appendChild(dom.create('br', { 'data-mce-bogus': '1' })); + } + } + return fragment; + }; + + var keys = Object.keys; + var each$1 = function (obj, f) { + var props = keys(obj); + for (var k = 0, len = props.length; k < len; k++) { + var i = props[k]; + var x = obj[i]; + f(x, i); + } + }; + var objAcc = function (r) { + return function (x, i) { + r[i] = x; + }; + }; + var internalFilter = function (obj, pred, onTrue, onFalse) { + var r = {}; + each$1(obj, function (x, i) { + (pred(x, i) ? onTrue : onFalse)(x, i); + }); + return r; + }; + var filter$1 = function (obj, pred) { + var t = {}; + internalFilter(obj, pred, objAcc(t), noop); + return t; + }; + + var rawSet = function (dom, key, value) { + if (isString(value) || isBoolean(value) || isNumber(value)) { + dom.setAttribute(key, value + ''); + } else { + domGlobals.console.error('Invalid call to Attr.set. Key ', key, ':: Value ', value, ':: Element ', dom); + throw new Error('Attribute value was not simple'); + } + }; + var setAll = function (element, attrs) { + var dom = element.dom(); + each$1(attrs, function (v, k) { + rawSet(dom, k, v); + }); + }; + var clone = function (element) { + return foldl(element.dom().attributes, function (acc, attr) { + acc[attr.name] = attr.value; + return acc; + }, {}); + }; + + var isSupported = function (dom) { + return dom.style !== undefined && isFunction(dom.style.getPropertyValue); + }; + + var supported = isFunction(domGlobals.Element.prototype.attachShadow) && isFunction(domGlobals.Node.prototype.getRootNode); + + var internalSet = function (dom, property, value) { + if (!isString(value)) { + domGlobals.console.error('Invalid call to CSS.set. Property ', property, ':: Value ', value, ':: Element ', dom); + throw new Error('CSS value must be a string: ' + value); + } + if (isSupported(dom)) { + dom.style.setProperty(property, value); + } + }; + var set = function (element, property, value) { + var dom = element.dom(); + internalSet(dom, property, value); + }; + + var clone$1 = function (original, isDeep) { + return Element.fromDom(original.dom().cloneNode(isDeep)); + }; + var deep = function (original) { + return clone$1(original, true); + }; + var shallowAs = function (original, tag) { + var nu = Element.fromTag(tag); + var attributes = clone(original); + setAll(nu, attributes); + return nu; + }; + var mutate = function (original, tag) { + var nu = shallowAs(original, tag); + before(original, nu); + var children$1 = children(original); + append$1(nu, children$1); + remove(original); + return nu; + }; + + var joinSegment = function (parent, child) { + append(parent.item, child.list); + }; + var joinSegments = function (segments) { + for (var i = 1; i < segments.length; i++) { + joinSegment(segments[i - 1], segments[i]); + } + }; + var appendSegments = function (head$1, tail) { + lift2(last(head$1), head(tail), joinSegment); + }; + var createSegment = function (scope, listType) { + var segment = { + list: Element.fromTag(listType, scope), + item: Element.fromTag('li', scope) + }; + append(segment.list, segment.item); + return segment; + }; + var createSegments = function (scope, entry, size) { + var segments = []; + for (var i = 0; i < size; i++) { + segments.push(createSegment(scope, entry.listType)); + } + return segments; + }; + var populateSegments = function (segments, entry) { + for (var i = 0; i < segments.length - 1; i++) { + set(segments[i].item, 'list-style-type', 'none'); + } + last(segments).each(function (segment) { + setAll(segment.list, entry.listAttributes); + setAll(segment.item, entry.itemAttributes); + append$1(segment.item, entry.content); + }); + }; + var normalizeSegment = function (segment, entry) { + if (name(segment.list) !== entry.listType) { + segment.list = mutate(segment.list, entry.listType); + } + setAll(segment.list, entry.listAttributes); + }; + var createItem = function (scope, attr, content) { + var item = Element.fromTag('li', scope); + setAll(item, attr); + append$1(item, content); + return item; + }; + var appendItem = function (segment, item) { + append(segment.list, item); + segment.item = item; + }; + var writeShallow = function (scope, cast, entry) { + var newCast = cast.slice(0, entry.depth); + last(newCast).each(function (segment) { + var item = createItem(scope, entry.itemAttributes, entry.content); + appendItem(segment, item); + normalizeSegment(segment, entry); + }); + return newCast; + }; + var writeDeep = function (scope, cast, entry) { + var segments = createSegments(scope, entry, entry.depth - cast.length); + joinSegments(segments); + populateSegments(segments, entry); + appendSegments(cast, segments); + return cast.concat(segments); + }; + var composeList = function (scope, entries) { + var cast = foldl(entries, function (cast, entry) { + return entry.depth > cast.length ? writeDeep(scope, cast, entry) : writeShallow(scope, cast, entry); + }, []); + return head(cast).map(function (segment) { + return segment.list; + }); + }; + + var isList = function (el) { + return is$1(el, 'OL,UL'); + }; + var hasFirstChildList = function (el) { + return firstChild(el).map(isList).getOr(false); + }; + var hasLastChildList = function (el) { + return lastChild(el).map(isList).getOr(false); + }; + + var isIndented = function (entry) { + return entry.depth > 0; + }; + var isSelected = function (entry) { + return entry.isSelected; + }; + var cloneItemContent = function (li) { + var children$1 = children(li); + var content = hasLastChildList(li) ? children$1.slice(0, -1) : children$1; + return map(content, deep); + }; + var createEntry = function (li, depth, isSelected) { + return parent(li).filter(isElement).map(function (list) { + return { + depth: depth, + dirty: false, + isSelected: isSelected, + content: cloneItemContent(li), + itemAttributes: clone(li), + listAttributes: clone(list), + listType: name(list) + }; + }); + }; + + var indentEntry = function (indentation, entry) { + switch (indentation) { + case 'Indent': + entry.depth++; + break; + case 'Outdent': + entry.depth--; + break; + case 'Flatten': + entry.depth = 0; + } + entry.dirty = true; + }; + + var cloneListProperties = function (target, source) { + target.listType = source.listType; + target.listAttributes = __assign({}, source.listAttributes); + }; + var cleanListProperties = function (entry) { + entry.listAttributes = filter$1(entry.listAttributes, function (_value, key) { + return key !== 'start'; + }); + }; + var closestSiblingEntry = function (entries, start) { + var depth = entries[start].depth; + var matches = function (entry) { + return entry.depth === depth && !entry.dirty; + }; + var until = function (entry) { + return entry.depth < depth; + }; + return findUntil(reverse(entries.slice(0, start)), matches, until).orThunk(function () { + return findUntil(entries.slice(start + 1), matches, until); + }); + }; + var normalizeEntries = function (entries) { + each(entries, function (entry, i) { + closestSiblingEntry(entries, i).fold(function () { + if (entry.dirty) { + cleanListProperties(entry); + } + }, function (matchingEntry) { + return cloneListProperties(entry, matchingEntry); + }); + }); + return entries; + }; + + var Cell = function (initial) { + var value = initial; + var get = function () { + return value; + }; + var set = function (v) { + value = v; + }; + return { + get: get, + set: set + }; + }; + + var parseItem = function (depth, itemSelection, selectionState, item) { + return firstChild(item).filter(isList).fold(function () { + itemSelection.each(function (selection) { + if (eq(selection.start, item)) { + selectionState.set(true); + } + }); + var currentItemEntry = createEntry(item, depth, selectionState.get()); + itemSelection.each(function (selection) { + if (eq(selection.end, item)) { + selectionState.set(false); + } + }); + var childListEntries = lastChild(item).filter(isList).map(function (list) { + return parseList(depth, itemSelection, selectionState, list); + }).getOr([]); + return currentItemEntry.toArray().concat(childListEntries); + }, function (list) { + return parseList(depth, itemSelection, selectionState, list); + }); + }; + var parseList = function (depth, itemSelection, selectionState, list) { + return bind(children(list), function (element) { + var parser = isList(element) ? parseList : parseItem; + var newDepth = depth + 1; + return parser(newDepth, itemSelection, selectionState, element); + }); + }; + var parseLists = function (lists, itemSelection) { + var selectionState = Cell(false); + var initialDepth = 0; + return map(lists, function (list) { + return { + sourceList: list, + entries: parseList(initialDepth, itemSelection, selectionState, list) + }; + }); + }; + + var outdentedComposer = function (editor, entries) { + var normalizedEntries = normalizeEntries(entries); + return map(normalizedEntries, function (entry) { + var content = fromElements(entry.content); + return Element.fromDom(createTextBlock(editor, content.dom())); + }); + }; + var indentedComposer = function (editor, entries) { + var normalizedEntries = normalizeEntries(entries); + return composeList(editor.contentDocument, normalizedEntries).toArray(); + }; + var composeEntries = function (editor, entries) { + return bind(groupBy(entries, isIndented), function (entries) { + var groupIsIndented = head(entries).map(isIndented).getOr(false); + return groupIsIndented ? indentedComposer(editor, entries) : outdentedComposer(editor, entries); + }); + }; + var indentSelectedEntries = function (entries, indentation) { + each(filter(entries, isSelected), function (entry) { + return indentEntry(indentation, entry); + }); + }; + var getItemSelection = function (editor) { + var selectedListItems = map(getSelectedListItems(editor), Element.fromDom); + return lift2(find(selectedListItems, not(hasFirstChildList)), find(reverse(selectedListItems), not(hasFirstChildList)), function (start, end) { + return { + start: start, + end: end + }; + }); + }; + var listIndentation = function (editor, lists, indentation) { + var entrySets = parseLists(lists, getItemSelection(editor)); + each(entrySets, function (entrySet) { + indentSelectedEntries(entrySet.entries, indentation); + var composedLists = composeEntries(editor, entrySet.entries); + each(composedLists, function (composedList) { + fireListEvent(editor, indentation === 'Indent' ? 'IndentList' : 'OutdentList', composedList.dom()); + }); + before$1(entrySet.sourceList, composedLists); + remove(entrySet.sourceList); + }); + }; + + var global$6 = tinymce.util.Tools.resolve('tinymce.dom.DOMUtils'); + + var DOM = global$6.DOM; + var splitList = function (editor, ul, li) { + var removeAndKeepBookmarks = function (targetNode) { + global$5.each(bookmarks, function (node) { + targetNode.parentNode.insertBefore(node, li.parentNode); + }); + DOM.remove(targetNode); + }; + var bookmarks = DOM.select('span[data-mce-type="bookmark"]', ul); + var newBlock = createTextBlock(editor, li); + var tmpRng = DOM.createRng(); + tmpRng.setStartAfter(li); + tmpRng.setEndAfter(ul); + var fragment = tmpRng.extractContents(); + for (var node = fragment.firstChild; node; node = node.firstChild) { + if (node.nodeName === 'LI' && editor.dom.isEmpty(node)) { + DOM.remove(node); + break; + } + } + if (!editor.dom.isEmpty(fragment)) { + DOM.insertAfter(fragment, ul); + } + DOM.insertAfter(newBlock, ul); + if (isEmpty(editor.dom, li.parentNode)) { + removeAndKeepBookmarks(li.parentNode); + } + DOM.remove(li); + if (isEmpty(editor.dom, ul)) { + DOM.remove(ul); + } + }; + + var outdentDlItem = function (editor, item) { + if (is$1(item, 'dd')) { + mutate(item, 'dt'); + } else if (is$1(item, 'dt')) { + parent(item).each(function (dl) { + return splitList(editor, dl.dom(), item.dom()); + }); + } + }; + var indentDlItem = function (item) { + if (is$1(item, 'dt')) { + mutate(item, 'dd'); + } + }; + var dlIndentation = function (editor, indentation, dlItems) { + if (indentation === 'Indent') { + each(dlItems, indentDlItem); + } else { + each(dlItems, function (item) { + return outdentDlItem(editor, item); + }); + } + }; + + var getNormalizedPoint = function (container, offset) { + if (isTextNode(container)) { + return { + container: container, + offset: offset + }; + } + var node = global$1.getNode(container, offset); + if (isTextNode(node)) { + return { + container: node, + offset: offset >= container.childNodes.length ? node.data.length : 0 + }; + } else if (node.previousSibling && isTextNode(node.previousSibling)) { + return { + container: node.previousSibling, + offset: node.previousSibling.data.length + }; + } else if (node.nextSibling && isTextNode(node.nextSibling)) { + return { + container: node.nextSibling, + offset: 0 + }; + } + return { + container: container, + offset: offset + }; + }; + var normalizeRange = function (rng) { + var outRng = rng.cloneRange(); + var rangeStart = getNormalizedPoint(rng.startContainer, rng.startOffset); + outRng.setStart(rangeStart.container, rangeStart.offset); + var rangeEnd = getNormalizedPoint(rng.endContainer, rng.endOffset); + outRng.setEnd(rangeEnd.container, rangeEnd.offset); + return outRng; + }; + + var selectionIndentation = function (editor, indentation) { + var lists = map(getSelectedListRoots(editor), Element.fromDom); + var dlItems = map(getSelectedDlItems(editor), Element.fromDom); + var isHandled = false; + if (lists.length || dlItems.length) { + var bookmark = editor.selection.getBookmark(); + listIndentation(editor, lists, indentation); + dlIndentation(editor, indentation, dlItems); + editor.selection.moveToBookmark(bookmark); + editor.selection.setRng(normalizeRange(editor.selection.getRng())); + editor.nodeChanged(); + isHandled = true; + } + return isHandled; + }; + var indentListSelection = function (editor) { + return selectionIndentation(editor, 'Indent'); + }; + var outdentListSelection = function (editor) { + return selectionIndentation(editor, 'Outdent'); + }; + var flattenListSelection = function (editor) { + return selectionIndentation(editor, 'Flatten'); + }; + + var global$7 = tinymce.util.Tools.resolve('tinymce.dom.BookmarkManager'); + + var DOM$1 = global$6.DOM; + var createBookmark = function (rng) { + var bookmark = {}; + var setupEndPoint = function (start) { + var offsetNode, container, offset; + container = rng[start ? 'startContainer' : 'endContainer']; + offset = rng[start ? 'startOffset' : 'endOffset']; + if (container.nodeType === 1) { + offsetNode = DOM$1.create('span', { 'data-mce-type': 'bookmark' }); + if (container.hasChildNodes()) { + offset = Math.min(offset, container.childNodes.length - 1); + if (start) { + container.insertBefore(offsetNode, container.childNodes[offset]); + } else { + DOM$1.insertAfter(offsetNode, container.childNodes[offset]); + } + } else { + container.appendChild(offsetNode); + } + container = offsetNode; + offset = 0; + } + bookmark[start ? 'startContainer' : 'endContainer'] = container; + bookmark[start ? 'startOffset' : 'endOffset'] = offset; + }; + setupEndPoint(true); + if (!rng.collapsed) { + setupEndPoint(); + } + return bookmark; + }; + var resolveBookmark = function (bookmark) { + function restoreEndPoint(start) { + var container, offset, node; + var nodeIndex = function (container) { + var node = container.parentNode.firstChild, idx = 0; + while (node) { + if (node === container) { + return idx; + } + if (node.nodeType !== 1 || node.getAttribute('data-mce-type') !== 'bookmark') { + idx++; + } + node = node.nextSibling; + } + return -1; + }; + container = node = bookmark[start ? 'startContainer' : 'endContainer']; + offset = bookmark[start ? 'startOffset' : 'endOffset']; + if (!container) { + return; + } + if (container.nodeType === 1) { + offset = nodeIndex(container); + container = container.parentNode; + DOM$1.remove(node); + if (!container.hasChildNodes() && DOM$1.isBlock(container)) { + container.appendChild(DOM$1.create('br')); + } + } + bookmark[start ? 'startContainer' : 'endContainer'] = container; + bookmark[start ? 'startOffset' : 'endOffset'] = offset; + } + restoreEndPoint(true); + restoreEndPoint(); + var rng = DOM$1.createRng(); + rng.setStart(bookmark.startContainer, bookmark.startOffset); + if (bookmark.endContainer) { + rng.setEnd(bookmark.endContainer, bookmark.endOffset); + } + return normalizeRange(rng); + }; + + var listToggleActionFromListName = function (listName) { + switch (listName) { + case 'UL': + return 'ToggleUlList'; + case 'OL': + return 'ToggleOlList'; + case 'DL': + return 'ToggleDLList'; + } + }; + + var isCustomList = function (list) { + return /\btox\-/.test(list.className); + }; + var listState = function (editor, listName, activate) { + var nodeChangeHandler = function (e) { + var inList = findUntil(e.parents, isListNode, isTableCellNode).filter(function (list) { + return list.nodeName === listName && !isCustomList(list); + }).isSome(); + activate(inList); + }; + var parents = editor.dom.getParents(editor.selection.getNode()); + nodeChangeHandler({ parents: parents }); + editor.on('NodeChange', nodeChangeHandler); + return function () { + return editor.off('NodeChange', nodeChangeHandler); + }; + }; + + var updateListStyle = function (dom, el, detail) { + var type = detail['list-style-type'] ? detail['list-style-type'] : null; + dom.setStyle(el, 'list-style-type', type); + }; + var setAttribs = function (elm, attrs) { + global$5.each(attrs, function (value, key) { + elm.setAttribute(key, value); + }); + }; + var updateListAttrs = function (dom, el, detail) { + setAttribs(el, detail['list-attributes']); + global$5.each(dom.select('li', el), function (li) { + setAttribs(li, detail['list-item-attributes']); + }); + }; + var updateListWithDetails = function (dom, el, detail) { + updateListStyle(dom, el, detail); + updateListAttrs(dom, el, detail); + }; + var removeStyles = function (dom, element, styles) { + global$5.each(styles, function (style) { + var _a; + return dom.setStyle(element, (_a = {}, _a[style] = '', _a)); + }); + }; + var getEndPointNode = function (editor, rng, start, root) { + var container = rng[start ? 'startContainer' : 'endContainer']; + var offset = rng[start ? 'startOffset' : 'endOffset']; + if (container.nodeType === 1) { + container = container.childNodes[Math.min(offset, container.childNodes.length - 1)] || container; + } + if (!start && isBr(container.nextSibling)) { + container = container.nextSibling; + } + while (container.parentNode !== root) { + if (isTextBlock(editor, container)) { + return container; + } + if (/^(TD|TH)$/.test(container.parentNode.nodeName)) { + return container; + } + container = container.parentNode; + } + return container; + }; + var getSelectedTextBlocks = function (editor, rng, root) { + var textBlocks = [], dom = editor.dom; + var startNode = getEndPointNode(editor, rng, true, root); + var endNode = getEndPointNode(editor, rng, false, root); + var block; + var siblings = []; + for (var node = startNode; node; node = node.nextSibling) { + siblings.push(node); + if (node === endNode) { + break; + } + } + global$5.each(siblings, function (node) { + if (isTextBlock(editor, node)) { + textBlocks.push(node); + block = null; + return; + } + if (dom.isBlock(node) || isBr(node)) { + if (isBr(node)) { + dom.remove(node); + } + block = null; + return; + } + var nextSibling = node.nextSibling; + if (global$7.isBookmarkNode(node)) { + if (isTextBlock(editor, nextSibling) || !nextSibling && node.parentNode === root) { + block = null; + return; + } + } + if (!block) { + block = dom.create('p'); + node.parentNode.insertBefore(block, node); + textBlocks.push(block); + } + block.appendChild(node); + }); + return textBlocks; + }; + var hasCompatibleStyle = function (dom, sib, detail) { + var sibStyle = dom.getStyle(sib, 'list-style-type'); + var detailStyle = detail ? detail['list-style-type'] : ''; + detailStyle = detailStyle === null ? '' : detailStyle; + return sibStyle === detailStyle; + }; + var applyList = function (editor, listName, detail) { + if (detail === void 0) { + detail = {}; + } + var rng = editor.selection.getRng(); + var listItemName = 'LI'; + var root = getClosestListRootElm(editor, editor.selection.getStart(true)); + var dom = editor.dom; + if (dom.getContentEditable(editor.selection.getNode()) === 'false') { + return; + } + listName = listName.toUpperCase(); + if (listName === 'DL') { + listItemName = 'DT'; + } + var bookmark = createBookmark(rng); + global$5.each(getSelectedTextBlocks(editor, rng, root), function (block) { + var listBlock; + var sibling = block.previousSibling; + if (sibling && isListNode(sibling) && sibling.nodeName === listName && hasCompatibleStyle(dom, sibling, detail)) { + listBlock = sibling; + block = dom.rename(block, listItemName); + sibling.appendChild(block); + } else { + listBlock = dom.create(listName); + block.parentNode.insertBefore(listBlock, block); + listBlock.appendChild(block); + block = dom.rename(block, listItemName); + } + removeStyles(dom, block, [ + 'margin', + 'margin-right', + 'margin-bottom', + 'margin-left', + 'margin-top', + 'padding', + 'padding-right', + 'padding-bottom', + 'padding-left', + 'padding-top' + ]); + updateListWithDetails(dom, listBlock, detail); + mergeWithAdjacentLists(editor.dom, listBlock); + }); + editor.selection.setRng(resolveBookmark(bookmark)); + }; + var isValidLists = function (list1, list2) { + return list1 && list2 && isListNode(list1) && list1.nodeName === list2.nodeName; + }; + var hasSameListStyle = function (dom, list1, list2) { + var targetStyle = dom.getStyle(list1, 'list-style-type', true); + var style = dom.getStyle(list2, 'list-style-type', true); + return targetStyle === style; + }; + var hasSameClasses = function (elm1, elm2) { + return elm1.className === elm2.className; + }; + var shouldMerge = function (dom, list1, list2) { + return isValidLists(list1, list2) && hasSameListStyle(dom, list1, list2) && hasSameClasses(list1, list2); + }; + var mergeWithAdjacentLists = function (dom, listBlock) { + var sibling, node; + sibling = listBlock.nextSibling; + if (shouldMerge(dom, listBlock, sibling)) { + while (node = sibling.firstChild) { + listBlock.appendChild(node); + } + dom.remove(sibling); + } + sibling = listBlock.previousSibling; + if (shouldMerge(dom, listBlock, sibling)) { + while (node = sibling.lastChild) { + listBlock.insertBefore(node, listBlock.firstChild); + } + dom.remove(sibling); + } + }; + var updateList = function (editor, list, listName, detail) { + if (list.nodeName !== listName) { + var newList = editor.dom.rename(list, listName); + updateListWithDetails(editor.dom, newList, detail); + fireListEvent(editor, listToggleActionFromListName(listName), newList); + } else { + updateListWithDetails(editor.dom, list, detail); + fireListEvent(editor, listToggleActionFromListName(listName), list); + } + }; + var toggleMultipleLists = function (editor, parentList, lists, listName, detail) { + if (parentList.nodeName === listName && !hasListStyleDetail(detail)) { + flattenListSelection(editor); + } else { + var bookmark = createBookmark(editor.selection.getRng(true)); + global$5.each([parentList].concat(lists), function (elm) { + updateList(editor, elm, listName, detail); + }); + editor.selection.setRng(resolveBookmark(bookmark)); + } + }; + var hasListStyleDetail = function (detail) { + return 'list-style-type' in detail; + }; + var toggleSingleList = function (editor, parentList, listName, detail) { + if (parentList === editor.getBody()) { + return; + } + if (parentList) { + if (parentList.nodeName === listName && !hasListStyleDetail(detail) && !isCustomList(parentList)) { + flattenListSelection(editor); + } else { + var bookmark = createBookmark(editor.selection.getRng(true)); + updateListWithDetails(editor.dom, parentList, detail); + var newList = editor.dom.rename(parentList, listName); + mergeWithAdjacentLists(editor.dom, newList); + editor.selection.setRng(resolveBookmark(bookmark)); + fireListEvent(editor, listToggleActionFromListName(listName), newList); + } + } else { + applyList(editor, listName, detail); + fireListEvent(editor, listToggleActionFromListName(listName), parentList); + } + }; + var toggleList = function (editor, listName, detail) { + var parentList = getParentList(editor); + var selectedSubLists = getSelectedSubLists(editor); + detail = detail ? detail : {}; + if (parentList && selectedSubLists.length > 0) { + toggleMultipleLists(editor, parentList, selectedSubLists, listName, detail); + } else { + toggleSingleList(editor, parentList, listName, detail); + } + }; + + var DOM$2 = global$6.DOM; + var normalizeList = function (dom, ul) { + var sibling; + var parentNode = ul.parentNode; + if (parentNode.nodeName === 'LI' && parentNode.firstChild === ul) { + sibling = parentNode.previousSibling; + if (sibling && sibling.nodeName === 'LI') { + sibling.appendChild(ul); + if (isEmpty(dom, parentNode)) { + DOM$2.remove(parentNode); + } + } else { + DOM$2.setStyle(parentNode, 'listStyleType', 'none'); + } + } + if (isListNode(parentNode)) { + sibling = parentNode.previousSibling; + if (sibling && sibling.nodeName === 'LI') { + sibling.appendChild(ul); + } + } + }; + var normalizeLists = function (dom, element) { + global$5.each(global$5.grep(dom.select('ol,ul', element)), function (ul) { + normalizeList(dom, ul); + }); + }; + + var findNextCaretContainer = function (editor, rng, isForward, root) { + var node = rng.startContainer; + var offset = rng.startOffset; + if (isTextNode(node) && (isForward ? offset < node.data.length : offset > 0)) { + return node; + } + var nonEmptyBlocks = editor.schema.getNonEmptyElements(); + if (node.nodeType === 1) { + node = global$1.getNode(node, offset); + } + var walker = new global$2(node, root); + if (isForward) { + if (isBogusBr(editor.dom, node)) { + walker.next(); + } + } + while (node = walker[isForward ? 'next' : 'prev2']()) { + if (node.nodeName === 'LI' && !node.hasChildNodes()) { + return node; + } + if (nonEmptyBlocks[node.nodeName]) { + return node; + } + if (isTextNode(node) && node.data.length > 0) { + return node; + } + } + }; + var hasOnlyOneBlockChild = function (dom, elm) { + var childNodes = elm.childNodes; + return childNodes.length === 1 && !isListNode(childNodes[0]) && dom.isBlock(childNodes[0]); + }; + var unwrapSingleBlockChild = function (dom, elm) { + if (hasOnlyOneBlockChild(dom, elm)) { + dom.remove(elm.firstChild, true); + } + }; + var moveChildren = function (dom, fromElm, toElm) { + var node; + var targetElm = hasOnlyOneBlockChild(dom, toElm) ? toElm.firstChild : toElm; + unwrapSingleBlockChild(dom, fromElm); + if (!isEmpty(dom, fromElm, true)) { + while (node = fromElm.firstChild) { + targetElm.appendChild(node); + } + } + }; + var mergeLiElements = function (dom, fromElm, toElm) { + var listNode; + var ul = fromElm.parentNode; + if (!isChildOfBody(dom, fromElm) || !isChildOfBody(dom, toElm)) { + return; + } + if (isListNode(toElm.lastChild)) { + listNode = toElm.lastChild; + } + if (ul === toElm.lastChild) { + if (isBr(ul.previousSibling)) { + dom.remove(ul.previousSibling); + } + } + var node = toElm.lastChild; + if (node && isBr(node) && fromElm.hasChildNodes()) { + dom.remove(node); + } + if (isEmpty(dom, toElm, true)) { + dom.$(toElm).empty(); + } + moveChildren(dom, fromElm, toElm); + if (listNode) { + toElm.appendChild(listNode); + } + var contains = contains$1(Element.fromDom(toElm), Element.fromDom(fromElm)); + var nestedLists = contains ? dom.getParents(fromElm, isListNode, toElm) : []; + dom.remove(fromElm); + each(nestedLists, function (list) { + if (isEmpty(dom, list) && list !== dom.getRoot()) { + dom.remove(list); + } + }); + }; + var mergeIntoEmptyLi = function (editor, fromLi, toLi) { + editor.dom.$(toLi).empty(); + mergeLiElements(editor.dom, fromLi, toLi); + editor.selection.setCursorLocation(toLi); + }; + var mergeForward = function (editor, rng, fromLi, toLi) { + var dom = editor.dom; + if (dom.isEmpty(toLi)) { + mergeIntoEmptyLi(editor, fromLi, toLi); + } else { + var bookmark = createBookmark(rng); + mergeLiElements(dom, fromLi, toLi); + editor.selection.setRng(resolveBookmark(bookmark)); + } + }; + var mergeBackward = function (editor, rng, fromLi, toLi) { + var bookmark = createBookmark(rng); + mergeLiElements(editor.dom, fromLi, toLi); + var resolvedBookmark = resolveBookmark(bookmark); + editor.selection.setRng(resolvedBookmark); + }; + var backspaceDeleteFromListToListCaret = function (editor, isForward) { + var dom = editor.dom, selection = editor.selection; + var selectionStartElm = selection.getStart(); + var root = getClosestListRootElm(editor, selectionStartElm); + var li = dom.getParent(selection.getStart(), 'LI', root); + if (li) { + var ul = li.parentNode; + if (ul === editor.getBody() && isEmpty(dom, ul)) { + return true; + } + var rng_1 = normalizeRange(selection.getRng()); + var otherLi_1 = dom.getParent(findNextCaretContainer(editor, rng_1, isForward, root), 'LI', root); + if (otherLi_1 && otherLi_1 !== li) { + editor.undoManager.transact(function () { + if (isForward) { + mergeForward(editor, rng_1, otherLi_1, li); + } else { + if (isFirstChild(li)) { + outdentListSelection(editor); + } else { + mergeBackward(editor, rng_1, li, otherLi_1); + } + } + }); + return true; + } else if (!otherLi_1) { + if (!isForward && rng_1.startOffset === 0 && rng_1.endOffset === 0) { + editor.undoManager.transact(function () { + flattenListSelection(editor); + }); + return true; + } + } + } + return false; + }; + var removeBlock = function (dom, block, root) { + var parentBlock = dom.getParent(block.parentNode, dom.isBlock, root); + dom.remove(block); + if (parentBlock && dom.isEmpty(parentBlock)) { + dom.remove(parentBlock); + } + }; + var backspaceDeleteIntoListCaret = function (editor, isForward) { + var dom = editor.dom; + var selectionStartElm = editor.selection.getStart(); + var root = getClosestListRootElm(editor, selectionStartElm); + var block = dom.getParent(selectionStartElm, dom.isBlock, root); + if (block && dom.isEmpty(block)) { + var rng = normalizeRange(editor.selection.getRng()); + var otherLi_2 = dom.getParent(findNextCaretContainer(editor, rng, isForward, root), 'LI', root); + if (otherLi_2) { + editor.undoManager.transact(function () { + removeBlock(dom, block, root); + mergeWithAdjacentLists(dom, otherLi_2.parentNode); + editor.selection.select(otherLi_2, true); + editor.selection.collapse(isForward); + }); + return true; + } + } + return false; + }; + var backspaceDeleteCaret = function (editor, isForward) { + return backspaceDeleteFromListToListCaret(editor, isForward) || backspaceDeleteIntoListCaret(editor, isForward); + }; + var backspaceDeleteRange = function (editor) { + var selectionStartElm = editor.selection.getStart(); + var root = getClosestListRootElm(editor, selectionStartElm); + var startListParent = editor.dom.getParent(selectionStartElm, 'LI,DT,DD', root); + if (startListParent || getSelectedListItems(editor).length > 0) { + editor.undoManager.transact(function () { + editor.execCommand('Delete'); + normalizeLists(editor.dom, editor.getBody()); + }); + return true; + } + return false; + }; + var backspaceDelete = function (editor, isForward) { + return editor.selection.isCollapsed() ? backspaceDeleteCaret(editor, isForward) : backspaceDeleteRange(editor); + }; + var setup = function (editor) { + editor.on('keydown', function (e) { + if (e.keyCode === global$3.BACKSPACE) { + if (backspaceDelete(editor, false)) { + e.preventDefault(); + } + } else if (e.keyCode === global$3.DELETE) { + if (backspaceDelete(editor, true)) { + e.preventDefault(); + } + } + }); + }; + + var get = function (editor) { + return { + backspaceDelete: function (isForward) { + backspaceDelete(editor, isForward); + } + }; + }; + + var open = function (editor) { + var dom = editor.dom; + var currentList = getParentList(editor); + if (!isOlNode(currentList)) { + return; + } + editor.windowManager.open({ + title: 'List Properties', + body: { + type: 'panel', + items: [{ + type: 'input', + name: 'start', + label: 'Start list at number', + inputMode: 'numeric' + }] + }, + initialData: { start: dom.getAttrib(currentList, 'start') || '1' }, + buttons: [ + { + type: 'cancel', + name: 'cancel', + text: 'Cancel' + }, + { + type: 'submit', + name: 'save', + text: 'Save', + primary: true + } + ], + onSubmit: function (api) { + var data = api.getData(); + editor.undoManager.transact(function () { + dom.setAttrib(getParentList(editor), 'start', data.start === '1' ? '' : data.start); + }); + api.close(); + } + }); + }; + + var queryListCommandState = function (editor, listName) { + return function () { + var parentList = editor.dom.getParent(editor.selection.getStart(), 'UL,OL,DL'); + return parentList && parentList.nodeName === listName; + }; + }; + var register = function (editor) { + editor.on('BeforeExecCommand', function (e) { + var cmd = e.command.toLowerCase(); + if (cmd === 'indent') { + indentListSelection(editor); + } else if (cmd === 'outdent') { + outdentListSelection(editor); + } + }); + editor.addCommand('InsertUnorderedList', function (ui, detail) { + toggleList(editor, 'UL', detail); + }); + editor.addCommand('InsertOrderedList', function (ui, detail) { + toggleList(editor, 'OL', detail); + }); + editor.addCommand('InsertDefinitionList', function (ui, detail) { + toggleList(editor, 'DL', detail); + }); + editor.addCommand('RemoveList', function () { + flattenListSelection(editor); + }); + editor.addCommand('mceListProps', function () { + open(editor); + }); + editor.addQueryStateHandler('InsertUnorderedList', queryListCommandState(editor, 'UL')); + editor.addQueryStateHandler('InsertOrderedList', queryListCommandState(editor, 'OL')); + editor.addQueryStateHandler('InsertDefinitionList', queryListCommandState(editor, 'DL')); + }; + + var hasRtcPlugin = function (editor) { + if (/(^|[ ,])rtc([, ]|$)/.test(editor.getParam('plugins', '', 'string')) && global.get('rtc')) { + return true; + } else { + return false; + } + }; + + var setupTabKey = function (editor) { + editor.on('keydown', function (e) { + if (e.keyCode !== global$3.TAB || global$3.metaKeyPressed(e)) { + return; + } + editor.undoManager.transact(function () { + if (e.shiftKey ? outdentListSelection(editor) : indentListSelection(editor)) { + e.preventDefault(); + } + }); + }); + }; + var setup$1 = function (editor) { + if (shouldIndentOnTab(editor)) { + setupTabKey(editor); + } + setup(editor); + }; + + var register$1 = function (editor) { + var hasPlugin = function (editor, plugin) { + var plugins = editor.getParam('plugins', '', 'string'); + return global$5.inArray(plugins.split(/[ ,]/), plugin) !== -1; + }; + var exec = function (command) { + return function () { + return editor.execCommand(command); + }; + }; + if (!hasPlugin(editor, 'advlist')) { + editor.ui.registry.addToggleButton('numlist', { + icon: 'ordered-list', + active: false, + tooltip: 'Numbered list', + onAction: exec('InsertOrderedList'), + onSetup: function (api) { + return listState(editor, 'OL', api.setActive); + } + }); + editor.ui.registry.addToggleButton('bullist', { + icon: 'unordered-list', + active: false, + tooltip: 'Bullet list', + onAction: exec('InsertUnorderedList'), + onSetup: function (api) { + return listState(editor, 'UL', api.setActive); + } + }); + } + }; + + var register$2 = function (editor) { + var listProperties = { + text: 'List properties...', + icon: 'ordered-list', + onAction: function () { + return open(editor); + }, + onSetup: function (api) { + return listState(editor, 'OL', function (active) { + return api.setDisabled(!active); + }); + } + }; + editor.ui.registry.addMenuItem('listprops', listProperties); + editor.ui.registry.addContextMenu('lists', { + update: function (node) { + var parentList = getParentList(editor, node); + return isOlNode(parentList) ? ['listprops'] : []; + } + }); + }; + + function Plugin () { + global.add('lists', function (editor) { + if (hasRtcPlugin(editor) === false) { + setup$1(editor); + register(editor); + } + register$1(editor); + register$2(editor); + return get(editor); + }); + } + + Plugin(); + +}(window)); diff --git a/src/main/resources/static/layui-ext/tinymce/tinymce/plugins/lists/plugin.min.js b/src/main/resources/static/layui-ext/tinymce/tinymce/plugins/lists/plugin.min.js new file mode 100644 index 0000000..7509dd5 --- /dev/null +++ b/src/main/resources/static/layui-ext/tinymce/tinymce/plugins/lists/plugin.min.js @@ -0,0 +1,9 @@ +/** + * 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/ + * + * Version: 5.4.2 (2020-08-17) + */ +!function(u){"use strict";var e,n,t,r,o,i,a,c=tinymce.util.Tools.resolve("tinymce.PluginManager"),s=function(){},y=function(e){return function(){return e}},f=function(n){return function(e){return!n(e)}},d=y(!1),l=y(!0),m=function(){return p},p=(e=function(e){return e.isNone()},{fold:function(e,n){return e()},is:d,isSome:d,isNone:l,getOr:t=function(e){return e},getOrThunk:n=function(e){return e()},getOrDie:function(e){throw new Error(e||"error: getOrDie called on none.")},getOrNull:y(null),getOrUndefined:y(undefined),or:t,orThunk:n,map:m,each:s,bind:m,exists:d,forall:l,filter:m,equals:e,equals_:e,toArray:function(){return[]},toString:y("none()")}),g=function(t){var e=y(t),n=function(){return o},r=function(e){return e(t)},o={fold:function(e,n){return n(t)},is:function(e){return t===e},isSome:l,isNone:d,getOr:e,getOrThunk:e,getOrDie:e,getOrNull:e,getOrUndefined:e,or:n,orThunk:n,map:function(e){return g(e(t))},each:function(e){e(t)},bind:r,exists:r,forall:r,filter:function(e){return e(t)?o:p},toArray:function(){return[t]},toString:function(){return"some("+t+")"},equals:function(e){return e.is(t)},equals_:function(e,n){return e.fold(d,function(e){return n(t,e)})}};return o},v={some:g,none:m,from:function(e){return null===e||e===undefined?p:g(e)}},h=function(r){return function(e){return t=typeof(n=e),(null===n?"null":"object"==t&&(Array.prototype.isPrototypeOf(n)||n.constructor&&"Array"===n.constructor.name)?"array":"object"==t&&(String.prototype.isPrototypeOf(n)||n.constructor&&"String"===n.constructor.name)?"string":t)===r;var n,t}},S=function(n){return function(e){return typeof e===n}},b=h("string"),C=h("array"),N=S("boolean"),O=S("function"),L=S("number"),w=Array.prototype.slice,T=Array.prototype.push,D=function(e,n){for(var t=e.length,r=new Array(t),o=0;oe.length?hn:vn)(t,e,n)},[]),I(r).map(function(e){return e.list}).toArray()},xn=function(u,e,s){var n,t=Tn(e,(n=D(en(u),ge.fromDom),Oe(P(n,f(Sn)),P(R(n),f(Sn)),function(e,n){return{start:e,end:n}})));k(t,function(e){var n,t;n=e.entries,t=s,k(x(n,Cn),function(e){return function(e,n){switch(e){case"Indent":n.depth++;break;case"Outdent":n.depth--;break;case"Flatten":n.depth=0}n.dirty=!0}(t,e)});var r,o,i,a=(r=u,o=e.entries,B(function(e,n){if(0===e.length)return[];for(var t=n(e[0]),r=[],o=[],i=0,a=e.length;i=e.childNodes.length?t.data.length:0}:t.previousSibling&&$e(t.previousSibling)?{container:t.previousSibling,offset:t.previousSibling.data.length}:t.nextSibling&&$e(t.nextSibling)?{container:t.nextSibling,offset:0}:{container:e,offset:n}},In=function(e){var n=e.cloneRange(),t=Rn(e.startContainer,e.startOffset);n.setStart(t.container,t.offset);var r=Rn(e.endContainer,e.endOffset);return n.setEnd(r.container,r.offset),n},Mn=function(e,n){var t,r=D(rn(e),ge.fromDom),o=D(x(en(e),Ve),ge.fromDom),i=!1;if(r.length||o.length){var a=e.selection.getBookmark();xn(e,r,n),t=e,k(o,"Indent"===n?Bn:function(e){return Pn(t,e)}),e.selection.moveToBookmark(a),e.selection.setRng(In(e.selection.getRng())),e.nodeChanged(),i=!0}return i},Un=function(e){return Mn(e,"Indent")},_n=function(e){return Mn(e,"Outdent")},Fn=function(e){return Mn(e,"Flatten")},$n=tinymce.util.Tools.resolve("tinymce.dom.BookmarkManager"),Hn=An.DOM,jn=function(o){var i={},e=function(e){var n,t,r;t=o[e?"startContainer":"endContainer"],r=o[e?"startOffset":"endOffset"],1===t.nodeType&&(n=Hn.create("span",{"data-mce-type":"bookmark"}),t.hasChildNodes()?(r=Math.min(r,t.childNodes.length-1),e?t.insertBefore(n,t.childNodes[r]):Hn.insertAfter(n,t.childNodes[r])):t.appendChild(n),t=n,r=0),i[e?"startContainer":"endContainer"]=t,i[e?"startOffset":"endOffset"]=r};return e(!0),o.collapsed||e(),i},qn=function(o){function e(e){var n,t,r;n=r=o[e?"startContainer":"endContainer"],t=o[e?"startOffset":"endOffset"],n&&(1===n.nodeType&&(t=function(e){for(var n=e.parentNode.firstChild,t=0;n;){if(n===e)return t;1===n.nodeType&&"bookmark"===n.getAttribute("data-mce-type")||t++,n=n.nextSibling}return-1}(n),n=n.parentNode,Hn.remove(r),!n.hasChildNodes()&&Hn.isBlock(n)&&n.appendChild(Hn.create("br"))),o[e?"startContainer":"endContainer"]=n,o[e?"startOffset":"endOffset"]=t)}e(!0),e();var n=Hn.createRng();return n.setStart(o.startContainer,o.startOffset),o.endContainer&&n.setEnd(o.endContainer,o.endOffset),In(n)},Kn=function(e){switch(e){case"UL":return"ToggleUlList";case"OL":return"ToggleOlList";case"DL":return"ToggleDLList"}},Vn=function(e){return/\btox\-/.test(e.className)},Wn=function(e,t,r){var n=function(e){var n=E(e.parents,He,We).filter(function(e){return e.nodeName===t&&!Vn(e)}).isSome();r(n)},o=e.dom.getParents(e.selection.getNode());return n({parents:o}),e.on("NodeChange",n),function(){return e.off("NodeChange",n)}},Qn=function(t,e){Ue.each(e,function(e,n){t.setAttribute(n,e)})},Xn=function(e,n,t){var r,o,i,a,u,s,c;r=e,o=n,a=(i=t)["list-style-type"]?i["list-style-type"]:null,r.setStyle(o,"list-style-type",a),u=e,Qn(s=n,(c=t)["list-attributes"]),Ue.each(u.select("li",s),function(e){Qn(e,c["list-item-attributes"])})},zn=function(e,n,t,r){var o=n[t?"startContainer":"endContainer"],i=n[t?"startOffset":"endOffset"];for(1===o.nodeType&&(o=o.childNodes[Math.min(i,o.childNodes.length-1)]||o),!t&&Qe(o.nextSibling)&&(o=o.nextSibling);o.parentNode!==r;){if(Xe(e,o))return o;if(/^(TD|TH)$/.test(o.parentNode.nodeName))return o;o=o.parentNode}return o},Yn=function(f,d,l){void 0===l&&(l={});var e=f.selection.getRng(),m="LI",n=nn(f,f.selection.getStart(!0)),p=f.dom;if("false"!==p.getContentEditable(f.selection.getNode())){"DL"===(d=d.toUpperCase())&&(m="DT");var t=jn(e);Ue.each(function(t,e,r){for(var o,i=[],a=t.dom,n=zn(t,e,!0,r),u=zn(t,e,!1,r),s=[],c=n;c&&(s.push(c),c!==u);c=c.nextSibling);return Ue.each(s,function(e){if(Xe(t,e))return i.push(e),void(o=null);if(a.isBlock(e)||Qe(e))return Qe(e)&&a.remove(e),void(o=null);var n=e.nextSibling;$n.isBookmarkNode(e)&&(Xe(t,n)||!n&&e.parentNode===r)?o=null:(o||(o=a.create("p"),e.parentNode.insertBefore(o,e),i.push(o)),o.appendChild(e))}),i}(f,e,n),function(e){var n,t,r,o,i,a,u,s,c=e.previousSibling;c&&He(c)&&c.nodeName===d&&(t=c,r=l,o=p.getStyle(t,"list-style-type"),i=r?r["list-style-type"]:"",o===(i=null===i?"":i))?(n=c,e=p.rename(e,m),c.appendChild(e)):(n=p.create(d),e.parentNode.insertBefore(n,e),n.appendChild(e),e=p.rename(e,m)),a=p,u=e,s=["margin","margin-right","margin-bottom","margin-left","margin-top","padding","padding-right","padding-bottom","padding-left","padding-top"],Ue.each(s,function(e){var n;return a.setStyle(u,((n={})[e]="",n))}),Xn(p,n,l),Jn(f.dom,n)}),f.selection.setRng(qn(t))}},Gn=function(e,n,t){return s=t,(u=n)&&s&&He(u)&&u.nodeName===s.nodeName&&(i=n,a=t,(o=e).getStyle(i,"list-style-type",!0)===o.getStyle(a,"list-style-type",!0))&&(r=t,n.className===r.className);var r,o,i,a,u,s},Jn=function(e,n){var t,r;if(t=n.nextSibling,Gn(e,n,t)){for(;r=t.firstChild;)n.appendChild(r);e.remove(t)}if(t=n.previousSibling,Gn(e,n,t)){for(;r=t.lastChild;)n.insertBefore(r,n.firstChild);e.remove(t)}},Zn=function(n,e,t,r,o){if(e.nodeName!==r||et(o)){var i=jn(n.selection.getRng(!0));Ue.each([e].concat(t),function(e){!function(e,n,t,r){if(n.nodeName!==t){var o=e.dom.rename(n,t);Xn(e.dom,o,r),Ie(e,Kn(t),o)}else Xn(e.dom,n,r),Ie(e,Kn(t),n)}(n,e,r,o)}),n.selection.setRng(qn(i))}else Fn(n)},et=function(e){return"list-style-type"in e},nt=function(e,n,t){var r=Je(e),o=Ze(e);t=t||{},r&&0 1) { + return protocolMatches[1] === 'www.' ? 'https://' : protocolMatches[1]; + } else { + return 'https://'; + } + }; + var getUrl = function (pattern, url) { + var protocol = getProtocol(url); + var match = pattern.regex.exec(url); + var newUrl = protocol + pattern.url; + var _loop_1 = function (i) { + newUrl = newUrl.replace('$' + i, function () { + return match[i] ? match[i] : ''; + }); + }; + for (var i = 0; i < match.length; i++) { + _loop_1(i); + } + return newUrl.replace(/\?$/, ''); + }; + var matchPattern = function (url) { + var patterns = urlPatterns.filter(function (pattern) { + return pattern.regex.test(url); + }); + if (patterns.length > 0) { + return global$1.extend({}, patterns[0], { url: getUrl(patterns[0], url) }); + } else { + return null; + } + }; + + var getIframeHtml = function (data) { + var allowFullscreen = data.allowFullscreen ? ' allowFullscreen="1"' : ''; + return ''; + }; + var getFlashHtml = function (data) { + var html = ''; + if (data.poster) { + html += ''; + } + html += ''; + return html; + }; + var getAudioHtml = function (data, audioTemplateCallback) { + if (audioTemplateCallback) { + return audioTemplateCallback(data); + } else { + return ''; + } + }; + var getVideoHtml = function (data, videoTemplateCallback) { + if (videoTemplateCallback) { + return videoTemplateCallback(data); + } else { + return ''; + } + }; + var getScriptHtml = function (data) { + return ''; + }; + var dataToHtml = function (editor, dataIn) { + var data = global$1.extend({}, dataIn); + if (!data.source) { + global$1.extend(data, htmlToData(getScripts(editor), data.embed)); + if (!data.source) { + return ''; + } + } + if (!data.altsource) { + data.altsource = ''; + } + if (!data.poster) { + data.poster = ''; + } + data.source = editor.convertURL(data.source, 'source'); + data.altsource = editor.convertURL(data.altsource, 'source'); + data.sourcemime = guess(data.source); + data.altsourcemime = guess(data.altsource); + data.poster = editor.convertURL(data.poster, 'poster'); + var pattern = matchPattern(data.source); + if (pattern) { + data.source = pattern.url; + data.type = pattern.type; + data.allowFullscreen = pattern.allowFullscreen; + data.width = data.width || String(pattern.w); + data.height = data.height || String(pattern.h); + } + if (data.embed) { + return updateHtml(data.embed, data, true); + } else { + var videoScript = getVideoScriptMatch(getScripts(editor), data.source); + if (videoScript) { + data.type = 'script'; + data.width = String(videoScript.width); + data.height = String(videoScript.height); + } + var audioTemplateCallback = getAudioTemplateCallback(editor); + var videoTemplateCallback = getVideoTemplateCallback(editor); + data.width = data.width || '300'; + data.height = data.height || '150'; + global$1.each(data, function (value, key) { + data[key] = editor.dom.encode('' + value); + }); + if (data.type === 'iframe') { + return getIframeHtml(data); + } else if (data.sourcemime === 'application/x-shockwave-flash') { + return getFlashHtml(data); + } else if (data.sourcemime.indexOf('audio') !== -1) { + return getAudioHtml(data, audioTemplateCallback); + } else if (data.type === 'script') { + return getScriptHtml(data); + } else { + return getVideoHtml(data, videoTemplateCallback); + } + } + }; + + var global$6 = tinymce.util.Tools.resolve('tinymce.util.Promise'); + + var cache = {}; + var embedPromise = function (data, dataToHtml, handler) { + return new global$6(function (res, rej) { + var wrappedResolve = function (response) { + if (response.html) { + cache[data.source] = response; + } + return res({ + url: data.source, + html: response.html ? response.html : dataToHtml(data) + }); + }; + if (cache[data.source]) { + wrappedResolve(cache[data.source]); + } else { + handler({ url: data.source }, wrappedResolve, rej); + } + }); + }; + var defaultPromise = function (data, dataToHtml) { + return new global$6(function (res) { + res({ + html: dataToHtml(data), + url: data.source + }); + }); + }; + var loadedData = function (editor) { + return function (data) { + return dataToHtml(editor, data); + }; + }; + var getEmbedHtml = function (editor, data) { + var embedHandler = getUrlResolver(editor); + return embedHandler ? embedPromise(data, loadedData(editor), embedHandler) : defaultPromise(data, loadedData(editor)); + }; + var isCached = function (url) { + return cache.hasOwnProperty(url); + }; + + var extractMeta = function (sourceInput, data) { + return get(data, sourceInput).bind(function (mainData) { + return get(mainData, 'meta'); + }); + }; + var getValue = function (data, metaData, sourceInput) { + return function (prop) { + var _a; + var getFromData = function () { + return get(data, prop); + }; + var getFromMetaData = function () { + return get(metaData, prop); + }; + var getNonEmptyValue = function (c) { + return get(c, 'value').bind(function (v) { + return v.length > 0 ? Option.some(v) : Option.none(); + }); + }; + var getFromValueFirst = function () { + return getFromData().bind(function (child) { + return isObject(child) ? getNonEmptyValue(child).orThunk(getFromMetaData) : getFromMetaData().orThunk(function () { + return Option.from(child); + }); + }); + }; + var getFromMetaFirst = function () { + return getFromMetaData().orThunk(function () { + return getFromData().bind(function (child) { + return isObject(child) ? getNonEmptyValue(child) : Option.from(child); + }); + }); + }; + return _a = {}, _a[prop] = (prop === sourceInput ? getFromValueFirst() : getFromMetaFirst()).getOr(''), _a; + }; + }; + var getDimensions = function (data, metaData) { + var dimensions = {}; + get(data, 'dimensions').each(function (dims) { + each([ + 'width', + 'height' + ], function (prop) { + get(metaData, prop).orThunk(function () { + return get(dims, prop); + }).each(function (value) { + return dimensions[prop] = value; + }); + }); + }); + return dimensions; + }; + var unwrap = function (data, sourceInput) { + var metaData = sourceInput ? extractMeta(sourceInput, data).getOr({}) : {}; + var get = getValue(data, metaData, sourceInput); + return __assign(__assign(__assign(__assign(__assign({}, get('source')), get('altsource')), get('poster')), get('embed')), getDimensions(data, metaData)); + }; + var wrap = function (data) { + var wrapped = __assign(__assign({}, data), { + source: { value: get(data, 'source').getOr('') }, + altsource: { value: get(data, 'altsource').getOr('') }, + poster: { value: get(data, 'poster').getOr('') } + }); + each([ + 'width', + 'height' + ], function (prop) { + get(data, prop).each(function (value) { + var dimensions = wrapped.dimensions || {}; + dimensions[prop] = value; + wrapped.dimensions = dimensions; + }); + }); + return wrapped; + }; + var handleError = function (editor) { + return function (error) { + var errorMessage = error && error.msg ? 'Media embed handler error: ' + error.msg : 'Media embed handler threw unknown error.'; + editor.notificationManager.open({ + type: 'error', + text: errorMessage + }); + }; + }; + var snippetToData = function (editor, embedSnippet) { + return htmlToData(getScripts(editor), embedSnippet); + }; + var isMediaElement = function (element) { + return element.getAttribute('data-mce-object') || element.getAttribute('data-ephox-embed-iri'); + }; + var getEditorData = function (editor) { + var element = editor.selection.getNode(); + var snippet = isMediaElement(element) ? editor.serializer.serialize(element, { selection: true }) : ''; + return __assign({ embed: snippet }, htmlToData(getScripts(editor), snippet)); + }; + var addEmbedHtml = function (api, editor) { + return function (response) { + if (isString(response.url) && response.url.trim().length > 0) { + var html = response.html; + var snippetData = snippetToData(editor, html); + var nuData = __assign(__assign({}, snippetData), { + source: response.url, + embed: html + }); + api.setData(wrap(nuData)); + } + }; + }; + var selectPlaceholder = function (editor, beforeObjects) { + var afterObjects = editor.dom.select('img[data-mce-object]'); + for (var i = 0; i < beforeObjects.length; i++) { + for (var y = afterObjects.length - 1; y >= 0; y--) { + if (beforeObjects[i] === afterObjects[y]) { + afterObjects.splice(y, 1); + } + } + } + editor.selection.select(afterObjects[0]); + }; + var handleInsert = function (editor, html) { + var beforeObjects = editor.dom.select('img[data-mce-object]'); + editor.insertContent(html); + selectPlaceholder(editor, beforeObjects); + editor.nodeChanged(); + }; + var submitForm = function (prevData, newData, editor) { + newData.embed = updateHtml(newData.embed, newData); + if (newData.embed && (prevData.source === newData.source || isCached(newData.source))) { + handleInsert(editor, newData.embed); + } else { + getEmbedHtml(editor, newData).then(function (response) { + handleInsert(editor, response.html); + }).catch(handleError(editor)); + } + }; + var showDialog = function (editor) { + var editorData = getEditorData(editor); + var currentData = Cell(editorData); + var initialData = wrap(editorData); + var handleSource = function (prevData, api) { + var serviceData = unwrap(api.getData(), 'source'); + if (prevData.source !== serviceData.source) { + addEmbedHtml(win, editor)({ + url: serviceData.source, + html: '' + }); + getEmbedHtml(editor, serviceData).then(addEmbedHtml(win, editor)).catch(handleError(editor)); + } + }; + var handleEmbed = function (api) { + var data = unwrap(api.getData()); + var dataFromEmbed = snippetToData(editor, data.embed); + api.setData(wrap(dataFromEmbed)); + }; + var handleUpdate = function (api, sourceInput) { + var data = unwrap(api.getData(), sourceInput); + var embed = dataToHtml(editor, data); + api.setData(wrap(__assign(__assign({}, data), { embed: embed }))); + }; + var mediaInput = [{ + name: 'source', + type: 'urlinput', + filetype: 'media', + label: 'Source' + }]; + var sizeInput = !hasDimensions(editor) ? [] : [{ + type: 'sizeinput', + name: 'dimensions', + label: 'Constrain proportions', + constrain: true + }]; + var generalTab = { + title: 'General', + name: 'general', + items: flatten([ + mediaInput, + sizeInput + ]) + }; + var embedTextarea = { + type: 'textarea', + name: 'embed', + label: 'Paste your embed code below:' + }; + var embedTab = { + title: 'Embed', + items: [embedTextarea] + }; + var advancedFormItems = []; + if (hasAltSource(editor)) { + advancedFormItems.push({ + name: 'altsource', + type: 'urlinput', + filetype: 'media', + label: 'Alternative source URL' + }); + } + if (hasPoster(editor)) { + advancedFormItems.push({ + name: 'poster', + type: 'urlinput', + filetype: 'image', + label: 'Media poster (Image URL)' + }); + } + var advancedTab = { + title: 'Advanced', + name: 'advanced', + items: advancedFormItems + }; + var tabs = [ + generalTab, + embedTab + ]; + if (advancedFormItems.length > 0) { + tabs.push(advancedTab); + } + var body = { + type: 'tabpanel', + tabs: tabs + }; + var win = editor.windowManager.open({ + title: 'Insert/Edit Media', + size: 'normal', + body: body, + buttons: [ + { + type: 'cancel', + name: 'cancel', + text: 'Cancel' + }, + { + type: 'submit', + name: 'save', + text: 'Save', + primary: true + } + ], + onSubmit: function (api) { + var serviceData = unwrap(api.getData()); + submitForm(currentData.get(), serviceData, editor); + api.close(); + }, + onChange: function (api, detail) { + switch (detail.name) { + case 'source': + handleSource(currentData.get(), api); + break; + case 'embed': + handleEmbed(api); + break; + case 'dimensions': + case 'altsource': + case 'poster': + handleUpdate(api, detail.name); + break; + } + currentData.set(unwrap(api.getData())); + }, + initialData: initialData + }); + }; + + var get$1 = function (editor) { + var showDialog$1 = function () { + showDialog(editor); + }; + return { showDialog: showDialog$1 }; + }; + + var register = function (editor) { + var showDialog$1 = function () { + showDialog(editor); + }; + editor.addCommand('mceMedia', showDialog$1); + }; + + var global$7 = tinymce.util.Tools.resolve('tinymce.html.Node'); + + var global$8 = tinymce.util.Tools.resolve('tinymce.Env'); + + var sanitize = function (editor, html) { + if (shouldFilterHtml(editor) === false) { + return html; + } + var writer = global$5(); + var blocked; + global$3({ + validate: false, + allow_conditional_comments: false, + comment: function (text) { + writer.comment(text); + }, + cdata: function (text) { + writer.cdata(text); + }, + text: function (text, raw) { + writer.text(text, raw); + }, + start: function (name, attrs, empty) { + blocked = true; + if (name === 'script' || name === 'noscript' || name === 'svg') { + return; + } + for (var i = attrs.length - 1; i >= 0; i--) { + var attrName = attrs[i].name; + if (attrName.indexOf('on') === 0) { + delete attrs.map[attrName]; + attrs.splice(i, 1); + } + if (attrName === 'style') { + attrs[i].value = editor.dom.serializeStyle(editor.dom.parseStyle(attrs[i].value), name); + } + } + writer.start(name, attrs, empty); + blocked = false; + }, + end: function (name) { + if (blocked) { + return; + } + writer.end(name); + } + }, global$4({})).parse(html); + return writer.getContent(); + }; + + var createPlaceholderNode = function (editor, node) { + var name = node.name; + var placeHolder = new global$7('img', 1); + placeHolder.shortEnded = true; + retainAttributesAndInnerHtml(editor, node, placeHolder); + placeHolder.attr({ + 'width': node.attr('width') || '300', + 'height': node.attr('height') || (name === 'audio' ? '30' : '150'), + 'style': node.attr('style'), + 'src': global$8.transparentSrc, + 'data-mce-object': name, + 'class': 'mce-object mce-object-' + name + }); + return placeHolder; + }; + var createPreviewIframeNode = function (editor, node) { + var name = node.name; + var previewWrapper = new global$7('span', 1); + previewWrapper.attr({ + 'contentEditable': 'false', + 'style': node.attr('style'), + 'data-mce-object': name, + 'class': 'mce-preview-object mce-object-' + name + }); + retainAttributesAndInnerHtml(editor, node, previewWrapper); + var previewNode = new global$7(name, 1); + previewNode.attr({ + src: node.attr('src'), + allowfullscreen: node.attr('allowfullscreen'), + style: node.attr('style'), + class: node.attr('class'), + width: node.attr('width'), + height: node.attr('height'), + frameborder: '0' + }); + var shimNode = new global$7('span', 1); + shimNode.attr('class', 'mce-shim'); + previewWrapper.append(previewNode); + previewWrapper.append(shimNode); + return previewWrapper; + }; + var retainAttributesAndInnerHtml = function (editor, sourceNode, targetNode) { + var attrName; + var attrValue; + var ai; + var attribs = sourceNode.attributes; + ai = attribs.length; + while (ai--) { + attrName = attribs[ai].name; + attrValue = attribs[ai].value; + if (attrName !== 'width' && attrName !== 'height' && attrName !== 'style') { + if (attrName === 'data' || attrName === 'src') { + attrValue = editor.convertURL(attrValue, attrName); + } + targetNode.attr('data-mce-p-' + attrName, attrValue); + } + } + var innerHtml = sourceNode.firstChild && sourceNode.firstChild.value; + if (innerHtml) { + targetNode.attr('data-mce-html', escape(sanitize(editor, innerHtml))); + targetNode.firstChild = null; + } + }; + var isPageEmbedWrapper = function (node) { + var nodeClass = node.attr('class'); + return nodeClass && /\btiny-pageembed\b/.test(nodeClass); + }; + var isWithinEmbedWrapper = function (node) { + while (node = node.parent) { + if (node.attr('data-ephox-embed-iri') || isPageEmbedWrapper(node)) { + return true; + } + } + return false; + }; + var placeHolderConverter = function (editor) { + return function (nodes) { + var i = nodes.length; + var node; + var videoScript; + while (i--) { + node = nodes[i]; + if (!node.parent) { + continue; + } + if (node.parent.attr('data-mce-object')) { + continue; + } + if (node.name === 'script') { + videoScript = getVideoScriptMatch(getScripts(editor), node.attr('src')); + if (!videoScript) { + continue; + } + } + if (videoScript) { + if (videoScript.width) { + node.attr('width', videoScript.width.toString()); + } + if (videoScript.height) { + node.attr('height', videoScript.height.toString()); + } + } + if (node.name === 'iframe' && hasLiveEmbeds(editor) && global$8.ceFalse) { + if (!isWithinEmbedWrapper(node)) { + node.replace(createPreviewIframeNode(editor, node)); + } + } else { + if (!isWithinEmbedWrapper(node)) { + node.replace(createPlaceholderNode(editor, node)); + } + } + } + }; + }; + + var setup = function (editor) { + editor.on('preInit', function () { + var specialElements = editor.schema.getSpecialElements(); + global$1.each('video audio iframe object'.split(' '), function (name) { + specialElements[name] = new RegExp(']*>', 'gi'); + }); + var boolAttrs = editor.schema.getBoolAttrs(); + global$1.each('webkitallowfullscreen mozallowfullscreen allowfullscreen'.split(' '), function (name) { + boolAttrs[name] = {}; + }); + editor.parser.addNodeFilter('iframe,video,audio,object,embed,script', placeHolderConverter(editor)); + editor.serializer.addAttributeFilter('data-mce-object', function (nodes, name) { + var i = nodes.length; + var node; + var realElm; + var ai; + var attribs; + var innerHtml; + var innerNode; + var realElmName; + var className; + while (i--) { + node = nodes[i]; + if (!node.parent) { + continue; + } + realElmName = node.attr(name); + realElm = new global$7(realElmName, 1); + if (realElmName !== 'audio' && realElmName !== 'script') { + className = node.attr('class'); + if (className && className.indexOf('mce-preview-object') !== -1) { + realElm.attr({ + width: node.firstChild.attr('width'), + height: node.firstChild.attr('height') + }); + } else { + realElm.attr({ + width: node.attr('width'), + height: node.attr('height') + }); + } + } + realElm.attr({ style: node.attr('style') }); + attribs = node.attributes; + ai = attribs.length; + while (ai--) { + var attrName = attribs[ai].name; + if (attrName.indexOf('data-mce-p-') === 0) { + realElm.attr(attrName.substr(11), attribs[ai].value); + } + } + if (realElmName === 'script') { + realElm.attr('type', 'text/javascript'); + } + innerHtml = node.attr('data-mce-html'); + if (innerHtml) { + innerNode = new global$7('#text', 3); + innerNode.raw = true; + innerNode.value = sanitize(editor, unescape(innerHtml)); + realElm.append(innerNode); + } + node.replace(realElm); + } + }); + }); + editor.on('SetContent', function () { + editor.$('span.mce-preview-object').each(function (index, elm) { + var $elm = editor.$(elm); + if ($elm.find('span.mce-shim').length === 0) { + $elm.append(''); + } + }); + }); + }; + + var setup$1 = function (editor) { + editor.on('ResolveName', function (e) { + var name; + if (e.target.nodeType === 1 && (name = e.target.getAttribute('data-mce-object'))) { + e.name = name; + } + }); + }; + + var setup$2 = function (editor) { + editor.on('click keyup touchend', function () { + var selectedNode = editor.selection.getNode(); + if (selectedNode && editor.dom.hasClass(selectedNode, 'mce-preview-object')) { + if (editor.dom.getAttrib(selectedNode, 'data-mce-selected')) { + selectedNode.setAttribute('data-mce-selected', '2'); + } + } + }); + editor.on('ObjectSelected', function (e) { + var objectType = e.target.getAttribute('data-mce-object'); + if (objectType === 'audio' || objectType === 'script') { + e.preventDefault(); + } + }); + editor.on('ObjectResized', function (e) { + var target = e.target; + var html; + if (target.getAttribute('data-mce-object')) { + html = target.getAttribute('data-mce-html'); + if (html) { + html = unescape(html); + target.setAttribute('data-mce-html', escape(updateHtml(html, { + width: String(e.width), + height: String(e.height) + }))); + } + } + }); + }; + + var stateSelectorAdapter = function (editor, selector) { + return function (buttonApi) { + return editor.selection.selectorChangedWithUnbind(selector.join(','), buttonApi.setActive).unbind; + }; + }; + var register$1 = function (editor) { + editor.ui.registry.addToggleButton('media', { + tooltip: 'Insert/edit media', + icon: 'embed', + onAction: function () { + editor.execCommand('mceMedia'); + }, + onSetup: stateSelectorAdapter(editor, [ + 'img[data-mce-object]', + 'span[data-mce-object]', + 'div[data-ephox-embed-iri]' + ]) + }); + editor.ui.registry.addMenuItem('media', { + icon: 'embed', + text: 'Media...', + onAction: function () { + editor.execCommand('mceMedia'); + } + }); + }; + + function Plugin () { + global.add('media', function (editor) { + register(editor); + register$1(editor); + setup$1(editor); + setup(editor); + setup$2(editor); + return get$1(editor); + }); + } + + Plugin(); + +}()); diff --git a/src/main/resources/static/layui-ext/tinymce/tinymce/plugins/media/plugin.min.js b/src/main/resources/static/layui-ext/tinymce/tinymce/plugins/media/plugin.min.js new file mode 100644 index 0000000..9ee7c88 --- /dev/null +++ b/src/main/resources/static/layui-ext/tinymce/tinymce/plugins/media/plugin.min.js @@ -0,0 +1,9 @@ +/** + * 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/ + * + * Version: 5.4.2 (2020-08-17) + */ +!function(){"use strict";var e,t,r,n=tinymce.util.Tools.resolve("tinymce.PluginManager"),p=function(){return(p=Object.assign||function(e){for(var t,r=1,n=arguments.length;r"):"application/x-shockwave-flash"===n.sourcemime?(l='',s.poster&&(l+=''),l+=""):-1!==n.sourcemime.indexOf("audio")?(c=n,(u=h)?u(c):'"):"script"===n.type?' '; + var directionality = editor.getBody().dir; + var dirAttr = directionality ? ' dir="' + encode(directionality) + '"' : ''; + var previewHtml = '' + '' + '' + headHtml + '' + '' + editor.getContent() + preventClicksOnLinksScript + '' + ''; + return previewHtml; + }; + + var open = function (editor) { + var content = getPreviewHtml(editor); + var dataApi = editor.windowManager.open({ + title: 'Preview', + size: 'large', + body: { + type: 'panel', + items: [{ + name: 'preview', + type: 'iframe', + sandboxed: true + }] + }, + buttons: [{ + type: 'cancel', + name: 'close', + text: 'Close', + primary: true + }], + initialData: { preview: content } + }); + dataApi.focus('close'); + }; + + var register = function (editor) { + editor.addCommand('mcePreview', function () { + open(editor); + }); + }; + + var register$1 = function (editor) { + editor.ui.registry.addButton('preview', { + icon: 'preview', + tooltip: 'Preview', + onAction: function () { + return editor.execCommand('mcePreview'); + } + }); + editor.ui.registry.addMenuItem('preview', { + icon: 'preview', + text: 'Preview', + onAction: function () { + return editor.execCommand('mcePreview'); + } + }); + }; + + function Plugin () { + global.add('preview', function (editor) { + register(editor); + register$1(editor); + }); + } + + Plugin(); + +}()); diff --git a/src/main/resources/static/layui-ext/tinymce/tinymce/plugins/preview/plugin.min.js b/src/main/resources/static/layui-ext/tinymce/tinymce/plugins/preview/plugin.min.js new file mode 100644 index 0000000..8f0496e --- /dev/null +++ b/src/main/resources/static/layui-ext/tinymce/tinymce/plugins/preview/plugin.min.js @@ -0,0 +1,9 @@ +/** + * 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/ + * + * Version: 5.4.2 (2020-08-17) + */ +!function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager"),g=tinymce.util.Tools.resolve("tinymce.Env"),w=tinymce.util.Tools.resolve("tinymce.util.Tools"),i=function(e){var t=function(t){var n="",i=t.dom.encode,e=t.getParam("content_style","");n+='',e&&(n+='");var o=t.getParam("content_css_cors",!1,"boolean")?' crossorigin="anonymous"':"";w.each(t.contentCSS,function(e){n+='"});var r,a,c,s,d,m,l,u=-1===(s=(r=t).getParam("body_id","tinymce","string")).indexOf("=")?s:(c=(a=r).getParam("body_id","","hash"))[a.id]||c,y=-1===(l=(d=t).getParam("body_class","","string")).indexOf("=")?l:(m=d).getParam("body_class","","hash")[m.id]||"",v=' + + + + + \ No newline at end of file diff --git a/src/main/resources/template/menu.sql.vm b/src/main/resources/template/menu.sql.vm new file mode 100644 index 0000000..cfbeba9 --- /dev/null +++ b/src/main/resources/template/menu.sql.vm @@ -0,0 +1,18 @@ +-- 默认上级目录菜单为其他 +INSERT INTO sys_permission (id, name, pid, url,target, type,order_num, deleted, status) + VALUES ('${identity}', '${comments}' ,'21', 'index/${classname}','_self', '2', '10',1, 1); +-- 菜单对应按钮SQL +INSERT INTO sys_permission (id,pid, name, url, perms, type, deleted, status) + VALUES ('${selectId}', '${identity}', '列表' , '${classname}/listByPage','${classname}:list', '3',1, 1); +INSERT INTO sys_permission (id,pid, name, url, perms, type, deleted, status) + VALUES ('${addId}', '${identity}', '新增' , '${classname}/add','${classname}:add', '3',1, 1); +INSERT INTO sys_permission (id,pid, name, url, perms, type, deleted, status) + VALUES ('${updateId}', '${identity}', '修改' , '${classname}/update','${classname}:update', '3',1, 1); +INSERT INTO sys_permission (id,pid, name, url, perms, type, deleted, status) + VALUES ('${deleteId}', '${identity}', '删除' , '${classname}/delete','${classname}:delete', '3',1, 1); +-- 赋予admin用户权限 +INSERT INTO sys_role_permission(id, role_id, permission_id) VALUES ('${identityJoinId}', '1', '${identity}'); +INSERT INTO sys_role_permission(id, role_id, permission_id) VALUES ('${selectIdJoinId}', '1', '${selectId}'); +INSERT INTO sys_role_permission(id, role_id, permission_id) VALUES ('${addIdJoinId}', '1', '${addId}'); +INSERT INTO sys_role_permission(id, role_id, permission_id) VALUES ('${updateIdJoinId}', '1', '${updateId}'); +INSERT INTO sys_role_permission(id, role_id, permission_id) VALUES ('${deleteIdJoinId}', '1', '${deleteId}'); diff --git a/src/main/resources/templates/about.html b/src/main/resources/templates/about.html new file mode 100644 index 0000000..1692b73 --- /dev/null +++ b/src/main/resources/templates/about.html @@ -0,0 +1,50 @@ + + + + + + 后台管理系统 介绍 + +

    solon-manager

    + +

    介绍

    + +

    基于Solon 、Apache Shiro、Redis、Mybatis Plus 、Thymeleaf、Layui 后台管理系统
    提供代码生成器,基本增删改查无需编写,可快速完成开发任务。开发最精简,可当脚手架,适合你来diy +

    + +

    特征&提供

    + +
      +
    • 后台接口RESTful 风格,支持前后端分离,可与app公用一套接口。
    • +
    • 采用RBAC的权限控制
    • +
    • 统一响应结果封装及生成工具
    • +
    • 统一异常处理
    • +
    • 采用shiro redis token 角色权限管理认证
    • +
    • 使用Druid solon 集成Druid数据库连接池与监控
    • +
    • 集成MyBatis-Plus,实现单表业务零SQL
    • +
    • 集成国人风格的knife4j,自动生成接口文档
    • +
    • 提供代码生成器,生成从html到mapper,自动赋给admin超级权限,爽歪歪
    • +
    + +

    技术

    + +
      +
    • 核心框架:solon 2.1.6
    • +
    • 持久层框架:mybatis plus
    • +
    • 数据库连接池:alibaba druid
    • +
    • 安全框架:apache shiro
    • +
    • 缓存框架:redis
    • +
    • 日志框架:logback
    • +
    • 接口文档:Knife4j
    • +
    • 前端模板:thymeleaf+layui2x
    • +
    + +

    开发

    + +
      +
    • Model内成员变量建议与表字段数量对应,如需扩展成员变量(比如连表查询)建议创建VO,否则需在扩展的成员变量上加@TableField(exist = false)
    • +
    • 如果表有是否删除字段,需要在Model注解@TableLogic 默认0未删 1删除, 或@TableLogic(value="逻辑未删除值",delval="逻辑删除值")
    • +
    • 登录密码 admin/123456
    • +
    + + \ No newline at end of file diff --git a/src/main/resources/templates/build.html b/src/main/resources/templates/build.html new file mode 100644 index 0000000..c3cb207 --- /dev/null +++ b/src/main/resources/templates/build.html @@ -0,0 +1,155 @@ + + + + + + + layui表单生成器 + +
    + + + + + +
    +
    +
    +
    + 将表单元素拖拽到构建面板中即可生成表单块 +
    +
    +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    +
    + +
    + +
    +
    +
    + +
    + + + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + + +
    +
    +
    + +
    + +
    +
    +
    +
    + + +
    +
    +
    +
    +
    +
    +
    + +
    +
    +
    + 构建面板 + +
    +
    +
    +
    +
    + + + \ No newline at end of file diff --git a/src/main/resources/templates/depts/dept_list.html b/src/main/resources/templates/depts/dept_list.html new file mode 100644 index 0000000..124f96c --- /dev/null +++ b/src/main/resources/templates/depts/dept_list.html @@ -0,0 +1,265 @@ + + + + + Title + +
    + + + + +
    +
    +
    + + + + + + \ No newline at end of file diff --git a/src/main/resources/templates/error/403.html b/src/main/resources/templates/error/403.html new file mode 100644 index 0000000..6bf25b6 --- /dev/null +++ b/src/main/resources/templates/error/403.html @@ -0,0 +1,18 @@ + + + + + + + Title + + + +
    +

    403

    +

    对不起您没有权限访问

    + 回首页 +
    + + \ No newline at end of file diff --git a/src/main/resources/templates/error/404.html b/src/main/resources/templates/error/404.html new file mode 100644 index 0000000..f9d06d7 --- /dev/null +++ b/src/main/resources/templates/error/404.html @@ -0,0 +1,24 @@ + + + + + + + Title + + + +
    +

    404

    +

    您访问的页面好像不存在哦!

    + 回首页 +
    + + + \ No newline at end of file diff --git a/src/main/resources/templates/error/500.html b/src/main/resources/templates/error/500.html new file mode 100644 index 0000000..f963f74 --- /dev/null +++ b/src/main/resources/templates/error/500.html @@ -0,0 +1,20 @@ + + + + + + + + Title + + + +
    +

    500

    +

    服务器好像除了点问题!请稍后试试...

    + 回首页 +
    + + + \ No newline at end of file diff --git a/src/main/resources/templates/generator/list.html b/src/main/resources/templates/generator/list.html new file mode 100644 index 0000000..efa1db8 --- /dev/null +++ b/src/main/resources/templates/generator/list.html @@ -0,0 +1,114 @@ + + + + + Title + +
    + + +
    +
    +
    +
    +
    + +
    + +
    + +
    +
    +
    +
    +
    +
    + + + + + + + \ No newline at end of file diff --git a/src/main/resources/templates/home.html b/src/main/resources/templates/home.html new file mode 100644 index 0000000..194a4ca --- /dev/null +++ b/src/main/resources/templates/home.html @@ -0,0 +1,230 @@ + + + + + + + + + + + + 后台管理系统 + +
    + + + + + + +
    +
    + + + +
    +
    + + + +
    + + +
    + +
    +
      +
    • 主页
    • +
    + +
    +
    + +
    +
    +
    +
    +
    + + + + + \ No newline at end of file diff --git a/src/main/resources/templates/layout.html b/src/main/resources/templates/layout.html new file mode 100644 index 0000000..0bb4d06 --- /dev/null +++ b/src/main/resources/templates/layout.html @@ -0,0 +1,27 @@ + + + + + + Manager + + + + + + + + + + + + + + + diff --git a/src/main/resources/templates/login.html b/src/main/resources/templates/login.html new file mode 100644 index 0000000..1c97fc3 --- /dev/null +++ b/src/main/resources/templates/login.html @@ -0,0 +1,98 @@ + + + + + 后台管理-登陆 + +
    + + + + + +
    + +
    + + + + \ No newline at end of file diff --git a/src/main/resources/templates/login2.html b/src/main/resources/templates/login2.html new file mode 100644 index 0000000..debe7e8 --- /dev/null +++ b/src/main/resources/templates/login2.html @@ -0,0 +1,82 @@ + + + + + 后台管理-登录 + + +
    + + +
    +
    + +
    + + + diff --git a/src/main/resources/templates/main.html b/src/main/resources/templates/main.html new file mode 100644 index 0000000..75943e2 --- /dev/null +++ b/src/main/resources/templates/main.html @@ -0,0 +1,173 @@ + + + + + 主页 +
    + + + +
    +
    +
    + +
    +
    +
    +
    +
    + 实时 +
    用户统计
    +
    +
    +

    1234

    +
    1234
    + 当前分类总记录数 +
    +
    +
    +
    +
    + +
    +
    +
    +
    +
    + 实时 +
    商品统计
    +
    +
    +

    1234

    +
    1234
    + 当前分类总记录数 +
    +
    +
    +
    +
    + +
    +
    +
    +
    +
    + 实时 +
    浏览统计
    +
    +
    +

    1234

    +
    1234
    + 当前分类总记录数 +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + 实时 +
    订单统计
    +
    +
    +

    1234

    +
    1234
    + 当前分类总记录数 +
    +
    +
    +
    +
    +
    +
    + +
    +
    +
    +
    +

    喜欢此后台模板的可以给我的Gitee加个Star支持一下

    +

    Gitee地址:star

    + +
    +
    +
    +
    + +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    昵称加入时间签名
    xian.zi.ming@qq.com fuck.vip2020-03-18人生就像是一场修行
    xian.zi.ming@qq.com fuck.vip2020-03-18于千万人之中遇见你所遇见的人,于千万年之中,时间的无涯的荒野里…
    xian.zi.ming@qq.com fuck.vip2020-03-18于千万人之中遇见你所遇见的人,于千万年之中,时间的无涯的荒野里…
    xian.zi.ming@qq.com fuck.vip2020-03-18于千万人之中遇见你所遇见的人,于千万年之中,时间的无涯的荒野里…
    +
    +
    +
      +
    • + +
      +

      2020年3月18日

      +

      + 一切准备工作似乎都已到位。发布之弦,一触即发。 +
      不枉近百个日日夜夜与之为伴。因小而大,因弱而强。 +
      无论它能走多远,抑或如何支撑?至少我曾倾注全心,无怨无悔 +

      +
      +
    • +
    • + +
      +
      过去
      +
      +
    • +
    +
    +
    +
    +
    + + \ No newline at end of file diff --git a/src/main/resources/templates/menus/menu_list.html b/src/main/resources/templates/menus/menu_list.html new file mode 100644 index 0000000..94ac814 --- /dev/null +++ b/src/main/resources/templates/menus/menu_list.html @@ -0,0 +1,368 @@ + + + + + Title + +
    + + + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/templates/roles/role_list.html b/src/main/resources/templates/roles/role_list.html new file mode 100644 index 0000000..45b6907 --- /dev/null +++ b/src/main/resources/templates/roles/role_list.html @@ -0,0 +1,291 @@ + + + + + Title + +
    + + + +
    +
    +
    +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    + +
    +
    +
    + + + + + \ No newline at end of file diff --git a/src/main/resources/templates/syscontent/list.html b/src/main/resources/templates/syscontent/list.html new file mode 100644 index 0000000..26d7a98 --- /dev/null +++ b/src/main/resources/templates/syscontent/list.html @@ -0,0 +1,281 @@ + + + + + Title + + +
    + + + + +
    +
    +
    +
    +
    + +
    + +
    + +
    +
    +
    +
    +
    +
    + + + + + + \ No newline at end of file diff --git a/src/main/resources/templates/sysdict/list.html b/src/main/resources/templates/sysdict/list.html new file mode 100644 index 0000000..39ab108 --- /dev/null +++ b/src/main/resources/templates/sysdict/list.html @@ -0,0 +1,464 @@ + + + + + Title + +
    + + + + + + + + + + +
    +
    +
    +
    +
    + +
    +
    +
    + + +
    + +
    + +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/templates/sysfiles/list.html b/src/main/resources/templates/sysfiles/list.html new file mode 100644 index 0000000..261113c --- /dev/null +++ b/src/main/resources/templates/sysfiles/list.html @@ -0,0 +1,152 @@ + + + + + Title + +
    + + +
    + +
    +
    +
    + +
    +
    + +
    +
    +
    + + + + + + \ No newline at end of file diff --git a/src/main/resources/templates/users/update_password.html b/src/main/resources/templates/users/update_password.html new file mode 100644 index 0000000..1086f04 --- /dev/null +++ b/src/main/resources/templates/users/update_password.html @@ -0,0 +1,68 @@ + + + + + Title + +
    + + +
    +
    +
    + +
    + +
    + +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    + +
    +
    + + + + + + \ No newline at end of file diff --git a/src/main/resources/templates/users/user_edit.html b/src/main/resources/templates/users/user_edit.html new file mode 100644 index 0000000..c17cdae --- /dev/null +++ b/src/main/resources/templates/users/user_edit.html @@ -0,0 +1,106 @@ + + + + + Title + +
    + + +
    +
    + +
    + +
    + +
    +
    +
    + +
    + +
    +
    + +
    + +
    + +
    +
    +
    + +
    + +
    +
    + +
    + +
    + +
    +
    + +
    + +
    + + +
    +
    + +
    +
    + +
    +
    +
    +
    + + + diff --git a/src/main/resources/templates/users/user_list.html b/src/main/resources/templates/users/user_list.html new file mode 100644 index 0000000..39a451c --- /dev/null +++ b/src/main/resources/templates/users/user_list.html @@ -0,0 +1,472 @@ + + + + + Title + + +
    + + + + +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + + +
    +
    +
    + +
    +
    +
    + +
    +
    +
    + + + + + + + + \ No newline at end of file