From 3a10e8ca53a036921723a1dfc593692c5f447a33 Mon Sep 17 00:00:00 2001 From: xiaotan <1031040634@qq.com> Date: Sat, 6 Apr 2024 00:17:56 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=9D=E5=A7=8B=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 28 + LICENSE | 73 + README.md | 3 + bin/clean.bat | 12 + bin/package.bat | 12 + bin/run.bat | 14 + bs-admin/pom.xml | 99 + .../src/main/java/com/bs/BsApplication.java | 23 + .../java/com/bs/BsServletInitializer.java | 18 + .../bs/cm/controller/CmAttachController.java | 208 ++ .../main/java/com/bs/cm/domain/CmAttach.java | 94 + .../java/com/bs/cm/mapper/CmAttachMapper.java | 14 + .../com/bs/cm/service/ICmAttachService.java | 15 + .../cm/service/impl/CmAttachServiceImpl.java | 19 + .../controller/common/CaptchaController.java | 94 + .../controller/common/CommonController.java | 294 +++ .../controller/monitor/CacheController.java | 120 ++ .../controller/monitor/ServerController.java | 27 + .../monitor/SysLogininforController.java | 82 + .../monitor/SysOperlogController.java | 69 + .../monitor/SysUserOnlineController.java | 81 + .../system/SysConfigController.java | 133 ++ .../controller/system/SysDeptController.java | 132 ++ .../system/SysDictDataController.java | 121 ++ .../system/SysDictTypeController.java | 131 ++ .../controller/system/SysIndexController.java | 29 + .../controller/system/SysLoginController.java | 98 + .../controller/system/SysMenuController.java | 139 ++ .../system/SysNoticeController.java | 170 ++ .../controller/system/SysPostController.java | 129 ++ .../system/SysProfileController.java | 147 ++ .../system/SysRegisterController.java | 38 + .../controller/system/SysRoleController.java | 262 +++ .../system/SysTenantController.java | 335 ++++ .../controller/system/SysUserController.java | 239 +++ .../system/TenantConfigController.java | 231 +++ .../web/controller/tool/TestController.java | 183 ++ .../com/bs/web/core/config/SwaggerConfig.java | 125 ++ .../META-INF/spring-devtools.properties | 1 + .../src/main/resources/application-druid.yml | 68 + .../src/main/resources/application-priv.yml | 68 + .../src/main/resources/application-prot.yml | 66 + bs-admin/src/main/resources/application.yml | 177 ++ bs-admin/src/main/resources/banner.txt | 24 + .../main/resources/i18n/messages.properties | 38 + bs-admin/src/main/resources/logback.xml | 93 + .../resources/mapper/cm/CmAttachMapper.xml | 7 + .../main/resources/mybatis/mybatis-config.xml | 20 + bs-common/pom.xml | 185 ++ .../com/bs/common/annotation/Anonymous.java | 19 + .../com/bs/common/annotation/DataScope.java | 33 + .../com/bs/common/annotation/DataSource.java | 28 + .../java/com/bs/common/annotation/Excel.java | 187 ++ .../java/com/bs/common/annotation/Excels.java | 18 + .../java/com/bs/common/annotation/Log.java | 51 + .../com/bs/common/annotation/RateLimiter.java | 40 + .../bs/common/annotation/RepeatSubmit.java | 31 + .../com/bs/common/annotation/TenantClear.java | 28 + .../bs/common/aspectj/TenantClearAspect.java | 45 + .../java/com/bs/common/config/BsConfig.java | 220 +++ .../common/config/TenantConfigProperties.java | 82 + .../bs/common/constant/CacheConstants.java | 44 + .../com/bs/common/constant/Constants.java | 142 ++ .../com/bs/common/constant/GenConstants.java | 117 ++ .../com/bs/common/constant/HttpStatus.java | 94 + .../bs/common/constant/ScheduleConstants.java | 50 + .../com/bs/common/constant/UserConstants.java | 78 + .../core/controller/BaseController.java | 216 ++ .../com/bs/common/core/domain/AjaxResult.java | 206 ++ .../com/bs/common/core/domain/BaseEntity.java | 93 + .../java/com/bs/common/core/domain/R.java | 115 ++ .../com/bs/common/core/domain/TreeEntity.java | 79 + .../com/bs/common/core/domain/TreeSelect.java | 77 + .../bs/common/core/domain/entity/SysDept.java | 200 ++ .../core/domain/entity/SysDictData.java | 67 + .../core/domain/entity/SysDictType.java | 98 + .../bs/common/core/domain/entity/SysMenu.java | 268 +++ .../bs/common/core/domain/entity/SysRole.java | 239 +++ .../common/core/domain/entity/SysTenant.java | 57 + .../bs/common/core/domain/entity/SysUser.java | 142 ++ .../core/domain/entity/TenantConfig.java | 156 ++ .../common/core/domain/model/LoginBody.java | 69 + .../common/core/domain/model/LoginUser.java | 312 +++ .../core/domain/model/RegisterBody.java | 11 + .../com/bs/common/core/page/PageDomain.java | 101 + .../bs/common/core/page/TableDataInfo.java | 85 + .../com/bs/common/core/page/TableSupport.java | 56 + .../com/bs/common/core/redis/RedisCache.java | 268 +++ .../com/bs/common/core/text/CharsetKit.java | 86 + .../java/com/bs/common/core/text/Convert.java | 1000 ++++++++++ .../com/bs/common/core/text/StrFormatter.java | 92 + .../com/bs/common/enums/BusinessStatus.java | 20 + .../com/bs/common/enums/BusinessType.java | 59 + .../com/bs/common/enums/DataSourceType.java | 19 + .../java/com/bs/common/enums/HttpMethod.java | 36 + .../java/com/bs/common/enums/LimitType.java | 20 + .../com/bs/common/enums/OperatorType.java | 24 + .../java/com/bs/common/enums/UserStatus.java | 30 + .../common/exception/DemoModeException.java | 15 + .../bs/common/exception/GlobalException.java | 58 + .../bs/common/exception/ServiceException.java | 74 + .../bs/common/exception/UtilException.java | 26 + .../common/exception/base/BaseException.java | 97 + .../common/exception/file/FileException.java | 19 + .../FileNameLengthLimitExceededException.java | 16 + .../file/FileSizeLimitExceededException.java | 16 + .../exception/file/FileUploadException.java | 61 + .../file/InvalidExtensionException.java | 80 + .../common/exception/job/TaskException.java | 34 + .../exception/user/BlackListException.java | 16 + .../exception/user/CaptchaException.java | 16 + .../user/CaptchaExpireException.java | 16 + .../common/exception/user/UserException.java | 18 + .../user/UserNotExistsException.java | 16 + .../user/UserPasswordNotMatchException.java | 16 + ...UserPasswordRetryLimitExceedException.java | 16 + .../java/com/bs/common/filter/PortFilter.java | 47 + .../filter/PropertyPreExcludeFilter.java | 24 + .../bs/common/filter/RepeatableFilter.java | 52 + .../filter/RepeatedlyRequestWrapper.java | 76 + .../java/com/bs/common/filter/XssFilter.java | 71 + .../filter/XssHttpServletRequestWrapper.java | 111 ++ .../handler/DefaultDBFieldHandler.java | 76 + .../bs/common/mybatis/mapper/BaseMapperX.java | 94 + .../com/bs/common/mybatis/pojo/PageParam.java | 30 + .../bs/common/mybatis/pojo/PageResult.java | 42 + .../bs/common/mybatis/pojo/SortingField.java | 56 + .../com/bs/common/mybatis/util/JdbcUtils.java | 42 + .../bs/common/mybatis/util/MyBatisUtils.java | 83 + .../main/java/com/bs/common/utils/Arith.java | 114 ++ .../java/com/bs/common/utils/DateUtils.java | 191 ++ .../java/com/bs/common/utils/DictUtils.java | 187 ++ .../com/bs/common/utils/ExceptionUtil.java | 39 + .../java/com/bs/common/utils/FileUtil.java | 939 +++++++++ .../java/com/bs/common/utils/LogUtils.java | 18 + .../com/bs/common/utils/MessageUtils.java | 26 + .../java/com/bs/common/utils/OsInfoUtil.java | 137 ++ .../java/com/bs/common/utils/PageUtils.java | 35 + .../com/bs/common/utils/SecurityUtils.java | 144 ++ .../com/bs/common/utils/ServletUtils.java | 218 ++ .../java/com/bs/common/utils/StringUtils.java | 614 ++++++ .../java/com/bs/common/utils/SystemEnum.java | 36 + .../java/com/bs/common/utils/Threads.java | 99 + .../com/bs/common/utils/bean/BeanUtils.java | 110 ++ .../bs/common/utils/bean/BeanValidators.java | 24 + .../utils/collection/CollectionUtils.java | 187 ++ .../bs/common/utils/file/FileTypeUtils.java | 77 + .../bs/common/utils/file/FileUploadUtils.java | 232 +++ .../com/bs/common/utils/file/FileUtils.java | 291 +++ .../com/bs/common/utils/file/ImageUtils.java | 98 + .../bs/common/utils/file/MimeTypeUtils.java | 59 + .../com/bs/common/utils/html/EscapeUtil.java | 167 ++ .../com/bs/common/utils/html/HTMLFilter.java | 570 ++++++ .../com/bs/common/utils/http/HttpHelper.java | 55 + .../com/bs/common/utils/http/HttpUtils.java | 274 +++ .../com/bs/common/utils/ip/AddressUtils.java | 56 + .../java/com/bs/common/utils/ip/IpUtils.java | 382 ++++ .../common/utils/poi/ExcelHandlerAdapter.java | 19 + .../com/bs/common/utils/poi/ExcelUtil.java | 1745 +++++++++++++++++ .../bs/common/utils/reflect/ReflectUtils.java | 406 ++++ .../java/com/bs/common/utils/sign/Base64.java | 291 +++ .../com/bs/common/utils/sign/Md5Utils.java | 67 + .../bs/common/utils/spring/SpringUtils.java | 158 ++ .../java/com/bs/common/utils/sql/SqlUtil.java | 70 + .../com/bs/common/utils/uuid/IdUtils.java | 49 + .../java/com/bs/common/utils/uuid/Seq.java | 86 + .../java/com/bs/common/utils/uuid/UUID.java | 484 +++++ .../src/main/java/com/bs/common/xss/Xss.java | 27 + .../java/com/bs/common/xss/XssValidator.java | 34 + bs-framework/pom.xml | 67 + .../bs/framework/aspectj/DataScopeAspect.java | 175 ++ .../framework/aspectj/DataSourceAspect.java | 72 + .../com/bs/framework/aspectj/LogAspect.java | 249 +++ .../framework/aspectj/RateLimiterAspect.java | 89 + .../framework/config/ApplicationConfig.java | 30 + .../bs/framework/config/CaptchaConfig.java | 88 + .../com/bs/framework/config/DruidConfig.java | 126 ++ .../config/FastJson2JsonRedisSerializer.java | 48 + .../com/bs/framework/config/FilterConfig.java | 77 + .../framework/config/KaptchaTextCreator.java | 68 + .../config/MyTenantLineHandlerImpl.java | 81 + .../framework/config/MybatisPlusConfig.java | 75 + .../com/bs/framework/config/RedisConfig.java | 69 + .../bs/framework/config/ResourcesConfig.java | 73 + .../bs/framework/config/SecurityConfig.java | 148 ++ .../com/bs/framework/config/ServerConfig.java | 32 + .../bs/framework/config/ThreadPoolConfig.java | 63 + .../config/properties/DruidProperties.java | 89 + .../properties/PermitAllUrlProperties.java | 73 + .../datasource/DynamicDataSource.java | 26 + .../DynamicDataSourceContextHolder.java | 45 + .../interceptor/RepeatSubmitInterceptor.java | 55 + .../impl/SameUrlDataInterceptor.java | 110 ++ .../bs/framework/manager/AsyncManager.java | 55 + .../bs/framework/manager/ShutdownManager.java | 39 + .../manager/factory/AsyncFactory.java | 102 + .../context/AuthenticationContextHolder.java | 28 + .../context/PermissionContextHolder.java | 27 + .../filter/JwtAuthenticationTokenFilter.java | 44 + .../handle/AuthenticationEntryPointImpl.java | 34 + .../handle/LogoutSuccessHandlerImpl.java | 52 + .../com/bs/framework/web/domain/Server.java | 240 +++ .../bs/framework/web/domain/server/Cpu.java | 101 + .../bs/framework/web/domain/server/Jvm.java | 130 ++ .../bs/framework/web/domain/server/Mem.java | 61 + .../bs/framework/web/domain/server/Sys.java | 84 + .../framework/web/domain/server/SysFile.java | 114 ++ .../web/exception/GlobalExceptionHandler.java | 138 ++ .../web/service/PermissionService.java | 168 ++ .../web/service/SysLoginService.java | 181 ++ .../web/service/SysPasswordService.java | 94 + .../web/service/SysPermissionService.java | 71 + .../web/service/SysRegisterService.java | 115 ++ .../framework/web/service/TokenService.java | 227 +++ .../web/service/UserDetailsServiceImpl.java | 65 + bs-generator/pom.xml | 44 + .../com/bs/generator/config/GenConfig.java | 73 + .../generator/controller/GenController.java | 214 ++ .../com/bs/generator/domain/GenTable.java | 147 ++ .../bs/generator/domain/GenTableColumn.java | 373 ++++ .../mapper/GenTableColumnMapper.java | 60 + .../bs/generator/mapper/GenTableMapper.java | 83 + .../service/GenTableColumnServiceImpl.java | 68 + .../service/GenTableServiceImpl.java | 557 ++++++ .../service/IGenTableColumnService.java | 44 + .../generator/service/IGenTableService.java | 121 ++ .../com/bs/generator/util/GenTableUtils.java | 56 + .../java/com/bs/generator/util/GenUtils.java | 258 +++ .../generator/util/VelocityInitializer.java | 34 + .../com/bs/generator/util/VelocityUtils.java | 405 ++++ bs-generator/src/main/resources/generator.yml | 10 + .../mapper/generator/GenTableColumnMapper.xml | 127 ++ .../mapper/generator/GenTableMapper.xml | 202 ++ .../shiptemplates/java/controller.java.vm | 146 ++ .../shiptemplates/java/domain.java.vm | 71 + .../shiptemplates/java/mapper.java.vm | 17 + .../shiptemplates/java/service.java.vm | 14 + .../shiptemplates/java/serviceImpl.java.vm | 27 + .../shiptemplates/java/sub-domain.java.vm | 73 + .../main/resources/shiptemplates/js/api.js.vm | 62 + .../main/resources/shiptemplates/sql/sql.vm | 22 + .../shiptemplates/vue/index-tree.vue.vm | 568 ++++++ .../resources/shiptemplates/vue/index.vue.vm | 665 +++++++ .../shiptemplates/vue/v3/index-tree.vue.vm | 536 +++++ .../shiptemplates/vue/v3/index.vue.vm | 714 +++++++ .../resources/shiptemplates/vue/v3/readme.txt | 1 + .../resources/shiptemplates/xml/mapper.xml.vm | 7 + .../main/resources/vm/java/controller.java.vm | 115 ++ .../src/main/resources/vm/java/domain.java.vm | 101 + .../src/main/resources/vm/java/mapper.java.vm | 91 + .../main/resources/vm/java/service.java.vm | 61 + .../resources/vm/java/serviceImpl.java.vm | 169 ++ .../main/resources/vm/java/sub-domain.java.vm | 73 + .../src/main/resources/vm/js/api.js.vm | 44 + bs-generator/src/main/resources/vm/sql/sql.vm | 22 + .../main/resources/vm/vue/index-tree.vue.vm | 505 +++++ .../src/main/resources/vm/vue/index.vue.vm | 602 ++++++ .../resources/vm/vue/v3/index-tree.vue.vm | 474 +++++ .../src/main/resources/vm/vue/v3/index.vue.vm | 590 ++++++ .../src/main/resources/vm/vue/v3/readme.txt | 1 + .../src/main/resources/vm/xml/mapper.xml.vm | 135 ++ bs-quartz/pom.xml | 40 + .../com/bs/quartz/config/ScheduleConfig.java | 57 + .../quartz/controller/SysJobController.java | 185 ++ .../controller/SysJobLogController.java | 92 + .../java/com/bs/quartz/domain/SysJob.java | 173 ++ .../java/com/bs/quartz/domain/SysJobLog.java | 155 ++ .../com/bs/quartz/mapper/SysJobLogMapper.java | 64 + .../com/bs/quartz/mapper/SysJobMapper.java | 67 + .../bs/quartz/service/ISysJobLogService.java | 56 + .../com/bs/quartz/service/ISysJobService.java | 102 + .../service/impl/SysJobLogServiceImpl.java | 87 + .../service/impl/SysJobServiceImpl.java | 261 +++ .../main/java/com/bs/quartz/task/RyTask.java | 28 + .../com/bs/quartz/util/AbstractQuartzJob.java | 107 + .../java/com/bs/quartz/util/CronUtils.java | 63 + .../com/bs/quartz/util/JobInvokeUtil.java | 182 ++ .../QuartzDisallowConcurrentExecution.java | 21 + .../bs/quartz/util/QuartzJobExecution.java | 19 + .../com/bs/quartz/util/ScheduleUtils.java | 141 ++ .../mapper/quartz/SysJobLogMapper.xml | 93 + .../resources/mapper/quartz/SysJobMapper.xml | 111 ++ bs-system/pom.xml | 28 + .../java/com/bs/system/domain/SysCache.java | 81 + .../java/com/bs/system/domain/SysConfig.java | 51 + .../com/bs/system/domain/SysLogininfor.java | 144 ++ .../java/com/bs/system/domain/SysNotice.java | 77 + .../java/com/bs/system/domain/SysOperLog.java | 269 +++ .../java/com/bs/system/domain/SysPost.java | 126 ++ .../com/bs/system/domain/SysRoleDept.java | 46 + .../com/bs/system/domain/SysRoleMenu.java | 47 + .../com/bs/system/domain/SysUserOnline.java | 113 ++ .../com/bs/system/domain/SysUserPost.java | 46 + .../com/bs/system/domain/SysUserRole.java | 47 + .../java/com/bs/system/domain/vo/MetaVo.java | 106 + .../com/bs/system/domain/vo/RouterVo.java | 148 ++ .../com/bs/system/mapper/SysConfigMapper.java | 76 + .../com/bs/system/mapper/SysDeptMapper.java | 119 ++ .../bs/system/mapper/SysDictDataMapper.java | 95 + .../bs/system/mapper/SysDictTypeMapper.java | 83 + .../bs/system/mapper/SysLogininforMapper.java | 42 + .../com/bs/system/mapper/SysMenuMapper.java | 127 ++ .../com/bs/system/mapper/SysNoticeMapper.java | 14 + .../bs/system/mapper/SysOperLogMapper.java | 48 + .../com/bs/system/mapper/SysPostMapper.java | 101 + .../bs/system/mapper/SysRoleDeptMapper.java | 44 + .../com/bs/system/mapper/SysRoleMapper.java | 119 ++ .../bs/system/mapper/SysRoleMenuMapper.java | 46 + .../com/bs/system/mapper/SysTenantMapper.java | 13 + .../com/bs/system/mapper/SysUserMapper.java | 68 + .../bs/system/mapper/SysUserPostMapper.java | 44 + .../bs/system/mapper/SysUserRoleMapper.java | 64 + .../bs/system/mapper/TenantConfigMapper.java | 15 + .../bs/system/service/ISysConfigService.java | 89 + .../bs/system/service/ISysDeptService.java | 124 ++ .../system/service/ISysDictDataService.java | 60 + .../system/service/ISysDictTypeService.java | 98 + .../system/service/ISysLogininforService.java | 40 + .../bs/system/service/ISysMenuService.java | 144 ++ .../bs/system/service/ISysNoticeService.java | 14 + .../bs/system/service/ISysOperLogService.java | 48 + .../bs/system/service/ISysPostService.java | 99 + .../bs/system/service/ISysRoleService.java | 173 ++ .../system/service/ISysUserOnlineService.java | 48 + .../bs/system/service/ISysUserService.java | 208 ++ .../system/service/ITenantConfigService.java | 15 + .../bs/system/service/SysTenantService.java | 20 + .../service/impl/SysConfigServiceImpl.java | 233 +++ .../service/impl/SysDeptServiceImpl.java | 344 ++++ .../service/impl/SysDictDataServiceImpl.java | 111 ++ .../service/impl/SysDictTypeServiceImpl.java | 224 +++ .../impl/SysLogininforServiceImpl.java | 65 + .../service/impl/SysMenuServiceImpl.java | 502 +++++ .../service/impl/SysNoticeServiceImpl.java | 19 + .../service/impl/SysOperLogServiceImpl.java | 76 + .../service/impl/SysPostServiceImpl.java | 178 ++ .../service/impl/SysRoleServiceImpl.java | 433 ++++ .../service/impl/SysTenantServiceImpl.java | 28 + .../impl/SysUserOnlineServiceImpl.java | 96 + .../service/impl/SysUserServiceImpl.java | 603 ++++++ .../service/impl/TenantConfigServiceImpl.java | 19 + .../mapper/system/SysConfigMapper.xml | 117 ++ .../resources/mapper/system/SysDeptMapper.xml | 159 ++ .../mapper/system/SysDictDataMapper.xml | 124 ++ .../mapper/system/SysDictTypeMapper.xml | 105 + .../mapper/system/SysLogininforMapper.xml | 57 + .../resources/mapper/system/SysMenuMapper.xml | 202 ++ .../mapper/system/SysNoticeMapper.xml | 7 + .../mapper/system/SysOperLogMapper.xml | 84 + .../resources/mapper/system/SysPostMapper.xml | 122 ++ .../mapper/system/SysRoleDeptMapper.xml | 34 + .../resources/mapper/system/SysRoleMapper.xml | 152 ++ .../mapper/system/SysRoleMenuMapper.xml | 34 + .../resources/mapper/system/SysUserMapper.xml | 225 +++ .../mapper/system/SysUserPostMapper.xml | 34 + .../mapper/system/SysUserRoleMapper.xml | 44 + bs-ui/.editorconfig | 22 + bs-ui/.env.development | 14 + bs-ui/.env.production | 8 + bs-ui/.env.staging | 10 + bs-ui/.eslintignore | 10 + bs-ui/.eslintrc.js | 199 ++ bs-ui/.gitignore | 23 + bs-ui/babel.config.js | 13 + bs-ui/bin/build.bat | 12 + bs-ui/bin/package.bat | 12 + bs-ui/bin/run-web.bat | 12 + bs-ui/build/index.js | 35 + bs-ui/package.json | 92 + bs-ui/public/favicon.ico | Bin 0 -> 9657 bytes bs-ui/public/html/ie.html | 46 + bs-ui/public/index.html | 208 ++ bs-ui/public/robots.txt | 2 + bs-ui/src/App.vue | 31 + bs-ui/src/api/amortize/cost.js | 71 + bs-ui/src/api/bill/number.js | 69 + bs-ui/src/api/cargo/detail.js | 62 + bs-ui/src/api/cargo/source.js | 71 + bs-ui/src/api/cargo/target.js | 62 + bs-ui/src/api/common/file.js | 84 + bs-ui/src/api/cust/item.js | 62 + bs-ui/src/api/finance/cash.js | 62 + bs-ui/src/api/finance/writeoff.js | 98 + bs-ui/src/api/jxc/berth.js | 62 + bs-ui/src/api/jxc/billCar.js | 62 + bs-ui/src/api/jxc/bmcargo.js | 79 + bs-ui/src/api/jxc/bmvoyage.js | 85 + bs-ui/src/api/jxc/cargo.js | 70 + bs-ui/src/api/jxc/ckbill.js | 152 ++ bs-ui/src/api/jxc/ckcargo.js | 113 ++ bs-ui/src/api/jxc/ckchange.js | 62 + bs-ui/src/api/jxc/ckstock.js | 108 + bs-ui/src/api/jxc/cust.js | 62 + bs-ui/src/api/jxc/custItem.js | 62 + bs-ui/src/api/jxc/port.js | 62 + bs-ui/src/api/jxc/stock.js | 62 + bs-ui/src/api/jxc/vessel.js | 62 + bs-ui/src/api/jxc/warehouse.js | 71 + bs-ui/src/api/login.js | 59 + bs-ui/src/api/menu.js | 9 + bs-ui/src/api/monitor/cache.js | 57 + bs-ui/src/api/monitor/job.js | 71 + bs-ui/src/api/monitor/jobLog.js | 26 + bs-ui/src/api/monitor/logininfor.js | 34 + bs-ui/src/api/monitor/online.js | 18 + bs-ui/src/api/monitor/operlog.js | 26 + bs-ui/src/api/monitor/server.js | 9 + bs-ui/src/api/order/cargo.js | 62 + bs-ui/src/api/order/price.js | 62 + bs-ui/src/api/order/trans.js | 71 + bs-ui/src/api/order/vehicle.js | 62 + bs-ui/src/api/system/config.js | 60 + bs-ui/src/api/system/dept.js | 52 + bs-ui/src/api/system/dict/data.js | 52 + bs-ui/src/api/system/dict/type.js | 60 + bs-ui/src/api/system/menu.js | 60 + bs-ui/src/api/system/notice.js | 62 + bs-ui/src/api/system/post.js | 44 + bs-ui/src/api/system/role.js | 119 ++ bs-ui/src/api/system/tenant.js | 62 + bs-ui/src/api/system/tenant/config.js | 62 + bs-ui/src/api/system/user.js | 143 ++ bs-ui/src/api/tm/driver.js | 62 + bs-ui/src/api/tm/order.js | 89 + bs-ui/src/api/tm/vehicle.js | 62 + bs-ui/src/api/tool/gen.js | 76 + bs-ui/src/api/trans/cargo.js | 71 + bs-ui/src/assets/401_images/401.gif | Bin 0 -> 164227 bytes bs-ui/src/assets/404_images/404.png | Bin 0 -> 98071 bytes bs-ui/src/assets/404_images/404_cloud.png | Bin 0 -> 4766 bytes bs-ui/src/assets/icons/index.js | 9 + bs-ui/src/assets/icons/svg/404.svg | 1 + bs-ui/src/assets/icons/svg/bug.svg | 1 + bs-ui/src/assets/icons/svg/build.svg | 1 + bs-ui/src/assets/icons/svg/button.svg | 1 + bs-ui/src/assets/icons/svg/cascader.svg | 1 + bs-ui/src/assets/icons/svg/chart.svg | 1 + bs-ui/src/assets/icons/svg/checkbox.svg | 1 + bs-ui/src/assets/icons/svg/clipboard.svg | 1 + bs-ui/src/assets/icons/svg/code.svg | 1 + bs-ui/src/assets/icons/svg/color.svg | 1 + bs-ui/src/assets/icons/svg/component.svg | 1 + bs-ui/src/assets/icons/svg/dashboard.svg | 1 + bs-ui/src/assets/icons/svg/date-range.svg | 1 + bs-ui/src/assets/icons/svg/date.svg | 1 + bs-ui/src/assets/icons/svg/dict.svg | 1 + bs-ui/src/assets/icons/svg/documentation.svg | 1 + bs-ui/src/assets/icons/svg/download.svg | 1 + bs-ui/src/assets/icons/svg/drag.svg | 1 + bs-ui/src/assets/icons/svg/druid.svg | 1 + bs-ui/src/assets/icons/svg/edit.svg | 1 + bs-ui/src/assets/icons/svg/education.svg | 1 + bs-ui/src/assets/icons/svg/email.svg | 1 + bs-ui/src/assets/icons/svg/example.svg | 1 + bs-ui/src/assets/icons/svg/excel.svg | 1 + .../src/assets/icons/svg/exit-fullscreen.svg | 1 + bs-ui/src/assets/icons/svg/eye-open.svg | 1 + bs-ui/src/assets/icons/svg/eye.svg | 1 + bs-ui/src/assets/icons/svg/form.svg | 1 + bs-ui/src/assets/icons/svg/fullscreen.svg | 1 + bs-ui/src/assets/icons/svg/github.svg | 1 + bs-ui/src/assets/icons/svg/guide.svg | 1 + bs-ui/src/assets/icons/svg/icon.svg | 1 + bs-ui/src/assets/icons/svg/input.svg | 1 + bs-ui/src/assets/icons/svg/international.svg | 1 + bs-ui/src/assets/icons/svg/job.svg | 1 + bs-ui/src/assets/icons/svg/language.svg | 1 + bs-ui/src/assets/icons/svg/link.svg | 1 + bs-ui/src/assets/icons/svg/list.svg | 1 + bs-ui/src/assets/icons/svg/lock.svg | 1 + bs-ui/src/assets/icons/svg/log.svg | 1 + bs-ui/src/assets/icons/svg/logininfor.svg | 1 + bs-ui/src/assets/icons/svg/message.svg | 1 + bs-ui/src/assets/icons/svg/money.svg | 1 + bs-ui/src/assets/icons/svg/monitor.svg | 2 + bs-ui/src/assets/icons/svg/nested.svg | 1 + bs-ui/src/assets/icons/svg/number.svg | 1 + bs-ui/src/assets/icons/svg/online.svg | 1 + bs-ui/src/assets/icons/svg/password.svg | 1 + bs-ui/src/assets/icons/svg/pdf.svg | 1 + bs-ui/src/assets/icons/svg/people.svg | 1 + bs-ui/src/assets/icons/svg/peoples.svg | 1 + bs-ui/src/assets/icons/svg/phone.svg | 1 + bs-ui/src/assets/icons/svg/post.svg | 1 + bs-ui/src/assets/icons/svg/qq.svg | 1 + bs-ui/src/assets/icons/svg/question.svg | 1 + bs-ui/src/assets/icons/svg/radio.svg | 1 + bs-ui/src/assets/icons/svg/rate.svg | 1 + bs-ui/src/assets/icons/svg/redis-list.svg | 2 + bs-ui/src/assets/icons/svg/redis.svg | 1 + bs-ui/src/assets/icons/svg/row.svg | 1 + bs-ui/src/assets/icons/svg/search.svg | 1 + bs-ui/src/assets/icons/svg/select.svg | 1 + bs-ui/src/assets/icons/svg/server.svg | 1 + bs-ui/src/assets/icons/svg/shopping.svg | 1 + bs-ui/src/assets/icons/svg/size.svg | 1 + bs-ui/src/assets/icons/svg/skill.svg | 1 + bs-ui/src/assets/icons/svg/slider.svg | 1 + bs-ui/src/assets/icons/svg/star.svg | 1 + bs-ui/src/assets/icons/svg/swagger.svg | 1 + bs-ui/src/assets/icons/svg/switch.svg | 1 + bs-ui/src/assets/icons/svg/system.svg | 2 + bs-ui/src/assets/icons/svg/tab.svg | 1 + bs-ui/src/assets/icons/svg/table.svg | 1 + bs-ui/src/assets/icons/svg/textarea.svg | 1 + bs-ui/src/assets/icons/svg/theme.svg | 1 + bs-ui/src/assets/icons/svg/time-range.svg | 1 + bs-ui/src/assets/icons/svg/time.svg | 1 + bs-ui/src/assets/icons/svg/tool.svg | 1 + bs-ui/src/assets/icons/svg/tree-table.svg | 1 + bs-ui/src/assets/icons/svg/tree.svg | 1 + bs-ui/src/assets/icons/svg/upload.svg | 1 + bs-ui/src/assets/icons/svg/user.svg | 1 + bs-ui/src/assets/icons/svg/validCode.svg | 1 + bs-ui/src/assets/icons/svg/wechat.svg | 1 + bs-ui/src/assets/icons/svg/zip.svg | 1 + bs-ui/src/assets/icons/svgo.yml | 22 + bs-ui/src/assets/images/dark.svg | 39 + bs-ui/src/assets/images/light.svg | 39 + bs-ui/src/assets/images/login-backgroun2.jpg | Bin 0 -> 1933103 bytes bs-ui/src/assets/images/login-background.jpg | Bin 0 -> 62591 bytes bs-ui/src/assets/images/profile.jpg | Bin 0 -> 25183 bytes bs-ui/src/assets/logo/logo.png | Bin 0 -> 32925 bytes bs-ui/src/assets/styles/btn.scss | 99 + bs-ui/src/assets/styles/edit.scss | 48 + bs-ui/src/assets/styles/element-ui.scss | 104 + .../src/assets/styles/element-variables.scss | 31 + bs-ui/src/assets/styles/index.scss | 187 ++ bs-ui/src/assets/styles/mixin.scss | 66 + bs-ui/src/assets/styles/ruoyi.scss | 285 +++ bs-ui/src/assets/styles/sidebar.scss | 227 +++ bs-ui/src/assets/styles/transition.scss | 49 + bs-ui/src/assets/styles/variables.scss | 54 + .../src/components/BillNumberInput/index.vue | 70 + bs-ui/src/components/Breadcrumb/index.vue | 74 + .../Chain/SelectTable/ChainSelect.vue | 109 + .../Chain/SelectTable/MultiSelectTable.vue | 393 ++++ .../Chain/SelectTable/SelectTable.vue | 374 ++++ bs-ui/src/components/Crontab/day.vue | 161 ++ bs-ui/src/components/Crontab/hour.vue | 114 ++ bs-ui/src/components/Crontab/index.vue | 430 ++++ bs-ui/src/components/Crontab/min.vue | 116 ++ bs-ui/src/components/Crontab/month.vue | 114 ++ bs-ui/src/components/Crontab/result.vue | 559 ++++++ bs-ui/src/components/Crontab/second.vue | 117 ++ bs-ui/src/components/Crontab/week.vue | 202 ++ bs-ui/src/components/Crontab/year.vue | 131 ++ bs-ui/src/components/DictData/index.js | 49 + bs-ui/src/components/DictTag/index.vue | 78 + bs-ui/src/components/Editor/index.vue | 272 +++ .../src/components/FileGroupUpload/index.vue | 320 +++ bs-ui/src/components/FileUpload/index.vue | 215 ++ bs-ui/src/components/Hamburger/index.vue | 44 + bs-ui/src/components/HeaderSearch/index.vue | 189 ++ bs-ui/src/components/IconSelect/index.vue | 104 + .../src/components/IconSelect/requireIcons.js | 11 + bs-ui/src/components/ImagePreview/index.vue | 90 + bs-ui/src/components/ImageUpload/index.vue | 226 +++ bs-ui/src/components/MyFormItem/index.vue | 35 + bs-ui/src/components/MyPage/index.vue | 56 + bs-ui/src/components/MySelectButton/index.vue | 60 + bs-ui/src/components/Pagination/index.vue | 114 ++ bs-ui/src/components/PanThumb/index.vue | 142 ++ bs-ui/src/components/ParentView/index.vue | 3 + bs-ui/src/components/RightPanel/index.vue | 106 + bs-ui/src/components/RightToolbar/index.vue | 104 + bs-ui/src/components/Rq/index.vue | 16 + bs-ui/src/components/Screenfull/index.vue | 57 + bs-ui/src/components/SizeSelect/index.vue | 56 + bs-ui/src/components/SvgIcon/index.vue | 61 + bs-ui/src/components/ThemePicker/index.vue | 173 ++ bs-ui/src/components/TopNav/index.vue | 191 ++ bs-ui/src/components/WarehouseName/index.vue | 28 + bs-ui/src/components/iFrame/index.vue | 36 + bs-ui/src/directive/dialog/drag.js | 94 + bs-ui/src/directive/dialog/dragHeight.js | 34 + bs-ui/src/directive/dialog/dragWidth.js | 30 + bs-ui/src/directive/index.js | 25 + bs-ui/src/directive/module/clipboard.js | 54 + bs-ui/src/directive/module/enterboard.js | 22 + bs-ui/src/directive/permission/hasPermi.js | 28 + bs-ui/src/directive/permission/hasRole.js | 28 + bs-ui/src/layout/components/AppMain.vue | 75 + .../layout/components/IframeToggle/index.vue | 24 + .../src/layout/components/InnerLink/index.vue | 47 + bs-ui/src/layout/components/Navbar.vue | 188 ++ .../src/layout/components/Settings/index.vue | 260 +++ .../layout/components/Sidebar/FixiOSBug.js | 25 + bs-ui/src/layout/components/Sidebar/Item.vue | 33 + bs-ui/src/layout/components/Sidebar/Link.vue | 43 + bs-ui/src/layout/components/Sidebar/Logo.vue | 115 ++ .../layout/components/Sidebar/SidebarItem.vue | 100 + bs-ui/src/layout/components/Sidebar/index.vue | 57 + .../layout/components/TagsView/ScrollPane.vue | 94 + .../src/layout/components/TagsView/index.vue | 332 ++++ bs-ui/src/layout/components/index.js | 5 + bs-ui/src/layout/index.vue | 111 ++ bs-ui/src/layout/mixin/ResizeHandler.js | 45 + bs-ui/src/main.js | 103 + bs-ui/src/permission.js | 56 + bs-ui/src/plugins/auth.js | 60 + bs-ui/src/plugins/cache.js | 77 + bs-ui/src/plugins/download.js | 89 + bs-ui/src/plugins/index.js | 20 + bs-ui/src/plugins/modal.js | 89 + bs-ui/src/plugins/tab.js | 71 + bs-ui/src/router/index.js | 183 ++ bs-ui/src/settings.js | 44 + bs-ui/src/store/getters.js | 21 + bs-ui/src/store/index.js | 27 + bs-ui/src/store/modules/app.js | 66 + bs-ui/src/store/modules/dict.js | 50 + bs-ui/src/store/modules/permission.js | 133 ++ bs-ui/src/store/modules/settings.js | 42 + bs-ui/src/store/modules/tagsView.js | 228 +++ bs-ui/src/store/modules/user.js | 101 + bs-ui/src/store/modules/warehouse.js | 66 + bs-ui/src/utils/auth.js | 15 + bs-ui/src/utils/bs.js | 249 +++ bs-ui/src/utils/dict/Dict.js | 82 + bs-ui/src/utils/dict/DictConverter.js | 17 + bs-ui/src/utils/dict/DictData.js | 13 + bs-ui/src/utils/dict/DictMeta.js | 38 + bs-ui/src/utils/dict/DictOptions.js | 51 + bs-ui/src/utils/dict/index.js | 33 + bs-ui/src/utils/errorCode.js | 6 + bs-ui/src/utils/generator/config.js | 438 +++++ bs-ui/src/utils/generator/css.js | 18 + bs-ui/src/utils/generator/drawingDefault.js | 29 + bs-ui/src/utils/generator/html.js | 359 ++++ bs-ui/src/utils/generator/icon.json | 1 + bs-ui/src/utils/generator/js.js | 235 +++ bs-ui/src/utils/generator/render.js | 126 ++ bs-ui/src/utils/index.js | 444 +++++ bs-ui/src/utils/jsencrypt.js | 30 + bs-ui/src/utils/permission.js | 51 + bs-ui/src/utils/request.js | 146 ++ bs-ui/src/utils/scroll-to.js | 58 + bs-ui/src/utils/validate.js | 96 + bs-ui/src/views/bill/number/index.vue | 290 +++ .../src/views/components/CargoDesc/index.vue | 80 + .../components/OutBillCargoDesc/index.vue | 81 + .../src/views/components/StockDesc/index.vue | 55 + .../views/components/icons/element-icons.js | 3 + bs-ui/src/views/components/icons/index.vue | 87 + bs-ui/src/views/components/icons/svg-icons.js | 10 + bs-ui/src/views/dashboard/BarChart.vue | 102 + bs-ui/src/views/dashboard/LineChart.vue | 135 ++ bs-ui/src/views/dashboard/PanelGroup.vue | 181 ++ bs-ui/src/views/dashboard/PieChart.vue | 79 + bs-ui/src/views/dashboard/RaddarChart.vue | 116 ++ bs-ui/src/views/dashboard/mixins/resize.js | 56 + bs-ui/src/views/error/401.vue | 88 + bs-ui/src/views/error/404.vue | 233 +++ bs-ui/src/views/finance/amortize/index.vue | 300 +++ bs-ui/src/views/finance/cash/index.vue | 260 +++ .../finance/components/AmortizeEdit/index.vue | 200 ++ .../finance/components/CashEdit/index.vue | 185 ++ bs-ui/src/views/finance/writeoff/index.vue | 93 + .../finance/writeoff/modules/AmortizeList.vue | 230 +++ .../finance/writeoff/modules/CashList.vue | 233 +++ .../src/views/finance/writeoff_pay/index.vue | 22 + bs-ui/src/views/index.vue | 36 + bs-ui/src/views/index_v1.vue | 98 + bs-ui/src/views/indexs/bulkCargo/index.vue | 13 + bs-ui/src/views/indexs/warehouse/index.vue | 329 ++++ bs-ui/src/views/jxc/berth/index.vue | 452 +++++ .../components/BmcargoConfirm/index.vue | 1210 ++++++++++++ .../bmcargo/components/BmcargoEdit/index.vue | 686 +++++++ .../bmcargo/components/BmcargoList/index.vue | 203 ++ .../bmcargo/components/VoyageNumber/index.vue | 130 ++ bs-ui/src/views/jxc/bmcargo/index.vue | 502 +++++ bs-ui/src/views/jxc/bmport/index.vue | 789 ++++++++ bs-ui/src/views/jxc/bmvoyage/index.vue | 806 ++++++++ bs-ui/src/views/jxc/cargo/index.vue | 536 +++++ bs-ui/src/views/jxc/ckbill/index.vue | 657 +++++++ bs-ui/src/views/jxc/ckcargo/index.vue | 957 +++++++++ bs-ui/src/views/jxc/ckchange/index.vue | 525 +++++ bs-ui/src/views/jxc/ckconfirm/index.vue | 577 ++++++ bs-ui/src/views/jxc/ckconfirm/index_bak.vue | 577 ++++++ bs-ui/src/views/jxc/ckinquiry/index.vue | 699 +++++++ bs-ui/src/views/jxc/ckmixed/index.vue | 1103 +++++++++++ .../components/StockChoose/index.vue | 309 +++ .../ckoutbound/components/StockOut/index.vue | 702 +++++++ bs-ui/src/views/jxc/ckoutbound/index.vue | 602 ++++++ .../components/StockChoose/index.vue | 310 +++ .../components/StockOut/index.vue | 999 ++++++++++ bs-ui/src/views/jxc/ckoutboundCar/index.vue | 603 ++++++ bs-ui/src/views/jxc/ckstock/index.vue | 600 ++++++ .../cktransfer/components/Transfer/index.vue | 682 +++++++ bs-ui/src/views/jxc/cktransfer/index.vue | 469 +++++ bs-ui/src/views/jxc/cktransfer/index_new.vue | 1121 +++++++++++ .../ckwarehouse/components/BillEdit/index.vue | 723 +++++++ .../ckwarehouse/components/BillList/index.vue | 143 ++ bs-ui/src/views/jxc/ckwarehouse/index.vue | 547 ++++++ bs-ui/src/views/jxc/cust/index.vue | 415 ++++ bs-ui/src/views/jxc/custItem/index.vue | 325 +++ bs-ui/src/views/jxc/dyn/index.vue | 306 +++ bs-ui/src/views/jxc/instock/index.vue | 613 ++++++ bs-ui/src/views/jxc/outstock/index.vue | 627 ++++++ bs-ui/src/views/jxc/port/index.vue | 431 ++++ bs-ui/src/views/jxc/stock/index.vue | 392 ++++ bs-ui/src/views/jxc/total/index.vue | 483 +++++ bs-ui/src/views/jxc/transfer/index.vue | 688 +++++++ bs-ui/src/views/jxc/vessel/index.vue | 456 +++++ bs-ui/src/views/jxc/warehouse/index.vue | 396 ++++ bs-ui/src/views/login.vue | 250 +++ bs-ui/src/views/monitor/cache/index.vue | 144 ++ bs-ui/src/views/monitor/cache/list.vue | 241 +++ bs-ui/src/views/monitor/druid/index.vue | 15 + bs-ui/src/views/monitor/job/index.vue | 513 +++++ bs-ui/src/views/monitor/job/log.vue | 295 +++ bs-ui/src/views/monitor/logininfor/index.vue | 246 +++ bs-ui/src/views/monitor/online/index.vue | 122 ++ bs-ui/src/views/monitor/operlog/index.vue | 313 +++ bs-ui/src/views/monitor/server/index.vue | 207 ++ bs-ui/src/views/redirect.vue | 12 + bs-ui/src/views/register.vue | 209 ++ bs-ui/src/views/system/config/index.vue | 346 ++++ bs-ui/src/views/system/dept/index.vue | 340 ++++ bs-ui/src/views/system/dict/data.vue | 402 ++++ bs-ui/src/views/system/dict/index.vue | 347 ++++ bs-ui/src/views/system/menu/index.vue | 452 +++++ bs-ui/src/views/system/notice/index.vue | 355 ++++ bs-ui/src/views/system/post/index.vue | 309 +++ bs-ui/src/views/system/role/authUser.vue | 199 ++ bs-ui/src/views/system/role/index.vue | 605 ++++++ bs-ui/src/views/system/role/selectUser.vue | 138 ++ .../src/views/system/tenant/config/index.vue | 488 +++++ bs-ui/src/views/system/tenant/edit.vue | 140 ++ bs-ui/src/views/system/tenant/index.vue | 407 ++++ bs-ui/src/views/system/user/authRole.vue | 117 ++ bs-ui/src/views/system/user/index.vue | 670 +++++++ bs-ui/src/views/system/user/profile/index.vue | 91 + .../views/system/user/profile/resetPwd.vue | 68 + .../views/system/user/profile/userAvatar.vue | 188 ++ .../views/system/user/profile/userInfo.vue | 75 + .../tm/carriage_order/finished/index.vue | 208 ++ .../plan/components/TransCargoPlan.vue | 172 ++ .../plan/components/TransCargoPlanEdit.vue | 548 ++++++ .../plan/components/TransPlan.vue | 153 ++ .../plan/components/TransPlanAuto.vue | 148 ++ .../plan/components/TransPlanEdit.vue | 707 +++++++ .../views/tm/carriage_order/plan/index.vue | 109 + .../tm/carriage_order/unfinished/index.vue | 245 +++ .../views/tm/components/AutoTableHeight.js | 66 + .../components/CarriageCargoInput/index.vue | 97 + .../tm/components/CarriageCargoList/index.vue | 60 + .../tm/components/CarriageOrderEdit/index.vue | 519 +++++ .../tm/components/ConsignOrderEdit/index.vue | 472 +++++ .../views/tm/components/CustEdit/index.vue | 146 ++ .../views/tm/components/CustInput/index.vue | 74 + .../views/tm/components/CustList/index.vue | 64 + .../views/tm/components/DriverEdit/index.vue | 219 +++ .../views/tm/components/DriverInput/index.vue | 97 + .../views/tm/components/DriverList/index.vue | 64 + .../views/tm/components/OrderInput/index.vue | 101 + .../views/tm/components/OrderList/index.vue | 103 + .../views/tm/components/SimpleList/index.vue | 250 +++ .../views/tm/components/VehicleEdit/index.vue | 282 +++ .../tm/components/VehicleInput/index.vue | 107 + .../views/tm/components/VehicleList/index.vue | 60 + .../views/tm/consign_order/finished/index.vue | 209 ++ .../tm/consign_order/unfinished/index.vue | 238 +++ bs-ui/src/views/tm/cust/index.vue | 347 ++++ bs-ui/src/views/tm/cust/modules/search.vue | 51 + bs-ui/src/views/tm/driver/index.vue | 292 +++ bs-ui/src/views/tm/driver/modules/search.vue | 52 + bs-ui/src/views/tm/vehicle/index.vue | 335 ++++ bs-ui/src/views/tm/vehicle/modules/search.vue | 55 + bs-ui/src/views/tool/build/CodeTypeDialog.vue | 106 + bs-ui/src/views/tool/build/DraggableItem.vue | 100 + bs-ui/src/views/tool/build/IconsDialog.vue | 123 ++ bs-ui/src/views/tool/build/RightPanel.vue | 946 +++++++++ bs-ui/src/views/tool/build/TreeNodeDialog.vue | 149 ++ bs-ui/src/views/tool/build/index.vue | 768 ++++++++ bs-ui/src/views/tool/gen/basicInfoForm.vue | 60 + bs-ui/src/views/tool/gen/editTable.vue | 234 +++ bs-ui/src/views/tool/gen/genInfoForm.vue | 299 +++ bs-ui/src/views/tool/gen/importTable.vue | 120 ++ bs-ui/src/views/tool/gen/index.vue | 337 ++++ bs-ui/src/views/tool/swagger/index.vue | 15 + bs-ui/vue.config.js | 134 ++ pom.xml | 307 +++ ry.bat | 67 + sql/20240405235624.nb3 | Bin 0 -> 83456 bytes sql/my-base.sql | 1122 +++++++++++ 787 files changed, 107897 insertions(+) create mode 100644 .gitignore create mode 100644 LICENSE create mode 100644 README.md create mode 100644 bin/clean.bat create mode 100644 bin/package.bat create mode 100644 bin/run.bat create mode 100644 bs-admin/pom.xml create mode 100644 bs-admin/src/main/java/com/bs/BsApplication.java create mode 100644 bs-admin/src/main/java/com/bs/BsServletInitializer.java create mode 100644 bs-admin/src/main/java/com/bs/cm/controller/CmAttachController.java create mode 100644 bs-admin/src/main/java/com/bs/cm/domain/CmAttach.java create mode 100644 bs-admin/src/main/java/com/bs/cm/mapper/CmAttachMapper.java create mode 100644 bs-admin/src/main/java/com/bs/cm/service/ICmAttachService.java create mode 100644 bs-admin/src/main/java/com/bs/cm/service/impl/CmAttachServiceImpl.java create mode 100644 bs-admin/src/main/java/com/bs/web/controller/common/CaptchaController.java create mode 100644 bs-admin/src/main/java/com/bs/web/controller/common/CommonController.java create mode 100644 bs-admin/src/main/java/com/bs/web/controller/monitor/CacheController.java create mode 100644 bs-admin/src/main/java/com/bs/web/controller/monitor/ServerController.java create mode 100644 bs-admin/src/main/java/com/bs/web/controller/monitor/SysLogininforController.java create mode 100644 bs-admin/src/main/java/com/bs/web/controller/monitor/SysOperlogController.java create mode 100644 bs-admin/src/main/java/com/bs/web/controller/monitor/SysUserOnlineController.java create mode 100644 bs-admin/src/main/java/com/bs/web/controller/system/SysConfigController.java create mode 100644 bs-admin/src/main/java/com/bs/web/controller/system/SysDeptController.java create mode 100644 bs-admin/src/main/java/com/bs/web/controller/system/SysDictDataController.java create mode 100644 bs-admin/src/main/java/com/bs/web/controller/system/SysDictTypeController.java create mode 100644 bs-admin/src/main/java/com/bs/web/controller/system/SysIndexController.java create mode 100644 bs-admin/src/main/java/com/bs/web/controller/system/SysLoginController.java create mode 100644 bs-admin/src/main/java/com/bs/web/controller/system/SysMenuController.java create mode 100644 bs-admin/src/main/java/com/bs/web/controller/system/SysNoticeController.java create mode 100644 bs-admin/src/main/java/com/bs/web/controller/system/SysPostController.java create mode 100644 bs-admin/src/main/java/com/bs/web/controller/system/SysProfileController.java create mode 100644 bs-admin/src/main/java/com/bs/web/controller/system/SysRegisterController.java create mode 100644 bs-admin/src/main/java/com/bs/web/controller/system/SysRoleController.java create mode 100644 bs-admin/src/main/java/com/bs/web/controller/system/SysTenantController.java create mode 100644 bs-admin/src/main/java/com/bs/web/controller/system/SysUserController.java create mode 100644 bs-admin/src/main/java/com/bs/web/controller/system/TenantConfigController.java create mode 100644 bs-admin/src/main/java/com/bs/web/controller/tool/TestController.java create mode 100644 bs-admin/src/main/java/com/bs/web/core/config/SwaggerConfig.java create mode 100644 bs-admin/src/main/resources/META-INF/spring-devtools.properties create mode 100644 bs-admin/src/main/resources/application-druid.yml create mode 100644 bs-admin/src/main/resources/application-priv.yml create mode 100644 bs-admin/src/main/resources/application-prot.yml create mode 100644 bs-admin/src/main/resources/application.yml create mode 100644 bs-admin/src/main/resources/banner.txt create mode 100644 bs-admin/src/main/resources/i18n/messages.properties create mode 100644 bs-admin/src/main/resources/logback.xml create mode 100644 bs-admin/src/main/resources/mapper/cm/CmAttachMapper.xml create mode 100644 bs-admin/src/main/resources/mybatis/mybatis-config.xml create mode 100644 bs-common/pom.xml create mode 100644 bs-common/src/main/java/com/bs/common/annotation/Anonymous.java create mode 100644 bs-common/src/main/java/com/bs/common/annotation/DataScope.java create mode 100644 bs-common/src/main/java/com/bs/common/annotation/DataSource.java create mode 100644 bs-common/src/main/java/com/bs/common/annotation/Excel.java create mode 100644 bs-common/src/main/java/com/bs/common/annotation/Excels.java create mode 100644 bs-common/src/main/java/com/bs/common/annotation/Log.java create mode 100644 bs-common/src/main/java/com/bs/common/annotation/RateLimiter.java create mode 100644 bs-common/src/main/java/com/bs/common/annotation/RepeatSubmit.java create mode 100644 bs-common/src/main/java/com/bs/common/annotation/TenantClear.java create mode 100644 bs-common/src/main/java/com/bs/common/aspectj/TenantClearAspect.java create mode 100644 bs-common/src/main/java/com/bs/common/config/BsConfig.java create mode 100644 bs-common/src/main/java/com/bs/common/config/TenantConfigProperties.java create mode 100644 bs-common/src/main/java/com/bs/common/constant/CacheConstants.java create mode 100644 bs-common/src/main/java/com/bs/common/constant/Constants.java create mode 100644 bs-common/src/main/java/com/bs/common/constant/GenConstants.java create mode 100644 bs-common/src/main/java/com/bs/common/constant/HttpStatus.java create mode 100644 bs-common/src/main/java/com/bs/common/constant/ScheduleConstants.java create mode 100644 bs-common/src/main/java/com/bs/common/constant/UserConstants.java create mode 100644 bs-common/src/main/java/com/bs/common/core/controller/BaseController.java create mode 100644 bs-common/src/main/java/com/bs/common/core/domain/AjaxResult.java create mode 100644 bs-common/src/main/java/com/bs/common/core/domain/BaseEntity.java create mode 100644 bs-common/src/main/java/com/bs/common/core/domain/R.java create mode 100644 bs-common/src/main/java/com/bs/common/core/domain/TreeEntity.java create mode 100644 bs-common/src/main/java/com/bs/common/core/domain/TreeSelect.java create mode 100644 bs-common/src/main/java/com/bs/common/core/domain/entity/SysDept.java create mode 100644 bs-common/src/main/java/com/bs/common/core/domain/entity/SysDictData.java create mode 100644 bs-common/src/main/java/com/bs/common/core/domain/entity/SysDictType.java create mode 100644 bs-common/src/main/java/com/bs/common/core/domain/entity/SysMenu.java create mode 100644 bs-common/src/main/java/com/bs/common/core/domain/entity/SysRole.java create mode 100644 bs-common/src/main/java/com/bs/common/core/domain/entity/SysTenant.java create mode 100644 bs-common/src/main/java/com/bs/common/core/domain/entity/SysUser.java create mode 100644 bs-common/src/main/java/com/bs/common/core/domain/entity/TenantConfig.java create mode 100644 bs-common/src/main/java/com/bs/common/core/domain/model/LoginBody.java create mode 100644 bs-common/src/main/java/com/bs/common/core/domain/model/LoginUser.java create mode 100644 bs-common/src/main/java/com/bs/common/core/domain/model/RegisterBody.java create mode 100644 bs-common/src/main/java/com/bs/common/core/page/PageDomain.java create mode 100644 bs-common/src/main/java/com/bs/common/core/page/TableDataInfo.java create mode 100644 bs-common/src/main/java/com/bs/common/core/page/TableSupport.java create mode 100644 bs-common/src/main/java/com/bs/common/core/redis/RedisCache.java create mode 100644 bs-common/src/main/java/com/bs/common/core/text/CharsetKit.java create mode 100644 bs-common/src/main/java/com/bs/common/core/text/Convert.java create mode 100644 bs-common/src/main/java/com/bs/common/core/text/StrFormatter.java create mode 100644 bs-common/src/main/java/com/bs/common/enums/BusinessStatus.java create mode 100644 bs-common/src/main/java/com/bs/common/enums/BusinessType.java create mode 100644 bs-common/src/main/java/com/bs/common/enums/DataSourceType.java create mode 100644 bs-common/src/main/java/com/bs/common/enums/HttpMethod.java create mode 100644 bs-common/src/main/java/com/bs/common/enums/LimitType.java create mode 100644 bs-common/src/main/java/com/bs/common/enums/OperatorType.java create mode 100644 bs-common/src/main/java/com/bs/common/enums/UserStatus.java create mode 100644 bs-common/src/main/java/com/bs/common/exception/DemoModeException.java create mode 100644 bs-common/src/main/java/com/bs/common/exception/GlobalException.java create mode 100644 bs-common/src/main/java/com/bs/common/exception/ServiceException.java create mode 100644 bs-common/src/main/java/com/bs/common/exception/UtilException.java create mode 100644 bs-common/src/main/java/com/bs/common/exception/base/BaseException.java create mode 100644 bs-common/src/main/java/com/bs/common/exception/file/FileException.java create mode 100644 bs-common/src/main/java/com/bs/common/exception/file/FileNameLengthLimitExceededException.java create mode 100644 bs-common/src/main/java/com/bs/common/exception/file/FileSizeLimitExceededException.java create mode 100644 bs-common/src/main/java/com/bs/common/exception/file/FileUploadException.java create mode 100644 bs-common/src/main/java/com/bs/common/exception/file/InvalidExtensionException.java create mode 100644 bs-common/src/main/java/com/bs/common/exception/job/TaskException.java create mode 100644 bs-common/src/main/java/com/bs/common/exception/user/BlackListException.java create mode 100644 bs-common/src/main/java/com/bs/common/exception/user/CaptchaException.java create mode 100644 bs-common/src/main/java/com/bs/common/exception/user/CaptchaExpireException.java create mode 100644 bs-common/src/main/java/com/bs/common/exception/user/UserException.java create mode 100644 bs-common/src/main/java/com/bs/common/exception/user/UserNotExistsException.java create mode 100644 bs-common/src/main/java/com/bs/common/exception/user/UserPasswordNotMatchException.java create mode 100644 bs-common/src/main/java/com/bs/common/exception/user/UserPasswordRetryLimitExceedException.java create mode 100644 bs-common/src/main/java/com/bs/common/filter/PortFilter.java create mode 100644 bs-common/src/main/java/com/bs/common/filter/PropertyPreExcludeFilter.java create mode 100644 bs-common/src/main/java/com/bs/common/filter/RepeatableFilter.java create mode 100644 bs-common/src/main/java/com/bs/common/filter/RepeatedlyRequestWrapper.java create mode 100644 bs-common/src/main/java/com/bs/common/filter/XssFilter.java create mode 100644 bs-common/src/main/java/com/bs/common/filter/XssHttpServletRequestWrapper.java create mode 100644 bs-common/src/main/java/com/bs/common/mybatis/handler/DefaultDBFieldHandler.java create mode 100644 bs-common/src/main/java/com/bs/common/mybatis/mapper/BaseMapperX.java create mode 100644 bs-common/src/main/java/com/bs/common/mybatis/pojo/PageParam.java create mode 100644 bs-common/src/main/java/com/bs/common/mybatis/pojo/PageResult.java create mode 100644 bs-common/src/main/java/com/bs/common/mybatis/pojo/SortingField.java create mode 100644 bs-common/src/main/java/com/bs/common/mybatis/util/JdbcUtils.java create mode 100644 bs-common/src/main/java/com/bs/common/mybatis/util/MyBatisUtils.java create mode 100644 bs-common/src/main/java/com/bs/common/utils/Arith.java create mode 100644 bs-common/src/main/java/com/bs/common/utils/DateUtils.java create mode 100644 bs-common/src/main/java/com/bs/common/utils/DictUtils.java create mode 100644 bs-common/src/main/java/com/bs/common/utils/ExceptionUtil.java create mode 100644 bs-common/src/main/java/com/bs/common/utils/FileUtil.java create mode 100644 bs-common/src/main/java/com/bs/common/utils/LogUtils.java create mode 100644 bs-common/src/main/java/com/bs/common/utils/MessageUtils.java create mode 100644 bs-common/src/main/java/com/bs/common/utils/OsInfoUtil.java create mode 100644 bs-common/src/main/java/com/bs/common/utils/PageUtils.java create mode 100644 bs-common/src/main/java/com/bs/common/utils/SecurityUtils.java create mode 100644 bs-common/src/main/java/com/bs/common/utils/ServletUtils.java create mode 100644 bs-common/src/main/java/com/bs/common/utils/StringUtils.java create mode 100644 bs-common/src/main/java/com/bs/common/utils/SystemEnum.java create mode 100644 bs-common/src/main/java/com/bs/common/utils/Threads.java create mode 100644 bs-common/src/main/java/com/bs/common/utils/bean/BeanUtils.java create mode 100644 bs-common/src/main/java/com/bs/common/utils/bean/BeanValidators.java create mode 100644 bs-common/src/main/java/com/bs/common/utils/collection/CollectionUtils.java create mode 100644 bs-common/src/main/java/com/bs/common/utils/file/FileTypeUtils.java create mode 100644 bs-common/src/main/java/com/bs/common/utils/file/FileUploadUtils.java create mode 100644 bs-common/src/main/java/com/bs/common/utils/file/FileUtils.java create mode 100644 bs-common/src/main/java/com/bs/common/utils/file/ImageUtils.java create mode 100644 bs-common/src/main/java/com/bs/common/utils/file/MimeTypeUtils.java create mode 100644 bs-common/src/main/java/com/bs/common/utils/html/EscapeUtil.java create mode 100644 bs-common/src/main/java/com/bs/common/utils/html/HTMLFilter.java create mode 100644 bs-common/src/main/java/com/bs/common/utils/http/HttpHelper.java create mode 100644 bs-common/src/main/java/com/bs/common/utils/http/HttpUtils.java create mode 100644 bs-common/src/main/java/com/bs/common/utils/ip/AddressUtils.java create mode 100644 bs-common/src/main/java/com/bs/common/utils/ip/IpUtils.java create mode 100644 bs-common/src/main/java/com/bs/common/utils/poi/ExcelHandlerAdapter.java create mode 100644 bs-common/src/main/java/com/bs/common/utils/poi/ExcelUtil.java create mode 100644 bs-common/src/main/java/com/bs/common/utils/reflect/ReflectUtils.java create mode 100644 bs-common/src/main/java/com/bs/common/utils/sign/Base64.java create mode 100644 bs-common/src/main/java/com/bs/common/utils/sign/Md5Utils.java create mode 100644 bs-common/src/main/java/com/bs/common/utils/spring/SpringUtils.java create mode 100644 bs-common/src/main/java/com/bs/common/utils/sql/SqlUtil.java create mode 100644 bs-common/src/main/java/com/bs/common/utils/uuid/IdUtils.java create mode 100644 bs-common/src/main/java/com/bs/common/utils/uuid/Seq.java create mode 100644 bs-common/src/main/java/com/bs/common/utils/uuid/UUID.java create mode 100644 bs-common/src/main/java/com/bs/common/xss/Xss.java create mode 100644 bs-common/src/main/java/com/bs/common/xss/XssValidator.java create mode 100644 bs-framework/pom.xml create mode 100644 bs-framework/src/main/java/com/bs/framework/aspectj/DataScopeAspect.java create mode 100644 bs-framework/src/main/java/com/bs/framework/aspectj/DataSourceAspect.java create mode 100644 bs-framework/src/main/java/com/bs/framework/aspectj/LogAspect.java create mode 100644 bs-framework/src/main/java/com/bs/framework/aspectj/RateLimiterAspect.java create mode 100644 bs-framework/src/main/java/com/bs/framework/config/ApplicationConfig.java create mode 100644 bs-framework/src/main/java/com/bs/framework/config/CaptchaConfig.java create mode 100644 bs-framework/src/main/java/com/bs/framework/config/DruidConfig.java create mode 100644 bs-framework/src/main/java/com/bs/framework/config/FastJson2JsonRedisSerializer.java create mode 100644 bs-framework/src/main/java/com/bs/framework/config/FilterConfig.java create mode 100644 bs-framework/src/main/java/com/bs/framework/config/KaptchaTextCreator.java create mode 100644 bs-framework/src/main/java/com/bs/framework/config/MyTenantLineHandlerImpl.java create mode 100644 bs-framework/src/main/java/com/bs/framework/config/MybatisPlusConfig.java create mode 100644 bs-framework/src/main/java/com/bs/framework/config/RedisConfig.java create mode 100644 bs-framework/src/main/java/com/bs/framework/config/ResourcesConfig.java create mode 100644 bs-framework/src/main/java/com/bs/framework/config/SecurityConfig.java create mode 100644 bs-framework/src/main/java/com/bs/framework/config/ServerConfig.java create mode 100644 bs-framework/src/main/java/com/bs/framework/config/ThreadPoolConfig.java create mode 100644 bs-framework/src/main/java/com/bs/framework/config/properties/DruidProperties.java create mode 100644 bs-framework/src/main/java/com/bs/framework/config/properties/PermitAllUrlProperties.java create mode 100644 bs-framework/src/main/java/com/bs/framework/datasource/DynamicDataSource.java create mode 100644 bs-framework/src/main/java/com/bs/framework/datasource/DynamicDataSourceContextHolder.java create mode 100644 bs-framework/src/main/java/com/bs/framework/interceptor/RepeatSubmitInterceptor.java create mode 100644 bs-framework/src/main/java/com/bs/framework/interceptor/impl/SameUrlDataInterceptor.java create mode 100644 bs-framework/src/main/java/com/bs/framework/manager/AsyncManager.java create mode 100644 bs-framework/src/main/java/com/bs/framework/manager/ShutdownManager.java create mode 100644 bs-framework/src/main/java/com/bs/framework/manager/factory/AsyncFactory.java create mode 100644 bs-framework/src/main/java/com/bs/framework/security/context/AuthenticationContextHolder.java create mode 100644 bs-framework/src/main/java/com/bs/framework/security/context/PermissionContextHolder.java create mode 100644 bs-framework/src/main/java/com/bs/framework/security/filter/JwtAuthenticationTokenFilter.java create mode 100644 bs-framework/src/main/java/com/bs/framework/security/handle/AuthenticationEntryPointImpl.java create mode 100644 bs-framework/src/main/java/com/bs/framework/security/handle/LogoutSuccessHandlerImpl.java create mode 100644 bs-framework/src/main/java/com/bs/framework/web/domain/Server.java create mode 100644 bs-framework/src/main/java/com/bs/framework/web/domain/server/Cpu.java create mode 100644 bs-framework/src/main/java/com/bs/framework/web/domain/server/Jvm.java create mode 100644 bs-framework/src/main/java/com/bs/framework/web/domain/server/Mem.java create mode 100644 bs-framework/src/main/java/com/bs/framework/web/domain/server/Sys.java create mode 100644 bs-framework/src/main/java/com/bs/framework/web/domain/server/SysFile.java create mode 100644 bs-framework/src/main/java/com/bs/framework/web/exception/GlobalExceptionHandler.java create mode 100644 bs-framework/src/main/java/com/bs/framework/web/service/PermissionService.java create mode 100644 bs-framework/src/main/java/com/bs/framework/web/service/SysLoginService.java create mode 100644 bs-framework/src/main/java/com/bs/framework/web/service/SysPasswordService.java create mode 100644 bs-framework/src/main/java/com/bs/framework/web/service/SysPermissionService.java create mode 100644 bs-framework/src/main/java/com/bs/framework/web/service/SysRegisterService.java create mode 100644 bs-framework/src/main/java/com/bs/framework/web/service/TokenService.java create mode 100644 bs-framework/src/main/java/com/bs/framework/web/service/UserDetailsServiceImpl.java create mode 100644 bs-generator/pom.xml create mode 100644 bs-generator/src/main/java/com/bs/generator/config/GenConfig.java create mode 100644 bs-generator/src/main/java/com/bs/generator/controller/GenController.java create mode 100644 bs-generator/src/main/java/com/bs/generator/domain/GenTable.java create mode 100644 bs-generator/src/main/java/com/bs/generator/domain/GenTableColumn.java create mode 100644 bs-generator/src/main/java/com/bs/generator/mapper/GenTableColumnMapper.java create mode 100644 bs-generator/src/main/java/com/bs/generator/mapper/GenTableMapper.java create mode 100644 bs-generator/src/main/java/com/bs/generator/service/GenTableColumnServiceImpl.java create mode 100644 bs-generator/src/main/java/com/bs/generator/service/GenTableServiceImpl.java create mode 100644 bs-generator/src/main/java/com/bs/generator/service/IGenTableColumnService.java create mode 100644 bs-generator/src/main/java/com/bs/generator/service/IGenTableService.java create mode 100644 bs-generator/src/main/java/com/bs/generator/util/GenTableUtils.java create mode 100644 bs-generator/src/main/java/com/bs/generator/util/GenUtils.java create mode 100644 bs-generator/src/main/java/com/bs/generator/util/VelocityInitializer.java create mode 100644 bs-generator/src/main/java/com/bs/generator/util/VelocityUtils.java create mode 100644 bs-generator/src/main/resources/generator.yml create mode 100644 bs-generator/src/main/resources/mapper/generator/GenTableColumnMapper.xml create mode 100644 bs-generator/src/main/resources/mapper/generator/GenTableMapper.xml create mode 100644 bs-generator/src/main/resources/shiptemplates/java/controller.java.vm create mode 100644 bs-generator/src/main/resources/shiptemplates/java/domain.java.vm create mode 100644 bs-generator/src/main/resources/shiptemplates/java/mapper.java.vm create mode 100644 bs-generator/src/main/resources/shiptemplates/java/service.java.vm create mode 100644 bs-generator/src/main/resources/shiptemplates/java/serviceImpl.java.vm create mode 100644 bs-generator/src/main/resources/shiptemplates/java/sub-domain.java.vm create mode 100644 bs-generator/src/main/resources/shiptemplates/js/api.js.vm create mode 100644 bs-generator/src/main/resources/shiptemplates/sql/sql.vm create mode 100644 bs-generator/src/main/resources/shiptemplates/vue/index-tree.vue.vm create mode 100644 bs-generator/src/main/resources/shiptemplates/vue/index.vue.vm create mode 100644 bs-generator/src/main/resources/shiptemplates/vue/v3/index-tree.vue.vm create mode 100644 bs-generator/src/main/resources/shiptemplates/vue/v3/index.vue.vm create mode 100644 bs-generator/src/main/resources/shiptemplates/vue/v3/readme.txt create mode 100644 bs-generator/src/main/resources/shiptemplates/xml/mapper.xml.vm create mode 100644 bs-generator/src/main/resources/vm/java/controller.java.vm create mode 100644 bs-generator/src/main/resources/vm/java/domain.java.vm create mode 100644 bs-generator/src/main/resources/vm/java/mapper.java.vm create mode 100644 bs-generator/src/main/resources/vm/java/service.java.vm create mode 100644 bs-generator/src/main/resources/vm/java/serviceImpl.java.vm create mode 100644 bs-generator/src/main/resources/vm/java/sub-domain.java.vm create mode 100644 bs-generator/src/main/resources/vm/js/api.js.vm create mode 100644 bs-generator/src/main/resources/vm/sql/sql.vm create mode 100644 bs-generator/src/main/resources/vm/vue/index-tree.vue.vm create mode 100644 bs-generator/src/main/resources/vm/vue/index.vue.vm create mode 100644 bs-generator/src/main/resources/vm/vue/v3/index-tree.vue.vm create mode 100644 bs-generator/src/main/resources/vm/vue/v3/index.vue.vm create mode 100644 bs-generator/src/main/resources/vm/vue/v3/readme.txt create mode 100644 bs-generator/src/main/resources/vm/xml/mapper.xml.vm create mode 100644 bs-quartz/pom.xml create mode 100644 bs-quartz/src/main/java/com/bs/quartz/config/ScheduleConfig.java create mode 100644 bs-quartz/src/main/java/com/bs/quartz/controller/SysJobController.java create mode 100644 bs-quartz/src/main/java/com/bs/quartz/controller/SysJobLogController.java create mode 100644 bs-quartz/src/main/java/com/bs/quartz/domain/SysJob.java create mode 100644 bs-quartz/src/main/java/com/bs/quartz/domain/SysJobLog.java create mode 100644 bs-quartz/src/main/java/com/bs/quartz/mapper/SysJobLogMapper.java create mode 100644 bs-quartz/src/main/java/com/bs/quartz/mapper/SysJobMapper.java create mode 100644 bs-quartz/src/main/java/com/bs/quartz/service/ISysJobLogService.java create mode 100644 bs-quartz/src/main/java/com/bs/quartz/service/ISysJobService.java create mode 100644 bs-quartz/src/main/java/com/bs/quartz/service/impl/SysJobLogServiceImpl.java create mode 100644 bs-quartz/src/main/java/com/bs/quartz/service/impl/SysJobServiceImpl.java create mode 100644 bs-quartz/src/main/java/com/bs/quartz/task/RyTask.java create mode 100644 bs-quartz/src/main/java/com/bs/quartz/util/AbstractQuartzJob.java create mode 100644 bs-quartz/src/main/java/com/bs/quartz/util/CronUtils.java create mode 100644 bs-quartz/src/main/java/com/bs/quartz/util/JobInvokeUtil.java create mode 100644 bs-quartz/src/main/java/com/bs/quartz/util/QuartzDisallowConcurrentExecution.java create mode 100644 bs-quartz/src/main/java/com/bs/quartz/util/QuartzJobExecution.java create mode 100644 bs-quartz/src/main/java/com/bs/quartz/util/ScheduleUtils.java create mode 100644 bs-quartz/src/main/resources/mapper/quartz/SysJobLogMapper.xml create mode 100644 bs-quartz/src/main/resources/mapper/quartz/SysJobMapper.xml create mode 100644 bs-system/pom.xml create mode 100644 bs-system/src/main/java/com/bs/system/domain/SysCache.java create mode 100644 bs-system/src/main/java/com/bs/system/domain/SysConfig.java create mode 100644 bs-system/src/main/java/com/bs/system/domain/SysLogininfor.java create mode 100644 bs-system/src/main/java/com/bs/system/domain/SysNotice.java create mode 100644 bs-system/src/main/java/com/bs/system/domain/SysOperLog.java create mode 100644 bs-system/src/main/java/com/bs/system/domain/SysPost.java create mode 100644 bs-system/src/main/java/com/bs/system/domain/SysRoleDept.java create mode 100644 bs-system/src/main/java/com/bs/system/domain/SysRoleMenu.java create mode 100644 bs-system/src/main/java/com/bs/system/domain/SysUserOnline.java create mode 100644 bs-system/src/main/java/com/bs/system/domain/SysUserPost.java create mode 100644 bs-system/src/main/java/com/bs/system/domain/SysUserRole.java create mode 100644 bs-system/src/main/java/com/bs/system/domain/vo/MetaVo.java create mode 100644 bs-system/src/main/java/com/bs/system/domain/vo/RouterVo.java create mode 100644 bs-system/src/main/java/com/bs/system/mapper/SysConfigMapper.java create mode 100644 bs-system/src/main/java/com/bs/system/mapper/SysDeptMapper.java create mode 100644 bs-system/src/main/java/com/bs/system/mapper/SysDictDataMapper.java create mode 100644 bs-system/src/main/java/com/bs/system/mapper/SysDictTypeMapper.java create mode 100644 bs-system/src/main/java/com/bs/system/mapper/SysLogininforMapper.java create mode 100644 bs-system/src/main/java/com/bs/system/mapper/SysMenuMapper.java create mode 100644 bs-system/src/main/java/com/bs/system/mapper/SysNoticeMapper.java create mode 100644 bs-system/src/main/java/com/bs/system/mapper/SysOperLogMapper.java create mode 100644 bs-system/src/main/java/com/bs/system/mapper/SysPostMapper.java create mode 100644 bs-system/src/main/java/com/bs/system/mapper/SysRoleDeptMapper.java create mode 100644 bs-system/src/main/java/com/bs/system/mapper/SysRoleMapper.java create mode 100644 bs-system/src/main/java/com/bs/system/mapper/SysRoleMenuMapper.java create mode 100644 bs-system/src/main/java/com/bs/system/mapper/SysTenantMapper.java create mode 100644 bs-system/src/main/java/com/bs/system/mapper/SysUserMapper.java create mode 100644 bs-system/src/main/java/com/bs/system/mapper/SysUserPostMapper.java create mode 100644 bs-system/src/main/java/com/bs/system/mapper/SysUserRoleMapper.java create mode 100644 bs-system/src/main/java/com/bs/system/mapper/TenantConfigMapper.java create mode 100644 bs-system/src/main/java/com/bs/system/service/ISysConfigService.java create mode 100644 bs-system/src/main/java/com/bs/system/service/ISysDeptService.java create mode 100644 bs-system/src/main/java/com/bs/system/service/ISysDictDataService.java create mode 100644 bs-system/src/main/java/com/bs/system/service/ISysDictTypeService.java create mode 100644 bs-system/src/main/java/com/bs/system/service/ISysLogininforService.java create mode 100644 bs-system/src/main/java/com/bs/system/service/ISysMenuService.java create mode 100644 bs-system/src/main/java/com/bs/system/service/ISysNoticeService.java create mode 100644 bs-system/src/main/java/com/bs/system/service/ISysOperLogService.java create mode 100644 bs-system/src/main/java/com/bs/system/service/ISysPostService.java create mode 100644 bs-system/src/main/java/com/bs/system/service/ISysRoleService.java create mode 100644 bs-system/src/main/java/com/bs/system/service/ISysUserOnlineService.java create mode 100644 bs-system/src/main/java/com/bs/system/service/ISysUserService.java create mode 100644 bs-system/src/main/java/com/bs/system/service/ITenantConfigService.java create mode 100644 bs-system/src/main/java/com/bs/system/service/SysTenantService.java create mode 100644 bs-system/src/main/java/com/bs/system/service/impl/SysConfigServiceImpl.java create mode 100644 bs-system/src/main/java/com/bs/system/service/impl/SysDeptServiceImpl.java create mode 100644 bs-system/src/main/java/com/bs/system/service/impl/SysDictDataServiceImpl.java create mode 100644 bs-system/src/main/java/com/bs/system/service/impl/SysDictTypeServiceImpl.java create mode 100644 bs-system/src/main/java/com/bs/system/service/impl/SysLogininforServiceImpl.java create mode 100644 bs-system/src/main/java/com/bs/system/service/impl/SysMenuServiceImpl.java create mode 100644 bs-system/src/main/java/com/bs/system/service/impl/SysNoticeServiceImpl.java create mode 100644 bs-system/src/main/java/com/bs/system/service/impl/SysOperLogServiceImpl.java create mode 100644 bs-system/src/main/java/com/bs/system/service/impl/SysPostServiceImpl.java create mode 100644 bs-system/src/main/java/com/bs/system/service/impl/SysRoleServiceImpl.java create mode 100644 bs-system/src/main/java/com/bs/system/service/impl/SysTenantServiceImpl.java create mode 100644 bs-system/src/main/java/com/bs/system/service/impl/SysUserOnlineServiceImpl.java create mode 100644 bs-system/src/main/java/com/bs/system/service/impl/SysUserServiceImpl.java create mode 100644 bs-system/src/main/java/com/bs/system/service/impl/TenantConfigServiceImpl.java create mode 100644 bs-system/src/main/resources/mapper/system/SysConfigMapper.xml create mode 100644 bs-system/src/main/resources/mapper/system/SysDeptMapper.xml create mode 100644 bs-system/src/main/resources/mapper/system/SysDictDataMapper.xml create mode 100644 bs-system/src/main/resources/mapper/system/SysDictTypeMapper.xml create mode 100644 bs-system/src/main/resources/mapper/system/SysLogininforMapper.xml create mode 100644 bs-system/src/main/resources/mapper/system/SysMenuMapper.xml create mode 100644 bs-system/src/main/resources/mapper/system/SysNoticeMapper.xml create mode 100644 bs-system/src/main/resources/mapper/system/SysOperLogMapper.xml create mode 100644 bs-system/src/main/resources/mapper/system/SysPostMapper.xml create mode 100644 bs-system/src/main/resources/mapper/system/SysRoleDeptMapper.xml create mode 100644 bs-system/src/main/resources/mapper/system/SysRoleMapper.xml create mode 100644 bs-system/src/main/resources/mapper/system/SysRoleMenuMapper.xml create mode 100644 bs-system/src/main/resources/mapper/system/SysUserMapper.xml create mode 100644 bs-system/src/main/resources/mapper/system/SysUserPostMapper.xml create mode 100644 bs-system/src/main/resources/mapper/system/SysUserRoleMapper.xml create mode 100644 bs-ui/.editorconfig create mode 100644 bs-ui/.env.development create mode 100644 bs-ui/.env.production create mode 100644 bs-ui/.env.staging create mode 100644 bs-ui/.eslintignore create mode 100644 bs-ui/.eslintrc.js create mode 100644 bs-ui/.gitignore create mode 100644 bs-ui/babel.config.js create mode 100644 bs-ui/bin/build.bat create mode 100644 bs-ui/bin/package.bat create mode 100644 bs-ui/bin/run-web.bat create mode 100644 bs-ui/build/index.js create mode 100644 bs-ui/package.json create mode 100644 bs-ui/public/favicon.ico create mode 100644 bs-ui/public/html/ie.html create mode 100644 bs-ui/public/index.html create mode 100644 bs-ui/public/robots.txt create mode 100644 bs-ui/src/App.vue create mode 100644 bs-ui/src/api/amortize/cost.js create mode 100644 bs-ui/src/api/bill/number.js create mode 100644 bs-ui/src/api/cargo/detail.js create mode 100644 bs-ui/src/api/cargo/source.js create mode 100644 bs-ui/src/api/cargo/target.js create mode 100644 bs-ui/src/api/common/file.js create mode 100644 bs-ui/src/api/cust/item.js create mode 100644 bs-ui/src/api/finance/cash.js create mode 100644 bs-ui/src/api/finance/writeoff.js create mode 100644 bs-ui/src/api/jxc/berth.js create mode 100644 bs-ui/src/api/jxc/billCar.js create mode 100644 bs-ui/src/api/jxc/bmcargo.js create mode 100644 bs-ui/src/api/jxc/bmvoyage.js create mode 100644 bs-ui/src/api/jxc/cargo.js create mode 100644 bs-ui/src/api/jxc/ckbill.js create mode 100644 bs-ui/src/api/jxc/ckcargo.js create mode 100644 bs-ui/src/api/jxc/ckchange.js create mode 100644 bs-ui/src/api/jxc/ckstock.js create mode 100644 bs-ui/src/api/jxc/cust.js create mode 100644 bs-ui/src/api/jxc/custItem.js create mode 100644 bs-ui/src/api/jxc/port.js create mode 100644 bs-ui/src/api/jxc/stock.js create mode 100644 bs-ui/src/api/jxc/vessel.js create mode 100644 bs-ui/src/api/jxc/warehouse.js create mode 100644 bs-ui/src/api/login.js create mode 100644 bs-ui/src/api/menu.js create mode 100644 bs-ui/src/api/monitor/cache.js create mode 100644 bs-ui/src/api/monitor/job.js create mode 100644 bs-ui/src/api/monitor/jobLog.js create mode 100644 bs-ui/src/api/monitor/logininfor.js create mode 100644 bs-ui/src/api/monitor/online.js create mode 100644 bs-ui/src/api/monitor/operlog.js create mode 100644 bs-ui/src/api/monitor/server.js create mode 100644 bs-ui/src/api/order/cargo.js create mode 100644 bs-ui/src/api/order/price.js create mode 100644 bs-ui/src/api/order/trans.js create mode 100644 bs-ui/src/api/order/vehicle.js create mode 100644 bs-ui/src/api/system/config.js create mode 100644 bs-ui/src/api/system/dept.js create mode 100644 bs-ui/src/api/system/dict/data.js create mode 100644 bs-ui/src/api/system/dict/type.js create mode 100644 bs-ui/src/api/system/menu.js create mode 100644 bs-ui/src/api/system/notice.js create mode 100644 bs-ui/src/api/system/post.js create mode 100644 bs-ui/src/api/system/role.js create mode 100644 bs-ui/src/api/system/tenant.js create mode 100644 bs-ui/src/api/system/tenant/config.js create mode 100644 bs-ui/src/api/system/user.js create mode 100644 bs-ui/src/api/tm/driver.js create mode 100644 bs-ui/src/api/tm/order.js create mode 100644 bs-ui/src/api/tm/vehicle.js create mode 100644 bs-ui/src/api/tool/gen.js create mode 100644 bs-ui/src/api/trans/cargo.js create mode 100644 bs-ui/src/assets/401_images/401.gif create mode 100644 bs-ui/src/assets/404_images/404.png create mode 100644 bs-ui/src/assets/404_images/404_cloud.png create mode 100644 bs-ui/src/assets/icons/index.js create mode 100644 bs-ui/src/assets/icons/svg/404.svg create mode 100644 bs-ui/src/assets/icons/svg/bug.svg create mode 100644 bs-ui/src/assets/icons/svg/build.svg create mode 100644 bs-ui/src/assets/icons/svg/button.svg create mode 100644 bs-ui/src/assets/icons/svg/cascader.svg create mode 100644 bs-ui/src/assets/icons/svg/chart.svg create mode 100644 bs-ui/src/assets/icons/svg/checkbox.svg create mode 100644 bs-ui/src/assets/icons/svg/clipboard.svg create mode 100644 bs-ui/src/assets/icons/svg/code.svg create mode 100644 bs-ui/src/assets/icons/svg/color.svg create mode 100644 bs-ui/src/assets/icons/svg/component.svg create mode 100644 bs-ui/src/assets/icons/svg/dashboard.svg create mode 100644 bs-ui/src/assets/icons/svg/date-range.svg create mode 100644 bs-ui/src/assets/icons/svg/date.svg create mode 100644 bs-ui/src/assets/icons/svg/dict.svg create mode 100644 bs-ui/src/assets/icons/svg/documentation.svg create mode 100644 bs-ui/src/assets/icons/svg/download.svg create mode 100644 bs-ui/src/assets/icons/svg/drag.svg create mode 100644 bs-ui/src/assets/icons/svg/druid.svg create mode 100644 bs-ui/src/assets/icons/svg/edit.svg create mode 100644 bs-ui/src/assets/icons/svg/education.svg create mode 100644 bs-ui/src/assets/icons/svg/email.svg create mode 100644 bs-ui/src/assets/icons/svg/example.svg create mode 100644 bs-ui/src/assets/icons/svg/excel.svg create mode 100644 bs-ui/src/assets/icons/svg/exit-fullscreen.svg create mode 100644 bs-ui/src/assets/icons/svg/eye-open.svg create mode 100644 bs-ui/src/assets/icons/svg/eye.svg create mode 100644 bs-ui/src/assets/icons/svg/form.svg create mode 100644 bs-ui/src/assets/icons/svg/fullscreen.svg create mode 100644 bs-ui/src/assets/icons/svg/github.svg create mode 100644 bs-ui/src/assets/icons/svg/guide.svg create mode 100644 bs-ui/src/assets/icons/svg/icon.svg create mode 100644 bs-ui/src/assets/icons/svg/input.svg create mode 100644 bs-ui/src/assets/icons/svg/international.svg create mode 100644 bs-ui/src/assets/icons/svg/job.svg create mode 100644 bs-ui/src/assets/icons/svg/language.svg create mode 100644 bs-ui/src/assets/icons/svg/link.svg create mode 100644 bs-ui/src/assets/icons/svg/list.svg create mode 100644 bs-ui/src/assets/icons/svg/lock.svg create mode 100644 bs-ui/src/assets/icons/svg/log.svg create mode 100644 bs-ui/src/assets/icons/svg/logininfor.svg create mode 100644 bs-ui/src/assets/icons/svg/message.svg create mode 100644 bs-ui/src/assets/icons/svg/money.svg create mode 100644 bs-ui/src/assets/icons/svg/monitor.svg create mode 100644 bs-ui/src/assets/icons/svg/nested.svg create mode 100644 bs-ui/src/assets/icons/svg/number.svg create mode 100644 bs-ui/src/assets/icons/svg/online.svg create mode 100644 bs-ui/src/assets/icons/svg/password.svg create mode 100644 bs-ui/src/assets/icons/svg/pdf.svg create mode 100644 bs-ui/src/assets/icons/svg/people.svg create mode 100644 bs-ui/src/assets/icons/svg/peoples.svg create mode 100644 bs-ui/src/assets/icons/svg/phone.svg create mode 100644 bs-ui/src/assets/icons/svg/post.svg create mode 100644 bs-ui/src/assets/icons/svg/qq.svg create mode 100644 bs-ui/src/assets/icons/svg/question.svg create mode 100644 bs-ui/src/assets/icons/svg/radio.svg create mode 100644 bs-ui/src/assets/icons/svg/rate.svg create mode 100644 bs-ui/src/assets/icons/svg/redis-list.svg create mode 100644 bs-ui/src/assets/icons/svg/redis.svg create mode 100644 bs-ui/src/assets/icons/svg/row.svg create mode 100644 bs-ui/src/assets/icons/svg/search.svg create mode 100644 bs-ui/src/assets/icons/svg/select.svg create mode 100644 bs-ui/src/assets/icons/svg/server.svg create mode 100644 bs-ui/src/assets/icons/svg/shopping.svg create mode 100644 bs-ui/src/assets/icons/svg/size.svg create mode 100644 bs-ui/src/assets/icons/svg/skill.svg create mode 100644 bs-ui/src/assets/icons/svg/slider.svg create mode 100644 bs-ui/src/assets/icons/svg/star.svg create mode 100644 bs-ui/src/assets/icons/svg/swagger.svg create mode 100644 bs-ui/src/assets/icons/svg/switch.svg create mode 100644 bs-ui/src/assets/icons/svg/system.svg create mode 100644 bs-ui/src/assets/icons/svg/tab.svg create mode 100644 bs-ui/src/assets/icons/svg/table.svg create mode 100644 bs-ui/src/assets/icons/svg/textarea.svg create mode 100644 bs-ui/src/assets/icons/svg/theme.svg create mode 100644 bs-ui/src/assets/icons/svg/time-range.svg create mode 100644 bs-ui/src/assets/icons/svg/time.svg create mode 100644 bs-ui/src/assets/icons/svg/tool.svg create mode 100644 bs-ui/src/assets/icons/svg/tree-table.svg create mode 100644 bs-ui/src/assets/icons/svg/tree.svg create mode 100644 bs-ui/src/assets/icons/svg/upload.svg create mode 100644 bs-ui/src/assets/icons/svg/user.svg create mode 100644 bs-ui/src/assets/icons/svg/validCode.svg create mode 100644 bs-ui/src/assets/icons/svg/wechat.svg create mode 100644 bs-ui/src/assets/icons/svg/zip.svg create mode 100644 bs-ui/src/assets/icons/svgo.yml create mode 100644 bs-ui/src/assets/images/dark.svg create mode 100644 bs-ui/src/assets/images/light.svg create mode 100644 bs-ui/src/assets/images/login-backgroun2.jpg create mode 100644 bs-ui/src/assets/images/login-background.jpg create mode 100644 bs-ui/src/assets/images/profile.jpg create mode 100644 bs-ui/src/assets/logo/logo.png create mode 100644 bs-ui/src/assets/styles/btn.scss create mode 100644 bs-ui/src/assets/styles/edit.scss create mode 100644 bs-ui/src/assets/styles/element-ui.scss create mode 100644 bs-ui/src/assets/styles/element-variables.scss create mode 100644 bs-ui/src/assets/styles/index.scss create mode 100644 bs-ui/src/assets/styles/mixin.scss create mode 100644 bs-ui/src/assets/styles/ruoyi.scss create mode 100644 bs-ui/src/assets/styles/sidebar.scss create mode 100644 bs-ui/src/assets/styles/transition.scss create mode 100644 bs-ui/src/assets/styles/variables.scss create mode 100644 bs-ui/src/components/BillNumberInput/index.vue create mode 100644 bs-ui/src/components/Breadcrumb/index.vue create mode 100644 bs-ui/src/components/Chain/SelectTable/ChainSelect.vue create mode 100644 bs-ui/src/components/Chain/SelectTable/MultiSelectTable.vue create mode 100644 bs-ui/src/components/Chain/SelectTable/SelectTable.vue create mode 100644 bs-ui/src/components/Crontab/day.vue create mode 100644 bs-ui/src/components/Crontab/hour.vue create mode 100644 bs-ui/src/components/Crontab/index.vue create mode 100644 bs-ui/src/components/Crontab/min.vue create mode 100644 bs-ui/src/components/Crontab/month.vue create mode 100644 bs-ui/src/components/Crontab/result.vue create mode 100644 bs-ui/src/components/Crontab/second.vue create mode 100644 bs-ui/src/components/Crontab/week.vue create mode 100644 bs-ui/src/components/Crontab/year.vue create mode 100644 bs-ui/src/components/DictData/index.js create mode 100644 bs-ui/src/components/DictTag/index.vue create mode 100644 bs-ui/src/components/Editor/index.vue create mode 100644 bs-ui/src/components/FileGroupUpload/index.vue create mode 100644 bs-ui/src/components/FileUpload/index.vue create mode 100644 bs-ui/src/components/Hamburger/index.vue create mode 100644 bs-ui/src/components/HeaderSearch/index.vue create mode 100644 bs-ui/src/components/IconSelect/index.vue create mode 100644 bs-ui/src/components/IconSelect/requireIcons.js create mode 100644 bs-ui/src/components/ImagePreview/index.vue create mode 100644 bs-ui/src/components/ImageUpload/index.vue create mode 100644 bs-ui/src/components/MyFormItem/index.vue create mode 100644 bs-ui/src/components/MyPage/index.vue create mode 100644 bs-ui/src/components/MySelectButton/index.vue create mode 100644 bs-ui/src/components/Pagination/index.vue create mode 100644 bs-ui/src/components/PanThumb/index.vue create mode 100644 bs-ui/src/components/ParentView/index.vue create mode 100644 bs-ui/src/components/RightPanel/index.vue create mode 100644 bs-ui/src/components/RightToolbar/index.vue create mode 100644 bs-ui/src/components/Rq/index.vue create mode 100644 bs-ui/src/components/Screenfull/index.vue create mode 100644 bs-ui/src/components/SizeSelect/index.vue create mode 100644 bs-ui/src/components/SvgIcon/index.vue create mode 100644 bs-ui/src/components/ThemePicker/index.vue create mode 100644 bs-ui/src/components/TopNav/index.vue create mode 100644 bs-ui/src/components/WarehouseName/index.vue create mode 100644 bs-ui/src/components/iFrame/index.vue create mode 100644 bs-ui/src/directive/dialog/drag.js create mode 100644 bs-ui/src/directive/dialog/dragHeight.js create mode 100644 bs-ui/src/directive/dialog/dragWidth.js create mode 100644 bs-ui/src/directive/index.js create mode 100644 bs-ui/src/directive/module/clipboard.js create mode 100644 bs-ui/src/directive/module/enterboard.js create mode 100644 bs-ui/src/directive/permission/hasPermi.js create mode 100644 bs-ui/src/directive/permission/hasRole.js create mode 100644 bs-ui/src/layout/components/AppMain.vue create mode 100644 bs-ui/src/layout/components/IframeToggle/index.vue create mode 100644 bs-ui/src/layout/components/InnerLink/index.vue create mode 100644 bs-ui/src/layout/components/Navbar.vue create mode 100644 bs-ui/src/layout/components/Settings/index.vue create mode 100644 bs-ui/src/layout/components/Sidebar/FixiOSBug.js create mode 100644 bs-ui/src/layout/components/Sidebar/Item.vue create mode 100644 bs-ui/src/layout/components/Sidebar/Link.vue create mode 100644 bs-ui/src/layout/components/Sidebar/Logo.vue create mode 100644 bs-ui/src/layout/components/Sidebar/SidebarItem.vue create mode 100644 bs-ui/src/layout/components/Sidebar/index.vue create mode 100644 bs-ui/src/layout/components/TagsView/ScrollPane.vue create mode 100644 bs-ui/src/layout/components/TagsView/index.vue create mode 100644 bs-ui/src/layout/components/index.js create mode 100644 bs-ui/src/layout/index.vue create mode 100644 bs-ui/src/layout/mixin/ResizeHandler.js create mode 100644 bs-ui/src/main.js create mode 100644 bs-ui/src/permission.js create mode 100644 bs-ui/src/plugins/auth.js create mode 100644 bs-ui/src/plugins/cache.js create mode 100644 bs-ui/src/plugins/download.js create mode 100644 bs-ui/src/plugins/index.js create mode 100644 bs-ui/src/plugins/modal.js create mode 100644 bs-ui/src/plugins/tab.js create mode 100644 bs-ui/src/router/index.js create mode 100644 bs-ui/src/settings.js create mode 100644 bs-ui/src/store/getters.js create mode 100644 bs-ui/src/store/index.js create mode 100644 bs-ui/src/store/modules/app.js create mode 100644 bs-ui/src/store/modules/dict.js create mode 100644 bs-ui/src/store/modules/permission.js create mode 100644 bs-ui/src/store/modules/settings.js create mode 100644 bs-ui/src/store/modules/tagsView.js create mode 100644 bs-ui/src/store/modules/user.js create mode 100644 bs-ui/src/store/modules/warehouse.js create mode 100644 bs-ui/src/utils/auth.js create mode 100644 bs-ui/src/utils/bs.js create mode 100644 bs-ui/src/utils/dict/Dict.js create mode 100644 bs-ui/src/utils/dict/DictConverter.js create mode 100644 bs-ui/src/utils/dict/DictData.js create mode 100644 bs-ui/src/utils/dict/DictMeta.js create mode 100644 bs-ui/src/utils/dict/DictOptions.js create mode 100644 bs-ui/src/utils/dict/index.js create mode 100644 bs-ui/src/utils/errorCode.js create mode 100644 bs-ui/src/utils/generator/config.js create mode 100644 bs-ui/src/utils/generator/css.js create mode 100644 bs-ui/src/utils/generator/drawingDefault.js create mode 100644 bs-ui/src/utils/generator/html.js create mode 100644 bs-ui/src/utils/generator/icon.json create mode 100644 bs-ui/src/utils/generator/js.js create mode 100644 bs-ui/src/utils/generator/render.js create mode 100644 bs-ui/src/utils/index.js create mode 100644 bs-ui/src/utils/jsencrypt.js create mode 100644 bs-ui/src/utils/permission.js create mode 100644 bs-ui/src/utils/request.js create mode 100644 bs-ui/src/utils/scroll-to.js create mode 100644 bs-ui/src/utils/validate.js create mode 100644 bs-ui/src/views/bill/number/index.vue create mode 100644 bs-ui/src/views/components/CargoDesc/index.vue create mode 100644 bs-ui/src/views/components/OutBillCargoDesc/index.vue create mode 100644 bs-ui/src/views/components/StockDesc/index.vue create mode 100644 bs-ui/src/views/components/icons/element-icons.js create mode 100644 bs-ui/src/views/components/icons/index.vue create mode 100644 bs-ui/src/views/components/icons/svg-icons.js create mode 100644 bs-ui/src/views/dashboard/BarChart.vue create mode 100644 bs-ui/src/views/dashboard/LineChart.vue create mode 100644 bs-ui/src/views/dashboard/PanelGroup.vue create mode 100644 bs-ui/src/views/dashboard/PieChart.vue create mode 100644 bs-ui/src/views/dashboard/RaddarChart.vue create mode 100644 bs-ui/src/views/dashboard/mixins/resize.js create mode 100644 bs-ui/src/views/error/401.vue create mode 100644 bs-ui/src/views/error/404.vue create mode 100644 bs-ui/src/views/finance/amortize/index.vue create mode 100644 bs-ui/src/views/finance/cash/index.vue create mode 100644 bs-ui/src/views/finance/components/AmortizeEdit/index.vue create mode 100644 bs-ui/src/views/finance/components/CashEdit/index.vue create mode 100644 bs-ui/src/views/finance/writeoff/index.vue create mode 100644 bs-ui/src/views/finance/writeoff/modules/AmortizeList.vue create mode 100644 bs-ui/src/views/finance/writeoff/modules/CashList.vue create mode 100644 bs-ui/src/views/finance/writeoff_pay/index.vue create mode 100644 bs-ui/src/views/index.vue create mode 100644 bs-ui/src/views/index_v1.vue create mode 100644 bs-ui/src/views/indexs/bulkCargo/index.vue create mode 100644 bs-ui/src/views/indexs/warehouse/index.vue create mode 100644 bs-ui/src/views/jxc/berth/index.vue create mode 100644 bs-ui/src/views/jxc/bmcargo/components/BmcargoConfirm/index.vue create mode 100644 bs-ui/src/views/jxc/bmcargo/components/BmcargoEdit/index.vue create mode 100644 bs-ui/src/views/jxc/bmcargo/components/BmcargoList/index.vue create mode 100644 bs-ui/src/views/jxc/bmcargo/components/VoyageNumber/index.vue create mode 100644 bs-ui/src/views/jxc/bmcargo/index.vue create mode 100644 bs-ui/src/views/jxc/bmport/index.vue create mode 100644 bs-ui/src/views/jxc/bmvoyage/index.vue create mode 100644 bs-ui/src/views/jxc/cargo/index.vue create mode 100644 bs-ui/src/views/jxc/ckbill/index.vue create mode 100644 bs-ui/src/views/jxc/ckcargo/index.vue create mode 100644 bs-ui/src/views/jxc/ckchange/index.vue create mode 100644 bs-ui/src/views/jxc/ckconfirm/index.vue create mode 100644 bs-ui/src/views/jxc/ckconfirm/index_bak.vue create mode 100644 bs-ui/src/views/jxc/ckinquiry/index.vue create mode 100644 bs-ui/src/views/jxc/ckmixed/index.vue create mode 100644 bs-ui/src/views/jxc/ckoutbound/components/StockChoose/index.vue create mode 100644 bs-ui/src/views/jxc/ckoutbound/components/StockOut/index.vue create mode 100644 bs-ui/src/views/jxc/ckoutbound/index.vue create mode 100644 bs-ui/src/views/jxc/ckoutboundCar/components/StockChoose/index.vue create mode 100644 bs-ui/src/views/jxc/ckoutboundCar/components/StockOut/index.vue create mode 100644 bs-ui/src/views/jxc/ckoutboundCar/index.vue create mode 100644 bs-ui/src/views/jxc/ckstock/index.vue create mode 100644 bs-ui/src/views/jxc/cktransfer/components/Transfer/index.vue create mode 100644 bs-ui/src/views/jxc/cktransfer/index.vue create mode 100644 bs-ui/src/views/jxc/cktransfer/index_new.vue create mode 100644 bs-ui/src/views/jxc/ckwarehouse/components/BillEdit/index.vue create mode 100644 bs-ui/src/views/jxc/ckwarehouse/components/BillList/index.vue create mode 100644 bs-ui/src/views/jxc/ckwarehouse/index.vue create mode 100644 bs-ui/src/views/jxc/cust/index.vue create mode 100644 bs-ui/src/views/jxc/custItem/index.vue create mode 100644 bs-ui/src/views/jxc/dyn/index.vue create mode 100644 bs-ui/src/views/jxc/instock/index.vue create mode 100644 bs-ui/src/views/jxc/outstock/index.vue create mode 100644 bs-ui/src/views/jxc/port/index.vue create mode 100644 bs-ui/src/views/jxc/stock/index.vue create mode 100644 bs-ui/src/views/jxc/total/index.vue create mode 100644 bs-ui/src/views/jxc/transfer/index.vue create mode 100644 bs-ui/src/views/jxc/vessel/index.vue create mode 100644 bs-ui/src/views/jxc/warehouse/index.vue create mode 100644 bs-ui/src/views/login.vue create mode 100644 bs-ui/src/views/monitor/cache/index.vue create mode 100644 bs-ui/src/views/monitor/cache/list.vue create mode 100644 bs-ui/src/views/monitor/druid/index.vue create mode 100644 bs-ui/src/views/monitor/job/index.vue create mode 100644 bs-ui/src/views/monitor/job/log.vue create mode 100644 bs-ui/src/views/monitor/logininfor/index.vue create mode 100644 bs-ui/src/views/monitor/online/index.vue create mode 100644 bs-ui/src/views/monitor/operlog/index.vue create mode 100644 bs-ui/src/views/monitor/server/index.vue create mode 100644 bs-ui/src/views/redirect.vue create mode 100644 bs-ui/src/views/register.vue create mode 100644 bs-ui/src/views/system/config/index.vue create mode 100644 bs-ui/src/views/system/dept/index.vue create mode 100644 bs-ui/src/views/system/dict/data.vue create mode 100644 bs-ui/src/views/system/dict/index.vue create mode 100644 bs-ui/src/views/system/menu/index.vue create mode 100644 bs-ui/src/views/system/notice/index.vue create mode 100644 bs-ui/src/views/system/post/index.vue create mode 100644 bs-ui/src/views/system/role/authUser.vue create mode 100644 bs-ui/src/views/system/role/index.vue create mode 100644 bs-ui/src/views/system/role/selectUser.vue create mode 100644 bs-ui/src/views/system/tenant/config/index.vue create mode 100644 bs-ui/src/views/system/tenant/edit.vue create mode 100644 bs-ui/src/views/system/tenant/index.vue create mode 100644 bs-ui/src/views/system/user/authRole.vue create mode 100644 bs-ui/src/views/system/user/index.vue create mode 100644 bs-ui/src/views/system/user/profile/index.vue create mode 100644 bs-ui/src/views/system/user/profile/resetPwd.vue create mode 100644 bs-ui/src/views/system/user/profile/userAvatar.vue create mode 100644 bs-ui/src/views/system/user/profile/userInfo.vue create mode 100644 bs-ui/src/views/tm/carriage_order/finished/index.vue create mode 100644 bs-ui/src/views/tm/carriage_order/plan/components/TransCargoPlan.vue create mode 100644 bs-ui/src/views/tm/carriage_order/plan/components/TransCargoPlanEdit.vue create mode 100644 bs-ui/src/views/tm/carriage_order/plan/components/TransPlan.vue create mode 100644 bs-ui/src/views/tm/carriage_order/plan/components/TransPlanAuto.vue create mode 100644 bs-ui/src/views/tm/carriage_order/plan/components/TransPlanEdit.vue create mode 100644 bs-ui/src/views/tm/carriage_order/plan/index.vue create mode 100644 bs-ui/src/views/tm/carriage_order/unfinished/index.vue create mode 100644 bs-ui/src/views/tm/components/AutoTableHeight.js create mode 100644 bs-ui/src/views/tm/components/CarriageCargoInput/index.vue create mode 100644 bs-ui/src/views/tm/components/CarriageCargoList/index.vue create mode 100644 bs-ui/src/views/tm/components/CarriageOrderEdit/index.vue create mode 100644 bs-ui/src/views/tm/components/ConsignOrderEdit/index.vue create mode 100644 bs-ui/src/views/tm/components/CustEdit/index.vue create mode 100644 bs-ui/src/views/tm/components/CustInput/index.vue create mode 100644 bs-ui/src/views/tm/components/CustList/index.vue create mode 100644 bs-ui/src/views/tm/components/DriverEdit/index.vue create mode 100644 bs-ui/src/views/tm/components/DriverInput/index.vue create mode 100644 bs-ui/src/views/tm/components/DriverList/index.vue create mode 100644 bs-ui/src/views/tm/components/OrderInput/index.vue create mode 100644 bs-ui/src/views/tm/components/OrderList/index.vue create mode 100644 bs-ui/src/views/tm/components/SimpleList/index.vue create mode 100644 bs-ui/src/views/tm/components/VehicleEdit/index.vue create mode 100644 bs-ui/src/views/tm/components/VehicleInput/index.vue create mode 100644 bs-ui/src/views/tm/components/VehicleList/index.vue create mode 100644 bs-ui/src/views/tm/consign_order/finished/index.vue create mode 100644 bs-ui/src/views/tm/consign_order/unfinished/index.vue create mode 100644 bs-ui/src/views/tm/cust/index.vue create mode 100644 bs-ui/src/views/tm/cust/modules/search.vue create mode 100644 bs-ui/src/views/tm/driver/index.vue create mode 100644 bs-ui/src/views/tm/driver/modules/search.vue create mode 100644 bs-ui/src/views/tm/vehicle/index.vue create mode 100644 bs-ui/src/views/tm/vehicle/modules/search.vue create mode 100644 bs-ui/src/views/tool/build/CodeTypeDialog.vue create mode 100644 bs-ui/src/views/tool/build/DraggableItem.vue create mode 100644 bs-ui/src/views/tool/build/IconsDialog.vue create mode 100644 bs-ui/src/views/tool/build/RightPanel.vue create mode 100644 bs-ui/src/views/tool/build/TreeNodeDialog.vue create mode 100644 bs-ui/src/views/tool/build/index.vue create mode 100644 bs-ui/src/views/tool/gen/basicInfoForm.vue create mode 100644 bs-ui/src/views/tool/gen/editTable.vue create mode 100644 bs-ui/src/views/tool/gen/genInfoForm.vue create mode 100644 bs-ui/src/views/tool/gen/importTable.vue create mode 100644 bs-ui/src/views/tool/gen/index.vue create mode 100644 bs-ui/src/views/tool/swagger/index.vue create mode 100644 bs-ui/vue.config.js create mode 100644 pom.xml create mode 100644 ry.bat create mode 100644 sql/20240405235624.nb3 create mode 100644 sql/my-base.sql diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b34d8b1 --- /dev/null +++ b/.gitignore @@ -0,0 +1,28 @@ +.DS_Store +node_modules/ +dist/ +npm-debug.log* +yarn-debug.log* +yarn-error.log* +**/*.log + +tests/**/coverage/ +tests/e2e/reports +selenium-debug.log + +# Editor directories and files +.idea +.vscode +*.suo +*.ntvs* +*.njsproj +*.sln +*.local +target/ +# Created by .ignore support plugin (hsz.mobi) +*.iml +*.iws +# out +**/out/ +package-lock.json +yarn.lock diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..137069b --- /dev/null +++ b/LICENSE @@ -0,0 +1,73 @@ +Apache License +Version 2.0, January 2004 +http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + +"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. + +"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. + +"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. + +"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. + +"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. + +"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. + +"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). + +"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. + +"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." + +"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: + + (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. + + You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + +To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/README.md b/README.md new file mode 100644 index 0000000..ae9ec78 --- /dev/null +++ b/README.md @@ -0,0 +1,3 @@ +# bs-jxc + +保税进销存 \ No newline at end of file diff --git a/bin/clean.bat b/bin/clean.bat new file mode 100644 index 0000000..24c0974 --- /dev/null +++ b/bin/clean.bat @@ -0,0 +1,12 @@ +@echo off +echo. +echo [Ϣ] target· +echo. + +%~d0 +cd %~dp0 + +cd .. +call mvn clean + +pause \ No newline at end of file diff --git a/bin/package.bat b/bin/package.bat new file mode 100644 index 0000000..c693ec0 --- /dev/null +++ b/bin/package.bat @@ -0,0 +1,12 @@ +@echo off +echo. +echo [Ϣ] Weḅwar/jarļ +echo. + +%~d0 +cd %~dp0 + +cd .. +call mvn clean package -Dmaven.test.skip=true + +pause \ No newline at end of file diff --git a/bin/run.bat b/bin/run.bat new file mode 100644 index 0000000..41efbd0 --- /dev/null +++ b/bin/run.bat @@ -0,0 +1,14 @@ +@echo off +echo. +echo [Ϣ] ʹJarWeb̡ +echo. + +cd %~dp0 +cd ../ruoyi-admin/target + +set JAVA_OPTS=-Xms256m -Xmx1024m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=512m + +java -jar %JAVA_OPTS% ruoyi-admin.jar + +cd bin +pause \ No newline at end of file diff --git a/bs-admin/pom.xml b/bs-admin/pom.xml new file mode 100644 index 0000000..6fe3be0 --- /dev/null +++ b/bs-admin/pom.xml @@ -0,0 +1,99 @@ + + + + my-base + com.bs + 3.8.6 + + 4.0.0 + jar + bs-admin + + + web服务入口 + + + + + cn.hutool + hutool-all + + + + org.springframework.boot + spring-boot-devtools + true + + + + + io.springfox + springfox-boot-starter + + + + + io.swagger + swagger-models + 1.6.2 + + + + + mysql + mysql-connector-java + + + + + com.bs + bs-framework + + + + + com.bs + bs-quartz + + + + + com.bs + bs-generator + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + 2.1.1.RELEASE + + true + + + + + repackage + + + + + + org.apache.maven.plugins + maven-war-plugin + 3.1.0 + + false + ${project.artifactId} + + + + ${project.artifactId} + + + diff --git a/bs-admin/src/main/java/com/bs/BsApplication.java b/bs-admin/src/main/java/com/bs/BsApplication.java new file mode 100644 index 0000000..a1302fe --- /dev/null +++ b/bs-admin/src/main/java/com/bs/BsApplication.java @@ -0,0 +1,23 @@ +package com.bs; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; +import org.springframework.boot.context.properties.EnableConfigurationProperties; + +/** + * 启动程序 + * + * @author bs + */ +@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class }) +@EnableConfigurationProperties +public class BsApplication +{ + public static void main(String[] args) + { + // System.setProperty("spring.devtools.restart.enabled", "false"); + SpringApplication.run(BsApplication.class, args); + System.out.println("(♥◠‿◠)ノ゙ 启动成功 ლ(´ڡ`ლ)゙ "); + } +} diff --git a/bs-admin/src/main/java/com/bs/BsServletInitializer.java b/bs-admin/src/main/java/com/bs/BsServletInitializer.java new file mode 100644 index 0000000..d9439e7 --- /dev/null +++ b/bs-admin/src/main/java/com/bs/BsServletInitializer.java @@ -0,0 +1,18 @@ +package com.bs; + +import org.springframework.boot.builder.SpringApplicationBuilder; +import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; + +/** + * web容器中进行部署 + * + * @author bs + */ +public class BsServletInitializer extends SpringBootServletInitializer +{ + @Override + protected SpringApplicationBuilder configure(SpringApplicationBuilder application) + { + return application.sources(BsApplication.class); + } +} diff --git a/bs-admin/src/main/java/com/bs/cm/controller/CmAttachController.java b/bs-admin/src/main/java/com/bs/cm/controller/CmAttachController.java new file mode 100644 index 0000000..17252cf --- /dev/null +++ b/bs-admin/src/main/java/com/bs/cm/controller/CmAttachController.java @@ -0,0 +1,208 @@ +package com.bs.cm.controller; + +import cn.hutool.core.lang.Validator; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.bs.cm.domain.CmAttach; +import com.bs.cm.service.ICmAttachService; +import com.bs.common.annotation.Log; +import com.bs.common.core.controller.BaseController; +import com.bs.common.core.domain.AjaxResult; +import com.bs.common.core.page.TableDataInfo; +import com.bs.common.enums.BusinessType; +import com.bs.common.utils.poi.ExcelUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import java.util.List; + +/** + * 附件信息Controller + * + * @author bs + * @date 2024-03-03 + */ +@Api(tags = "附件信息") +@RestController +@RequestMapping("/cm/attach") +public class CmAttachController extends BaseController { + @Resource + private ICmAttachService cmAttachService; + + /** + * 分页查询附件信息列表 + */ + @ApiOperation("分页查询附件信息列表") + @GetMapping("/pageList") + public TableDataInfo pageList(CmAttach cmAttach) { + startPage(); + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper(); + condition(queryWrapper, cmAttach); + List list = cmAttachService.list(queryWrapper); + return getDataTable(list); + } + + /** + * 查询附件信息列表 + */ + @ApiOperation("查询附件信息列表") + @GetMapping("/list") + public AjaxResult list(CmAttach cmAttach) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper(); + condition(queryWrapper, cmAttach); + List list = cmAttachService.list(queryWrapper); + return success(list); + } + + /** + * 导出附件信息列表 + */ + @ApiOperation("导出附件信息列表") + @Log(title = "附件信息导出", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, CmAttach cmAttach) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper(); + condition(queryWrapper, cmAttach); + List list = cmAttachService.list(queryWrapper); + ExcelUtil util = new ExcelUtil(CmAttach.class); + util.exportExcel(response, list, "附件信息数据"); + } + + /** + * 获取附件信息详细信息 + */ + @ApiOperation("获取附件信息详细信息") + @GetMapping(value = "/{id}") + public AjaxResult getInfo(@PathVariable("id") Long id) { + return success(cmAttachService.getById(id)); + } + + /** + * 新增附件信息 + */ + @ApiOperation("新增附件信息") + @Log(title = "附件信息新增", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody CmAttach cmAttach) { + return toAjax(cmAttachService.save(cmAttach)); + } + + /** + * 修改附件信息 + */ + @ApiOperation("修改附件信息") + @Log(title = "附件信息修改", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody CmAttach cmAttach) { + return toAjax(cmAttachService.updateById(cmAttach)); + } + + /** + * 删除附件信息 + */ + @ApiOperation("删除附件信息") + @Log(title = "附件信息删除", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public AjaxResult remove(@PathVariable List ids) { + return toAjax(cmAttachService.removeBatchByIds(ids)); + } + + + /** + * 条件设置 + */ + private void condition(LambdaQueryWrapper queryWrapper, CmAttach cmAttach) { + //用户id + if (Validator.isNotEmpty(cmAttach.getId())) { + queryWrapper.eq(CmAttach::getId, cmAttach.getId()); + } + + //文件组id + if (Validator.isNotEmpty(cmAttach.getFileId())) { + queryWrapper.eq(CmAttach::getFileId, cmAttach.getFileId()); + } + + //文件排序 + if (Validator.isNotEmpty(cmAttach.getFileSort())) { + queryWrapper.eq(CmAttach::getFileSort, cmAttach.getFileSort()); + } + + //文件名称(编译后) + if (Validator.isNotEmpty(cmAttach.getAttachName())) { + queryWrapper.eq(CmAttach::getAttachName, cmAttach.getAttachName()); + } + + //文件类型 + if (Validator.isNotEmpty(cmAttach.getAttachFileType())) { + queryWrapper.eq(CmAttach::getAttachFileType, cmAttach.getAttachFileType()); + } + + //文件编码类型 + if (Validator.isNotEmpty(cmAttach.getAttachContentType())) { + queryWrapper.eq(CmAttach::getAttachContentType, cmAttach.getAttachContentType()); + } + + //文件大小 + if (Validator.isNotEmpty(cmAttach.getAttachFileSize())) { + queryWrapper.eq(CmAttach::getAttachFileSize, cmAttach.getAttachFileSize()); + } + + //文件路径 + if (Validator.isNotEmpty(cmAttach.getAttachFileUrl())) { + queryWrapper.eq(CmAttach::getAttachFileUrl, cmAttach.getAttachFileUrl()); + } + + //文件名(原始) + if (Validator.isNotEmpty(cmAttach.getOldName())) { + queryWrapper.eq(CmAttach::getOldName, cmAttach.getOldName()); + } + + //文件版本号 + if (Validator.isNotEmpty(cmAttach.getVersionNo())) { + queryWrapper.eq(CmAttach::getVersionNo, cmAttach.getVersionNo()); + } + + //创建部门 + if (Validator.isNotEmpty(cmAttach.getCreateDept())) { + queryWrapper.eq(CmAttach::getCreateDept, cmAttach.getCreateDept()); + } + + //创建人 + if (Validator.isNotEmpty(cmAttach.getCreateBy())) { + queryWrapper.eq(CmAttach::getCreateBy, cmAttach.getCreateBy()); + } + + //创建时间 + if (Validator.isNotEmpty(cmAttach.getCreateTime())) { + queryWrapper.eq(CmAttach::getCreateTime, cmAttach.getCreateTime()); + } + + //修改人 + if (Validator.isNotEmpty(cmAttach.getUpdateBy())) { + queryWrapper.eq(CmAttach::getUpdateBy, cmAttach.getUpdateBy()); + } + + //修改时间 + if (Validator.isNotEmpty(cmAttach.getUpdateTime())) { + queryWrapper.eq(CmAttach::getUpdateTime, cmAttach.getUpdateTime()); + } + + //备注 + if (Validator.isNotEmpty(cmAttach.getRemark())) { + queryWrapper.eq(CmAttach::getRemark, cmAttach.getRemark()); + } + + //删除标志(0代表存在 2代表删除) + if (Validator.isNotEmpty(cmAttach.getDelFlag())) { + queryWrapper.eq(CmAttach::getDelFlag, cmAttach.getDelFlag()); + } + + //${column.columnComment} + if (Validator.isNotEmpty(cmAttach.getTenantId())) { + queryWrapper.eq(CmAttach::getTenantId, cmAttach.getTenantId()); + } + + } + +} diff --git a/bs-admin/src/main/java/com/bs/cm/domain/CmAttach.java b/bs-admin/src/main/java/com/bs/cm/domain/CmAttach.java new file mode 100644 index 0000000..f600da3 --- /dev/null +++ b/bs-admin/src/main/java/com/bs/cm/domain/CmAttach.java @@ -0,0 +1,94 @@ +package com.bs.cm.domain; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.bs.common.annotation.Excel; +import com.bs.common.core.domain.BaseEntity; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * 附件信息对象 cm_attach + * + * @author bs + * @date 2024-03-03 + */ +@EqualsAndHashCode(callSuper = true) +@Accessors(chain = true) +@TableName("cm_attach") +@Data +public class CmAttach extends BaseEntity{ + private static final long serialVersionUID = 1L; + + /** 用户id */ + @TableId(value = "id",type = IdType.AUTO) + @ApiModelProperty(value = "用户id") + private Long id; + + /** 文件组id */ + + @Excel(name = "文件组id") + @ApiModelProperty(value = "文件组id") + private String fileId; + + /** 文件排序 */ + + @Excel(name = "文件排序") + @ApiModelProperty(value = "文件排序") + private Integer fileSort; + + /** 文件名称(编译后) */ + + @Excel(name = "文件名称", readConverterExp = "编=译后") + @ApiModelProperty(value = "文件名称(编译后)") + private String attachName; + + /** 文件类型 */ + + @Excel(name = "文件类型") + @ApiModelProperty(value = "文件类型") + private String attachFileType; + + /** 文件编码类型 */ + + @Excel(name = "文件编码类型") + @ApiModelProperty(value = "文件编码类型") + private String attachContentType; + + /** 文件大小 */ + + @Excel(name = "文件大小") + @ApiModelProperty(value = "文件大小") + private Long attachFileSize; + + /** 文件路径 */ + + @Excel(name = "文件路径") + @ApiModelProperty(value = "文件路径") + private String attachFileUrl; + + /** 文件名(原始) */ + + @Excel(name = "文件名", readConverterExp = "原=始") + @ApiModelProperty(value = "文件名(原始)") + private String oldName; + + /** 文件版本号 */ + + @Excel(name = "文件版本号") + @ApiModelProperty(value = "文件版本号") + private String versionNo; + + /** 备注 */ + + @Excel(name = "备注") + @ApiModelProperty(value = "备注") + private String remark; + + + + +} diff --git a/bs-admin/src/main/java/com/bs/cm/mapper/CmAttachMapper.java b/bs-admin/src/main/java/com/bs/cm/mapper/CmAttachMapper.java new file mode 100644 index 0000000..d607342 --- /dev/null +++ b/bs-admin/src/main/java/com/bs/cm/mapper/CmAttachMapper.java @@ -0,0 +1,14 @@ +package com.bs.cm.mapper; + +import com.bs.common.mybatis.mapper.BaseMapperX; +import com.bs.cm.domain.CmAttach; + +/** + * 附件信息Mapper接口 + * + * @author bs + * @date 2024-03-03 + */ +public interface CmAttachMapper extends BaseMapperX { + +} diff --git a/bs-admin/src/main/java/com/bs/cm/service/ICmAttachService.java b/bs-admin/src/main/java/com/bs/cm/service/ICmAttachService.java new file mode 100644 index 0000000..c387dd4 --- /dev/null +++ b/bs-admin/src/main/java/com/bs/cm/service/ICmAttachService.java @@ -0,0 +1,15 @@ +package com.bs.cm.service; + +import com.bs.cm.domain.CmAttach; +import com.bs.common.core.domain.AjaxResult; +import com.github.yulichang.base.MPJBaseService; + +/** + * 附件信息Service接口 + * + * @author bs + * @date 2024-03-03 + */ +public interface ICmAttachService extends MPJBaseService{ + +} diff --git a/bs-admin/src/main/java/com/bs/cm/service/impl/CmAttachServiceImpl.java b/bs-admin/src/main/java/com/bs/cm/service/impl/CmAttachServiceImpl.java new file mode 100644 index 0000000..1c83609 --- /dev/null +++ b/bs-admin/src/main/java/com/bs/cm/service/impl/CmAttachServiceImpl.java @@ -0,0 +1,19 @@ +package com.bs.cm.service.impl; + +import com.bs.cm.mapper.CmAttachMapper; +import com.bs.cm.domain.CmAttach; +import com.bs.cm.service.ICmAttachService; +import com.github.yulichang.base.MPJBaseServiceImpl; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +/** + * 附件信息Service业务层处理 + * + * @author bs + * @date 2024-03-03 + */ +@Service +@Transactional(rollbackFor = Exception.class) +public class CmAttachServiceImpl extends MPJBaseServiceImpl implements ICmAttachService { + +} diff --git a/bs-admin/src/main/java/com/bs/web/controller/common/CaptchaController.java b/bs-admin/src/main/java/com/bs/web/controller/common/CaptchaController.java new file mode 100644 index 0000000..8b0d937 --- /dev/null +++ b/bs-admin/src/main/java/com/bs/web/controller/common/CaptchaController.java @@ -0,0 +1,94 @@ +package com.bs.web.controller.common; + +import java.awt.image.BufferedImage; +import java.io.IOException; +import java.util.concurrent.TimeUnit; +import javax.annotation.Resource; +import javax.imageio.ImageIO; +import javax.servlet.http.HttpServletResponse; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.util.FastByteArrayOutputStream; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; +import com.google.code.kaptcha.Producer; +import com.bs.common.config.BsConfig; +import com.bs.common.constant.CacheConstants; +import com.bs.common.constant.Constants; +import com.bs.common.core.domain.AjaxResult; +import com.bs.common.core.redis.RedisCache; +import com.bs.common.utils.sign.Base64; +import com.bs.common.utils.uuid.IdUtils; +import com.bs.system.service.ISysConfigService; + +/** + * 验证码操作处理 + * + * @author bs + */ +@RestController +public class CaptchaController +{ + @Resource(name = "captchaProducer") + private Producer captchaProducer; + + @Resource(name = "captchaProducerMath") + private Producer captchaProducerMath; + + @Autowired + private RedisCache redisCache; + + @Autowired + private ISysConfigService configService; + /** + * 生成验证码 + */ + @GetMapping("/captchaImage") + public AjaxResult getCode(HttpServletResponse response) throws IOException + { + AjaxResult ajax = AjaxResult.success(); + boolean captchaEnabled = configService.selectCaptchaEnabled(); + ajax.put("captchaEnabled", captchaEnabled); + if (!captchaEnabled) + { + return ajax; + } + + // 保存验证码信息 + String uuid = IdUtils.simpleUUID(); + String verifyKey = CacheConstants.CAPTCHA_CODE_KEY + uuid; + + String capStr = null, code = null; + BufferedImage image = null; + + // 生成验证码 + String captchaType = BsConfig.getCaptchaType(); + if ("math".equals(captchaType)) + { + String capText = captchaProducerMath.createText(); + capStr = capText.substring(0, capText.lastIndexOf("@")); + code = capText.substring(capText.lastIndexOf("@") + 1); + image = captchaProducerMath.createImage(capStr); + } + else if ("char".equals(captchaType)) + { + capStr = code = captchaProducer.createText(); + image = captchaProducer.createImage(capStr); + } + + redisCache.setCacheObject(verifyKey, code, Constants.CAPTCHA_EXPIRATION, TimeUnit.MINUTES); + // 转换流信息写出 + FastByteArrayOutputStream os = new FastByteArrayOutputStream(); + try + { + ImageIO.write(image, "jpg", os); + } + catch (IOException e) + { + return AjaxResult.error(e.getMessage()); + } + + ajax.put("uuid", uuid); + ajax.put("img", Base64.encode(os.toByteArray())); + return ajax; + } +} diff --git a/bs-admin/src/main/java/com/bs/web/controller/common/CommonController.java b/bs-admin/src/main/java/com/bs/web/controller/common/CommonController.java new file mode 100644 index 0000000..5257a2b --- /dev/null +++ b/bs-admin/src/main/java/com/bs/web/controller/common/CommonController.java @@ -0,0 +1,294 @@ +package com.bs.web.controller.common; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.bs.cm.domain.CmAttach; +import com.bs.cm.service.ICmAttachService; +import com.bs.common.config.BsConfig; +import com.bs.common.constant.Constants; +import com.bs.common.core.domain.AjaxResult; +import com.bs.common.exception.ServiceException; +import com.bs.common.utils.FileUtil; +import com.bs.common.utils.StringUtils; +import com.bs.common.utils.file.FileUploadUtils; +import com.bs.common.utils.file.FileUtils; +import com.bs.framework.config.ServerConfig; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * 通用请求处理 + * + * @author bs + */ +@RestController +@RequestMapping("/common") +@Api(tags = "文件上传") +public class CommonController { + private static final Logger log = LoggerFactory.getLogger(CommonController.class); + + @Autowired + private ServerConfig serverConfig; + + @Autowired + private ICmAttachService cmAttachService; + + private static final String FILE_DELIMETER = ","; + + /** + * 通用下载请求 + * + * @param fileName 文件名称 + * @param delete 是否删除 + */ + @GetMapping("/download") + @ApiOperation("文件下载") + public void fileDownload(String fileName, Boolean delete, HttpServletResponse response, HttpServletRequest request) { + try { + if (!FileUtils.checkAllowDownload(fileName)) { + throw new Exception(StringUtils.format("文件名称({})非法,不允许下载。 ", fileName)); + } + String realFileName = System.currentTimeMillis() + fileName.substring(fileName.indexOf("_") + 1); + String filePath = BsConfig.getDownloadPath() + fileName; + + response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE); + FileUtils.setAttachmentResponseHeader(response, realFileName); + FileUtils.writeBytes(filePath, response.getOutputStream()); + if (delete) { + FileUtils.deleteFile(filePath); + } + } catch (Exception e) { + log.error("下载文件失败", e); + } + } + + + @ApiOperation("根据attachId下载对应文件") + @GetMapping("/fileDownloadById") + public void fileDownloadById(String attachId,HttpServletResponse response, HttpServletRequest request) { + if (StringUtils.isBlank(attachId) || "null".equals(attachId)) { + throw new ServiceException("附件ID不能为空"); + } + CmAttach cmAttach = cmAttachService.getById(attachId); + String path =cmAttach.getAttachFileUrl(); + path =BsConfig.getFilePath()+path; +// Constants.RESOURCE_PREFIX + path = path.replace(Constants.RESOURCE_PREFIX, ""); + File compressedImageFile = new File(path); + response.setHeader("Access-Control-Expose-Headers", "Content-Disposition"); + FileUtil.downloadFile(request, response, compressedImageFile, false); + } + + + + /** + * 通用上传请求(单个) + */ + @PostMapping("/upload") + @ApiOperation("单文件上传") + public AjaxResult uploadFile(MultipartFile file,String fileId) throws Exception { + try { + // 上传文件路径 + String filePath = BsConfig.getUploadPath(); + // 上传并返回新文件名称 + String fileName = FileUploadUtils.upload(filePath, file); + String url = serverConfig.getUrl() + fileName; + String newFileName = FileUtils.getName(fileName); + String originalFilename = file.getOriginalFilename(); + CmAttach cmAttach = new CmAttach(); + cmAttach.setFileId(fileId); + cmAttach.setFileSort(1); + cmAttach.setAttachName(newFileName); + cmAttach.setAttachContentType(file.getContentType()); + cmAttach.setAttachFileSize(file.getSize()); + String suffix = FileUtil.getExtensionName(originalFilename); + String type = FileUtil.getFileType(suffix); + cmAttach.setAttachFileType(type); + cmAttach.setAttachFileUrl(fileName); + cmAttach.setOldName(originalFilename); + cmAttach.setVersionNo("1"); + cmAttach.setRemark(""); + cmAttachService.save(cmAttach); + AjaxResult ajax = AjaxResult.success(); + ajax.put("url", url); + ajax.put("fileName", fileName); + ajax.put("newFileName", newFileName); + ajax.put("cmAttach", cmAttach); + ajax.put("originalFilename", originalFilename); + return ajax; + } catch (Exception e) { + e.printStackTrace(); + return AjaxResult.error(e.getMessage()); + } + } + + /** + * 通用上传请求(多个) + */ + @PostMapping("/uploads") + @ApiOperation("多文件上传") + public AjaxResult uploadFiles(List files, String fileId) throws Exception { + try { + // 上传文件路径 + String filePath = BsConfig.getUploadPath(); + List urls = new ArrayList(); + List fileNames = new ArrayList(); + List newFileNames = new ArrayList(); + List originalFilenames = new ArrayList(); + List cmAttachList = new ArrayList<>(); + for (MultipartFile file : files) { + // 上传并返回新文件名称 + String fileName = FileUploadUtils.upload(filePath, file); + String url = serverConfig.getUrl() + fileName; + urls.add(url); + fileNames.add(fileName); + String newFileName = FileUtils.getName(fileName); + newFileNames.add(newFileName); + String originalFilename = file.getOriginalFilename(); + originalFilenames.add(originalFilename); + CmAttach cmAttach = new CmAttach(); + cmAttach.setFileId(fileId); + cmAttach.setFileSort(1); + cmAttach.setAttachName(newFileName); + cmAttach.setAttachContentType(file.getContentType()); + cmAttach.setAttachFileSize(file.getSize()); + String suffix = FileUtil.getExtensionName(originalFilename); + String type = FileUtil.getFileType(suffix); + cmAttach.setAttachFileType(type); + cmAttach.setAttachFileUrl(fileName); + cmAttach.setOldName(originalFilename); + cmAttach.setVersionNo("1"); + cmAttach.setRemark(""); + cmAttachList.add(cmAttach); + } + cmAttachService.saveBatch(cmAttachList); + AjaxResult ajax = AjaxResult.success(); + ajax.put("urls", StringUtils.join(urls, FILE_DELIMETER)); + ajax.put("fileNames", StringUtils.join(fileNames, FILE_DELIMETER)); + ajax.put("newFileNames", StringUtils.join(newFileNames, FILE_DELIMETER)); + ajax.put("originalFilenames", StringUtils.join(originalFilenames, FILE_DELIMETER)); + return ajax; + } catch (Exception e) { + e.printStackTrace(); + return AjaxResult.error(e.getMessage()); + } + } + + /** + * 上查询文件列表 + * @param fileId + * @param type + * @return + */ + @ApiOperation("根据fileId查找附件列表") + @GetMapping(value = "/getAttachList/{fileId}") + public AjaxResult getAttachVo(@PathVariable String fileId, String type) { + if (org.apache.commons.lang3.StringUtils.isBlank(fileId) || "null".equals(fileId)) { + return AjaxResult.error("fileId不能为空"); + } else if ("undefined".equals(fileId)) { + return AjaxResult.success(); + } + List attachVo = cmAttachService.list(new LambdaQueryWrapper().eq(CmAttach::getFileId,fileId)); + //压缩图片 + return AjaxResult.success(attachVo); + } + + /** + * 根据fileIds查找附件列表 + * @param fileIds + * @return + */ + @ApiOperation("根据fileIds查找附件列表") + @GetMapping(value = "/getFileIdsByAttachVos") + public AjaxResult getFileIdsByAttachVos(String[] fileIds) { + LambdaQueryWrapper refWrapper = new LambdaQueryWrapper(); + if (null != fileIds && fileIds.length > 0) { + refWrapper.in(CmAttach::getFileId, fileIds); + List refs = cmAttachService.list(refWrapper); + //通过fileId进行分组 + Map> attachVoMap = refs.stream().collect(Collectors.groupingBy(CmAttach::getFileId)); + return AjaxResult.success(attachVoMap); + } else { + return AjaxResult.warn("请输入文件fileIds!"); + } + } + + + @ApiOperation("根据fileId删除表及对应文件") + @DeleteMapping(value = "/deleteFileByFileId/{fileId}") + public AjaxResult deleteFileByFileId(@PathVariable String fileId) { + if (org.apache.commons.lang3.StringUtils.isBlank(fileId) || "null".equals(fileId)) { + return AjaxResult.error("fileId不能为空"); + } + List cmAttachs = cmAttachService.list(new LambdaQueryWrapper().eq(CmAttach::getFileId,fileId)); + cmAttachs.forEach(cmAttach->{ + String path =cmAttach.getAttachFileUrl(); + /* path = path.replace(Constants.RESOURCE_PREFIX, ""); + path = path.replace(cmAttach.getAttachName(), ""); + path =BsConfig.getFilePath()+path+"xt_"+cmAttach.getAttachName();*/ + path =BsConfig.getFilePath()+path; + File compressedImageFile = new File(path); + if (compressedImageFile.exists()) { + FileUtil.del(compressedImageFile); + } + }); + cmAttachService.remove(new LambdaQueryWrapper().eq(CmAttach::getFileId,fileId)); + return AjaxResult.success(); + } + + + @ApiOperation("根据attachId删除表及对应文件") + @DeleteMapping(value = "/deleteFile/{attachId}") + public AjaxResult deleteFile(@PathVariable Long attachId) { + if (attachId==null) { + return AjaxResult.error("attachId不能为空"); + } + CmAttach cmAttach = cmAttachService.getById(attachId); + String path =cmAttach.getAttachFileUrl(); + path =BsConfig.getFilePath()+path; + File compressedImageFile = new File(path); + if (compressedImageFile.exists()) { + FileUtil.del(compressedImageFile); + } + cmAttachService.removeById(attachId); + return AjaxResult.success(); + } + + + /** + * 本地资源通用下载 + */ + @GetMapping("/download/resource") + public void resourceDownload(String resource, HttpServletRequest request, HttpServletResponse response) + throws Exception { + try { + if (!FileUtils.checkAllowDownload(resource)) { + throw new Exception(StringUtils.format("资源文件({})非法,不允许下载。 ", resource)); + } + // 本地资源路径 + String localPath = BsConfig.getProfile(); + // 数据库资源地址 + String downloadPath = localPath + StringUtils.substringAfter(resource, Constants.RESOURCE_PREFIX); + // 下载名称 + String downloadName = StringUtils.substringAfterLast(downloadPath, "/"); + response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE); + FileUtils.setAttachmentResponseHeader(response, downloadName); + FileUtils.writeBytes(downloadPath, response.getOutputStream()); + } catch (Exception e) { + log.error("下载文件失败", e); + } + } +} diff --git a/bs-admin/src/main/java/com/bs/web/controller/monitor/CacheController.java b/bs-admin/src/main/java/com/bs/web/controller/monitor/CacheController.java new file mode 100644 index 0000000..5de9cf5 --- /dev/null +++ b/bs-admin/src/main/java/com/bs/web/controller/monitor/CacheController.java @@ -0,0 +1,120 @@ +package com.bs.web.controller.monitor; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Properties; +import java.util.Set; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisCallback; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.bs.common.constant.CacheConstants; +import com.bs.common.core.domain.AjaxResult; +import com.bs.common.utils.StringUtils; +import com.bs.system.domain.SysCache; + +/** + * 缓存监控 + * + * @author bs + */ +@RestController +@RequestMapping("/monitor/cache") +public class CacheController +{ + @Autowired + private RedisTemplate redisTemplate; + + private final static List caches = new ArrayList(); + { + caches.add(new SysCache(CacheConstants.LOGIN_TOKEN_KEY, "用户信息")); + caches.add(new SysCache(CacheConstants.SYS_CONFIG_KEY, "配置信息")); + caches.add(new SysCache(CacheConstants.SYS_DICT_KEY, "数据字典")); + caches.add(new SysCache(CacheConstants.CAPTCHA_CODE_KEY, "验证码")); + caches.add(new SysCache(CacheConstants.REPEAT_SUBMIT_KEY, "防重提交")); + caches.add(new SysCache(CacheConstants.RATE_LIMIT_KEY, "限流处理")); + caches.add(new SysCache(CacheConstants.PWD_ERR_CNT_KEY, "密码错误次数")); + } + + @PreAuthorize("@ss.hasPermi('monitor:cache:list')") + @GetMapping() + public AjaxResult getInfo() throws Exception + { + Properties info = (Properties) redisTemplate.execute((RedisCallback) connection -> connection.info()); + Properties commandStats = (Properties) redisTemplate.execute((RedisCallback) connection -> connection.info("commandstats")); + Object dbSize = redisTemplate.execute((RedisCallback) connection -> connection.dbSize()); + + Map result = new HashMap<>(3); + result.put("info", info); + result.put("dbSize", dbSize); + + List> pieList = new ArrayList<>(); + commandStats.stringPropertyNames().forEach(key -> { + Map data = new HashMap<>(2); + String property = commandStats.getProperty(key); + data.put("name", StringUtils.removeStart(key, "cmdstat_")); + data.put("value", StringUtils.substringBetween(property, "calls=", ",usec")); + pieList.add(data); + }); + result.put("commandStats", pieList); + return AjaxResult.success(result); + } + + @PreAuthorize("@ss.hasPermi('monitor:cache:list')") + @GetMapping("/getNames") + public AjaxResult cache() + { + return AjaxResult.success(caches); + } + + @PreAuthorize("@ss.hasPermi('monitor:cache:list')") + @GetMapping("/getKeys/{cacheName}") + public AjaxResult getCacheKeys(@PathVariable String cacheName) + { + Set cacheKeys = redisTemplate.keys(cacheName + "*"); + return AjaxResult.success(cacheKeys); + } + + @PreAuthorize("@ss.hasPermi('monitor:cache:list')") + @GetMapping("/getValue/{cacheName}/{cacheKey}") + public AjaxResult getCacheValue(@PathVariable String cacheName, @PathVariable String cacheKey) + { + String cacheValue = redisTemplate.opsForValue().get(cacheKey); + SysCache sysCache = new SysCache(cacheName, cacheKey, cacheValue); + return AjaxResult.success(sysCache); + } + + @PreAuthorize("@ss.hasPermi('monitor:cache:list')") + @DeleteMapping("/clearCacheName/{cacheName}") + public AjaxResult clearCacheName(@PathVariable String cacheName) + { + Collection cacheKeys = redisTemplate.keys(cacheName + "*"); + redisTemplate.delete(cacheKeys); + return AjaxResult.success(); + } + + @PreAuthorize("@ss.hasPermi('monitor:cache:list')") + @DeleteMapping("/clearCacheKey/{cacheKey}") + public AjaxResult clearCacheKey(@PathVariable String cacheKey) + { + redisTemplate.delete(cacheKey); + return AjaxResult.success(); + } + + @PreAuthorize("@ss.hasPermi('monitor:cache:list')") + @DeleteMapping("/clearCacheAll") + public AjaxResult clearCacheAll() + { + Collection cacheKeys = redisTemplate.keys("*"); + redisTemplate.delete(cacheKeys); + return AjaxResult.success(); + } +} diff --git a/bs-admin/src/main/java/com/bs/web/controller/monitor/ServerController.java b/bs-admin/src/main/java/com/bs/web/controller/monitor/ServerController.java new file mode 100644 index 0000000..2d878de --- /dev/null +++ b/bs-admin/src/main/java/com/bs/web/controller/monitor/ServerController.java @@ -0,0 +1,27 @@ +package com.bs.web.controller.monitor; + +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.bs.common.core.domain.AjaxResult; +import com.bs.framework.web.domain.Server; + +/** + * 服务器监控 + * + * @author bs + */ +@RestController +@RequestMapping("/monitor/server") +public class ServerController +{ + @PreAuthorize("@ss.hasPermi('monitor:server:list')") + @GetMapping() + public AjaxResult getInfo() throws Exception + { + Server server = new Server(); + server.copyTo(); + return AjaxResult.success(server); + } +} diff --git a/bs-admin/src/main/java/com/bs/web/controller/monitor/SysLogininforController.java b/bs-admin/src/main/java/com/bs/web/controller/monitor/SysLogininforController.java new file mode 100644 index 0000000..56063c6 --- /dev/null +++ b/bs-admin/src/main/java/com/bs/web/controller/monitor/SysLogininforController.java @@ -0,0 +1,82 @@ +package com.bs.web.controller.monitor; + +import java.util.List; +import javax.servlet.http.HttpServletResponse; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.bs.common.annotation.Log; +import com.bs.common.core.controller.BaseController; +import com.bs.common.core.domain.AjaxResult; +import com.bs.common.core.page.TableDataInfo; +import com.bs.common.enums.BusinessType; +import com.bs.common.utils.poi.ExcelUtil; +import com.bs.framework.web.service.SysPasswordService; +import com.bs.system.domain.SysLogininfor; +import com.bs.system.service.ISysLogininforService; + +/** + * 系统访问记录 + * + * @author bs + */ +@RestController +@RequestMapping("/monitor/logininfor") +public class SysLogininforController extends BaseController +{ + @Autowired + private ISysLogininforService logininforService; + + @Autowired + private SysPasswordService passwordService; + + @PreAuthorize("@ss.hasPermi('monitor:logininfor:list')") + @GetMapping("/list") + public TableDataInfo list(SysLogininfor logininfor) + { + startPage(); + List list = logininforService.selectLogininforList(logininfor); + return getDataTable(list); + } + + @Log(title = "登录日志", businessType = BusinessType.EXPORT) + @PreAuthorize("@ss.hasPermi('monitor:logininfor:export')") + @PostMapping("/export") + public void export(HttpServletResponse response, SysLogininfor logininfor) + { + List list = logininforService.selectLogininforList(logininfor); + ExcelUtil util = new ExcelUtil(SysLogininfor.class); + util.exportExcel(response, list, "登录日志"); + } + + @PreAuthorize("@ss.hasPermi('monitor:logininfor:remove')") + @Log(title = "登录日志", businessType = BusinessType.DELETE) + @DeleteMapping("/{infoIds}") + public AjaxResult remove(@PathVariable Long[] infoIds) + { + return toAjax(logininforService.deleteLogininforByIds(infoIds)); + } + + @PreAuthorize("@ss.hasPermi('monitor:logininfor:remove')") + @Log(title = "登录日志", businessType = BusinessType.CLEAN) + @DeleteMapping("/clean") + public AjaxResult clean() + { + logininforService.cleanLogininfor(); + return success(); + } + + @PreAuthorize("@ss.hasPermi('monitor:logininfor:unlock')") + @Log(title = "账户解锁", businessType = BusinessType.OTHER) + @GetMapping("/unlock/{userName}") + public AjaxResult unlock(@PathVariable("userName") String userName) + { + passwordService.clearLoginRecordCache(userName); + return success(); + } +} diff --git a/bs-admin/src/main/java/com/bs/web/controller/monitor/SysOperlogController.java b/bs-admin/src/main/java/com/bs/web/controller/monitor/SysOperlogController.java new file mode 100644 index 0000000..b00fa95 --- /dev/null +++ b/bs-admin/src/main/java/com/bs/web/controller/monitor/SysOperlogController.java @@ -0,0 +1,69 @@ +package com.bs.web.controller.monitor; + +import java.util.List; +import javax.servlet.http.HttpServletResponse; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.bs.common.annotation.Log; +import com.bs.common.core.controller.BaseController; +import com.bs.common.core.domain.AjaxResult; +import com.bs.common.core.page.TableDataInfo; +import com.bs.common.enums.BusinessType; +import com.bs.common.utils.poi.ExcelUtil; +import com.bs.system.domain.SysOperLog; +import com.bs.system.service.ISysOperLogService; + +/** + * 操作日志记录 + * + * @author bs + */ +@RestController +@RequestMapping("/monitor/operlog") +public class SysOperlogController extends BaseController +{ + @Autowired + private ISysOperLogService operLogService; + + @PreAuthorize("@ss.hasPermi('monitor:operlog:list')") + @GetMapping("/list") + public TableDataInfo list(SysOperLog operLog) + { + startPage(); + List list = operLogService.selectOperLogList(operLog); + return getDataTable(list); + } + + @Log(title = "操作日志", businessType = BusinessType.EXPORT) + @PreAuthorize("@ss.hasPermi('monitor:operlog:export')") + @PostMapping("/export") + public void export(HttpServletResponse response, SysOperLog operLog) + { + List list = operLogService.selectOperLogList(operLog); + ExcelUtil util = new ExcelUtil(SysOperLog.class); + util.exportExcel(response, list, "操作日志"); + } + + @Log(title = "操作日志", businessType = BusinessType.DELETE) + @PreAuthorize("@ss.hasPermi('monitor:operlog:remove')") + @DeleteMapping("/{operIds}") + public AjaxResult remove(@PathVariable Long[] operIds) + { + return toAjax(operLogService.deleteOperLogByIds(operIds)); + } + + @Log(title = "操作日志", businessType = BusinessType.CLEAN) + @PreAuthorize("@ss.hasPermi('monitor:operlog:remove')") + @DeleteMapping("/clean") + public AjaxResult clean() + { + operLogService.cleanOperLog(); + return success(); + } +} diff --git a/bs-admin/src/main/java/com/bs/web/controller/monitor/SysUserOnlineController.java b/bs-admin/src/main/java/com/bs/web/controller/monitor/SysUserOnlineController.java new file mode 100644 index 0000000..9a2bfa9 --- /dev/null +++ b/bs-admin/src/main/java/com/bs/web/controller/monitor/SysUserOnlineController.java @@ -0,0 +1,81 @@ +package com.bs.web.controller.monitor; + +import cn.hutool.core.lang.Validator; +import com.bs.common.annotation.Log; +import com.bs.common.constant.CacheConstants; +import com.bs.common.core.controller.BaseController; +import com.bs.common.core.domain.AjaxResult; +import com.bs.common.core.domain.model.LoginUser; +import com.bs.common.core.page.TableDataInfo; +import com.bs.common.core.redis.RedisCache; +import com.bs.common.enums.BusinessType; +import com.bs.common.utils.StringUtils; +import com.bs.system.domain.SysUserOnline; +import com.bs.system.service.ISysUserOnlineService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.List; + +/** + * 在线用户监控 + * + * @author bs + */ +@RestController +@RequestMapping("/monitor/online") +public class SysUserOnlineController extends BaseController +{ + @Autowired + private ISysUserOnlineService userOnlineService; + + @Autowired + private RedisCache redisCache; + + @PreAuthorize("@ss.hasPermi('monitor:online:list')") + @GetMapping("/list") + public TableDataInfo list(String ipaddr, String userName) + { + Collection keys = redisCache.keys(CacheConstants.LOGIN_TOKEN_KEY + "*"); + List userOnlineList = new ArrayList(); + for (String key : keys) + { + LoginUser user = redisCache.getCacheObject(key); + if (Validator.isNotEmpty(ipaddr) && Validator.isNotEmpty(userName)) + { + userOnlineList.add(userOnlineService.selectOnlineByInfo(ipaddr, userName, user)); + } + else if (Validator.isNotEmpty(ipaddr)) + { + userOnlineList.add(userOnlineService.selectOnlineByIpaddr(ipaddr, user)); + } + else if (Validator.isNotEmpty(userName) && StringUtils.isNotNull(user.getUser())) + { + userOnlineList.add(userOnlineService.selectOnlineByUserName(userName, user)); + } + else + { + userOnlineList.add(userOnlineService.loginUserToUserOnline(user)); + } + } + Collections.reverse(userOnlineList); + userOnlineList.removeAll(Collections.singleton(null)); + return getDataTable(userOnlineList); + } + + /** + * 强退用户 + */ + @PreAuthorize("@ss.hasPermi('monitor:online:forceLogout')") + @Log(title = "在线用户", businessType = BusinessType.FORCE) + @DeleteMapping("/{tokenId}") + public AjaxResult forceLogout(@PathVariable String tokenId) + { + redisCache.deleteObject(CacheConstants.LOGIN_TOKEN_KEY + tokenId); + return success(); + } +} diff --git a/bs-admin/src/main/java/com/bs/web/controller/system/SysConfigController.java b/bs-admin/src/main/java/com/bs/web/controller/system/SysConfigController.java new file mode 100644 index 0000000..5ec6cae --- /dev/null +++ b/bs-admin/src/main/java/com/bs/web/controller/system/SysConfigController.java @@ -0,0 +1,133 @@ +package com.bs.web.controller.system; + +import java.util.List; +import javax.servlet.http.HttpServletResponse; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.bs.common.annotation.Log; +import com.bs.common.core.controller.BaseController; +import com.bs.common.core.domain.AjaxResult; +import com.bs.common.core.page.TableDataInfo; +import com.bs.common.enums.BusinessType; +import com.bs.common.utils.poi.ExcelUtil; +import com.bs.system.domain.SysConfig; +import com.bs.system.service.ISysConfigService; + +/** + * 参数配置 信息操作处理 + * + * @author bs + */ +@RestController +@RequestMapping("/system/config") +public class SysConfigController extends BaseController +{ + @Autowired + private ISysConfigService configService; + + /** + * 获取参数配置列表 + */ + @PreAuthorize("@ss.hasPermi('system:config:list')") + @GetMapping("/list") + public TableDataInfo list(SysConfig config) + { + startPage(); + List list = configService.selectConfigList(config); + return getDataTable(list); + } + + @Log(title = "参数管理", businessType = BusinessType.EXPORT) + @PreAuthorize("@ss.hasPermi('system:config:export')") + @PostMapping("/export") + public void export(HttpServletResponse response, SysConfig config) + { + List list = configService.selectConfigList(config); + ExcelUtil util = new ExcelUtil(SysConfig.class); + util.exportExcel(response, list, "参数数据"); + } + + /** + * 根据参数编号获取详细信息 + */ + @PreAuthorize("@ss.hasPermi('system:config:query')") + @GetMapping(value = "/{configId}") + public AjaxResult getInfo(@PathVariable Long configId) + { + return success(configService.selectConfigById(configId)); + } + + /** + * 根据参数键名查询参数值 + */ + @GetMapping(value = "/configKey/{configKey}") + public AjaxResult getConfigKey(@PathVariable String configKey) + { + return success(configService.selectConfigByKey(configKey)); + } + + /** + * 新增参数配置 + */ + @PreAuthorize("@ss.hasPermi('system:config:add')") + @Log(title = "参数管理", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@Validated @RequestBody SysConfig config) + { + if (!configService.checkConfigKeyUnique(config)) + { + return error("新增参数'" + config.getConfigName() + "'失败,参数键名已存在"); + } + config.setCreateBy(getUsername()); + return toAjax(configService.insertConfig(config)); + } + + /** + * 修改参数配置 + */ + @PreAuthorize("@ss.hasPermi('system:config:edit')") + @Log(title = "参数管理", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@Validated @RequestBody SysConfig config) + { + if (!configService.checkConfigKeyUnique(config)) + { + return error("修改参数'" + config.getConfigName() + "'失败,参数键名已存在"); + } + config.setUpdateBy(getUsername()); + return toAjax(configService.updateConfig(config)); + } + + /** + * 删除参数配置 + */ + @PreAuthorize("@ss.hasPermi('system:config:remove')") + @Log(title = "参数管理", businessType = BusinessType.DELETE) + @DeleteMapping("/{configIds}") + public AjaxResult remove(@PathVariable Long[] configIds) + { + configService.deleteConfigByIds(configIds); + return success(); + } + + /** + * 刷新参数缓存 + */ + @PreAuthorize("@ss.hasPermi('system:config:remove')") + @Log(title = "参数管理", businessType = BusinessType.CLEAN) + @DeleteMapping("/refreshCache") + public AjaxResult refreshCache() + { + configService.resetConfigCache(); + return success(); + } +} diff --git a/bs-admin/src/main/java/com/bs/web/controller/system/SysDeptController.java b/bs-admin/src/main/java/com/bs/web/controller/system/SysDeptController.java new file mode 100644 index 0000000..bf15568 --- /dev/null +++ b/bs-admin/src/main/java/com/bs/web/controller/system/SysDeptController.java @@ -0,0 +1,132 @@ +package com.bs.web.controller.system; + +import java.util.List; +import org.apache.commons.lang3.ArrayUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.bs.common.annotation.Log; +import com.bs.common.constant.UserConstants; +import com.bs.common.core.controller.BaseController; +import com.bs.common.core.domain.AjaxResult; +import com.bs.common.core.domain.entity.SysDept; +import com.bs.common.enums.BusinessType; +import com.bs.common.utils.StringUtils; +import com.bs.system.service.ISysDeptService; + +/** + * 部门信息 + * + * @author bs + */ +@RestController +@RequestMapping("/system/dept") +public class SysDeptController extends BaseController +{ + @Autowired + private ISysDeptService deptService; + + /** + * 获取部门列表 + */ + @PreAuthorize("@ss.hasPermi('system:dept:list')") + @GetMapping("/list") + public AjaxResult list(SysDept dept) + { + List depts = deptService.selectDeptList(dept); + return success(depts); + } + + /** + * 查询部门列表(排除节点) + */ + @PreAuthorize("@ss.hasPermi('system:dept:list')") + @GetMapping("/list/exclude/{deptId}") + public AjaxResult excludeChild(@PathVariable(value = "deptId", required = false) Long deptId) + { + List depts = deptService.selectDeptList(new SysDept()); + depts.removeIf(d -> d.getDeptId().intValue() == deptId || ArrayUtils.contains(StringUtils.split(d.getAncestors(), ","), deptId + "")); + return success(depts); + } + + /** + * 根据部门编号获取详细信息 + */ + @PreAuthorize("@ss.hasPermi('system:dept:query')") + @GetMapping(value = "/{deptId}") + public AjaxResult getInfo(@PathVariable Long deptId) + { + deptService.checkDeptDataScope(deptId); + return success(deptService.selectDeptById(deptId)); + } + + /** + * 新增部门 + */ + @PreAuthorize("@ss.hasPermi('system:dept:add')") + @Log(title = "部门管理", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@Validated @RequestBody SysDept dept) + { + if (!deptService.checkDeptNameUnique(dept)) + { + return error("新增部门'" + dept.getDeptName() + "'失败,部门名称已存在"); + } + dept.setCreateBy(getUsername()); + return toAjax(deptService.insertDept(dept)); + } + + /** + * 修改部门 + */ + @PreAuthorize("@ss.hasPermi('system:dept:edit')") + @Log(title = "部门管理", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@Validated @RequestBody SysDept dept) + { + Long deptId = dept.getDeptId(); + deptService.checkDeptDataScope(deptId); + if (!deptService.checkDeptNameUnique(dept)) + { + return error("修改部门'" + dept.getDeptName() + "'失败,部门名称已存在"); + } + else if (dept.getParentId().equals(deptId)) + { + return error("修改部门'" + dept.getDeptName() + "'失败,上级部门不能是自己"); + } + else if (StringUtils.equals(UserConstants.DEPT_DISABLE, dept.getStatus()) && deptService.selectNormalChildrenDeptById(deptId) > 0) + { + return error("该部门包含未停用的子部门!"); + } + dept.setUpdateBy(getUsername()); + return toAjax(deptService.updateDept(dept)); + } + + /** + * 删除部门 + */ + @PreAuthorize("@ss.hasPermi('system:dept:remove')") + @Log(title = "部门管理", businessType = BusinessType.DELETE) + @DeleteMapping("/{deptId}") + public AjaxResult remove(@PathVariable Long deptId) + { + if (deptService.hasChildByDeptId(deptId)) + { + return warn("存在下级部门,不允许删除"); + } + if (deptService.checkDeptExistUser(deptId)) + { + return warn("部门存在用户,不允许删除"); + } + deptService.checkDeptDataScope(deptId); + return toAjax(deptService.deleteDeptById(deptId)); + } +} diff --git a/bs-admin/src/main/java/com/bs/web/controller/system/SysDictDataController.java b/bs-admin/src/main/java/com/bs/web/controller/system/SysDictDataController.java new file mode 100644 index 0000000..e36ccde --- /dev/null +++ b/bs-admin/src/main/java/com/bs/web/controller/system/SysDictDataController.java @@ -0,0 +1,121 @@ +package com.bs.web.controller.system; + +import java.util.ArrayList; +import java.util.List; +import javax.servlet.http.HttpServletResponse; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.bs.common.annotation.Log; +import com.bs.common.core.controller.BaseController; +import com.bs.common.core.domain.AjaxResult; +import com.bs.common.core.domain.entity.SysDictData; +import com.bs.common.core.page.TableDataInfo; +import com.bs.common.enums.BusinessType; +import com.bs.common.utils.StringUtils; +import com.bs.common.utils.poi.ExcelUtil; +import com.bs.system.service.ISysDictDataService; +import com.bs.system.service.ISysDictTypeService; + +/** + * 数据字典信息 + * + * @author bs + */ +@RestController +@RequestMapping("/system/dict/data") +public class SysDictDataController extends BaseController +{ + @Autowired + private ISysDictDataService dictDataService; + + @Autowired + private ISysDictTypeService dictTypeService; + + @PreAuthorize("@ss.hasPermi('system:dict:list')") + @GetMapping("/list") + public TableDataInfo list(SysDictData dictData) + { + startPage(); + List list = dictDataService.selectDictDataList(dictData); + return getDataTable(list); + } + + @Log(title = "字典数据", businessType = BusinessType.EXPORT) + @PreAuthorize("@ss.hasPermi('system:dict:export')") + @PostMapping("/export") + public void export(HttpServletResponse response, SysDictData dictData) + { + List list = dictDataService.selectDictDataList(dictData); + ExcelUtil util = new ExcelUtil(SysDictData.class); + util.exportExcel(response, list, "字典数据"); + } + + /** + * 查询字典数据详细 + */ + @PreAuthorize("@ss.hasPermi('system:dict:query')") + @GetMapping(value = "/{dictCode}") + public AjaxResult getInfo(@PathVariable Long dictCode) + { + return success(dictDataService.selectDictDataById(dictCode)); + } + + /** + * 根据字典类型查询字典数据信息 + */ + @GetMapping(value = "/type/{dictType}") + public AjaxResult dictType(@PathVariable String dictType) + { + List data = dictTypeService.selectDictDataByType(dictType); + if (StringUtils.isNull(data)) + { + data = new ArrayList(); + } + return success(data); + } + + /** + * 新增字典类型 + */ + @PreAuthorize("@ss.hasPermi('system:dict:add')") + @Log(title = "字典数据", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@Validated @RequestBody SysDictData dict) + { + dict.setCreateBy(getUsername()); + return toAjax(dictDataService.insertDictData(dict)); + } + + /** + * 修改保存字典类型 + */ + @PreAuthorize("@ss.hasPermi('system:dict:edit')") + @Log(title = "字典数据", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@Validated @RequestBody SysDictData dict) + { + dict.setUpdateBy(getUsername()); + return toAjax(dictDataService.updateDictData(dict)); + } + + /** + * 删除字典类型 + */ + @PreAuthorize("@ss.hasPermi('system:dict:remove')") + @Log(title = "字典类型", businessType = BusinessType.DELETE) + @DeleteMapping("/{dictCodes}") + public AjaxResult remove(@PathVariable Long[] dictCodes) + { + dictDataService.deleteDictDataByIds(dictCodes); + return success(); + } +} diff --git a/bs-admin/src/main/java/com/bs/web/controller/system/SysDictTypeController.java b/bs-admin/src/main/java/com/bs/web/controller/system/SysDictTypeController.java new file mode 100644 index 0000000..12aa620 --- /dev/null +++ b/bs-admin/src/main/java/com/bs/web/controller/system/SysDictTypeController.java @@ -0,0 +1,131 @@ +package com.bs.web.controller.system; + +import java.util.List; +import javax.servlet.http.HttpServletResponse; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.bs.common.annotation.Log; +import com.bs.common.core.controller.BaseController; +import com.bs.common.core.domain.AjaxResult; +import com.bs.common.core.domain.entity.SysDictType; +import com.bs.common.core.page.TableDataInfo; +import com.bs.common.enums.BusinessType; +import com.bs.common.utils.poi.ExcelUtil; +import com.bs.system.service.ISysDictTypeService; + +/** + * 数据字典信息 + * + * @author bs + */ +@RestController +@RequestMapping("/system/dict/type") +public class SysDictTypeController extends BaseController +{ + @Autowired + private ISysDictTypeService dictTypeService; + + @PreAuthorize("@ss.hasPermi('system:dict:list')") + @GetMapping("/list") + public TableDataInfo list(SysDictType dictType) + { + startPage(); + List list = dictTypeService.selectDictTypeList(dictType); + return getDataTable(list); + } + + @Log(title = "字典类型", businessType = BusinessType.EXPORT) + @PreAuthorize("@ss.hasPermi('system:dict:export')") + @PostMapping("/export") + public void export(HttpServletResponse response, SysDictType dictType) + { + List list = dictTypeService.selectDictTypeList(dictType); + ExcelUtil util = new ExcelUtil(SysDictType.class); + util.exportExcel(response, list, "字典类型"); + } + + /** + * 查询字典类型详细 + */ + @PreAuthorize("@ss.hasPermi('system:dict:query')") + @GetMapping(value = "/{dictId}") + public AjaxResult getInfo(@PathVariable Long dictId) + { + return success(dictTypeService.selectDictTypeById(dictId)); + } + + /** + * 新增字典类型 + */ + @PreAuthorize("@ss.hasPermi('system:dict:add')") + @Log(title = "字典类型", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@Validated @RequestBody SysDictType dict) + { + if (!dictTypeService.checkDictTypeUnique(dict)) + { + return error("新增字典'" + dict.getDictName() + "'失败,字典类型已存在"); + } + dict.setCreateBy(getUsername()); + return toAjax(dictTypeService.insertDictType(dict)); + } + + /** + * 修改字典类型 + */ + @PreAuthorize("@ss.hasPermi('system:dict:edit')") + @Log(title = "字典类型", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@Validated @RequestBody SysDictType dict) + { + if (!dictTypeService.checkDictTypeUnique(dict)) + { + return error("修改字典'" + dict.getDictName() + "'失败,字典类型已存在"); + } + dict.setUpdateBy(getUsername()); + return toAjax(dictTypeService.updateDictType(dict)); + } + + /** + * 删除字典类型 + */ + @PreAuthorize("@ss.hasPermi('system:dict:remove')") + @Log(title = "字典类型", businessType = BusinessType.DELETE) + @DeleteMapping("/{dictIds}") + public AjaxResult remove(@PathVariable Long[] dictIds) + { + dictTypeService.deleteDictTypeByIds(dictIds); + return success(); + } + + /** + * 刷新字典缓存 + */ + @PreAuthorize("@ss.hasPermi('system:dict:remove')") + @Log(title = "字典类型", businessType = BusinessType.CLEAN) + @DeleteMapping("/refreshCache") + public AjaxResult refreshCache() + { + dictTypeService.resetDictCache(); + return success(); + } + + /** + * 获取字典选择框列表 + */ + @GetMapping("/optionselect") + public AjaxResult optionselect() + { + List dictTypes = dictTypeService.selectDictTypeAll(); + return success(dictTypes); + } +} diff --git a/bs-admin/src/main/java/com/bs/web/controller/system/SysIndexController.java b/bs-admin/src/main/java/com/bs/web/controller/system/SysIndexController.java new file mode 100644 index 0000000..4c8eb63 --- /dev/null +++ b/bs-admin/src/main/java/com/bs/web/controller/system/SysIndexController.java @@ -0,0 +1,29 @@ +package com.bs.web.controller.system; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.bs.common.config.BsConfig; +import com.bs.common.utils.StringUtils; + +/** + * 首页 + * + * @author bs + */ +@RestController +public class SysIndexController +{ + /** 系统基础配置 */ + @Autowired + private BsConfig bsConfig; + + /** + * 访问首页,提示语 + */ + @RequestMapping("/") + public String index() + { + return StringUtils.format("欢迎使用{}后台管理框架,当前版本:v{},请通过前端地址访问。", bsConfig.getName(), bsConfig.getVersion()); + } +} diff --git a/bs-admin/src/main/java/com/bs/web/controller/system/SysLoginController.java b/bs-admin/src/main/java/com/bs/web/controller/system/SysLoginController.java new file mode 100644 index 0000000..e10a8fc --- /dev/null +++ b/bs-admin/src/main/java/com/bs/web/controller/system/SysLoginController.java @@ -0,0 +1,98 @@ +package com.bs.web.controller.system; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.bs.common.constant.Constants; +import com.bs.common.core.domain.AjaxResult; +import com.bs.common.core.domain.entity.SysMenu; +import com.bs.common.core.domain.entity.SysUser; +import com.bs.common.core.domain.entity.TenantConfig; +import com.bs.common.core.domain.model.LoginBody; +import com.bs.common.utils.SecurityUtils; +import com.bs.framework.web.service.SysLoginService; +import com.bs.framework.web.service.SysPermissionService; +import com.bs.system.service.ISysMenuService; +import com.bs.system.service.ITenantConfigService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; +import java.util.Set; + +/** + * 登录验证 + * + * @author bs + */ +@RestController +public class SysLoginController +{ + @Autowired + private SysLoginService loginService; + + @Autowired + private ISysMenuService menuService; + + @Autowired + private SysPermissionService permissionService; + + @Autowired + private ITenantConfigService tenantConfigService; + + /** + * 登录方法 + * + * @param loginBody 登录信息 + * @return 结果 + */ + @PostMapping("/login") + public AjaxResult login(@RequestBody LoginBody loginBody) + { + AjaxResult ajax = AjaxResult.success(); + // 生成令牌 + String token = loginService.login(loginBody.getUsername(), loginBody.getPassword(), loginBody.getCode(), + loginBody.getUuid()); + ajax.put(Constants.TOKEN, token); + return ajax; + } + + /** + * 获取用户信息 + * + * @return 用户信息 + */ + @GetMapping("getInfo") + public AjaxResult getInfo() + { + SysUser user = SecurityUtils.getLoginUser().getUser(); + TenantConfig tenantConfig = tenantConfigService.getOne(new LambdaQueryWrapper().eq(TenantConfig::getId, user.getTenantId())); + // 角色集合 + Set roles = permissionService.getRolePermission(user); + // 权限集合 + Set permissions = permissionService.getMenuPermission(user); + if(tenantConfig==null){ + tenantConfig = new TenantConfig(); + } + AjaxResult ajax = AjaxResult.success(); + ajax.put("user", user); + ajax.put("tenantConfig", tenantConfig); + ajax.put("roles", roles); + ajax.put("permissions", permissions); + return ajax; + } + + /** + * 获取路由信息 + * + * @return 路由信息 + */ + @GetMapping("getRouters") + public AjaxResult getRouters() + { + Long userId = SecurityUtils.getUserId(); + List menus = menuService.selectMenuTreeByUserId(userId); + return AjaxResult.success(menuService.buildMenus(menus)); + } +} diff --git a/bs-admin/src/main/java/com/bs/web/controller/system/SysMenuController.java b/bs-admin/src/main/java/com/bs/web/controller/system/SysMenuController.java new file mode 100644 index 0000000..54dffc9 --- /dev/null +++ b/bs-admin/src/main/java/com/bs/web/controller/system/SysMenuController.java @@ -0,0 +1,139 @@ +package com.bs.web.controller.system; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.bs.common.annotation.Log; +import com.bs.common.constant.UserConstants; +import com.bs.common.core.controller.BaseController; +import com.bs.common.core.domain.AjaxResult; +import com.bs.common.core.domain.entity.SysMenu; +import com.bs.common.enums.BusinessType; +import com.bs.common.utils.StringUtils; +import com.bs.system.mapper.SysMenuMapper; +import com.bs.system.service.ISysMenuService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 菜单信息 + * + * @author bs + */ +@RestController +@RequestMapping("/system/menu") +public class SysMenuController extends BaseController +{ + @Autowired + private ISysMenuService menuService; + @Autowired + private SysMenuMapper sysMenuMapper; + + /** + * 获取菜单列表 + */ + @PreAuthorize("@ss.hasPermi('system:menu:list')") + @GetMapping("/list") + public AjaxResult list(SysMenu menu) + { + List menus = menuService.selectMenuList(menu, getUserId()); + return success(menus); + } + + /** + * 根据菜单编号获取详细信息 + */ + @PreAuthorize("@ss.hasPermi('system:menu:query')") + @GetMapping(value = "/{menuId}") + public AjaxResult getInfo(@PathVariable Long menuId) + { + return success(menuService.selectMenuById(menuId)); + } + + /** + * 获取菜单下拉树列表 + */ + @GetMapping("/treeselect") + public AjaxResult treeselect(SysMenu menu) + { + List menus = menuService.selectMenuList(menu, getUserId()); + return success(menuService.buildMenuTreeSelect(menus)); + } + + /** + * 加载对应角色菜单列表树 + */ + @GetMapping(value = "/roleMenuTreeselect/{roleId}") + public AjaxResult roleMenuTreeselect(@PathVariable("roleId") Long roleId) + { + List menus = menuService.selectMenuList(getUserId()); + AjaxResult ajax = AjaxResult.success(); + ajax.put("checkedKeys", menuService.selectMenuListByRoleId(roleId)); + ajax.put("menus", menuService.buildMenuTreeSelect(menus)); + return ajax; + } + + /** + * 新增菜单 + */ + @PreAuthorize("@ss.hasPermi('system:menu:add')") + @Log(title = "菜单管理", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@Validated @RequestBody SysMenu menu) + { + if (!menuService.checkMenuNameUnique(menu)) + { + return error("新增菜单'" + menu.getMenuName() + "'失败,菜单名称已存在"); + } + else if (UserConstants.YES_FRAME.equals(menu.getIsFrame()) && !StringUtils.ishttp(menu.getPath())) + { + return error("新增菜单'" + menu.getMenuName() + "'失败,地址必须以http(s)://开头"); + } + menu.setCreateBy(getUsername()); + return toAjax(menuService.insertMenu(menu)); + } + + /** + * 修改菜单 + */ + @PreAuthorize("@ss.hasPermi('system:menu:edit')") + @Log(title = "菜单管理", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@Validated @RequestBody SysMenu menu) + { + if (!menuService.checkMenuNameUnique(menu)) + { + return error("修改菜单'" + menu.getMenuName() + "'失败,菜单名称已存在"); + } + else if (UserConstants.YES_FRAME.equals(menu.getIsFrame()) && !StringUtils.ishttp(menu.getPath())) + { + return error("修改菜单'" + menu.getMenuName() + "'失败,地址必须以http(s)://开头"); + } + else if (menu.getMenuId().equals(menu.getParentId())) + { + return error("修改菜单'" + menu.getMenuName() + "'失败,上级菜单不能选择自己"); + } + menu.setUpdateBy(getUsername()); + return toAjax(menuService.updateMenu(menu)); + } + + /** + * 删除菜单 + */ + @PreAuthorize("@ss.hasPermi('system:menu:remove')") + @Log(title = "菜单管理", businessType = BusinessType.DELETE) + @DeleteMapping("/{menuId}") + public AjaxResult remove(@PathVariable("menuId") Long menuId) + { + + if (menuService.checkMenuExistRole(menuId)) + { + return warn("菜单已分配,不允许删除"); + } + //select count(1) from sys_menu where parent_id = #{menuId} + sysMenuMapper.delete(new LambdaQueryWrapper().eq(SysMenu::getParentId, menuId)); + return toAjax(menuService.deleteMenuById(menuId)); + } +} diff --git a/bs-admin/src/main/java/com/bs/web/controller/system/SysNoticeController.java b/bs-admin/src/main/java/com/bs/web/controller/system/SysNoticeController.java new file mode 100644 index 0000000..ee8aeb5 --- /dev/null +++ b/bs-admin/src/main/java/com/bs/web/controller/system/SysNoticeController.java @@ -0,0 +1,170 @@ +package com.bs.web.controller.system; + +import java.util.List; +import javax.servlet.http.HttpServletResponse; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.bs.common.annotation.Log; +import com.bs.common.core.controller.BaseController; +import com.bs.common.core.domain.AjaxResult; +import com.bs.common.core.page.TableDataInfo; +import com.bs.common.enums.BusinessType; +import com.bs.common.utils.poi.ExcelUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import cn.hutool.core.lang.Validator; +import com.bs.system.domain.SysNotice; +import com.bs.system.service.ISysNoticeService; +import javax.annotation.Resource; + +/** + * 通知公告Controller + * + * @author bs + * @date 2023-08-06 + */ +@Api(tags = "通知公告") +@RestController +@RequestMapping("/system/notice") +public class SysNoticeController extends BaseController { + @Resource + private ISysNoticeService sysNoticeService; + + /** + * 分页查询通知公告列表 + */ + @ApiOperation("分页查询通知公告列表") + @GetMapping("/pageList") + public TableDataInfo pageList(SysNotice sysNotice) { + startPage(); + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper(); + condition(queryWrapper,sysNotice); + List list = sysNoticeService.list(queryWrapper); + return getDataTable(list); + } + + /** + * 查询通知公告列表 + */ + @ApiOperation("查询通知公告列表") + @GetMapping("/list") + public AjaxResult list(SysNotice sysNotice) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper(); + condition(queryWrapper,sysNotice); + List list = sysNoticeService.list(queryWrapper); + return success(list); + } + + /** + * 导出通知公告列表 + */ + @ApiOperation("导出通知公告列表") + @Log(title = "通知公告导出", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, SysNotice sysNotice) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper(); + condition(queryWrapper,sysNotice); + List list = sysNoticeService.list(queryWrapper); + ExcelUtil util = new ExcelUtil(SysNotice. class); + util.exportExcel(response, list, "通知公告数据"); + } + + /** + * 获取通知公告详细信息 + */ + @ApiOperation("获取通知公告详细信息") + @GetMapping(value = "/{noticeId}") + public AjaxResult getInfo(@PathVariable("noticeId") Long noticeId) { + return success(sysNoticeService.getById(noticeId)); + } + + /** + * 新增通知公告 + */ + @ApiOperation("新增通知公告") + @Log(title = "通知公告新增", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody SysNotice sysNotice) { + return toAjax(sysNoticeService.save(sysNotice)); + } + + /** + * 修改通知公告 + */ + @ApiOperation("修改通知公告") + @Log(title = "通知公告修改", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody SysNotice sysNotice) { + return toAjax(sysNoticeService.updateById(sysNotice)); + } + + /** + * 删除通知公告 + */ + @ApiOperation("删除通知公告") + @Log(title = "通知公告删除", businessType = BusinessType.DELETE) + @DeleteMapping("/{noticeIds}") + public AjaxResult remove(@PathVariable List noticeIds) { + return toAjax(sysNoticeService.removeBatchByIds(noticeIds)); + } + + /** + * 条件设置 + */ + private void condition (LambdaQueryWrapper queryWrapper,SysNotice sysNotice){ + + + //公告标题 + if(Validator.isNotEmpty(sysNotice.getNoticeTitle())){ + queryWrapper.eq(SysNotice::getNoticeTitle,sysNotice.getNoticeTitle()); + } + + //公告类型sys_notice_type字典(1通知 2公告) + if(Validator.isNotEmpty(sysNotice.getNoticeType())){ + queryWrapper.eq(SysNotice::getNoticeType,sysNotice.getNoticeType()); + } + + //公告内容 + if(Validator.isNotEmpty(sysNotice.getNoticeContent())){ + queryWrapper.eq(SysNotice::getNoticeContent,sysNotice.getNoticeContent()); + } + + //公告状态(0正常 1关闭) + if(Validator.isNotEmpty(sysNotice.getStatus())){ + queryWrapper.eq(SysNotice::getStatus,sysNotice.getStatus()); + } + + //阅读状态(0未阅读 1已阅读) + if(Validator.isNotEmpty(sysNotice.getReadStatus())){ + queryWrapper.eq(SysNotice::getReadStatus,sysNotice.getReadStatus()); + } + + //查看人 + if(sysNotice.getReadUser()!=null){ + queryWrapper.eq(SysNotice::getReadUser,sysNotice.getReadUser()); + } + + //删除标志(0代表存在 2代表删除) + if(Validator.isNotEmpty(sysNotice.getDelFlag())){ + queryWrapper.eq(SysNotice::getDelFlag,sysNotice.getDelFlag()); + } + + + //创建人 + if(sysNotice.getCreateBy()!=null){ + queryWrapper.eq(SysNotice::getCreateBy,sysNotice.getCreateBy()); + } + + } + +} diff --git a/bs-admin/src/main/java/com/bs/web/controller/system/SysPostController.java b/bs-admin/src/main/java/com/bs/web/controller/system/SysPostController.java new file mode 100644 index 0000000..a22dd77 --- /dev/null +++ b/bs-admin/src/main/java/com/bs/web/controller/system/SysPostController.java @@ -0,0 +1,129 @@ +package com.bs.web.controller.system; + +import java.util.List; +import javax.servlet.http.HttpServletResponse; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.bs.common.annotation.Log; +import com.bs.common.core.controller.BaseController; +import com.bs.common.core.domain.AjaxResult; +import com.bs.common.core.page.TableDataInfo; +import com.bs.common.enums.BusinessType; +import com.bs.common.utils.poi.ExcelUtil; +import com.bs.system.domain.SysPost; +import com.bs.system.service.ISysPostService; + +/** + * 岗位信息操作处理 + * + * @author bs + */ +@RestController +@RequestMapping("/system/post") +public class SysPostController extends BaseController +{ + @Autowired + private ISysPostService postService; + + /** + * 获取岗位列表 + */ + @PreAuthorize("@ss.hasPermi('system:post:list')") + @GetMapping("/list") + public TableDataInfo list(SysPost post) + { + startPage(); + List list = postService.selectPostList(post); + return getDataTable(list); + } + + @Log(title = "岗位管理", businessType = BusinessType.EXPORT) + @PreAuthorize("@ss.hasPermi('system:post:export')") + @PostMapping("/export") + public void export(HttpServletResponse response, SysPost post) + { + List list = postService.selectPostList(post); + ExcelUtil util = new ExcelUtil(SysPost.class); + util.exportExcel(response, list, "岗位数据"); + } + + /** + * 根据岗位编号获取详细信息 + */ + @PreAuthorize("@ss.hasPermi('system:post:query')") + @GetMapping(value = "/{postId}") + public AjaxResult getInfo(@PathVariable Long postId) + { + return success(postService.selectPostById(postId)); + } + + /** + * 新增岗位 + */ + @PreAuthorize("@ss.hasPermi('system:post:add')") + @Log(title = "岗位管理", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@Validated @RequestBody SysPost post) + { + if (!postService.checkPostNameUnique(post)) + { + return error("新增岗位'" + post.getPostName() + "'失败,岗位名称已存在"); + } + else if (!postService.checkPostCodeUnique(post)) + { + return error("新增岗位'" + post.getPostName() + "'失败,岗位编码已存在"); + } + post.setCreateBy(getUsername()); + return toAjax(postService.insertPost(post)); + } + + /** + * 修改岗位 + */ + @PreAuthorize("@ss.hasPermi('system:post:edit')") + @Log(title = "岗位管理", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@Validated @RequestBody SysPost post) + { + if (!postService.checkPostNameUnique(post)) + { + return error("修改岗位'" + post.getPostName() + "'失败,岗位名称已存在"); + } + else if (!postService.checkPostCodeUnique(post)) + { + return error("修改岗位'" + post.getPostName() + "'失败,岗位编码已存在"); + } + post.setUpdateBy(getUsername()); + return toAjax(postService.updatePost(post)); + } + + /** + * 删除岗位 + */ + @PreAuthorize("@ss.hasPermi('system:post:remove')") + @Log(title = "岗位管理", businessType = BusinessType.DELETE) + @DeleteMapping("/{postIds}") + public AjaxResult remove(@PathVariable Long[] postIds) + { + return toAjax(postService.deletePostByIds(postIds)); + } + + /** + * 获取岗位选择框列表 + */ + @GetMapping("/optionselect") + public AjaxResult optionselect() + { + List posts = postService.selectPostAll(); + return success(posts); + } +} diff --git a/bs-admin/src/main/java/com/bs/web/controller/system/SysProfileController.java b/bs-admin/src/main/java/com/bs/web/controller/system/SysProfileController.java new file mode 100644 index 0000000..a1410d7 --- /dev/null +++ b/bs-admin/src/main/java/com/bs/web/controller/system/SysProfileController.java @@ -0,0 +1,147 @@ +package com.bs.web.controller.system; + +import cn.hutool.core.lang.Validator; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.bs.common.annotation.Log; +import com.bs.common.config.BsConfig; +import com.bs.common.core.controller.BaseController; +import com.bs.common.core.domain.AjaxResult; +import com.bs.common.core.domain.entity.SysTenant; +import com.bs.common.core.domain.entity.SysUser; +import com.bs.common.core.domain.model.LoginUser; +import com.bs.common.enums.BusinessType; +import com.bs.common.utils.SecurityUtils; +import com.bs.common.utils.file.FileUploadUtils; +import com.bs.common.utils.file.MimeTypeUtils; +import com.bs.framework.web.service.TokenService; +import com.bs.system.service.ISysUserService; +import com.bs.system.service.SysTenantService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +/** + * 个人信息 业务处理 + * + * @author bs + */ +@RestController +@RequestMapping("/system/user/profile") +public class SysProfileController extends BaseController +{ + @Autowired + private ISysUserService userService; + @Autowired + private SysTenantService sysTenantService; + + @Autowired + private TokenService tokenService; + + /** + * 个人信息 + */ + @GetMapping + public AjaxResult profile() + { + LoginUser loginUser = getLoginUser(); + SysUser user = loginUser.getUser(); + AjaxResult ajax = AjaxResult.success(user); + ajax.put("roleGroup", userService.selectUserRoleGroup(loginUser.getUsername())); + ajax.put("postGroup", userService.selectUserPostGroup(loginUser.getUsername())); + return ajax; + } + + /** + * 修改用户 + */ + @Log(title = "个人信息", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult updateProfile(@RequestBody SysUser user) + { + LoginUser loginUser = getLoginUser(); + SysUser sysUser = loginUser.getUser(); + user.setUserName(sysUser.getUserName()); + if (Validator.isNotEmpty(user.getPhonenumber()) && !userService.checkPhoneUnique(user)) + { + return error("修改用户'" + user.getUserName() + "'失败,手机号码已存在"); + } + if (Validator.isNotEmpty(user.getEmail()) && !userService.checkEmailUnique(user)) + { + return error("修改用户'" + user.getUserName() + "'失败,邮箱账号已存在"); + } + user.setUserId(sysUser.getUserId()); + user.setPassword(null); + user.setAvatar(null); + user.setDeptId(null); + if (userService.updateUserProfile(user) > 0) + { + // 更新缓存用户信息 + sysUser.setNickName(user.getNickName()); + sysUser.setPhonenumber(user.getPhonenumber()); + sysUser.setEmail(user.getEmail()); + sysUser.setSex(user.getSex()); + tokenService.setLoginUser(loginUser); + return success(); + } + return error("修改个人信息异常,请联系管理员"); + } + + /** + * 重置密码 + */ + @Log(title = "个人信息", businessType = BusinessType.UPDATE) + @PutMapping("/updatePwd") + public AjaxResult updatePwd(String oldPassword, String newPassword) + { + LoginUser loginUser = getLoginUser(); + String userName = loginUser.getUsername(); + String password = loginUser.getPassword(); + if (!SecurityUtils.matchesPassword(oldPassword, password)) + { + return error("修改密码失败,旧密码错误"); + } + if (SecurityUtils.matchesPassword(newPassword, password)) + { + return error("新密码不能与旧密码相同"); + } + if (userService.resetUserPwd(userName, SecurityUtils.encryptPassword(newPassword)) > 0) + { + SysUser user = userService.getOne(new LambdaQueryWrapper().eq(SysUser::getUserName, userName)); + //如果是租户管理员,密码写一份到租户信息 + if(user.getIsTenantAdmin().equals("Y")){ + SysTenant sysTenant = sysTenantService.getById(user.getTenantId()); + sysTenant.setPassword(newPassword); + sysTenantService.updateById(sysTenant); + } + // 更新缓存用户密码 + loginUser.getUser().setPassword(SecurityUtils.encryptPassword(newPassword)); + tokenService.setLoginUser(loginUser); + return success(); + } + return error("修改密码异常,请联系管理员"); + } + + /** + * 头像上传 + */ + @Log(title = "用户头像", businessType = BusinessType.UPDATE) + @PostMapping("/avatar") + public AjaxResult avatar(@RequestParam("avatarfile") MultipartFile file) throws Exception + { + if (!file.isEmpty()) + { + LoginUser loginUser = getLoginUser(); + String avatar = FileUploadUtils.upload(BsConfig.getAvatarPath(), file, MimeTypeUtils.IMAGE_EXTENSION); + if (userService.updateUserAvatar(loginUser.getUsername(), avatar)) + { + AjaxResult ajax = AjaxResult.success(); + ajax.put("imgUrl", avatar); + // 更新缓存用户头像 + loginUser.getUser().setAvatar(avatar); + tokenService.setLoginUser(loginUser); + return ajax; + } + } + return error("上传图片异常,请联系管理员"); + } +} diff --git a/bs-admin/src/main/java/com/bs/web/controller/system/SysRegisterController.java b/bs-admin/src/main/java/com/bs/web/controller/system/SysRegisterController.java new file mode 100644 index 0000000..bd524c6 --- /dev/null +++ b/bs-admin/src/main/java/com/bs/web/controller/system/SysRegisterController.java @@ -0,0 +1,38 @@ +package com.bs.web.controller.system; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; +import com.bs.common.core.controller.BaseController; +import com.bs.common.core.domain.AjaxResult; +import com.bs.common.core.domain.model.RegisterBody; +import com.bs.common.utils.StringUtils; +import com.bs.framework.web.service.SysRegisterService; +import com.bs.system.service.ISysConfigService; + +/** + * 注册验证 + * + * @author bs + */ +@RestController +public class SysRegisterController extends BaseController +{ + @Autowired + private SysRegisterService registerService; + + @Autowired + private ISysConfigService configService; + + @PostMapping("/register") + public AjaxResult register(@RequestBody RegisterBody user) + { + if (!("true".equals(configService.selectConfigByKey("sys.account.registerUser")))) + { + return error("当前系统没有开启注册功能!"); + } + String msg = registerService.register(user); + return StringUtils.isEmpty(msg) ? success() : error(msg); + } +} diff --git a/bs-admin/src/main/java/com/bs/web/controller/system/SysRoleController.java b/bs-admin/src/main/java/com/bs/web/controller/system/SysRoleController.java new file mode 100644 index 0000000..948e240 --- /dev/null +++ b/bs-admin/src/main/java/com/bs/web/controller/system/SysRoleController.java @@ -0,0 +1,262 @@ +package com.bs.web.controller.system; + +import java.util.List; +import javax.servlet.http.HttpServletResponse; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.bs.common.annotation.Log; +import com.bs.common.core.controller.BaseController; +import com.bs.common.core.domain.AjaxResult; +import com.bs.common.core.domain.entity.SysDept; +import com.bs.common.core.domain.entity.SysRole; +import com.bs.common.core.domain.entity.SysUser; +import com.bs.common.core.domain.model.LoginUser; +import com.bs.common.core.page.TableDataInfo; +import com.bs.common.enums.BusinessType; +import com.bs.common.utils.StringUtils; +import com.bs.common.utils.poi.ExcelUtil; +import com.bs.framework.web.service.SysPermissionService; +import com.bs.framework.web.service.TokenService; +import com.bs.system.domain.SysUserRole; +import com.bs.system.service.ISysDeptService; +import com.bs.system.service.ISysRoleService; +import com.bs.system.service.ISysUserService; + +/** + * 角色信息 + * + * @author bs + */ +@RestController +@RequestMapping("/system/role") +public class SysRoleController extends BaseController +{ + @Autowired + private ISysRoleService roleService; + + @Autowired + private TokenService tokenService; + + @Autowired + private SysPermissionService permissionService; + + @Autowired + private ISysUserService userService; + + @Autowired + private ISysDeptService deptService; + + @PreAuthorize("@ss.hasPermi('system:role:list')") + @GetMapping("/list") + public TableDataInfo list(SysRole role) + { + startPage(); + List list = roleService.selectRoleList(role); + return getDataTable(list); + } + + @Log(title = "角色管理", businessType = BusinessType.EXPORT) + @PreAuthorize("@ss.hasPermi('system:role:export')") + @PostMapping("/export") + public void export(HttpServletResponse response, SysRole role) + { + List list = roleService.selectRoleList(role); + ExcelUtil util = new ExcelUtil(SysRole.class); + util.exportExcel(response, list, "角色数据"); + } + + /** + * 根据角色编号获取详细信息 + */ + @PreAuthorize("@ss.hasPermi('system:role:query')") + @GetMapping(value = "/{roleId}") + public AjaxResult getInfo(@PathVariable Long roleId) + { + roleService.checkRoleDataScope(roleId); + return success(roleService.selectRoleById(roleId)); + } + + /** + * 新增角色 + */ + @PreAuthorize("@ss.hasPermi('system:role:add')") + @Log(title = "角色管理", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@Validated @RequestBody SysRole role) + { + if (!roleService.checkRoleNameUnique(role)) + { + return error("新增角色'" + role.getRoleName() + "'失败,角色名称已存在"); + } + else if (!roleService.checkRoleKeyUnique(role)) + { + return error("新增角色'" + role.getRoleName() + "'失败,角色权限已存在"); + } + role.setCreateBy(getUsername()); + return toAjax(roleService.insertRole(role)); + + } + + /** + * 修改保存角色 + */ + @PreAuthorize("@ss.hasPermi('system:role:edit')") + @Log(title = "角色管理", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@Validated @RequestBody SysRole role) + { + roleService.checkRoleAllowed(role); + roleService.checkRoleDataScope(role.getRoleId()); + if (!roleService.checkRoleNameUnique(role)) + { + return error("修改角色'" + role.getRoleName() + "'失败,角色名称已存在"); + } + else if (!roleService.checkRoleKeyUnique(role)) + { + return error("修改角色'" + role.getRoleName() + "'失败,角色权限已存在"); + } + role.setUpdateBy(getUsername()); + + if (roleService.updateRole(role) > 0) + { + // 更新缓存用户权限 + LoginUser loginUser = getLoginUser(); + if (StringUtils.isNotNull(loginUser.getUser()) && !loginUser.getUser().isAdmin()) + { + loginUser.setPermissions(permissionService.getMenuPermission(loginUser.getUser())); + loginUser.setUser(userService.selectUserByUserName(loginUser.getUser().getUserName())); + tokenService.setLoginUser(loginUser); + } + return success(); + } + return error("修改角色'" + role.getRoleName() + "'失败,请联系管理员"); + } + + /** + * 修改保存数据权限 + */ + @PreAuthorize("@ss.hasPermi('system:role:edit')") + @Log(title = "角色管理", businessType = BusinessType.UPDATE) + @PutMapping("/dataScope") + public AjaxResult dataScope(@RequestBody SysRole role) + { + roleService.checkRoleAllowed(role); + roleService.checkRoleDataScope(role.getRoleId()); + return toAjax(roleService.authDataScope(role)); + } + + /** + * 状态修改 + */ + @PreAuthorize("@ss.hasPermi('system:role:edit')") + @Log(title = "角色管理", businessType = BusinessType.UPDATE) + @PutMapping("/changeStatus") + public AjaxResult changeStatus(@RequestBody SysRole role) + { + roleService.checkRoleAllowed(role); + roleService.checkRoleDataScope(role.getRoleId()); + role.setUpdateBy(getUsername()); + return toAjax(roleService.updateRoleStatus(role)); + } + + /** + * 删除角色 + */ + @PreAuthorize("@ss.hasPermi('system:role:remove')") + @Log(title = "角色管理", businessType = BusinessType.DELETE) + @DeleteMapping("/{roleIds}") + public AjaxResult remove(@PathVariable Long[] roleIds) + { + return toAjax(roleService.deleteRoleByIds(roleIds)); + } + + /** + * 获取角色选择框列表 + */ + @PreAuthorize("@ss.hasPermi('system:role:query')") + @GetMapping("/optionselect") + public AjaxResult optionselect() + { + return success(roleService.selectRoleAll()); + } + + /** + * 查询已分配用户角色列表 + */ + @PreAuthorize("@ss.hasPermi('system:role:list')") + @GetMapping("/authUser/allocatedList") + public TableDataInfo allocatedList(SysUser user) + { + startPage(); + List list = userService.selectAllocatedList(user); + return getDataTable(list); + } + + /** + * 查询未分配用户角色列表 + */ + @PreAuthorize("@ss.hasPermi('system:role:list')") + @GetMapping("/authUser/unallocatedList") + public TableDataInfo unallocatedList(SysUser user) + { + startPage(); + List list = userService.selectUnallocatedList(user); + return getDataTable(list); + } + + /** + * 取消授权用户 + */ + @PreAuthorize("@ss.hasPermi('system:role:edit')") + @Log(title = "角色管理", businessType = BusinessType.GRANT) + @PutMapping("/authUser/cancel") + public AjaxResult cancelAuthUser(@RequestBody SysUserRole userRole) + { + return toAjax(roleService.deleteAuthUser(userRole)); + } + + /** + * 批量取消授权用户 + */ + @PreAuthorize("@ss.hasPermi('system:role:edit')") + @Log(title = "角色管理", businessType = BusinessType.GRANT) + @PutMapping("/authUser/cancelAll") + public AjaxResult cancelAuthUserAll(Long roleId, Long[] userIds) + { + return toAjax(roleService.deleteAuthUsers(roleId, userIds)); + } + + /** + * 批量选择用户授权 + */ + @PreAuthorize("@ss.hasPermi('system:role:edit')") + @Log(title = "角色管理", businessType = BusinessType.GRANT) + @PutMapping("/authUser/selectAll") + public AjaxResult selectAuthUserAll(Long roleId, Long[] userIds) + { + roleService.checkRoleDataScope(roleId); + return toAjax(roleService.insertAuthUsers(roleId, userIds)); + } + + /** + * 获取对应角色部门树列表 + */ + @PreAuthorize("@ss.hasPermi('system:role:query')") + @GetMapping(value = "/deptTree/{roleId}") + public AjaxResult deptTree(@PathVariable("roleId") Long roleId) + { + AjaxResult ajax = AjaxResult.success(); + ajax.put("checkedKeys", deptService.selectDeptListByRoleId(roleId)); + ajax.put("depts", deptService.selectDeptTreeList(new SysDept())); + return ajax; + } +} diff --git a/bs-admin/src/main/java/com/bs/web/controller/system/SysTenantController.java b/bs-admin/src/main/java/com/bs/web/controller/system/SysTenantController.java new file mode 100644 index 0000000..f607b28 --- /dev/null +++ b/bs-admin/src/main/java/com/bs/web/controller/system/SysTenantController.java @@ -0,0 +1,335 @@ +package com.bs.web.controller.system; + +import cn.hutool.core.lang.Validator; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.bs.common.annotation.Log; +import com.bs.common.core.controller.BaseController; +import com.bs.common.core.domain.AjaxResult; +import com.bs.common.core.domain.entity.SysDept; +import com.bs.common.core.domain.entity.SysTenant; +import com.bs.common.core.domain.entity.SysUser; +import com.bs.common.core.page.TableDataInfo; +import com.bs.common.enums.BusinessType; +import com.bs.common.utils.SecurityUtils; +import com.bs.common.utils.poi.ExcelUtil; +import com.bs.system.domain.SysPost; +import com.bs.system.domain.SysUserRole; +import com.bs.system.mapper.SysDeptMapper; +import com.bs.system.mapper.SysPostMapper; +import com.bs.system.mapper.SysUserMapper; +import com.bs.system.mapper.SysUserRoleMapper; +import com.bs.system.service.ISysUserService; +import com.bs.system.service.SysTenantService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 租户信息Controller + * + * @author bs + * @date 2024-02-22 + */ +@Api(tags = "租户信息") +@RestController +@RequestMapping("/system/tenant") +public class SysTenantController extends BaseController { + @Resource + private SysTenantService sysTenantService; + @Autowired + private ISysUserService userService; + + @Autowired + private SysUserMapper userMapper; + @Autowired + private SysUserRoleMapper sysUserRoleMapper; + + @Autowired + private SysDeptMapper deptMapper; + + @Autowired + private SysPostMapper postMapepr; + + /** + * 分页查询租户信息列表 + */ + @ApiOperation("分页查询租户信息列表") + @GetMapping("/pageList") + public TableDataInfo pageList(SysTenant sysTenant) { + startPage(); + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper(); + condition(queryWrapper, sysTenant); + List list = sysTenantService.list(queryWrapper); + return getDataTable(list); + } + + /** + * 查询租户信息列表 + */ + @ApiOperation("查询租户信息列表") + @GetMapping("/list") + public AjaxResult list(SysTenant sysTenant) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper(); + condition(queryWrapper, sysTenant); + List list = sysTenantService.list(queryWrapper); + return success(list); + } + + /** + * 导出租户信息列表 + */ + @ApiOperation("导出租户信息列表") + @Log(title = "租户信息导出", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, SysTenant sysTenant) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper(); + condition(queryWrapper, sysTenant); + List list = sysTenantService.list(queryWrapper); + ExcelUtil util = new ExcelUtil(SysTenant.class); + util.exportExcel(response, list, "租户信息数据"); + } + + /** + * 获取租户信息详细信息 + */ + @ApiOperation("获取租户信息详细信息") + @GetMapping(value = "/{id}") + public AjaxResult getInfo(@PathVariable("id") Long id) { + final SysTenant sysTenant = sysTenantService.getById(id); + SysUser sysUser = userMapper.selectTenantAdmin(sysTenant.getId()); + final List sysUserRoles = sysUserRoleMapper.selectList(new LambdaQueryWrapper().eq(SysUserRole::getUserId, sysUser.getUserId())); + final List roleIds = sysUserRoles.stream().map(SysUserRole::getRoleId).collect(Collectors.toList()); + sysTenant.setRoleIds(roleIds); + return success(sysTenant); + } + + /** + * 新增租户信息 + */ + @ApiOperation("新增租户信息") + @Log(title = "租户信息新增", businessType = BusinessType.INSERT) + @PostMapping + @Transactional(rollbackFor = Exception.class) + public AjaxResult add(@RequestBody SysTenant sysTenant) { + //新增租户的时候,进行租户管理员账号的添加 + sysTenantService.save(sysTenant); + SysUser user = new SysUser(); + user.setNickName(sysTenant.getName() + "管理员"); + user.setUserName(sysTenant.getUserName()); + user.setPassword(sysTenant.getPassword()); + user.setStatus("0"); + user.setIsTenant("Y"); + user.setIsTenantAdmin("Y"); + user.setPhonenumber(sysTenant.getContactPhone()); + if (!userService.checkUserNameUnique(user)) { + return error("新增用户'" + user.getUserName() + "'失败,登录账号已存在"); + } + if (Validator.isNotEmpty(user.getPhonenumber()) && !userService.checkPhoneUnique(user)) { + return error("新增用户'" + user.getUserName() + "'失败,手机号码已存在"); + } + user.setCreateBy(getUsername()); + user.setPassword(SecurityUtils.encryptPassword(user.getPassword())); + user.setTenantId(sysTenant.getId()); + + initTenantDate(user); + userMapper.insert(user); + List userRoles = new ArrayList<>(); + sysTenant.getRoleIds().forEach(roleId -> { + SysUserRole sysUserRole = new SysUserRole(); + sysUserRole.setUserId(user.getUserId()); + sysUserRole.setRoleId(roleId); + userRoles.add(sysUserRole); + }); + sysUserRoleMapper.insertBatch(userRoles); + return success("添加成功"); + } + + /** + * 初始化租户的数据 + * 新建部门,复制一份基础租户的角色,配置给admin + * 复制一份字典给租户 + */ + public void initTenantDate(SysUser user) { + //查询 sys_dept 表,租户id为空的,复制一份 + //初始化部门 + SysDept parentsysDepts = new SysDept(); + parentsysDepts.setParentId(0L); + parentsysDepts.setDeptName("总公司"); + parentsysDepts.setOrderNum(0); + parentsysDepts.setAncestors("0"); + parentsysDepts.setLeader("admin"); + parentsysDepts.setPhone("15888888888"); + parentsysDepts.setEmail("zgs@qq.com"); + parentsysDepts.setTenantId(user.getTenantId()); + deptMapper.insert(parentsysDepts); + SysDept sonSysDepts = new SysDept(); + sonSysDepts.setParentId(parentsysDepts.getDeptId()); + sonSysDepts.setDeptName("福建分公司"); + sonSysDepts.setOrderNum(1); + //祖辈id列表 + sonSysDepts.setAncestors("0," + parentsysDepts.getDeptId()); + sonSysDepts.setLeader("admin"); + sonSysDepts.setPhone("15888888888"); + sonSysDepts.setEmail("zgs@qq.com"); + sonSysDepts.setTenantId(user.getTenantId()); + deptMapper.insert(sonSysDepts); + //初始化岗位 + List sysPosts = postMapepr.selectList(new LambdaQueryWrapper().eq(SysPost::getDelFlag, "0").eq(SysPost::getTenantId, "0")); + sysPosts.forEach(ele -> { + ele.setTenantId(user.getTenantId()); + ele.setPostId(null); + }); + postMapepr.insertBatch(sysPosts); + //最高部门 + user.setDeptId(parentsysDepts.getDeptId()); + //ceo + Long[] postIds = new Long[1]; + sysPosts.forEach(ele -> { + if (ele.getPostCode().equals("ceo")) { + postIds[0] = ele.getPostId(); + } + }); + user.setPostIds(postIds); + } + + + /** + * 修改租户信息 + */ + @ApiOperation("修改租户信息") + @Log(title = "租户信息修改", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody SysTenant sysTenant) { + //修改租户,判断密码是否有更换,如有更换进行修改用户密码 + SysTenant tenant = sysTenantService.getById(sysTenant.getId()); + SysUser user = userMapper.selectTenantAdmin(sysTenant.getId()); + if (!tenant.getPassword().equals(sysTenant.getPassword()) || !tenant.getUserName().equals(sysTenant.getUserName())) { + + user.setPassword(SecurityUtils.encryptPassword(sysTenant.getPassword())); + user.setUserName(sysTenant.getUserName()); + userService.resetPwd(user); + } + //修改租户的角色信息 + sysUserRoleMapper.delete(new LambdaUpdateWrapper().eq(SysUserRole::getUserId, user.getUserId())); + List userRoles = new ArrayList<>(); + sysTenant.getRoleIds().forEach(roleId -> { + SysUserRole sysUserRole = new SysUserRole(); + sysUserRole.setUserId(user.getUserId()); + sysUserRole.setRoleId(roleId); + userRoles.add(sysUserRole); + }); + if(userRoles.size()>0){ + sysUserRoleMapper.insertBatch(userRoles); + } + return toAjax(sysTenantService.updateById(sysTenant)); + } + + /** + * 删除租户信息 + */ + @ApiOperation("删除租户信息") + @Log(title = "租户信息删除", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public AjaxResult remove(@PathVariable List ids) { + return toAjax(sysTenantService.removeBatchByIds(ids)); + } + + /** + * 条件设置 + */ + private void condition(LambdaQueryWrapper queryWrapper, SysTenant sysTenant) { + + + //用户ID + if (Validator.isNotEmpty(sysTenant.getId())) { + queryWrapper.eq(SysTenant::getId, sysTenant.getId()); + } + + //租户名 + if (Validator.isNotEmpty(sysTenant.getName())) { + queryWrapper.eq(SysTenant::getName, sysTenant.getName()); + } + + //租户简名 + if (Validator.isNotEmpty(sysTenant.getSimpleName())) { + queryWrapper.eq(SysTenant::getSimpleName, sysTenant.getSimpleName()); + } + + //行政区划 + if (Validator.isNotEmpty(sysTenant.getAreaCode())) { + queryWrapper.eq(SysTenant::getAreaCode, sysTenant.getAreaCode()); + } + + + //租户密码 + if (Validator.isNotEmpty(sysTenant.getPassword())) { + queryWrapper.eq(SysTenant::getPassword, sysTenant.getPassword()); + } + + //租户账号 + if (Validator.isNotEmpty(sysTenant.getUserName())) { + queryWrapper.eq(SysTenant::getUserName, sysTenant.getUserName()); + } + + //联系人 + if (Validator.isNotEmpty(sysTenant.getContactUser())) { + queryWrapper.eq(SysTenant::getContactUser, sysTenant.getContactUser()); + } + + //联系电话 + if (Validator.isNotEmpty(sysTenant.getContactPhone())) { + queryWrapper.eq(SysTenant::getContactPhone, sysTenant.getContactPhone()); + } + + //状态,启用1,禁用0,即将过期2 + if (Validator.isNotEmpty(sysTenant.getStatus())) { + queryWrapper.eq(SysTenant::getStatus, sysTenant.getStatus()); + } + + //创建部门 + if (Validator.isNotEmpty(sysTenant.getCreateDept())) { + queryWrapper.eq(SysTenant::getCreateDept, sysTenant.getCreateDept()); + } + + //创建人 + if (Validator.isNotEmpty(sysTenant.getCreateBy())) { + queryWrapper.eq(SysTenant::getCreateBy, sysTenant.getCreateBy()); + } + + //创建时间 + if (Validator.isNotEmpty(sysTenant.getCreateTime())) { + queryWrapper.eq(SysTenant::getCreateTime, sysTenant.getCreateTime()); + } + + //修改人 + if (Validator.isNotEmpty(sysTenant.getUpdateBy())) { + queryWrapper.eq(SysTenant::getUpdateBy, sysTenant.getUpdateBy()); + } + + //修改时间 + if (Validator.isNotEmpty(sysTenant.getUpdateTime())) { + queryWrapper.eq(SysTenant::getUpdateTime, sysTenant.getUpdateTime()); + } + + //备注 + if (Validator.isNotEmpty(sysTenant.getRemark())) { + queryWrapper.eq(SysTenant::getRemark, sysTenant.getRemark()); + } + + //删除标志(0代表存在 2代表删除) + if (Validator.isNotEmpty(sysTenant.getDelFlag())) { + queryWrapper.eq(SysTenant::getDelFlag, sysTenant.getDelFlag()); + } + + } + +} diff --git a/bs-admin/src/main/java/com/bs/web/controller/system/SysUserController.java b/bs-admin/src/main/java/com/bs/web/controller/system/SysUserController.java new file mode 100644 index 0000000..c9a00ec --- /dev/null +++ b/bs-admin/src/main/java/com/bs/web/controller/system/SysUserController.java @@ -0,0 +1,239 @@ +package com.bs.web.controller.system; + +import cn.hutool.core.lang.Validator; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.bs.common.annotation.Log; +import com.bs.common.core.controller.BaseController; +import com.bs.common.core.domain.AjaxResult; +import com.bs.common.core.domain.entity.SysDept; +import com.bs.common.core.domain.entity.SysRole; +import com.bs.common.core.domain.entity.SysUser; +import com.bs.common.core.page.TableDataInfo; +import com.bs.common.enums.BusinessType; +import com.bs.common.utils.SecurityUtils; +import com.bs.common.utils.StringUtils; +import com.bs.common.utils.poi.ExcelUtil; +import com.bs.system.domain.SysUserRole; +import com.bs.system.mapper.SysUserRoleMapper; +import com.bs.system.service.ISysDeptService; +import com.bs.system.service.ISysPostService; +import com.bs.system.service.ISysRoleService; +import com.bs.system.service.ISysUserService; +import org.apache.commons.lang3.ArrayUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 用户信息 + * + * @author bs + */ +@RestController +@RequestMapping("/system/user") +public class SysUserController extends BaseController { + @Autowired + private ISysUserService userService; + + @Autowired + private ISysRoleService roleService; + + @Autowired + private SysUserRoleMapper sysUserRoleMapper; + + @Autowired + private ISysDeptService deptService; + + @Autowired + private ISysPostService postService; + + /** + * 获取用户列表 + */ + @PreAuthorize("@ss.hasPermi('system:user:list')") + @GetMapping("/list") + public TableDataInfo list(SysUser user) { + startPage(); + List list = userService.selectUserList(user); + return getDataTable(list); + } + + @Log(title = "用户管理", businessType = BusinessType.EXPORT) + @PreAuthorize("@ss.hasPermi('system:user:export')") + @PostMapping("/export") + public void export(HttpServletResponse response, SysUser user) { + List list = userService.selectUserList(user); + ExcelUtil util = new ExcelUtil(SysUser.class); + util.exportExcel(response, list, "用户数据"); + } + + @Log(title = "用户管理", businessType = BusinessType.IMPORT) + @PreAuthorize("@ss.hasPermi('system:user:import')") + @PostMapping("/importData") + public AjaxResult importData(MultipartFile file, boolean updateSupport) throws Exception { + ExcelUtil util = new ExcelUtil(SysUser.class); + List userList = util.importExcel(file.getInputStream()); + Long operName = getUsername(); + String message = userService.importUser(userList, updateSupport, operName); + return success(message); + } + + @PostMapping("/importTemplate") + public void importTemplate(HttpServletResponse response) { + ExcelUtil util = new ExcelUtil(SysUser.class); + util.importTemplateExcel(response, "用户数据"); + } + + /** + * 根据用户编号获取详细信息 + */ + @PreAuthorize("@ss.hasPermi('system:user:query')") + @GetMapping(value = {"/", "/{userId}"}) + public AjaxResult getInfo(@PathVariable(value = "userId", required = false) Long userId) { + userService.checkUserDataScope(userId); + AjaxResult ajax = AjaxResult.success(); + List roles = roleService.selectRoleAll(); + ajax.put("roles", SysUser.isAdmin(userId) ? roles : roles.stream().filter(r -> !r.isAdmin()).collect(Collectors.toList())); + ajax.put("posts", postService.selectPostAll()); + if (StringUtils.isNotNull(userId)) { + SysUser sysUser = userService.selectUserById(userId); + final List sysUserRoles = sysUserRoleMapper.selectList(new LambdaQueryWrapper().eq(SysUserRole::getUserId, userId)); + ajax.put(AjaxResult.DATA_TAG, sysUser); + ajax.put("postIds", postService.selectPostListByUserId(userId)); + ajax.put("roleIds", sysUserRoles.stream().map(SysUserRole::getRoleId).collect(Collectors.toList())); + } + return ajax; + } + + + /** + 获取所有非admin角色,用于租户配置 + */ + @GetMapping("/getRoles") + public AjaxResult getRoles() { + List roles = roleService.selectRoleAll(); + return AjaxResult.success().put("roles", roles.stream().filter(r -> !r.isAdmin()).collect(Collectors.toList())); + } + + /** + * 新增用户 + */ + @PreAuthorize("@ss.hasPermi('system:user:add')") + @Log(title = "用户管理", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@Validated @RequestBody SysUser user) { + if (!userService.checkUserNameUnique(user)) { + return error("新增用户'" + user.getUserName() + "'失败,登录账号已存在"); + } else if (Validator.isNotEmpty(user.getPhonenumber()) && !userService.checkPhoneUnique(user)) { + return error("新增用户'" + user.getUserName() + "'失败,手机号码已存在"); + } else if (Validator.isNotEmpty(user.getEmail()) && !userService.checkEmailUnique(user)) { + return error("新增用户'" + user.getUserName() + "'失败,邮箱账号已存在"); + } + user.setIsTenant(SecurityUtils.getLoginUser().getIsTenant()); + user.setIsTenantAdmin("N"); + user.setCreateBy(getUsername()); + user.setPassword(SecurityUtils.encryptPassword(user.getPassword())); + return toAjax(userService.insertUser(user)); + } + + /** + * 修改用户 + */ + @PreAuthorize("@ss.hasPermi('system:user:edit')") + @Log(title = "用户管理", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@Validated @RequestBody SysUser user) { + userService.checkUserAllowed(user); + userService.checkUserDataScope(user.getUserId()); + if (!userService.checkUserNameUnique(user)) { + return error("修改用户'" + user.getUserName() + "'失败,登录账号已存在"); + } else if (Validator.isNotEmpty(user.getPhonenumber()) && !userService.checkPhoneUnique(user)) { + return error("修改用户'" + user.getUserName() + "'失败,手机号码已存在"); + } else if (Validator.isNotEmpty(user.getEmail()) && !userService.checkEmailUnique(user)) { + return error("修改用户'" + user.getUserName() + "'失败,邮箱账号已存在"); + } + user.setUpdateBy(getUsername()); + return toAjax(userService.updateUser(user)); + } + + /** + * 删除用户 + */ + @PreAuthorize("@ss.hasPermi('system:user:remove')") + @Log(title = "用户管理", businessType = BusinessType.DELETE) + @DeleteMapping("/{userIds}") + public AjaxResult remove(@PathVariable Long[] userIds) { + if (ArrayUtils.contains(userIds, getUserId())) { + return error("当前用户不能删除"); + } + return toAjax(userService.deleteUserByIds(userIds)); + } + + /** + * 重置密码 + */ + @PreAuthorize("@ss.hasPermi('system:user:resetPwd')") + @Log(title = "用户管理", businessType = BusinessType.UPDATE) + @PutMapping("/resetPwd") + public AjaxResult resetPwd(@RequestBody SysUser user) { + userService.checkUserAllowed(user); + userService.checkUserDataScope(user.getUserId()); + user.setPassword(SecurityUtils.encryptPassword(user.getPassword())); + user.setUpdateBy(getUsername()); + return toAjax(userService.resetPwd(user)); + } + + /** + * 状态修改 + */ + @PreAuthorize("@ss.hasPermi('system:user:edit')") + @Log(title = "用户管理", businessType = BusinessType.UPDATE) + @PutMapping("/changeStatus") + public AjaxResult changeStatus(@RequestBody SysUser user) { + userService.checkUserAllowed(user); + userService.checkUserDataScope(user.getUserId()); + user.setUpdateBy(getUsername()); + return toAjax(userService.updateUserStatus(user)); + } + + /** + * 根据用户编号获取授权角色 + */ + @PreAuthorize("@ss.hasPermi('system:user:query')") + @GetMapping("/authRole/{userId}") + public AjaxResult authRole(@PathVariable("userId") Long userId) { + AjaxResult ajax = AjaxResult.success(); + SysUser user = userService.selectUserById(userId); + List roles = roleService.selectRolesByUserId(userId); + ajax.put("user", user); + ajax.put("roles", SysUser.isAdmin(userId) ? roles : roles.stream().filter(r -> !r.isAdmin()).collect(Collectors.toList())); + return ajax; + } + + /** + * 用户授权角色 + */ + @PreAuthorize("@ss.hasPermi('system:user:edit')") + @Log(title = "用户管理", businessType = BusinessType.GRANT) + @PutMapping("/authRole") + public AjaxResult insertAuthRole(Long userId, Long[] roleIds) { + userService.checkUserDataScope(userId); + userService.insertUserAuth(userId, roleIds); + return success(); + } + + /** + * 获取部门树列表 + */ + @PreAuthorize("@ss.hasPermi('system:user:list')") + @GetMapping("/deptTree") + public AjaxResult deptTree(SysDept dept) { + return success(deptService.selectDeptTreeList(dept)); + } +} diff --git a/bs-admin/src/main/java/com/bs/web/controller/system/TenantConfigController.java b/bs-admin/src/main/java/com/bs/web/controller/system/TenantConfigController.java new file mode 100644 index 0000000..aa4b542 --- /dev/null +++ b/bs-admin/src/main/java/com/bs/web/controller/system/TenantConfigController.java @@ -0,0 +1,231 @@ +package com.bs.web.controller.system; + +import cn.hutool.core.lang.Validator; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.bs.common.annotation.Log; +import com.bs.common.config.BsConfig; +import com.bs.common.core.controller.BaseController; +import com.bs.common.core.domain.AjaxResult; +import com.bs.common.core.domain.entity.TenantConfig; +import com.bs.common.core.page.TableDataInfo; +import com.bs.common.enums.BusinessType; +import com.bs.common.utils.file.FileUploadUtils; +import com.bs.common.utils.file.MimeTypeUtils; +import com.bs.common.utils.poi.ExcelUtil; +import com.bs.system.service.ITenantConfigService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; + +/** + * 租户配置Controller + * + * @author ruoyi + * @date 2023-04-02 + */ +@RestController +@RequestMapping("/tenant/config") +public class TenantConfigController extends BaseController { + @Autowired + private ITenantConfigService tenantConfigService; + + /** + * 分页查询租户配置列表 + */ + @PreAuthorize("@ss.hasPermi('tenant:config:pageList')") + @GetMapping("/pageList") + public TableDataInfo pageList(TenantConfig tenantConfig) { + startPage(); + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper(); + condition(queryWrapper, tenantConfig); + List list = tenantConfigService.list(queryWrapper); + return getDataTable(list); + } + + /** + * 查询租户配置列表 + */ + @PreAuthorize("@ss.hasPermi('tenant:config:list')") + @GetMapping("/list") + public AjaxResult list(TenantConfig tenantConfig) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper(); + condition(queryWrapper, tenantConfig); + List list = tenantConfigService.list(queryWrapper); + return success(list); + } + + /** + * 导出租户配置列表 + */ + @Log(title = "租户配置导出", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, TenantConfig tenantConfig) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper(); + condition(queryWrapper, tenantConfig); + List list = tenantConfigService.list(queryWrapper); + ExcelUtil util = new ExcelUtil(TenantConfig.class); + util.exportExcel(response, list, "租户配置数据"); + } + + /** + * 获取租户配置详细信息 + */ + @GetMapping(value = "/{id}") + public AjaxResult getInfo(@PathVariable("id") String id) { + TenantConfig tenantConfig = tenantConfigService.getById(id); + tenantConfig.setTenantId(tenantConfig.getId()) ; + return success(tenantConfig); + } + + /** + * 新增租户配置 + */ + @Log(title = "租户配置新增", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody TenantConfig tenantConfig) { + tenantConfig.setId(tenantConfig.getTenantId()) ; + return toAjax(tenantConfigService.save(tenantConfig)); + } + + /** + * 修改租户配置 + */ + @Log(title = "租户配置修改", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody TenantConfig tenantConfig) { + tenantConfig.setId(tenantConfig.getTenantId()) ; + return toAjax(tenantConfigService.updateById(tenantConfig)); + } + + /** + * 删除租户配置 + */ + @Log(title = "租户配置删除", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public AjaxResult remove(@PathVariable List ids) { + return toAjax(tenantConfigService.removeBatchByIds(ids)); + } + + /** + * 租户logo图片上传 + */ + @Log(title = "租户logo图片上传", businessType = BusinessType.UPDATE) + @PostMapping("/logo") + public AjaxResult avatar(@RequestParam("tenantLogo") MultipartFile file) throws Exception { + if (!file.isEmpty()) { + String logo = FileUploadUtils.upload(BsConfig.getUploadPath(), file, MimeTypeUtils.IMAGE_EXTENSION); + AjaxResult ajax = success(); + ajax.put("imgUrl", logo); + return ajax; + } + return error("上传图片异常,请联系管理员"); + } + + + + /** + * 条件设置 + */ + private void condition(LambdaQueryWrapper queryWrapper, TenantConfig tenantConfig) { + + + //${column.columnComment} + if (Validator.isNotEmpty(tenantConfig.getId())) { + queryWrapper.eq(TenantConfig::getId, tenantConfig.getId()); + } + + //开始时间 + if (tenantConfig.getStartData() != null) { + queryWrapper.eq(TenantConfig::getStartData, tenantConfig.getStartData()); + } + + //结束时间 + if (tenantConfig.getStopData() != null) { + queryWrapper.eq(TenantConfig::getStopData, tenantConfig.getStopData()); + } + + //是否限制用户数 + if (Validator.isNotEmpty(tenantConfig.getIsUserAstrict())) { + queryWrapper.eq(TenantConfig::getIsUserAstrict, tenantConfig.getIsUserAstrict()); + } + + //用户数 + if (tenantConfig.getUserQuantity() != null) { + queryWrapper.eq(TenantConfig::getUserQuantity, tenantConfig.getUserQuantity()); + } + + //是否限制在线数 + if (Validator.isNotEmpty(tenantConfig.getIsOnLine())) { + queryWrapper.eq(TenantConfig::getIsOnLine, tenantConfig.getIsOnLine()); + } + + //在线数 + if (tenantConfig.getOnLineUserQuantity() != null) { + queryWrapper.eq(TenantConfig::getOnLineUserQuantity, tenantConfig.getOnLineUserQuantity()); + } + + //是否定义系统名称 + if (Validator.isNotEmpty(tenantConfig.getIsDefinitionName())) { + queryWrapper.eq(TenantConfig::getIsDefinitionName, tenantConfig.getIsDefinitionName()); + } + + //系统名称 + if (Validator.isNotEmpty(tenantConfig.getSysName())) { + queryWrapper.like(TenantConfig::getSysName, tenantConfig.getSysName()); + } + + //是否定义系统logo + if (Validator.isNotEmpty(tenantConfig.getIsDefinitionLogo())) { + queryWrapper.eq(TenantConfig::getIsDefinitionLogo, tenantConfig.getIsDefinitionLogo()); + } + + //系统log + if (Validator.isNotEmpty(tenantConfig.getSysLog())) { + queryWrapper.eq(TenantConfig::getSysLog, tenantConfig.getSysLog()); + } + + //是否定义系统色调 + if (Validator.isNotEmpty(tenantConfig.getIsDefinitionHue())) { + queryWrapper.eq(TenantConfig::getIsDefinitionHue, tenantConfig.getIsDefinitionHue()); + } + + //系统色调 + if (Validator.isNotEmpty(tenantConfig.getSysHue())) { + queryWrapper.eq(TenantConfig::getSysHue, tenantConfig.getSysHue()); + } + + //定制化数据,键值对{key:{type1:"",type2:"",value:""},key2:{type1:"",type2:"",value:""}}具体操作时候,做具体说明 + if (Validator.isNotEmpty(tenantConfig.getCustomizationFields())) { + queryWrapper.eq(TenantConfig::getCustomizationFields, tenantConfig.getCustomizationFields()); + } + + + //创建人员 + if (Validator.isNotEmpty(tenantConfig.getCreateBy())) { + queryWrapper.eq(TenantConfig::getCreateBy, tenantConfig.getCreateBy()); + } + + + //修改人员 + if (Validator.isNotEmpty(tenantConfig.getUpdateBy())) { + queryWrapper.eq(TenantConfig::getUpdateBy, tenantConfig.getUpdateBy()); + } + + + //部门ID + if (Validator.isNotEmpty(tenantConfig.getCreateDept())) { + queryWrapper.eq(TenantConfig::getCreateDept, tenantConfig.getCreateDept()); + } + + //删除标示 默认为1 有效数据 ,0为无效已删除 + if (Validator.isNotEmpty(tenantConfig.getDelFlag())) { + queryWrapper.eq(TenantConfig::getDelFlag, tenantConfig.getDelFlag()); + } + + } + +} diff --git a/bs-admin/src/main/java/com/bs/web/controller/tool/TestController.java b/bs-admin/src/main/java/com/bs/web/controller/tool/TestController.java new file mode 100644 index 0000000..e2ef0df --- /dev/null +++ b/bs-admin/src/main/java/com/bs/web/controller/tool/TestController.java @@ -0,0 +1,183 @@ +package com.bs.web.controller.tool; + +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.bs.common.core.controller.BaseController; +import com.bs.common.core.domain.R; +import com.bs.common.utils.StringUtils; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import io.swagger.annotations.ApiOperation; + +/** + * swagger 用户测试方法 + * + * @author bs + */ +@Api("用户信息管理") +@RestController +@RequestMapping("/test/user") +public class TestController extends BaseController +{ + private final static Map users = new LinkedHashMap(); + { + users.put(1, new UserEntity(1, "admin", "admin123", "15888888888")); + users.put(2, new UserEntity(2, "ry", "admin123", "15666666666")); + } + + @ApiOperation("获取用户列表") + @GetMapping("/list") + public R> userList() + { + List userList = new ArrayList(users.values()); + return R.ok(userList); + } + + @ApiOperation("获取用户详细") + @ApiImplicitParam(name = "userId", value = "用户ID", required = true, dataType = "int", paramType = "path", dataTypeClass = Integer.class) + @GetMapping("/{userId}") + public R getUser(@PathVariable Integer userId) + { + if (!users.isEmpty() && users.containsKey(userId)) + { + return R.ok(users.get(userId)); + } + else + { + return R.fail("用户不存在"); + } + } + + @ApiOperation("新增用户") + @ApiImplicitParams({ + @ApiImplicitParam(name = "userId", value = "用户id", dataType = "Integer", dataTypeClass = Integer.class), + @ApiImplicitParam(name = "username", value = "用户名称", dataType = "String", dataTypeClass = String.class), + @ApiImplicitParam(name = "password", value = "用户密码", dataType = "String", dataTypeClass = String.class), + @ApiImplicitParam(name = "mobile", value = "用户手机", dataType = "String", dataTypeClass = String.class) + }) + @PostMapping("/save") + public R save(UserEntity user) + { + if (StringUtils.isNull(user) || StringUtils.isNull(user.getUserId())) + { + return R.fail("用户ID不能为空"); + } + users.put(user.getUserId(), user); + return R.ok(); + } + + @ApiOperation("更新用户") + @PutMapping("/update") + public R update(@RequestBody UserEntity user) + { + if (StringUtils.isNull(user) || StringUtils.isNull(user.getUserId())) + { + return R.fail("用户ID不能为空"); + } + if (users.isEmpty() || !users.containsKey(user.getUserId())) + { + return R.fail("用户不存在"); + } + users.remove(user.getUserId()); + users.put(user.getUserId(), user); + return R.ok(); + } + + @ApiOperation("删除用户信息") + @ApiImplicitParam(name = "userId", value = "用户ID", required = true, dataType = "int", paramType = "path", dataTypeClass = Integer.class) + @DeleteMapping("/{userId}") + public R delete(@PathVariable Integer userId) + { + if (!users.isEmpty() && users.containsKey(userId)) + { + users.remove(userId); + return R.ok(); + } + else + { + return R.fail("用户不存在"); + } + } +} + +@ApiModel(value = "UserEntity", description = "用户实体") +class UserEntity +{ + @ApiModelProperty("用户ID") + private Integer userId; + + @ApiModelProperty("用户名称") + private String username; + + @ApiModelProperty("用户密码") + private String password; + + @ApiModelProperty("用户手机") + private String mobile; + + public UserEntity() + { + + } + + public UserEntity(Integer userId, String username, String password, String mobile) + { + this.userId = userId; + this.username = username; + this.password = password; + this.mobile = mobile; + } + + public Integer getUserId() + { + return userId; + } + + public void setUserId(Integer userId) + { + this.userId = userId; + } + + public String getUsername() + { + return username; + } + + public void setUsername(String username) + { + this.username = username; + } + + public String getPassword() + { + return password; + } + + public void setPassword(String password) + { + this.password = password; + } + + public String getMobile() + { + return mobile; + } + + public void setMobile(String mobile) + { + this.mobile = mobile; + } +} diff --git a/bs-admin/src/main/java/com/bs/web/core/config/SwaggerConfig.java b/bs-admin/src/main/java/com/bs/web/core/config/SwaggerConfig.java new file mode 100644 index 0000000..13367a1 --- /dev/null +++ b/bs-admin/src/main/java/com/bs/web/core/config/SwaggerConfig.java @@ -0,0 +1,125 @@ +package com.bs.web.core.config; + +import java.util.ArrayList; +import java.util.List; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import com.bs.common.config.BsConfig; +import io.swagger.annotations.ApiOperation; +import io.swagger.models.auth.In; +import springfox.documentation.builders.ApiInfoBuilder; +import springfox.documentation.builders.PathSelectors; +import springfox.documentation.builders.RequestHandlerSelectors; +import springfox.documentation.service.ApiInfo; +import springfox.documentation.service.ApiKey; +import springfox.documentation.service.AuthorizationScope; +import springfox.documentation.service.Contact; +import springfox.documentation.service.SecurityReference; +import springfox.documentation.service.SecurityScheme; +import springfox.documentation.spi.DocumentationType; +import springfox.documentation.spi.service.contexts.SecurityContext; +import springfox.documentation.spring.web.plugins.Docket; + +/** + * Swagger2的接口配置 + * + * @author bs + */ +@Configuration +public class SwaggerConfig +{ + /** 系统基础配置 */ + @Autowired + private BsConfig bsConfig; + + /** 是否开启swagger */ + @Value("${swagger.enabled}") + private boolean enabled; + + /** 设置请求的统一前缀 */ + @Value("${swagger.pathMapping}") + private String pathMapping; + + /** + * 创建API + */ + @Bean + public Docket createRestApi() + { + return new Docket(DocumentationType.OAS_30) + // 是否启用Swagger + .enable(enabled) + // 用来创建该API的基本信息,展示在文档的页面中(自定义展示的信息) + .apiInfo(apiInfo()) + // 设置哪些接口暴露给Swagger展示 + .select() + // 扫描所有有注解的api,用这种方式更灵活 + .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class)) + // 扫描指定包中的swagger注解 + // .apis(RequestHandlerSelectors.basePackage("com.bs.project.tool.swagger")) + // 扫描所有 .apis(RequestHandlerSelectors.any()) + .paths(PathSelectors.any()) + .build() + /* 设置安全模式,swagger可以设置访问token */ + .securitySchemes(securitySchemes()) + .securityContexts(securityContexts()) + .pathMapping(pathMapping); + } + + /** + * 安全模式,这里指定token通过Authorization头请求头传递 + */ + private List securitySchemes() + { + List apiKeyList = new ArrayList(); + apiKeyList.add(new ApiKey("Authorization", "Authorization", In.HEADER.toValue())); + return apiKeyList; + } + + /** + * 安全上下文 + */ + private List securityContexts() + { + List securityContexts = new ArrayList<>(); + securityContexts.add( + SecurityContext.builder() + .securityReferences(defaultAuth()) + .operationSelector(o -> o.requestMappingPattern().matches("/.*")) + .build()); + return securityContexts; + } + + /** + * 默认的安全上引用 + */ + private List defaultAuth() + { + AuthorizationScope authorizationScope = new AuthorizationScope("global", "accessEverything"); + AuthorizationScope[] authorizationScopes = new AuthorizationScope[1]; + authorizationScopes[0] = authorizationScope; + List securityReferences = new ArrayList<>(); + securityReferences.add(new SecurityReference("Authorization", authorizationScopes)); + return securityReferences; + } + + /** + * 添加摘要信息 + */ + private ApiInfo apiInfo() + { + // 用ApiInfoBuilder进行定制 + return new ApiInfoBuilder() + // 设置标题 + .title("标题:保税仓库管理系统_接口文档") + // 描述 + .description("描述:用于管理集团旗下公司的人员信息,具体包括XXX,XXX模块...") + // 作者信息 + .contact(new Contact(bsConfig.getName(), null, null)) + // 版本 + .version("版本号:" + bsConfig.getVersion()) + .build(); + } +} diff --git a/bs-admin/src/main/resources/META-INF/spring-devtools.properties b/bs-admin/src/main/resources/META-INF/spring-devtools.properties new file mode 100644 index 0000000..2b23f85 --- /dev/null +++ b/bs-admin/src/main/resources/META-INF/spring-devtools.properties @@ -0,0 +1 @@ +restart.include.json=/com.alibaba.fastjson.*.jar \ No newline at end of file diff --git a/bs-admin/src/main/resources/application-druid.yml b/bs-admin/src/main/resources/application-druid.yml new file mode 100644 index 0000000..a2fe2cb --- /dev/null +++ b/bs-admin/src/main/resources/application-druid.yml @@ -0,0 +1,68 @@ +# 数据源配置 +spring: + datasource: + type: com.alibaba.druid.pool.DruidDataSource + driverClassName: com.mysql.cj.jdbc.Driver + druid: + # 主库数据源 + master: + #url: jdbc:mysql://124.71.134.146:63306/bs-jxc-dev?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&rewriteBatchedStatements=true + #username: root + #password: fastrise@chain + url: jdbc:mysql://localhost:3306/my-base?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&rewriteBatchedStatements=true + username: root + password: abcd123 + # 从库数据源 + slave: + # 从数据源开关/默认关闭 + enabled: false + url: + username: + password: + # 初始连接数 + initialSize: 5 + # 最小连接池数量 + minIdle: 10 + # 最大连接池数量 + maxActive: 20 + # 配置获取连接等待超时的时间 + maxWait: 60000 + # 配置连接超时时间 + connectTimeout: 30000 + # 配置网络超时时间 + socketTimeout: 60000 + # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 + timeBetweenEvictionRunsMillis: 60000 + # 配置一个连接在池中最小生存的时间,单位是毫秒 + minEvictableIdleTimeMillis: 300000 + # 配置一个连接在池中最大生存的时间,单位是毫秒 + maxEvictableIdleTimeMillis: 900000 + # 配置检测连接是否有效 + validationQuery: SELECT 1 FROM DUAL + testWhileIdle: true + testOnBorrow: false + testOnReturn: false + webStatFilter: + enabled: true + statViewServlet: + enabled: true + # 设置白名单,不填则允许所有访问 + allow: + url-pattern: /druid/* + # 控制台管理用户名和密码 + login-username: bs + login-password: 123456 + filter: + stat: + enabled: true + # 慢SQL记录 + log-slow-sql: true + slow-sql-millis: 1000 + merge-sql: true + wall: + config: + multi-statement-allow: true +bs: + tenant: + #开启租户 + openTenant: true \ No newline at end of file diff --git a/bs-admin/src/main/resources/application-priv.yml b/bs-admin/src/main/resources/application-priv.yml new file mode 100644 index 0000000..f280d56 --- /dev/null +++ b/bs-admin/src/main/resources/application-priv.yml @@ -0,0 +1,68 @@ +# 数据源配置 +spring: + datasource: + type: com.alibaba.druid.pool.DruidDataSource + driverClassName: com.mysql.cj.jdbc.Driver + druid: + # 主库数据源 + master: + #url: jdbc:mysql://124.71.134.146:63306/bs-jxc-dev?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&rewriteBatchedStatements=true + #username: root + #password: fastrise@chain + url: jdbc:mysql://localhost:3306/bs-jxc-dev?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&rewriteBatchedStatements=true + username: root + password: abcd123 + # 从库数据源 + slave: + # 从数据源开关/默认关闭 + enabled: false + url: + username: + password: + # 初始连接数 + initialSize: 5 + # 最小连接池数量 + minIdle: 10 + # 最大连接池数量 + maxActive: 20 + # 配置获取连接等待超时的时间 + maxWait: 60000 + # 配置连接超时时间 + connectTimeout: 30000 + # 配置网络超时时间 + socketTimeout: 60000 + # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 + timeBetweenEvictionRunsMillis: 60000 + # 配置一个连接在池中最小生存的时间,单位是毫秒 + minEvictableIdleTimeMillis: 300000 + # 配置一个连接在池中最大生存的时间,单位是毫秒 + maxEvictableIdleTimeMillis: 900000 + # 配置检测连接是否有效 + validationQuery: SELECT 1 FROM DUAL + testWhileIdle: true + testOnBorrow: false + testOnReturn: false + webStatFilter: + enabled: true + statViewServlet: + enabled: true + # 设置白名单,不填则允许所有访问 + allow: + url-pattern: /druid/* + # 控制台管理用户名和密码 + login-username: bs + login-password: 123456 + filter: + stat: + enabled: true + # 慢SQL记录 + log-slow-sql: true + slow-sql-millis: 1000 + merge-sql: true + wall: + config: + multi-statement-allow: true +bs: + tenant: + #关闭租户 + openTenant: false \ No newline at end of file diff --git a/bs-admin/src/main/resources/application-prot.yml b/bs-admin/src/main/resources/application-prot.yml new file mode 100644 index 0000000..76eb85f --- /dev/null +++ b/bs-admin/src/main/resources/application-prot.yml @@ -0,0 +1,66 @@ +# 数据源配置 +spring: + datasource: + type: com.alibaba.druid.pool.DruidDataSource + driverClassName: com.mysql.cj.jdbc.Driver + druid: + # 主库数据源 + master: + url: jdbc:mysql://124.71.134.146:63306/bs-jxc-prot?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&rewriteBatchedStatements=true + username: root + password: fastrise@chain + + # 从库数据源 + slave: + # 从数据源开关/默认关闭 + enabled: false + url: + username: + password: + # 初始连接数 + initialSize: 5 + # 最小连接池数量 + minIdle: 10 + # 最大连接池数量 + maxActive: 20 + # 配置获取连接等待超时的时间 + maxWait: 60000 + # 配置连接超时时间 + connectTimeout: 30000 + # 配置网络超时时间 + socketTimeout: 60000 + # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 + timeBetweenEvictionRunsMillis: 60000 + # 配置一个连接在池中最小生存的时间,单位是毫秒 + minEvictableIdleTimeMillis: 300000 + # 配置一个连接在池中最大生存的时间,单位是毫秒 + maxEvictableIdleTimeMillis: 900000 + # 配置检测连接是否有效 + validationQuery: SELECT 1 FROM DUAL + testWhileIdle: true + testOnBorrow: false + testOnReturn: false + webStatFilter: + enabled: true + statViewServlet: + enabled: true + # 设置白名单,不填则允许所有访问 + allow: + url-pattern: /druid/* + # 控制台管理用户名和密码 + login-username: bs + login-password: 123456 + filter: + stat: + enabled: true + # 慢SQL记录 + log-slow-sql: true + slow-sql-millis: 1000 + merge-sql: true + wall: + config: + multi-statement-allow: true +bs: + tenant: + #开启租户 + openTenant: true \ No newline at end of file diff --git a/bs-admin/src/main/resources/application.yml b/bs-admin/src/main/resources/application.yml new file mode 100644 index 0000000..91ef24a --- /dev/null +++ b/bs-admin/src/main/resources/application.yml @@ -0,0 +1,177 @@ +# Spring配置 +spring: + # 资源信息 + messages: + # 国际化资源文件路径 + basename: i18n/messages + profiles: + active: druid +# 项目相关配置 +bs: + # 名称 + name: bs + # 版本 + version: 3.8.6 + # 版权年份 + copyrightYear: 2023 + # 实例演示开关 + demoEnabled: true + # 文件路径 示例( Windows配置D:/bs/uploadPath,Linux配置 /home/bs/uploadPath) + profile: D:/bs/uploadPath + # 文件存储路径 windows 路径 + winLocalFilePath: D:/bs/uploadPath + # winLocalFilePath: E:/test + # 文件存储路径 linux 路径 + linuxLocalFilePath: /home/chain-mos/attachment + # 文件存储路径 mac 路径 + macLocalFilePath: ~/chain-mos/attachment + # 获取ip地址开关 + addressEnabled: false + # 验证码类型 math 数字计算 char 字符验证 + captchaType: char + tenant: + column: tenant_id + noIgnoreTables: + - sys_tenant + - tenant_config + - gen_table + - gen_table_column + - sys_user_role + - sys_dict_data + - sys_dict_type + - sys_job + - sys_job_log + - sys_logininfor + - sys_menu + - sys_oper_log + - sys_role_dept + - sys_role_menu + - sys_user_post + - sys_user_role + - sys_config +# 开发环境配置 +server: + # 服务器的HTTP端口,默认为8080 + port: 8080 + servlet: + # 应用的访问路径 + context-path: / + tomcat: + # tomcat的URI编码 + uri-encoding: UTF-8 + # 连接数满后的排队数,默认为100 + accept-count: 1000 + threads: + # tomcat最大线程数,默认为200 + max: 800 + # Tomcat启动初始化的线程数,默认值10 + min-spare: 100 + +# 日志配置 +logging: + level: + com.bs: debug + org.springframework: warn + +# 用户配置 +user: + password: + # 密码最大错误次数 + maxRetryCount: 5 + # 密码锁定时间(默认10分钟) + lockTime: 10 + + + # 文件上传 + servlet: + multipart: + # 单个文件大小 + max-file-size: 10MB + # 设置总上传的文件大小 + max-request-size: 20MB + # 服务模块 + devtools: + restart: + # 热部署开关 + enabled: true + # redis 配置 + redis: + # 地址 + host: localhost + # 端口,默认为6379 + port: 6379 + # 数据库索引 + database: 2 + # 密码 + password: + # 连接超时时间 + timeout: 10s + lettuce: + pool: + # 连接池中的最小空闲连接 + min-idle: 0 + # 连接池中的最大空闲连接 + max-idle: 8 + # 连接池的最大数据库连接数 + max-active: 8 + # #连接池最大阻塞等待时间(使用负值表示没有限制) + max-wait: -1ms + +# token配置 +token: + # 令牌自定义标识 + header: Authorization + # 令牌密钥 + secret: abcdefghijklmnopqrstuvwxyz + # 令牌有效期(默认30分钟) + expireTime: 300 + + +# MyBatis Plus配置 +mybatis-plus: + # 搜索指定包别名 + typeAliasesPackage: com.bs.**.domain + # 配置mapper的扫描,找到所有的mapper.xml映射文件 + mapperLocations: classpath*:mapper/**/*Mapper*.xml + # 加载全局的配置文件 + #configLocation: classpath:mybatis/mybatis-config.xml + configuration: + map-underscore-to-camel-case: true + cache-enabled: true + lazyLoadingEnabled: true + multipleResultSetsEnabled: true + #log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #打印sql语句,调试用 + use-generated-keys: true + default-executor-type: reuse +mybatis-plus-join: + #是否打印 mybatis plus join banner 默认true + banner: true + #全局启用副表逻辑删除(默认true) 关闭后关联查询不会加副表逻辑删除 + sub-table-logic: true + #拦截器MappedStatement缓存(默认true) + ms-cache: true + #表别名(默认 t) + table-alias: t + #副表逻辑删除条件的位置,支持where、on默认 where (1.4.4+) + logic-del-type: where +# PageHelper分页插件 +pagehelper: + helperDialect: mysql + supportMethodsArguments: true + params: count=countSql + +# Swagger配置 +swagger: + # 是否开启swagger + enabled: true + # 请求前缀 + pathMapping: /dev-api + +# 防止XSS攻击 +xss: + # 过滤开关 + enabled: true + # 排除链接(多个用逗号分隔) + excludes: /system/notice + # 匹配链接 + urlPatterns: /system/*,/monitor/*,/tool/* diff --git a/bs-admin/src/main/resources/banner.txt b/bs-admin/src/main/resources/banner.txt new file mode 100644 index 0000000..91a14ee --- /dev/null +++ b/bs-admin/src/main/resources/banner.txt @@ -0,0 +1,24 @@ +Application Version: ${bs.version} +Spring Boot Version: ${spring-boot.version} +//////////////////////////////////////////////////////////////////// +// _ooOoo_ // +// o8888888o // +// 88" . "88 // +// (| ^_^ |) // +// O\ = /O // +// ____/`---'\____ // +// .' \\| |// `. // +// / \\||| : |||// \ // +// / _||||| -:- |||||- \ // +// | | \\\ - /// | | // +// | \_| ''\---/'' | | // +// \ .-\__ `-` ___/-. / // +// ___`. .' /--.--\ `. . ___ // +// ."" '< `.___\_<|>_/___.' >'"". // +// | | : `- \`.;`\ _ /`;.`/ - ` : | | // +// \ \ `-. \_ __\ /__ _/ .-` / / // +// ========`-.____`-.___\_____/___.-`____.-'======== // +// `=---=' // +// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ // +// 佛祖保佑 永不宕机 永无BUG // +//////////////////////////////////////////////////////////////////// diff --git a/bs-admin/src/main/resources/i18n/messages.properties b/bs-admin/src/main/resources/i18n/messages.properties new file mode 100644 index 0000000..93de005 --- /dev/null +++ b/bs-admin/src/main/resources/i18n/messages.properties @@ -0,0 +1,38 @@ +#错误消息 +not.null=* 必须填写 +user.jcaptcha.error=验证码错误 +user.jcaptcha.expire=验证码已失效 +user.not.exists=用户不存在/密码错误 +user.password.not.match=用户不存在/密码错误 +user.password.retry.limit.count=密码输入错误{0}次 +user.password.retry.limit.exceed=密码输入错误{0}次,帐户锁定{1}分钟 +user.password.delete=对不起,您的账号已被删除 +user.blocked=用户已封禁,请联系管理员 +role.blocked=角色已封禁,请联系管理员 +login.blocked=很遗憾,访问IP已被列入系统黑名单 +user.logout.success=退出成功 + +length.not.valid=长度必须在{min}到{max}个字符之间 + +user.username.not.valid=* 2到20个汉字、字母、数字或下划线组成,且必须以非数字开头 +user.password.not.valid=* 5-50个字符 + +user.email.not.valid=邮箱格式错误 +user.mobile.phone.number.not.valid=手机号格式错误 +user.login.success=登录成功 +user.register.success=注册成功 +user.notfound=请重新登录 +user.forcelogout=管理员强制退出,请重新登录 +user.unknown.error=未知错误,请重新登录 + +##文件上传消息 +upload.exceed.maxSize=上传的文件大小超出限制的文件大小!
允许的文件最大大小是:{0}MB! +upload.filename.exceed.length=上传的文件名最长{0}个字符 + +##权限 +no.permission=您没有数据的权限,请联系管理员添加权限 [{0}] +no.create.permission=您没有创建数据的权限,请联系管理员添加权限 [{0}] +no.update.permission=您没有修改数据的权限,请联系管理员添加权限 [{0}] +no.delete.permission=您没有删除数据的权限,请联系管理员添加权限 [{0}] +no.export.permission=您没有导出数据的权限,请联系管理员添加权限 [{0}] +no.view.permission=您没有查看数据的权限,请联系管理员添加权限 [{0}] diff --git a/bs-admin/src/main/resources/logback.xml b/bs-admin/src/main/resources/logback.xml new file mode 100644 index 0000000..debb908 --- /dev/null +++ b/bs-admin/src/main/resources/logback.xml @@ -0,0 +1,93 @@ + + + + + + + + + + + ${log.pattern} + + + + + + ${log.path}/sys-info.log + + + + ${log.path}/sys-info.%d{yyyy-MM-dd}.log + + 60 + + + ${log.pattern} + + + + INFO + + ACCEPT + + DENY + + + + + ${log.path}/sys-error.log + + + + ${log.path}/sys-error.%d{yyyy-MM-dd}.log + + 60 + + + ${log.pattern} + + + + ERROR + + ACCEPT + + DENY + + + + + + ${log.path}/sys-user.log + + + ${log.path}/sys-user.%d{yyyy-MM-dd}.log + + 60 + + + ${log.pattern} + + + + + + + + + + + + + + + + + + + + + + + diff --git a/bs-admin/src/main/resources/mapper/cm/CmAttachMapper.xml b/bs-admin/src/main/resources/mapper/cm/CmAttachMapper.xml new file mode 100644 index 0000000..75deb16 --- /dev/null +++ b/bs-admin/src/main/resources/mapper/cm/CmAttachMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/bs-admin/src/main/resources/mybatis/mybatis-config.xml b/bs-admin/src/main/resources/mybatis/mybatis-config.xml new file mode 100644 index 0000000..ac47c03 --- /dev/null +++ b/bs-admin/src/main/resources/mybatis/mybatis-config.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + diff --git a/bs-common/pom.xml b/bs-common/pom.xml new file mode 100644 index 0000000..f8000de --- /dev/null +++ b/bs-common/pom.xml @@ -0,0 +1,185 @@ + + + + my-base + com.bs + 3.8.6 + + 4.0.0 + + bs-common + + + common通用工具 + + + + + org.apache.ant + ant + 1.9.15 + + + com.github.jsqlparser + jsqlparser + 4.2 + + + + com.alibaba + transmittable-thread-local + 2.13.0 + + + + + + com.github.xiaoymin + knife4j-spring-boot-starter + + + + com.alibaba + druid-spring-boot-starter + + + + io.springfox + springfox-boot-starter + + + io.swagger + swagger-models + + + + + com.baomidou + mybatis-plus-boot-starter + + + com.github.yulichang + mybatis-plus-join-boot-starter + + + org.projectlombok + lombok + + + + org.springframework + spring-context-support + + + + cn.hutool + hutool-all + + + + org.springframework + spring-web + + + + + org.springframework.boot + spring-boot-starter-security + + + + + com.github.pagehelper + pagehelper-spring-boot-starter + + + + + org.springframework.boot + spring-boot-starter-validation + + + + + org.apache.commons + commons-lang3 + + + + + com.fasterxml.jackson.core + jackson-databind + + + + + com.baomidou + dynamic-datasource-spring-boot-starter + 3.5.2 + + + + + com.alibaba.fastjson2 + fastjson2 + + + + + commons-io + commons-io + + + + + org.apache.poi + poi-ooxml + + + + + org.yaml + snakeyaml + + + + + io.jsonwebtoken + jjwt + + + + + javax.xml.bind + jaxb-api + + + + + org.springframework.boot + spring-boot-starter-data-redis + + + + + org.apache.commons + commons-pool2 + + + + + eu.bitwalker + UserAgentUtils + + + + + javax.servlet + javax.servlet-api + + + + + diff --git a/bs-common/src/main/java/com/bs/common/annotation/Anonymous.java b/bs-common/src/main/java/com/bs/common/annotation/Anonymous.java new file mode 100644 index 0000000..b19091c --- /dev/null +++ b/bs-common/src/main/java/com/bs/common/annotation/Anonymous.java @@ -0,0 +1,19 @@ +package com.bs.common.annotation; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 匿名访问不鉴权注解 + * + * @author bs + */ +@Target({ ElementType.METHOD, ElementType.TYPE }) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface Anonymous +{ +} diff --git a/bs-common/src/main/java/com/bs/common/annotation/DataScope.java b/bs-common/src/main/java/com/bs/common/annotation/DataScope.java new file mode 100644 index 0000000..59b9d85 --- /dev/null +++ b/bs-common/src/main/java/com/bs/common/annotation/DataScope.java @@ -0,0 +1,33 @@ +package com.bs.common.annotation; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 数据权限过滤注解 + * + * @author bs + */ +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface DataScope +{ + /** + * 部门表的别名 + */ + public String deptAlias() default ""; + + /** + * 用户表的别名 + */ + public String userAlias() default ""; + + /** + * 权限字符(用于多个角色匹配符合要求的权限)默认根据权限注解@ss获取,多个权限用逗号分隔开来 + */ + public String permission() default ""; +} diff --git a/bs-common/src/main/java/com/bs/common/annotation/DataSource.java b/bs-common/src/main/java/com/bs/common/annotation/DataSource.java new file mode 100644 index 0000000..a804108 --- /dev/null +++ b/bs-common/src/main/java/com/bs/common/annotation/DataSource.java @@ -0,0 +1,28 @@ +package com.bs.common.annotation; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Inherited; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; +import com.bs.common.enums.DataSourceType; + +/** + * 自定义多数据源切换注解 + * + * 优先级:先方法,后类,如果方法覆盖了类上的数据源类型,以方法的为准,否则以类上的为准 + * + * @author bs + */ +@Target({ ElementType.METHOD, ElementType.TYPE }) +@Retention(RetentionPolicy.RUNTIME) +@Documented +@Inherited +public @interface DataSource +{ + /** + * 切换数据源名称 + */ + public DataSourceType value() default DataSourceType.MASTER; +} diff --git a/bs-common/src/main/java/com/bs/common/annotation/Excel.java b/bs-common/src/main/java/com/bs/common/annotation/Excel.java new file mode 100644 index 0000000..c1bb765 --- /dev/null +++ b/bs-common/src/main/java/com/bs/common/annotation/Excel.java @@ -0,0 +1,187 @@ +package com.bs.common.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; +import java.math.BigDecimal; +import org.apache.poi.ss.usermodel.HorizontalAlignment; +import org.apache.poi.ss.usermodel.IndexedColors; +import com.bs.common.utils.poi.ExcelHandlerAdapter; + +/** + * 自定义导出Excel数据注解 + * + * @author bs + */ +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.FIELD) +public @interface Excel +{ + /** + * 导出时在excel中排序 + */ + public int sort() default Integer.MAX_VALUE; + + /** + * 导出到Excel中的名字. + */ + public String name() default ""; + + /** + * 日期格式, 如: yyyy-MM-dd + */ + public String dateFormat() default ""; + + /** + * 如果是字典类型,请设置字典的type值 (如: sys_user_sex) + */ + public String dictType() default ""; + + /** + * 读取内容转表达式 (如: 0=男,1=女,2=未知) + */ + public String readConverterExp() default ""; + + /** + * 分隔符,读取字符串组内容 + */ + public String separator() default ","; + + /** + * BigDecimal 精度 默认:-1(默认不开启BigDecimal格式化) + */ + public int scale() default -1; + + /** + * BigDecimal 舍入规则 默认:BigDecimal.ROUND_HALF_EVEN + */ + public int roundingMode() default BigDecimal.ROUND_HALF_EVEN; + + /** + * 导出时在excel中每个列的高度 + */ + public double height() default 14; + + /** + * 导出时在excel中每个列的宽度 + */ + public double width() default 16; + + /** + * 文字后缀,如% 90 变成90% + */ + public String suffix() default ""; + + /** + * 当值为空时,字段的默认值 + */ + public String defaultValue() default ""; + + /** + * 提示信息 + */ + public String prompt() default ""; + + /** + * 设置只能选择不能输入的列内容. + */ + public String[] combo() default {}; + + /** + * 是否需要纵向合并单元格,应对需求:含有list集合单元格) + */ + public boolean needMerge() default false; + + /** + * 是否导出数据,应对需求:有时我们需要导出一份模板,这是标题需要但内容需要用户手工填写. + */ + public boolean isExport() default true; + + /** + * 另一个类中的属性名称,支持多级获取,以小数点隔开 + */ + public String targetAttr() default ""; + + /** + * 是否自动统计数据,在最后追加一行统计数据总和 + */ + public boolean isStatistics() default false; + + /** + * 导出类型(0数字 1字符串 2图片) + */ + public ColumnType cellType() default ColumnType.STRING; + + /** + * 导出列头背景颜色 + */ + public IndexedColors headerBackgroundColor() default IndexedColors.GREY_50_PERCENT; + + /** + * 导出列头字体颜色 + */ + public IndexedColors headerColor() default IndexedColors.WHITE; + + /** + * 导出单元格背景颜色 + */ + public IndexedColors backgroundColor() default IndexedColors.WHITE; + + /** + * 导出单元格字体颜色 + */ + public IndexedColors color() default IndexedColors.BLACK; + + /** + * 导出字段对齐方式 + */ + public HorizontalAlignment align() default HorizontalAlignment.CENTER; + + /** + * 自定义数据处理器 + */ + public Class handler() default ExcelHandlerAdapter.class; + + /** + * 自定义数据处理器参数 + */ + public String[] args() default {}; + + /** + * 字段类型(0:导出导入;1:仅导出;2:仅导入) + */ + Type type() default Type.ALL; + + public enum Type + { + ALL(0), EXPORT(1), IMPORT(2); + private final int value; + + Type(int value) + { + this.value = value; + } + + public int value() + { + return this.value; + } + } + + public enum ColumnType + { + NUMERIC(0), STRING(1), IMAGE(2); + private final int value; + + ColumnType(int value) + { + this.value = value; + } + + public int value() + { + return this.value; + } + } +} diff --git a/bs-common/src/main/java/com/bs/common/annotation/Excels.java b/bs-common/src/main/java/com/bs/common/annotation/Excels.java new file mode 100644 index 0000000..1e60290 --- /dev/null +++ b/bs-common/src/main/java/com/bs/common/annotation/Excels.java @@ -0,0 +1,18 @@ +package com.bs.common.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * Excel注解集 + * + * @author bs + */ +@Target(ElementType.FIELD) +@Retention(RetentionPolicy.RUNTIME) +public @interface Excels +{ + public Excel[] value(); +} diff --git a/bs-common/src/main/java/com/bs/common/annotation/Log.java b/bs-common/src/main/java/com/bs/common/annotation/Log.java new file mode 100644 index 0000000..4f5ab3a --- /dev/null +++ b/bs-common/src/main/java/com/bs/common/annotation/Log.java @@ -0,0 +1,51 @@ +package com.bs.common.annotation; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; +import com.bs.common.enums.BusinessType; +import com.bs.common.enums.OperatorType; + +/** + * 自定义操作日志记录注解 + * + * @author bs + * + */ +@Target({ ElementType.PARAMETER, ElementType.METHOD }) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface Log +{ + /** + * 模块 + */ + public String title() default ""; + + /** + * 功能 + */ + public BusinessType businessType() default BusinessType.OTHER; + + /** + * 操作人类别 + */ + public OperatorType operatorType() default OperatorType.MANAGE; + + /** + * 是否保存请求的参数 + */ + public boolean isSaveRequestData() default true; + + /** + * 是否保存响应的参数 + */ + public boolean isSaveResponseData() default true; + + /** + * 排除指定的请求参数 + */ + public String[] excludeParamNames() default {}; +} diff --git a/bs-common/src/main/java/com/bs/common/annotation/RateLimiter.java b/bs-common/src/main/java/com/bs/common/annotation/RateLimiter.java new file mode 100644 index 0000000..7ca1de1 --- /dev/null +++ b/bs-common/src/main/java/com/bs/common/annotation/RateLimiter.java @@ -0,0 +1,40 @@ +package com.bs.common.annotation; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; +import com.bs.common.constant.CacheConstants; +import com.bs.common.enums.LimitType; + +/** + * 限流注解 + * + * @author bs + */ +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface RateLimiter +{ + /** + * 限流key + */ + public String key() default CacheConstants.RATE_LIMIT_KEY; + + /** + * 限流时间,单位秒 + */ + public int time() default 60; + + /** + * 限流次数 + */ + public int count() default 100; + + /** + * 限流类型 + */ + public LimitType limitType() default LimitType.DEFAULT; +} diff --git a/bs-common/src/main/java/com/bs/common/annotation/RepeatSubmit.java b/bs-common/src/main/java/com/bs/common/annotation/RepeatSubmit.java new file mode 100644 index 0000000..e5b43be --- /dev/null +++ b/bs-common/src/main/java/com/bs/common/annotation/RepeatSubmit.java @@ -0,0 +1,31 @@ +package com.bs.common.annotation; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Inherited; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 自定义注解防止表单重复提交 + * + * @author bs + * + */ +@Inherited +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface RepeatSubmit +{ + /** + * 间隔时间(ms),小于此时间视为重复提交 + */ + public int interval() default 5000; + + /** + * 提示消息 + */ + public String message() default "不允许重复提交,请稍候再试"; +} diff --git a/bs-common/src/main/java/com/bs/common/annotation/TenantClear.java b/bs-common/src/main/java/com/bs/common/annotation/TenantClear.java new file mode 100644 index 0000000..74e1bdd --- /dev/null +++ b/bs-common/src/main/java/com/bs/common/annotation/TenantClear.java @@ -0,0 +1,28 @@ +package com.bs.common.annotation;/** + * @作者 tjw + * @创建时间 2024-03-02-15:11 + * @说明 : + */ + +import java.lang.annotation.*; + +/** + * @author tjw + * @since 2023/11/21 20:41 + */ +@Target({ ElementType.METHOD, ElementType.TYPE }) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface TenantClear { + + /** + *

执行该方法后,是否全局过滤租户标志

+ *
    + *
  • true:执行完该线程之前,后续对db操作不添加租户操作
  • + *
  • false:执行完当前方法后,后续方法的db操作添加租户操作
  • + *
+ * + * @return 默认后续不添加租户操作 + */ + boolean globalFlag() default true; +} diff --git a/bs-common/src/main/java/com/bs/common/aspectj/TenantClearAspect.java b/bs-common/src/main/java/com/bs/common/aspectj/TenantClearAspect.java new file mode 100644 index 0000000..cf3ff3e --- /dev/null +++ b/bs-common/src/main/java/com/bs/common/aspectj/TenantClearAspect.java @@ -0,0 +1,45 @@ +package com.bs.common.aspectj; + +import com.bs.common.annotation.TenantClear; +import lombok.SneakyThrows; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.annotation.AnnotationUtils; +import org.springframework.stereotype.Component; +import com.bs.common.config.TenantConfigProperties; + +/** + * @作者 tjw + * @创建时间 2024-03-02-15:10 + * @说明 : + */ + +@Aspect +@Component +public class TenantClearAspect { + @Autowired + private TenantConfigProperties tenantConfigProperties; + + @SneakyThrows + @Around("@within(clear) || @annotation(clear)") + public Object around(ProceedingJoinPoint point, TenantClear clear) { + // 如果在类上,而不是在方法上,则为空 + if (clear == null) { + Class aClass = point.getTarget().getClass(); + clear = AnnotationUtils.findAnnotation(aClass, TenantClear.class); + } + if (clear != null) { + if(clear.globalFlag()){ + tenantConfigProperties.setTenantSkip(); + } + } + Object result = point.proceed(); + if (!clear.globalFlag()) { + tenantConfigProperties.clearSkip(); + } + return result; + } + +} \ No newline at end of file diff --git a/bs-common/src/main/java/com/bs/common/config/BsConfig.java b/bs-common/src/main/java/com/bs/common/config/BsConfig.java new file mode 100644 index 0000000..7fc5486 --- /dev/null +++ b/bs-common/src/main/java/com/bs/common/config/BsConfig.java @@ -0,0 +1,220 @@ +package com.bs.common.config; + +import com.bs.common.utils.OsInfoUtil; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +import java.util.Set; + +/** + * 读取项目相关配置 + * + * @author bs + */ +@Component +@ConfigurationProperties(prefix = "bs") +public class BsConfig +{ + /** 项目名称 */ + private String name; + + /** + * 维护租户列名称 + */ + private static String column = "tenant_id"; + + /** + * 多租户的数据表集合(不忽略的表) + */ + private static Set noIgnoreTables; + /** 版本 */ + private String version; + + /** 版权年份 */ + private String copyrightYear; + + /** 实例演示开关 */ + private boolean demoEnabled; + + /** 上传路径 */ + private static String profile; + + /** 获取地址开关 */ + private static boolean addressEnabled; + + /** 验证码类型 */ + private static String captchaType; + + /** + * windows附件地址 + */ + private static String winLocalFilePath; + /** + * linux附件地址 + */ + private static String linuxLocalFilePath; + /** + * mac附件地址 + */ + private static String macLocalFilePath; + + public void setWinLocalFilePath(String winLocalFilePath) { + BsConfig.winLocalFilePath = winLocalFilePath; + } + + public void setLinuxLocalFilePath(String linuxLocalFilePath) { + BsConfig.linuxLocalFilePath = linuxLocalFilePath; + } + + public void setMacLocalFilePath(String macLocalFilePath) { + BsConfig.macLocalFilePath = macLocalFilePath; + } + + public static String getWinLocalFilePath() { + return winLocalFilePath; + } + + public static String getLinuxLocalFilePath() { + return linuxLocalFilePath; + } + public static String getMacLocalFilePath() { + return macLocalFilePath; + } + + + + public String getName() + { + return name; + } + + public void setName(String name) + { + this.name = name; + } + + public String getVersion() + { + return version; + } + + public void setVersion(String version) + { + this.version = version; + } + + public String getCopyrightYear() + { + return copyrightYear; + } + + public void setCopyrightYear(String copyrightYear) + { + this.copyrightYear = copyrightYear; + } + + public boolean isDemoEnabled() + { + return demoEnabled; + } + + public void setDemoEnabled(boolean demoEnabled) + { + this.demoEnabled = demoEnabled; + } + + public static String getProfile() + { + return profile; + } + + public void setProfile(String profile) + { + BsConfig.profile = profile; + } + + public static String getColumn() { + return column; + } + + public static void setColumn(String column) { + BsConfig.column = column; + } + public static Set getTables() { + return getNoIgnoreTables(); + } + public static Set getNoIgnoreTables() { + return noIgnoreTables; + } + + public static void setNoIgnoreTables(Set noIgnoreTables) { + BsConfig.noIgnoreTables = noIgnoreTables; + } + + public static boolean isAddressEnabled() + { + return addressEnabled; + } + + public void setAddressEnabled(boolean addressEnabled) + { + BsConfig.addressEnabled = addressEnabled; + } + + public static String getCaptchaType() { + return captchaType; + } + + public void setCaptchaType(String captchaType) { + BsConfig.captchaType = captchaType; + } + + /** + * 获取导入上传路径 + */ + public static String getImportPath() + { + return getFilePath() + "/import"; + } + + /** + * 获取头像上传路径 + */ + public static String getAvatarPath() + { + return getFilePath() + "/avatar"; + } + + /** + * 获取下载路径 + */ + public static String getDownloadPath() + { + return getFilePath() + "/download/"; + } + + /** + * 获取上传路径 + */ + public static String getUploadPath() + { + return getFilePath() + "/upload"; + } + + + /** + * 根据系统切换存放附件绝对地址 + * + * @return 存放附件绝对地址 + */ + public static String getFilePath() { + if (OsInfoUtil.isLinux()) { + return getLinuxLocalFilePath(); + } + if (OsInfoUtil.isMacOS() || OsInfoUtil.isMacOSX()) { + return getMacLocalFilePath(); + } + return getWinLocalFilePath(); + } + +} diff --git a/bs-common/src/main/java/com/bs/common/config/TenantConfigProperties.java b/bs-common/src/main/java/com/bs/common/config/TenantConfigProperties.java new file mode 100644 index 0000000..01b34dc --- /dev/null +++ b/bs-common/src/main/java/com/bs/common/config/TenantConfigProperties.java @@ -0,0 +1,82 @@ +package com.bs.common.config; + +import com.alibaba.ttl.TransmittableThreadLocal; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +import java.util.Set; + +@Component +@ConfigurationProperties(prefix = "bs.tenant") +public class TenantConfigProperties { + + /** + * 维护租户列名称 + */ + private String column; + + /** + * 多租户的数据表集合(不忽略的表) + */ + private Set noIgnoreTables; + + + private boolean openTenant; + + /** + * 租户过滤标识 + */ + private final ThreadLocal TENANT_SKIP = new TransmittableThreadLocal<>(); + /** + * 设置是否过滤的标识 + */ + public void setTenantSkip() { + TENANT_SKIP.set(Boolean.TRUE); + } + /** + * 获取是否跳过租户过滤的标识 + * @return true-过滤 false-不过滤 + */ + public Boolean getTenantSkip() { + return TENANT_SKIP.get() != null && TENANT_SKIP.get(); + } + + /** + * 清空租户过滤标识 + */ + public void clearSkip(){ + TENANT_SKIP.remove(); + } + + + public String getColumn() { + return column; + } + + public void setColumn(String column) { + this.column = column; + } + + + public Boolean getOpenTenant() { + return openTenant; + } + + public void setOpenTenant(Boolean openTenant) { + this.openTenant = openTenant; + } + + + public Set getNoIgnoreTables() { + return noIgnoreTables; + } + + public void setNoIgnoreTables(Set noIgnoreTables) { + this.noIgnoreTables = noIgnoreTables; + } + + public Set getTables() { + return getNoIgnoreTables(); + } +} + diff --git a/bs-common/src/main/java/com/bs/common/constant/CacheConstants.java b/bs-common/src/main/java/com/bs/common/constant/CacheConstants.java new file mode 100644 index 0000000..be6bb6a --- /dev/null +++ b/bs-common/src/main/java/com/bs/common/constant/CacheConstants.java @@ -0,0 +1,44 @@ +package com.bs.common.constant; + +/** + * 缓存的key 常量 + * + * @author bs + */ +public class CacheConstants +{ + /** + * 登录用户 redis key + */ + public static final String LOGIN_TOKEN_KEY = "login_tokens:"; + + /** + * 验证码 redis key + */ + public static final String CAPTCHA_CODE_KEY = "captcha_codes:"; + + /** + * 参数管理 cache key + */ + public static final String SYS_CONFIG_KEY = "sys_config:"; + + /** + * 字典管理 cache key + */ + public static final String SYS_DICT_KEY = "sys_dict:"; + + /** + * 防重提交 redis key + */ + public static final String REPEAT_SUBMIT_KEY = "repeat_submit:"; + + /** + * 限流 redis key + */ + public static final String RATE_LIMIT_KEY = "rate_limit:"; + + /** + * 登录账户密码错误次数 redis key + */ + public static final String PWD_ERR_CNT_KEY = "pwd_err_cnt:"; +} diff --git a/bs-common/src/main/java/com/bs/common/constant/Constants.java b/bs-common/src/main/java/com/bs/common/constant/Constants.java new file mode 100644 index 0000000..6036fc9 --- /dev/null +++ b/bs-common/src/main/java/com/bs/common/constant/Constants.java @@ -0,0 +1,142 @@ +package com.bs.common.constant; + +import io.jsonwebtoken.Claims; + +/** + * 通用常量信息 + * + * @author bs + */ +public class Constants +{ + /** + * UTF-8 字符集 + */ + public static final String UTF8 = "UTF-8"; + + /** + * GBK 字符集 + */ + public static final String GBK = "GBK"; + + /** + * www主域 + */ + public static final String WWW = "www."; + + /** + * http请求 + */ + public static final String HTTP = "http://"; + + /** + * https请求 + */ + public static final String HTTPS = "https://"; + + /** + * 通用成功标识 + */ + public static final String SUCCESS = "0"; + + /** + * 通用失败标识 + */ + public static final String FAIL = "1"; + + /** + * 登录成功 + */ + public static final String LOGIN_SUCCESS = "Success"; + + /** + * 注销 + */ + public static final String LOGOUT = "Logout"; + + /** + * 注册 + */ + public static final String REGISTER = "Register"; + + /** + * 登录失败 + */ + public static final String LOGIN_FAIL = "Error"; + + /** + * 验证码有效期(分钟) + */ + public static final Integer CAPTCHA_EXPIRATION = 2; + + /** + * 令牌 + */ + public static final String TOKEN = "token"; + + /** + * 令牌前缀 + */ + public static final String TOKEN_PREFIX = "Bearer "; + + /** + * 令牌前缀 + */ + public static final String LOGIN_USER_KEY = "login_user_key"; + + /** + * 用户ID + */ + public static final String JWT_USERID = "userid"; + + /** + * 用户名称 + */ + public static final String JWT_USERNAME = Claims.SUBJECT; + + /** + * 用户头像 + */ + public static final String JWT_AVATAR = "avatar"; + + /** + * 创建时间 + */ + public static final String JWT_CREATED = "created"; + + /** + * 用户权限 + */ + public static final String JWT_AUTHORITIES = "authorities"; + + /** + * 资源映射路径 前缀 + */ + public static final String RESOURCE_PREFIX = "/profile"; + + /** + * RMI 远程方法调用 + */ + public static final String LOOKUP_RMI = "rmi:"; + + /** + * LDAP 远程方法调用 + */ + public static final String LOOKUP_LDAP = "ldap:"; + + /** + * LDAPS 远程方法调用 + */ + public static final String LOOKUP_LDAPS = "ldaps:"; + + /** + * 定时任务白名单配置(仅允许访问的包名,如其他需要可以自行添加) + */ + public static final String[] JOB_WHITELIST_STR = { "com.bs" }; + + /** + * 定时任务违规的字符 + */ + public static final String[] JOB_ERROR_STR = { "java.net.URL", "javax.naming.InitialContext", "org.yaml.snakeyaml", + "org.springframework", "org.apache", "com.bs.common.utils.file", "com.bs.common.config" }; +} diff --git a/bs-common/src/main/java/com/bs/common/constant/GenConstants.java b/bs-common/src/main/java/com/bs/common/constant/GenConstants.java new file mode 100644 index 0000000..8b7d8e1 --- /dev/null +++ b/bs-common/src/main/java/com/bs/common/constant/GenConstants.java @@ -0,0 +1,117 @@ +package com.bs.common.constant; + +/** + * 代码生成通用常量 + * + * @author bs + */ +public class GenConstants +{ + /** 单表(增删改查) */ + public static final String TPL_CRUD = "crud"; + + /** 树表(增删改查) */ + public static final String TPL_TREE = "tree"; + + /** 主子表(增删改查) */ + public static final String TPL_SUB = "sub"; + + /** 树编码字段 */ + public static final String TREE_CODE = "treeCode"; + + /** 树父编码字段 */ + public static final String TREE_PARENT_CODE = "treeParentCode"; + + /** 树名称字段 */ + public static final String TREE_NAME = "treeName"; + + /** 上级菜单ID字段 */ + public static final String PARENT_MENU_ID = "parentMenuId"; + + /** 上级菜单名称字段 */ + public static final String PARENT_MENU_NAME = "parentMenuName"; + + /** 数据库字符串类型 */ + public static final String[] COLUMNTYPE_STR = { "char", "varchar", "nvarchar", "varchar2" }; + + /** 数据库文本类型 */ + public static final String[] COLUMNTYPE_TEXT = { "tinytext", "text", "mediumtext", "longtext" }; + + /** 数据库时间类型 */ + public static final String[] COLUMNTYPE_TIME = { "datetime", "time", "date", "timestamp" }; + + /** 数据库数字类型 */ + public static final String[] COLUMNTYPE_NUMBER = { "tinyint", "smallint", "mediumint", "int", "number", "integer", + "bit", "bigint", "float", "double", "decimal" }; + + /** 页面不需要编辑字段 */ + public static final String[] COLUMNNAME_NOT_EDIT = { "id", "create_by", "create_time", "del_flag" }; + + /** 页面不需要显示的列表字段 */ + public static final String[] COLUMNNAME_NOT_LIST = { "id", "create_by", "create_time", "del_flag", "update_by", + "update_time" }; + + /** 页面不需要查询字段 */ + public static final String[] COLUMNNAME_NOT_QUERY = { "id", "create_by", "create_time", "del_flag", "update_by", + "update_time", "remark" }; + + /** Entity基类字段 */ + public static final String[] BASE_ENTITY = { "createBy", "createTime", "updateBy", "updateTime"}; + + /** Tree基类字段 */ + public static final String[] TREE_ENTITY = { "parentName", "parentId", "orderNum", "ancestors", "children" }; + + /** 文本框 */ + public static final String HTML_INPUT = "input"; + + /** 文本域 */ + public static final String HTML_TEXTAREA = "textarea"; + + /** 下拉框 */ + public static final String HTML_SELECT = "select"; + + /** 单选框 */ + public static final String HTML_RADIO = "radio"; + + /** 复选框 */ + public static final String HTML_CHECKBOX = "checkbox"; + + /** 日期控件 */ + public static final String HTML_DATETIME = "datetime"; + + /** 图片上传控件 */ + public static final String HTML_IMAGE_UPLOAD = "imageUpload"; + + /** 文件上传控件 */ + public static final String HTML_FILE_UPLOAD = "fileUpload"; + + /** 富文本控件 */ + public static final String HTML_EDITOR = "editor"; + + /** 字符串类型 */ + public static final String TYPE_STRING = "String"; + + /** 整型 */ + public static final String TYPE_INTEGER = "Integer"; + + /** 长整型 */ + public static final String TYPE_LONG = "Long"; + + /** 浮点型 */ + public static final String TYPE_DOUBLE = "Double"; + + /** 高精度计算类型 */ + public static final String TYPE_BIGDECIMAL = "BigDecimal"; + + /** 时间类型 */ + public static final String TYPE_DATE = "Date"; + + /** 模糊查询 */ + public static final String QUERY_LIKE = "LIKE"; + + /** 相等查询 */ + public static final String QUERY_EQ = "EQ"; + + /** 需要 */ + public static final String REQUIRE = "1"; +} diff --git a/bs-common/src/main/java/com/bs/common/constant/HttpStatus.java b/bs-common/src/main/java/com/bs/common/constant/HttpStatus.java new file mode 100644 index 0000000..64319e7 --- /dev/null +++ b/bs-common/src/main/java/com/bs/common/constant/HttpStatus.java @@ -0,0 +1,94 @@ +package com.bs.common.constant; + +/** + * 返回状态码 + * + * @author bs + */ +public class HttpStatus +{ + /** + * 操作成功 + */ + public static final int SUCCESS = 200; + + /** + * 对象创建成功 + */ + public static final int CREATED = 201; + + /** + * 请求已经被接受 + */ + public static final int ACCEPTED = 202; + + /** + * 操作已经执行成功,但是没有返回数据 + */ + public static final int NO_CONTENT = 204; + + /** + * 资源已被移除 + */ + public static final int MOVED_PERM = 301; + + /** + * 重定向 + */ + public static final int SEE_OTHER = 303; + + /** + * 资源没有被修改 + */ + public static final int NOT_MODIFIED = 304; + + /** + * 参数列表错误(缺少,格式不匹配) + */ + public static final int BAD_REQUEST = 400; + + /** + * 未授权 + */ + public static final int UNAUTHORIZED = 401; + + /** + * 访问受限,授权过期 + */ + public static final int FORBIDDEN = 403; + + /** + * 资源,服务未找到 + */ + public static final int NOT_FOUND = 404; + + /** + * 不允许的http方法 + */ + public static final int BAD_METHOD = 405; + + /** + * 资源冲突,或者资源被锁 + */ + public static final int CONFLICT = 409; + + /** + * 不支持的数据,媒体类型 + */ + public static final int UNSUPPORTED_TYPE = 415; + + /** + * 系统内部错误 + */ + public static final int ERROR = 500; + + /** + * 接口未实现 + */ + public static final int NOT_IMPLEMENTED = 501; + + /** + * 系统警告消息 + */ + public static final int WARN = 601; +} diff --git a/bs-common/src/main/java/com/bs/common/constant/ScheduleConstants.java b/bs-common/src/main/java/com/bs/common/constant/ScheduleConstants.java new file mode 100644 index 0000000..1680754 --- /dev/null +++ b/bs-common/src/main/java/com/bs/common/constant/ScheduleConstants.java @@ -0,0 +1,50 @@ +package com.bs.common.constant; + +/** + * 任务调度通用常量 + * + * @author bs + */ +public class ScheduleConstants +{ + public static final String TASK_CLASS_NAME = "TASK_CLASS_NAME"; + + /** 执行目标key */ + public static final String TASK_PROPERTIES = "TASK_PROPERTIES"; + + /** 默认 */ + public static final String MISFIRE_DEFAULT = "0"; + + /** 立即触发执行 */ + public static final String MISFIRE_IGNORE_MISFIRES = "1"; + + /** 触发一次执行 */ + public static final String MISFIRE_FIRE_AND_PROCEED = "2"; + + /** 不触发立即执行 */ + public static final String MISFIRE_DO_NOTHING = "3"; + + public enum Status + { + /** + * 正常 + */ + NORMAL("0"), + /** + * 暂停 + */ + PAUSE("1"); + + private String value; + + private Status(String value) + { + this.value = value; + } + + public String getValue() + { + return value; + } + } +} diff --git a/bs-common/src/main/java/com/bs/common/constant/UserConstants.java b/bs-common/src/main/java/com/bs/common/constant/UserConstants.java new file mode 100644 index 0000000..37053a7 --- /dev/null +++ b/bs-common/src/main/java/com/bs/common/constant/UserConstants.java @@ -0,0 +1,78 @@ +package com.bs.common.constant; + +/** + * 用户常量信息 + * + * @author bs + */ +public class UserConstants +{ + /** + * 平台内系统用户的唯一标志 + */ + public static final String SYS_USER = "SYS_USER"; + + /** 正常状态 */ + public static final String NORMAL = "0"; + + /** 异常状态 */ + public static final String EXCEPTION = "1"; + + /** 用户封禁状态 */ + public static final String USER_DISABLE = "1"; + + /** 角色封禁状态 */ + public static final String ROLE_DISABLE = "1"; + + /** 部门正常状态 */ + public static final String DEPT_NORMAL = "0"; + + /** 部门停用状态 */ + public static final String DEPT_DISABLE = "1"; + + /** 字典正常状态 */ + public static final String DICT_NORMAL = "0"; + + /** 是否为系统默认(是) */ + public static final String YES = "Y"; + + /** 是否菜单外链(是) */ + public static final String YES_FRAME = "0"; + + /** 是否菜单外链(否) */ + public static final String NO_FRAME = "1"; + + /** 菜单类型(目录) */ + public static final String TYPE_DIR = "M"; + + /** 菜单类型(菜单) */ + public static final String TYPE_MENU = "C"; + + /** 菜单类型(按钮) */ + public static final String TYPE_BUTTON = "F"; + + /** Layout组件标识 */ + public final static String LAYOUT = "Layout"; + + /** ParentView组件标识 */ + public final static String PARENT_VIEW = "ParentView"; + + /** InnerLink组件标识 */ + public final static String INNER_LINK = "InnerLink"; + + /** 校验是否唯一的返回标识 */ + public final static boolean UNIQUE = true; + public final static boolean NOT_UNIQUE = false; + + /** + * 用户名长度限制 + */ + public static final int USERNAME_MIN_LENGTH = 2; + public static final int USERNAME_MAX_LENGTH = 20; + + /** + * 密码长度限制 + */ + public static final int PASSWORD_MIN_LENGTH = 5; + public static final int PASSWORD_MAX_LENGTH = 20; +} diff --git a/bs-common/src/main/java/com/bs/common/core/controller/BaseController.java b/bs-common/src/main/java/com/bs/common/core/controller/BaseController.java new file mode 100644 index 0000000..64ac5f9 --- /dev/null +++ b/bs-common/src/main/java/com/bs/common/core/controller/BaseController.java @@ -0,0 +1,216 @@ +package com.bs.common.core.controller; + +import com.bs.common.constant.HttpStatus; +import com.bs.common.core.domain.AjaxResult; +import com.bs.common.core.domain.model.LoginUser; +import com.bs.common.core.page.PageDomain; +import com.bs.common.core.page.TableDataInfo; +import com.bs.common.core.page.TableSupport; +import com.bs.common.utils.DateUtils; +import com.bs.common.utils.PageUtils; +import com.bs.common.utils.SecurityUtils; +import com.bs.common.utils.StringUtils; +import com.bs.common.utils.sql.SqlUtil; +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.web.bind.WebDataBinder; +import org.springframework.web.bind.annotation.InitBinder; + +import java.beans.PropertyEditorSupport; +import java.util.Date; +import java.util.List; + +/** + * web层通用数据处理 + * + * @author bs + */ +public class BaseController +{ + protected final Logger logger = LoggerFactory.getLogger(this.getClass()); + + /** + * 将前台传递过来的日期格式的字符串,自动转化为Date类型 + */ + @InitBinder + public void initBinder(WebDataBinder binder) + { + // Date 类型转换 + binder.registerCustomEditor(Date.class, new PropertyEditorSupport() + { + @Override + public void setAsText(String text) + { + setValue(DateUtils.parseDate(text)); + } + }); + } + + /** + * 设置请求分页数据 + */ + protected void startPage() + { + PageUtils.startPage(); + } + + /** + * 设置请求排序数据 + */ + protected void startOrderBy() + { + PageDomain pageDomain = TableSupport.buildPageRequest(); + if (StringUtils.isNotEmpty(pageDomain.getOrderBy())) + { + String orderBy = SqlUtil.escapeOrderBySql(pageDomain.getOrderBy()); + PageHelper.orderBy(orderBy); + } + } + + /** + * 清理分页的线程变量 + */ + protected void clearPage() + { + PageUtils.clearPage(); + } + + /** + * 响应请求分页数据 + */ + @SuppressWarnings({ "rawtypes", "unchecked" }) + protected TableDataInfo getDataTable(List list) + { + TableDataInfo rspData = new TableDataInfo(); + rspData.setCode(HttpStatus.SUCCESS); + rspData.setMsg("查询成功"); + rspData.setRows(list); + rspData.setTotal(new PageInfo(list).getTotal()); + return rspData; + } + /** + * 响应请求分页数据 + */ + @SuppressWarnings({ "rawtypes", "unchecked" }) + protected TableDataInfo getDataTable(List list,long total) + { + TableDataInfo rspData = new TableDataInfo(); + rspData.setCode(HttpStatus.SUCCESS); + rspData.setMsg("查询成功"); + rspData.setRows(list); + rspData.setTotal(total); + return rspData; + } + + /** + * 返回成功 + */ + public AjaxResult success() + { + return AjaxResult.success(); + } + + /** + * 返回失败消息 + */ + public AjaxResult error() + { + return AjaxResult.error(); + } + + /** + * 返回成功消息 + */ + public AjaxResult success(String message) + { + return AjaxResult.success(message); + } + + /** + * 返回成功消息 + */ + public AjaxResult success(Object data) + { + return AjaxResult.success(data); + } + + /** + * 返回失败消息 + */ + public AjaxResult error(String message) + { + return AjaxResult.error(message); + } + + /** + * 返回警告消息 + */ + public AjaxResult warn(String message) + { + return AjaxResult.warn(message); + } + + /** + * 响应返回结果 + * + * @param rows 影响行数 + * @return 操作结果 + */ + protected AjaxResult toAjax(int rows) + { + return rows > 0 ? AjaxResult.success() : AjaxResult.error(); + } + + /** + * 响应返回结果 + * + * @param result 结果 + * @return 操作结果 + */ + protected AjaxResult toAjax(boolean result) + { + return result ? success() : error(); + } + + /** + * 页面跳转 + */ + public String redirect(String url) + { + return StringUtils.format("redirect:{}", url); + } + + /** + * 获取用户缓存信息 + */ + public LoginUser getLoginUser() + { + return SecurityUtils.getLoginUser(); + } + + /** + * 获取登录用户id + */ + public Long getUserId() + { + return getLoginUser().getUserId(); + } + + /** + * 获取登录部门id + */ + public Long getDeptId() + { + return getLoginUser().getDeptId(); + } + + /** + * 获取登录用户名 + */ + public Long getUsername() + { + return getLoginUser().getUserId(); + } +} diff --git a/bs-common/src/main/java/com/bs/common/core/domain/AjaxResult.java b/bs-common/src/main/java/com/bs/common/core/domain/AjaxResult.java new file mode 100644 index 0000000..18f2796 --- /dev/null +++ b/bs-common/src/main/java/com/bs/common/core/domain/AjaxResult.java @@ -0,0 +1,206 @@ +package com.bs.common.core.domain; + + +import com.bs.common.constant.HttpStatus; +import com.bs.common.utils.StringUtils; + +import java.util.HashMap; + +/** + * 操作消息提醒 + * + * @author ruoyi + */ +public class AjaxResult extends HashMap { + private static final long serialVersionUID = 1L; + + /** + * 状态码 + */ + public static final String CODE_TAG = "code"; + + private static final String STATE = "state"; + private static final String STATE_OK = "ok"; + private static final String STATE_FAIL = "fail"; + /** + * 返回内容 + */ + public static final String MSG_TAG = "msg"; + + /** + * 数据对象 + */ + public static final String DATA_TAG = "data"; + + /** + * 初始化一个新创建的 AjaxResult 对象,使其表示一个空消息。 + */ + public AjaxResult() { + } + + /** + * 初始化一个新创建的 AjaxResult 对象 + * + * @param code 状态码 + * @param msg 返回内容 + */ + public AjaxResult(int code, String msg) { + super.put(CODE_TAG, code); + super.put(MSG_TAG, msg); + } + + /** + * 初始化一个新创建的 AjaxResult 对象 + * + * @param code 状态码 + * @param msg 返回内容 + * @param data 数据对象 + */ + public AjaxResult(int code, String msg, Object data, String state) { + super.put(STATE, state); + super.put(CODE_TAG, code); + super.put(MSG_TAG, msg); + if (StringUtils.isNotNull(data)) { + super.put(DATA_TAG, data); + } + } + + /** + * 返回成功消息 + * + * @return 成功消息 + */ + public static AjaxResult success() { + return AjaxResult.success("操作成功"); + } + + /** + * 返回成功数据 + * + * @return 成功消息 + */ + public static AjaxResult success(Object data) { + return AjaxResult.success("操作成功", data); + } + + /** + * 返回成功消息 + * + * @param msg 返回内容 + * @return 成功消息 + */ + public static AjaxResult success(String msg) { + return AjaxResult.success(msg, null); + } + + /** + * 返回成功消息 + * + * @param msg 返回内容 + * @param data 数据对象 + * @return 成功消息 + */ + public static AjaxResult success(String msg, Object data) { + //所有的 + return new AjaxResult(HttpStatus.SUCCESS, msg, data,STATE_OK); + } + + /** + * 返回警告消息 + * + * @param msg 返回内容 + * @return 警告消息 + */ + public static AjaxResult warn(String msg) { + return AjaxResult.warn(msg, null); + } + + /** + * 返回警告消息 + * + * @param msg 返回内容 + * @param data 数据对象 + * @return 警告消息 + */ + public static AjaxResult warn(String msg, Object data) { + return new AjaxResult(HttpStatus.WARN, msg, data,STATE_FAIL); + } + + /** + * 返回错误消息 + * + * @return + */ + public static AjaxResult error() { + return AjaxResult.error("操作失败"); + } + + /** + * 返回错误消息 + * + * @param msg 返回内容 + * @return 错误消息 + */ + public static AjaxResult error(String msg) { + return AjaxResult.error(msg, null); + } + + /** + * 返回错误消息 + * + * @param msg 返回内容 + * @param data 数据对象 + * @return 错误消息 + */ + public static AjaxResult error(String msg, Object data) { + return new AjaxResult(HttpStatus.ERROR, msg, data,STATE_FAIL); + } + + /** + * 返回错误消息 + * + * @param code 状态码 + * @param msg 返回内容 + * @return 错误消息 + */ + public static AjaxResult error(int code, String msg) { + return new AjaxResult(code, msg, null,STATE_FAIL); + } + + /** + * 方便链式调用 + * + * @param key 键 + * @param value 值 + * @return 数据对象 + */ + @Override + public AjaxResult put(String key, Object value) { + super.put(key, value); + return this; + } + + + public boolean isOk() { + Object state = get(STATE); + if (STATE_OK.equals(state)) { + return true; + } + if (STATE_FAIL.equals(state)) { + return false; + } + throw new IllegalStateException("调用 isOk() 之前,必须先调用 ok()、fail() 或者 setOk()、setFail() 方法"); + } + + public boolean isFail() { + Object state = get(STATE); + if (STATE_FAIL.equals(state)) { + return true; + } + if (STATE_OK.equals(state)) { + return false; + } + + throw new IllegalStateException("调用 isFail() 之前,必须先调用 ok()、fail() 或者 setOk()、setFail() 方法"); + } +} diff --git a/bs-common/src/main/java/com/bs/common/core/domain/BaseEntity.java b/bs-common/src/main/java/com/bs/common/core/domain/BaseEntity.java new file mode 100644 index 0000000..564484b --- /dev/null +++ b/bs-common/src/main/java/com/bs/common/core/domain/BaseEntity.java @@ -0,0 +1,93 @@ +package com.bs.common.core.domain; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonInclude; +import lombok.Data; + +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.HashMap; +import java.util.Map; + +/** + * Entity基类 + * + * @author bs + */ +@Data +@JsonInclude(value= JsonInclude.Include.NON_NULL) +public class BaseEntity implements Serializable { + private static final long serialVersionUID = 1L; + + + /** + * 搜索值 + */ + @JsonIgnore + @TableField(exist = false) + private String searchValue; + + private Long tenantId; + + /** + * 创建部门 + */ + @TableField(fill = FieldFill.INSERT) + private Long createDept; + + /** + * 创建者 + */ + @TableField(fill = FieldFill.INSERT) + private Long createBy; + + /** + * 创建时间 + */ + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** + * 更新者 + */ + @TableField(fill = FieldFill.INSERT_UPDATE) + private Long updateBy; + + /** + * 更新时间 + */ + @TableField(fill = FieldFill.INSERT_UPDATE) + private LocalDateTime updateTime; + /** + * 逻辑删除标示 + */ + //做删除操作的时候,会变成update,del_flag = '2' + @TableLogic(value = "0", delval = "2") + @TableField(fill = FieldFill.INSERT) + @JsonIgnore + private String delFlag; + + + /** + * 创建部门(查询机构下的部门数据) + */ + @TableField(exist = false) + private Long jgCreateDept; + /** + * 权限sql拼接 + */ + @TableField(exist = false) + private String scopeSql; + + /** + * 请求参数 + */ + @JsonInclude(JsonInclude.Include.NON_EMPTY) + @TableField(exist = false) + private Map params = new HashMap<>(); + + +} diff --git a/bs-common/src/main/java/com/bs/common/core/domain/R.java b/bs-common/src/main/java/com/bs/common/core/domain/R.java new file mode 100644 index 0000000..86924b2 --- /dev/null +++ b/bs-common/src/main/java/com/bs/common/core/domain/R.java @@ -0,0 +1,115 @@ +package com.bs.common.core.domain; + +import java.io.Serializable; +import com.bs.common.constant.HttpStatus; + +/** + * 响应信息主体 + * + * @author bs + */ +public class R implements Serializable +{ + private static final long serialVersionUID = 1L; + + /** 成功 */ + public static final int SUCCESS = HttpStatus.SUCCESS; + + /** 失败 */ + public static final int FAIL = HttpStatus.ERROR; + + private int code; + + private String msg; + + private T data; + + public static R ok() + { + return restResult(null, SUCCESS, "操作成功"); + } + + public static R ok(T data) + { + return restResult(data, SUCCESS, "操作成功"); + } + + public static R ok(T data, String msg) + { + return restResult(data, SUCCESS, msg); + } + + public static R fail() + { + return restResult(null, FAIL, "操作失败"); + } + + public static R fail(String msg) + { + return restResult(null, FAIL, msg); + } + + public static R fail(T data) + { + return restResult(data, FAIL, "操作失败"); + } + + public static R fail(T data, String msg) + { + return restResult(data, FAIL, msg); + } + + public static R fail(int code, String msg) + { + return restResult(null, code, msg); + } + + private static R restResult(T data, int code, String msg) + { + R apiResult = new R<>(); + apiResult.setCode(code); + apiResult.setData(data); + apiResult.setMsg(msg); + return apiResult; + } + + public int getCode() + { + return code; + } + + public void setCode(int code) + { + this.code = code; + } + + public String getMsg() + { + return msg; + } + + public void setMsg(String msg) + { + this.msg = msg; + } + + public T getData() + { + return data; + } + + public void setData(T data) + { + this.data = data; + } + + public static Boolean isError(R ret) + { + return !isSuccess(ret); + } + + public static Boolean isSuccess(R ret) + { + return R.SUCCESS == ret.getCode(); + } +} diff --git a/bs-common/src/main/java/com/bs/common/core/domain/TreeEntity.java b/bs-common/src/main/java/com/bs/common/core/domain/TreeEntity.java new file mode 100644 index 0000000..f3f5386 --- /dev/null +++ b/bs-common/src/main/java/com/bs/common/core/domain/TreeEntity.java @@ -0,0 +1,79 @@ +package com.bs.common.core.domain; + +import java.util.ArrayList; +import java.util.List; + +/** + * Tree基类 + * + * @author bs + */ +public class TreeEntity extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 父菜单名称 */ + private String parentName; + + /** 父菜单ID */ + private Long parentId; + + /** 显示顺序 */ + private Integer orderNum; + + /** 祖级列表 */ + private String ancestors; + + /** 子部门 */ + private List children = new ArrayList<>(); + + public String getParentName() + { + return parentName; + } + + public void setParentName(String parentName) + { + this.parentName = parentName; + } + + public Long getParentId() + { + return parentId; + } + + public void setParentId(Long parentId) + { + this.parentId = parentId; + } + + public Integer getOrderNum() + { + return orderNum; + } + + public void setOrderNum(Integer orderNum) + { + this.orderNum = orderNum; + } + + public String getAncestors() + { + return ancestors; + } + + public void setAncestors(String ancestors) + { + this.ancestors = ancestors; + } + + public List getChildren() + { + return children; + } + + public void setChildren(List children) + { + this.children = children; + } +} diff --git a/bs-common/src/main/java/com/bs/common/core/domain/TreeSelect.java b/bs-common/src/main/java/com/bs/common/core/domain/TreeSelect.java new file mode 100644 index 0000000..dc83765 --- /dev/null +++ b/bs-common/src/main/java/com/bs/common/core/domain/TreeSelect.java @@ -0,0 +1,77 @@ +package com.bs.common.core.domain; + +import java.io.Serializable; +import java.util.List; +import java.util.stream.Collectors; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.bs.common.core.domain.entity.SysDept; +import com.bs.common.core.domain.entity.SysMenu; + +/** + * Treeselect树结构实体类 + * + * @author bs + */ +public class TreeSelect implements Serializable +{ + private static final long serialVersionUID = 1L; + + /** 节点ID */ + private Long id; + + /** 节点名称 */ + private String label; + + /** 子节点 */ + @JsonInclude(JsonInclude.Include.NON_EMPTY) + private List children; + + public TreeSelect() + { + + } + + public TreeSelect(SysDept dept) + { + this.id = dept.getDeptId(); + this.label = dept.getDeptName(); + this.children = dept.getChildren().stream().map(TreeSelect::new).collect(Collectors.toList()); + } + + public TreeSelect(SysMenu menu) + { + this.id = menu.getMenuId(); + this.label = menu.getMenuName(); + this.children = menu.getChildren().stream().map(TreeSelect::new).collect(Collectors.toList()); + } + + public Long getId() + { + return id; + } + + public void setId(Long id) + { + this.id = id; + } + + public String getLabel() + { + return label; + } + + public void setLabel(String label) + { + this.label = label; + } + + public List getChildren() + { + return children; + } + + public void setChildren(List children) + { + this.children = children; + } +} diff --git a/bs-common/src/main/java/com/bs/common/core/domain/entity/SysDept.java b/bs-common/src/main/java/com/bs/common/core/domain/entity/SysDept.java new file mode 100644 index 0000000..6a83c55 --- /dev/null +++ b/bs-common/src/main/java/com/bs/common/core/domain/entity/SysDept.java @@ -0,0 +1,200 @@ +package com.bs.common.core.domain.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.bs.common.core.domain.BaseEntity; +import lombok.Data; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; + +import javax.validation.constraints.Email; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; +import java.util.ArrayList; +import java.util.List; + +/** + * 部门表 sys_dept + * + * @author bs + */ +@Data +public class SysDept extends BaseEntity { + private static final long serialVersionUID = 1L; + + /** + * 部门ID + */ + @TableId(value = "dept_id",type = IdType.AUTO) + private Long deptId; + + /** + * 父部门ID + */ + private Long parentId; + + /** + * 祖级列表 + */ + private String ancestors; + + /** + * 部门名称 + */ + private String deptName; + + /** + * 显示顺序 + */ + private Integer orderNum; + + /** + * 负责人 + */ + private String leader; + + /** + * 联系电话 + */ + private String phone; + + /** + * 邮箱 + */ + private String email; + + /** + * 部门状态:0正常,1停用 + */ + private String status; + + + /** + * 父部门名称 + */ + @TableField(exist = false) + private String parentName; + + /** + * 子部门 + */ + @TableField(exist = false) + private List children = new ArrayList(); + + public Long getDeptId() { + return deptId; + } + + public void setDeptId(Long deptId) { + this.deptId = deptId; + } + + public Long getParentId() { + return parentId; + } + + public void setParentId(Long parentId) { + this.parentId = parentId; + } + + public String getAncestors() { + return ancestors; + } + + public void setAncestors(String ancestors) { + this.ancestors = ancestors; + } + + @NotBlank(message = "部门名称不能为空") + @Size(min = 0, max = 30, message = "部门名称长度不能超过30个字符") + public String getDeptName() { + return deptName; + } + + public void setDeptName(String deptName) { + this.deptName = deptName; + } + + @NotNull(message = "显示顺序不能为空") + public Integer getOrderNum() { + return orderNum; + } + + public void setOrderNum(Integer orderNum) { + this.orderNum = orderNum; + } + + public String getLeader() { + return leader; + } + + public void setLeader(String leader) { + this.leader = leader; + } + + @Size(min = 0, max = 11, message = "联系电话长度不能超过11个字符") + public String getPhone() { + return phone; + } + + public void setPhone(String phone) { + this.phone = phone; + } + + @Email(message = "邮箱格式不正确") + @Size(min = 0, max = 50, message = "邮箱长度不能超过50个字符") + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + + public String getParentName() { + return parentName; + } + + public void setParentName(String parentName) { + this.parentName = parentName; + } + + public List getChildren() { + return children; + } + + public void setChildren(List children) { + this.children = children; + } + + @Override + public String toString() { + return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE) + .append("deptId", getDeptId()) + .append("parentId", getParentId()) + .append("ancestors", getAncestors()) + .append("deptName", getDeptName()) + .append("orderNum", getOrderNum()) + .append("leader", getLeader()) + .append("phone", getPhone()) + .append("email", getEmail()) + .append("status", getStatus()) + .append("delFlag", getDelFlag()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .toString(); + } +} diff --git a/bs-common/src/main/java/com/bs/common/core/domain/entity/SysDictData.java b/bs-common/src/main/java/com/bs/common/core/domain/entity/SysDictData.java new file mode 100644 index 0000000..4698aef --- /dev/null +++ b/bs-common/src/main/java/com/bs/common/core/domain/entity/SysDictData.java @@ -0,0 +1,67 @@ +package com.bs.common.core.domain.entity; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Size; + +import lombok.Data; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.bs.common.annotation.Excel; +import com.bs.common.annotation.Excel.ColumnType; +import com.bs.common.constant.UserConstants; +import com.bs.common.core.domain.BaseEntity; + +/** + * 字典数据表 sys_dict_data + * + * @author bs + */ +@Data +public class SysDictData extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 字典编码 */ + @Excel(name = "字典编码", cellType = ColumnType.NUMERIC) + private Long dictCode; + + /** 字典排序 */ + @Excel(name = "字典排序", cellType = ColumnType.NUMERIC) + private Long dictSort; + + /** 字典标签 */ + @Excel(name = "字典标签") + @NotBlank(message = "字典标签不能为空") + @Size(min = 0, max = 100, message = "字典标签长度不能超过100个字符") + private String dictLabel; + + /** 字典键值 */ + @Excel(name = "字典键值") + @NotBlank(message = "字典键值不能为空") + @Size(min = 0, max = 100, message = "字典键值长度不能超过100个字符") + private String dictValue; + + /** 字典类型 */ + @Excel(name = "字典类型") + @NotBlank(message = "字典类型不能为空") + @Size(min = 0, max = 100, message = "字典类型长度不能超过100个字符") + private String dictType; + + /** 样式属性(其他样式扩展) */ + @Size(min = 0, max = 100, message = "样式属性长度不能超过100个字符") + private String cssClass; + + /** 表格字典样式 */ + private String listClass; + + /** 是否默认(Y是 N否) */ + @Excel(name = "是否默认", readConverterExp = "Y=是,N=否") + private String isDefault; + + /** 状态(0正常 1停用) */ + @Excel(name = "状态", readConverterExp = "0=正常,1=停用") + private String status; + private String remark; + + +} diff --git a/bs-common/src/main/java/com/bs/common/core/domain/entity/SysDictType.java b/bs-common/src/main/java/com/bs/common/core/domain/entity/SysDictType.java new file mode 100644 index 0000000..4e6664e --- /dev/null +++ b/bs-common/src/main/java/com/bs/common/core/domain/entity/SysDictType.java @@ -0,0 +1,98 @@ +package com.bs.common.core.domain.entity; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Pattern; +import javax.validation.constraints.Size; + +import lombok.Data; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.bs.common.annotation.Excel; +import com.bs.common.annotation.Excel.ColumnType; +import com.bs.common.core.domain.BaseEntity; + +/** + * 字典类型表 sys_dict_type + * + * @author bs + */ +@Data +public class SysDictType extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 字典主键 */ + @Excel(name = "字典主键", cellType = ColumnType.NUMERIC) + private Long dictId; + + /** 字典名称 */ + @Excel(name = "字典名称") + private String dictName; + + /** 字典类型 */ + @Excel(name = "字典类型") + private String dictType; + + /** 状态(0正常 1停用) */ + @Excel(name = "状态", readConverterExp = "0=正常,1=停用") + private String status; + private String remark; + public Long getDictId() + { + return dictId; + } + + public void setDictId(Long dictId) + { + this.dictId = dictId; + } + + @NotBlank(message = "字典名称不能为空") + @Size(min = 0, max = 100, message = "字典类型名称长度不能超过100个字符") + public String getDictName() + { + return dictName; + } + + public void setDictName(String dictName) + { + this.dictName = dictName; + } + + @NotBlank(message = "字典类型不能为空") + @Size(min = 0, max = 100, message = "字典类型类型长度不能超过100个字符") + @Pattern(regexp = "^[a-z][a-z0-9_]*$", message = "字典类型必须以字母开头,且只能为(小写字母,数字,下滑线)") + public String getDictType() + { + return dictType; + } + + public void setDictType(String dictType) + { + this.dictType = dictType; + } + + public String getStatus() + { + return status; + } + + public void setStatus(String status) + { + this.status = status; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("dictId", getDictId()) + .append("dictName", getDictName()) + .append("dictType", getDictType()) + .append("status", getStatus()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .toString(); + } +} diff --git a/bs-common/src/main/java/com/bs/common/core/domain/entity/SysMenu.java b/bs-common/src/main/java/com/bs/common/core/domain/entity/SysMenu.java new file mode 100644 index 0000000..c0f8217 --- /dev/null +++ b/bs-common/src/main/java/com/bs/common/core/domain/entity/SysMenu.java @@ -0,0 +1,268 @@ +package com.bs.common.core.domain.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.bs.common.core.domain.BaseEntity; +import lombok.Data; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; +import java.util.ArrayList; +import java.util.List; + +/** + * 菜单权限表 sys_menu + * + * @author bs + */ +@Data +public class SysMenu extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 菜单ID */ + @TableId(value = "menu_id", type = IdType.AUTO) + private Long menuId; + + /** 菜单名称 */ + private String menuName; + + /** 父菜单名称 */ + @TableField(exist = false) + private String parentName; + + /** 父菜单ID */ + private Long parentId; + + /** 显示顺序 */ + private Integer orderNum; + + /** 路由地址 */ + private String path; + + /** 组件路径 */ + private String component; + + /** 路由参数 */ + @TableField("`query`") + private String query; + + /** 是否为外链(0是 1否) */ + private String isFrame; + + /** 是否缓存(0缓存 1不缓存) */ + private String isCache; + + /** 类型(M目录 C菜单 F按钮) */ + private String menuType; + + /** 显示状态(0显示 1隐藏) */ + private String visible; + + /** 菜单状态(0正常 1停用) */ + private String status; + + /** 权限字符串 */ + private String perms; + + /** 菜单图标 */ + private String icon; + private String remark; + /** 子菜单 */ + @TableField(exist = false) + private List children = new ArrayList(); + + public Long getMenuId() + { + return menuId; + } + + public void setMenuId(Long menuId) + { + this.menuId = menuId; + } + + @NotBlank(message = "菜单名称不能为空") + @Size(min = 0, max = 50, message = "菜单名称长度不能超过50个字符") + public String getMenuName() + { + return menuName; + } + + public void setMenuName(String menuName) + { + this.menuName = menuName; + } + + public String getParentName() + { + return parentName; + } + + public void setParentName(String parentName) + { + this.parentName = parentName; + } + + public Long getParentId() + { + return parentId; + } + + public void setParentId(Long parentId) + { + this.parentId = parentId; + } + + @NotNull(message = "显示顺序不能为空") + public Integer getOrderNum() + { + return orderNum; + } + + public void setOrderNum(Integer orderNum) + { + this.orderNum = orderNum; + } + + @Size(min = 0, max = 200, message = "路由地址不能超过200个字符") + public String getPath() + { + return path; + } + + public void setPath(String path) + { + this.path = path; + } + + @Size(min = 0, max = 200, message = "组件路径不能超过255个字符") + public String getComponent() + { + return component; + } + + public void setComponent(String component) + { + this.component = component; + } + + public String getQuery() + { + return query; + } + + public void setQuery(String query) + { + this.query = query; + } + + public String getIsFrame() + { + return isFrame; + } + + public void setIsFrame(String isFrame) + { + this.isFrame = isFrame; + } + + public String getIsCache() + { + return isCache; + } + + public void setIsCache(String isCache) + { + this.isCache = isCache; + } + + @NotBlank(message = "菜单类型不能为空") + public String getMenuType() + { + return menuType; + } + + public void setMenuType(String menuType) + { + this.menuType = menuType; + } + + public String getVisible() + { + return visible; + } + + public void setVisible(String visible) + { + this.visible = visible; + } + + public String getStatus() + { + return status; + } + + public void setStatus(String status) + { + this.status = status; + } + + @Size(min = 0, max = 100, message = "权限标识长度不能超过100个字符") + public String getPerms() + { + return perms; + } + + public void setPerms(String perms) + { + this.perms = perms; + } + + public String getIcon() + { + return icon; + } + + public void setIcon(String icon) + { + this.icon = icon; + } + + public List getChildren() + { + return children; + } + + public void setChildren(List children) + { + this.children = children; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("menuId", getMenuId()) + .append("menuName", getMenuName()) + .append("parentId", getParentId()) + .append("orderNum", getOrderNum()) + .append("path", getPath()) + .append("component", getComponent()) + .append("isFrame", getIsFrame()) + .append("IsCache", getIsCache()) + .append("menuType", getMenuType()) + .append("visible", getVisible()) + .append("status ", getStatus()) + .append("perms", getPerms()) + .append("icon", getIcon()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .toString(); + } +} diff --git a/bs-common/src/main/java/com/bs/common/core/domain/entity/SysRole.java b/bs-common/src/main/java/com/bs/common/core/domain/entity/SysRole.java new file mode 100644 index 0000000..2ea7a45 --- /dev/null +++ b/bs-common/src/main/java/com/bs/common/core/domain/entity/SysRole.java @@ -0,0 +1,239 @@ +package com.bs.common.core.domain.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.bs.common.annotation.Excel; +import com.bs.common.annotation.Excel.ColumnType; +import com.bs.common.core.domain.BaseEntity; +import lombok.Data; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; +import java.util.Set; + +/** + * 角色表 sys_role + * + * @author bs + */ +@Data +public class SysRole extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 角色ID */ + @Excel(name = "角色序号", cellType = ColumnType.NUMERIC) + @TableId(value = "role_id", type = IdType.AUTO) + private Long roleId; + + /** 角色名称 */ + @Excel(name = "角色名称") + private String roleName; + + /** 角色权限 */ + @Excel(name = "角色权限") + private String roleKey; + + /** 角色排序 */ + @Excel(name = "角色排序") + private Integer roleSort; + + /** 数据范围(1:所有数据权限;2:自定义数据权限;3:本部门数据权限;4:本部门及以下数据权限;5:仅本人数据权限) */ + @Excel(name = "数据范围", readConverterExp = "1=所有数据权限,2=自定义数据权限,3=本部门数据权限,4=本部门及以下数据权限,5=仅本人数据权限") + private String dataScope; + private String remark; + /** 菜单树选择项是否关联显示( 0:父子不互相关联显示 1:父子互相关联显示) */ + private boolean menuCheckStrictly; + + /** 部门树选择项是否关联显示(0:父子不互相关联显示 1:父子互相关联显示 ) */ + private boolean deptCheckStrictly; + + /** 角色状态(0正常 1停用) */ + @Excel(name = "角色状态", readConverterExp = "0=正常,1=停用") + private String status; + + /** 用户是否存在此角色标识 默认不存在 */ + @TableField(exist = false) + private boolean flag = false; + + /** 菜单组 */ + @TableField(exist = false) + private Long[] menuIds; + + /** 部门组(数据权限) */ + @TableField(exist = false) + private Long[] deptIds; + + /** 角色菜单权限 */ + @TableField(exist = false) + private Set permissions; + + public SysRole() + { + + } + + public SysRole(Long roleId) + { + this.roleId = roleId; + } + + public Long getRoleId() + { + return roleId; + } + + public void setRoleId(Long roleId) + { + this.roleId = roleId; + } + + public boolean isAdmin() + { + return isAdmin(this.roleId); + } + + public static boolean isAdmin(Long roleId) + { + return roleId != null && 1L == roleId; + } + + @NotBlank(message = "角色名称不能为空") + @Size(min = 0, max = 30, message = "角色名称长度不能超过30个字符") + public String getRoleName() + { + return roleName; + } + + public void setRoleName(String roleName) + { + this.roleName = roleName; + } + + @NotBlank(message = "权限字符不能为空") + @Size(min = 0, max = 100, message = "权限字符长度不能超过100个字符") + public String getRoleKey() + { + return roleKey; + } + + public void setRoleKey(String roleKey) + { + this.roleKey = roleKey; + } + + @NotNull(message = "显示顺序不能为空") + public Integer getRoleSort() + { + return roleSort; + } + + public void setRoleSort(Integer roleSort) + { + this.roleSort = roleSort; + } + + public String getDataScope() + { + return dataScope; + } + + public void setDataScope(String dataScope) + { + this.dataScope = dataScope; + } + + public boolean isMenuCheckStrictly() + { + return menuCheckStrictly; + } + + public void setMenuCheckStrictly(boolean menuCheckStrictly) + { + this.menuCheckStrictly = menuCheckStrictly; + } + + public boolean isDeptCheckStrictly() + { + return deptCheckStrictly; + } + + public void setDeptCheckStrictly(boolean deptCheckStrictly) + { + this.deptCheckStrictly = deptCheckStrictly; + } + + public String getStatus() + { + return status; + } + + public void setStatus(String status) + { + this.status = status; + } + + + public boolean isFlag() + { + return flag; + } + + public void setFlag(boolean flag) + { + this.flag = flag; + } + + public Long[] getMenuIds() + { + return menuIds; + } + + public void setMenuIds(Long[] menuIds) + { + this.menuIds = menuIds; + } + + public Long[] getDeptIds() + { + return deptIds; + } + + public void setDeptIds(Long[] deptIds) + { + this.deptIds = deptIds; + } + + public Set getPermissions() + { + return permissions; + } + + public void setPermissions(Set permissions) + { + this.permissions = permissions; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("roleId", getRoleId()) + .append("roleName", getRoleName()) + .append("roleKey", getRoleKey()) + .append("roleSort", getRoleSort()) + .append("dataScope", getDataScope()) + .append("menuCheckStrictly", isMenuCheckStrictly()) + .append("deptCheckStrictly", isDeptCheckStrictly()) + .append("status", getStatus()) + .append("delFlag", getDelFlag()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .toString(); + } +} diff --git a/bs-common/src/main/java/com/bs/common/core/domain/entity/SysTenant.java b/bs-common/src/main/java/com/bs/common/core/domain/entity/SysTenant.java new file mode 100644 index 0000000..08c8b33 --- /dev/null +++ b/bs-common/src/main/java/com/bs/common/core/domain/entity/SysTenant.java @@ -0,0 +1,57 @@ + +package com.bs.common.core.domain.entity; + + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.bs.common.core.domain.BaseEntity; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@Data +public class SysTenant extends BaseEntity { + + @TableId(value = "ID", type = IdType.AUTO) + private Long id; + private String name; + private String simpleName; + private String contactUser; + private String contactPhone; + private Integer status; + private String userName; + private String password; + + @ApiModelProperty(value = "行政区划") + private String areaCode; + /** + * 所有模块集合 + */ + @TableField(exist = false) + private String systemNames; + @TableField(exist = false) + private Long tenantId; + @TableField(exist = false) + private String deptId; + @TableField(exist = false) + private TenantConfig tenantConfig; + /** + * 备注 + */ + private String remark; + /** + * 所属系统 + */ + @TableField(exist = false) + private List systems; + + @TableField(exist = false) + private String areaName; + + @TableField(exist = false) + private List roleIds; + + +} diff --git a/bs-common/src/main/java/com/bs/common/core/domain/entity/SysUser.java b/bs-common/src/main/java/com/bs/common/core/domain/entity/SysUser.java new file mode 100644 index 0000000..109a319 --- /dev/null +++ b/bs-common/src/main/java/com/bs/common/core/domain/entity/SysUser.java @@ -0,0 +1,142 @@ +package com.bs.common.core.domain.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.bs.common.annotation.Excel; +import com.bs.common.annotation.Excel.ColumnType; +import com.bs.common.annotation.Excel.Type; +import com.bs.common.annotation.Excels; +import com.bs.common.core.domain.BaseEntity; +import com.bs.common.xss.Xss; +import lombok.Data; + +import javax.validation.constraints.Email; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Size; +import java.util.Date; +import java.util.List; + +/** + * 用户对象 sys_user + * + * @author bs + */ +@Data +public class SysUser extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 用户ID */ + @Excel(name = "用户序号", cellType = ColumnType.NUMERIC, prompt = "用户编号") + @TableId(value = "user_id",type = IdType.AUTO) + private Long userId; + + /** 部门ID */ + @Excel(name = "部门编号", type = Type.IMPORT) + private Long deptId; + + /** 用户账号 */ + @Excel(name = "登录名称") + @Xss(message = "用户账号不能包含脚本字符") + @NotBlank(message = "用户账号不能为空") + @Size(min = 0, max = 30, message = "用户账号长度不能超过30个字符") + private String userName; + + /** 用户昵称 */ + @Excel(name = "用户名称") + @Xss(message = "用户昵称不能包含脚本字符") + @Size(min = 0, max = 30, message = "用户昵称长度不能超过30个字符") + private String nickName; + + /** 用户邮箱 */ + @Excel(name = "用户邮箱") + @Email(message = "邮箱格式不正确") + @Size(min = 0, max = 50, message = "邮箱长度不能超过50个字符") + private String email; + + /** 手机号码 */ + @Excel(name = "手机号码") + @Size(min = 0, max = 11, message = "手机号码长度不能超过11个字符") + private String phonenumber; + + /** 用户性别 */ + @Excel(name = "用户性别", readConverterExp = "0=男,1=女,2=未知") + private String sex; + + /** 用户头像 */ + private String avatar; + + /** 密码 */ + private String password; + + /** 帐号状态(0正常 1停用) */ + @Excel(name = "帐号状态", readConverterExp = "0=正常,1=停用") + private String status; + + /** 删除标志(0代表存在 2代表删除) */ + private String delFlag; + + /** 最后登录IP */ + @Excel(name = "最后登录IP", type = Type.EXPORT) + private String loginIp; + + + /** 是否是租户,Y是N,不是 */ + @Excel(name = "是否是租户,Y是N,不是", type = Type.EXPORT) + private String isTenant; + + /** 是否是租户管理员,Y是N,不是 */ + @Excel(name = "是否是租户管理员,Y是N,不是", type = Type.EXPORT) + private String isTenantAdmin; + + /** 最后登录时间 */ + @Excel(name = "最后登录时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss", type = Type.EXPORT) + private Date loginDate; + + /** 部门对象 */ + @Excels({ + @Excel(name = "部门名称", targetAttr = "deptName", type = Type.EXPORT), + @Excel(name = "部门负责人", targetAttr = "leader", type = Type.EXPORT) + }) + @TableField(exist = false) + private SysDept dept; + + /** 角色对象 */ + @TableField(exist = false) + private List roles; + + /** 角色组 */ + @TableField(exist = false) + private Long[] roleIds; + + /** 岗位组 */ + @TableField(exist = false) + private Long[] postIds; + + /** 角色ID */ + @TableField(exist = false) + private Long roleId; + private String remark; + public SysUser() + { + + } + + public SysUser(Long userId) + { + this.userId = userId; + } + + public boolean isAdmin() + { + return isAdmin(this.userId); + } + + public static boolean isAdmin(Long userId) + { + return userId != null && 1L == userId; + } + + +} diff --git a/bs-common/src/main/java/com/bs/common/core/domain/entity/TenantConfig.java b/bs-common/src/main/java/com/bs/common/core/domain/entity/TenantConfig.java new file mode 100644 index 0000000..d091d14 --- /dev/null +++ b/bs-common/src/main/java/com/bs/common/core/domain/entity/TenantConfig.java @@ -0,0 +1,156 @@ +package com.bs.common.core.domain.entity; + +import com.baomidou.mybatisplus.annotation.*; +import com.bs.common.annotation.Excel; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonIgnore; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.experimental.Accessors; + +import java.time.LocalDateTime; +import java.util.Date; + +/** + * 租户配置对象 tenant_config + * + * @author ruoyi + * @date 2023-04-02 + */ +@Accessors(chain = true) +@TableName("tenant_config") +@Data +public class TenantConfig +{ + private static final long serialVersionUID = 1L; + + /** $column.columnComment */ + @TableId(value = "ID",type = IdType.AUTO) + @ApiModelProperty(value = "${column.columnComment}") + private Long id; + + /** + * 创建部门 + */ + @TableField(fill = FieldFill.INSERT) + private Long createDept; + @TableField(exist = false) + private Long tenantId; + + /** + * 创建者 + */ + @TableField(fill = FieldFill.INSERT) + private Long createBy; + + /** + * 创建时间 + */ + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** + * 更新者 + */ + @TableField(fill = FieldFill.INSERT_UPDATE) + private Long updateBy; + + /** + * 更新时间 + */ + @TableField(fill = FieldFill.INSERT_UPDATE) + private LocalDateTime updateTime; + /** + * 逻辑删除标示 + */ + //做删除操作的时候,会变成update,del_flag = '2' + @TableLogic(value = "0", delval = "2") + @TableField(fill = FieldFill.INSERT) + @JsonIgnore + private String delFlag; + + + @JsonFormat(pattern = "yyyy-MM-dd") + @Excel(name = "开始时间", width = 30, dateFormat = "yyyy-MM-dd") + @ApiModelProperty(value = "开始时间") + private Date startData; + + /** 结束时间 */ + + @JsonFormat(pattern = "yyyy-MM-dd") + @Excel(name = "结束时间", width = 30, dateFormat = "yyyy-MM-dd") + @ApiModelProperty(value = "结束时间") + private Date stopData; + + /** 是否限制用户数 */ + + @Excel(name = "是否限制用户数") + @ApiModelProperty(value = "是否限制用户数") + private String isUserAstrict; + + @Excel(name = "首页类型") + @ApiModelProperty(value = "首页类型") + private String homeType; + + /** 用户数 */ + + @Excel(name = "用户数") + @ApiModelProperty(value = "用户数") + private Integer userQuantity; + + /** 是否限制在线数 */ + + @Excel(name = "是否限制在线数") + @ApiModelProperty(value = "是否限制在线数") + private String isOnLine; + + /** 在线数 */ + + @Excel(name = "在线数") + @ApiModelProperty(value = "在线数") + private Integer onLineUserQuantity; + + /** 是否定义系统名称 */ + + @Excel(name = "是否定义系统名称") + @ApiModelProperty(value = "是否定义系统名称") + private String isDefinitionName; + + /** 系统名称 */ + + @Excel(name = "系统名称") + @ApiModelProperty(value = "系统名称") + private String sysName; + + /** 是否定义系统logo */ + + @Excel(name = "是否定义系统logo") + @ApiModelProperty(value = "是否定义系统logo") + private String isDefinitionLogo; + + /** 系统log */ + + @Excel(name = "系统log") + @ApiModelProperty(value = "系统log") + private String sysLog; + + /** 是否定义系统色调 */ + + @Excel(name = "是否定义系统色调") + @ApiModelProperty(value = "是否定义系统色调") + private String isDefinitionHue; + + /** 系统色调 */ + + @Excel(name = "系统色调") + @ApiModelProperty(value = "系统色调") + private String sysHue; + + /** 定制化数据,键值对{key:{type1:"",type2:"",value:""},key2:{type1:"",type2:"",value:""}}具体操作时候,做具体说明 */ + + @ApiModelProperty(value = "定制化数据,键值对{key:{type1:'',type2:'',value:''},key2:{type1:'',type2:'',value:''}}具体操作时候,做具体说明") + private String customizationFields; + + + +} diff --git a/bs-common/src/main/java/com/bs/common/core/domain/model/LoginBody.java b/bs-common/src/main/java/com/bs/common/core/domain/model/LoginBody.java new file mode 100644 index 0000000..a61a351 --- /dev/null +++ b/bs-common/src/main/java/com/bs/common/core/domain/model/LoginBody.java @@ -0,0 +1,69 @@ +package com.bs.common.core.domain.model; + +/** + * 用户登录对象 + * + * @author bs + */ +public class LoginBody +{ + /** + * 用户名 + */ + private String username; + + /** + * 用户密码 + */ + private String password; + + /** + * 验证码 + */ + private String code; + + /** + * 唯一标识 + */ + private String uuid; + + public String getUsername() + { + return username; + } + + public void setUsername(String username) + { + this.username = username; + } + + public String getPassword() + { + return password; + } + + public void setPassword(String password) + { + this.password = password; + } + + public String getCode() + { + return code; + } + + public void setCode(String code) + { + this.code = code; + } + + public String getUuid() + { + return uuid; + } + + public void setUuid(String uuid) + { + this.uuid = uuid; + } +} diff --git a/bs-common/src/main/java/com/bs/common/core/domain/model/LoginUser.java b/bs-common/src/main/java/com/bs/common/core/domain/model/LoginUser.java new file mode 100644 index 0000000..096e578 --- /dev/null +++ b/bs-common/src/main/java/com/bs/common/core/domain/model/LoginUser.java @@ -0,0 +1,312 @@ +package com.bs.common.core.domain.model; + +import com.alibaba.fastjson2.annotation.JSONField; +import com.bs.common.core.domain.entity.SysUser; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.userdetails.UserDetails; +import java.util.Collection; +import java.util.Set; + +/** + * 登录用户身份权限 + * + * @author bs + */ +public class LoginUser implements UserDetails +{ + private static final long serialVersionUID = 1L; + + /** + * 用户ID + */ + private Long userId; + + /** + * 部门ID + */ + private Long deptId; + + /** + * 用户唯一标识 + */ + private String token; + + /** + * 登录时间 + */ + private Long loginTime; + + /** + * 过期时间 + */ + private Long expireTime; + + /** + * 登录IP地址 + */ + private String ipaddr; + + /** + * 登录地点 + */ + private String loginLocation; + + /** + * 浏览器类型 + */ + private String browser; + + /** + * 操作系统 + */ + private String os; + + /** + * 权限列表 + */ + private Set permissions; + + /** + * 用户信息 + */ + private SysUser user; + + /** + * 租户id + */ + private Long tenantId; + /** + * 是否租户 + */ + private String isTenant; + /** 是否租户管理员 */ + /** + * 是否租户admin + * Y 是 N 否 + * + * @return + */ + private String isTenantAdmin; + + public Long getTenantId() + { + return tenantId; + } + + public void setTenantId(Long tenantId) + { + this.tenantId = tenantId; + } + + public String getIsTenant() { + return isTenant; + } + + public void setIsTenant(String isTenant) { + this.isTenant = isTenant; + } + + public String getIsTenantAdmin() { + return isTenantAdmin; + } + + public void setIsTenantAdmin(String isTenantAdmin) { + this.isTenantAdmin = isTenantAdmin; + } + + public LoginUser() + { + } + + public LoginUser(SysUser user, Set permissions) + { + this.user = user; + this.permissions = permissions; + } + + public LoginUser(Long userId, Long deptId, SysUser user, Set permissions) + { + this.userId = userId; + this.deptId = deptId; + this.tenantId = user.getTenantId(); + this.isTenant = user.getIsTenant(); + this.isTenantAdmin = user.getIsTenantAdmin(); + this.user = user; + this.permissions = permissions; + } + + public Long getUserId() + { + return userId; + } + + public void setUserId(Long userId) + { + this.userId = userId; + } + + public Long getDeptId() + { + return deptId; + } + + public void setDeptId(Long deptId) + { + this.deptId = deptId; + } + + public String getToken() + { + return token; + } + + public void setToken(String token) + { + this.token = token; + } + + @JSONField(serialize = false) + @Override + public String getPassword() + { + return user.getPassword(); + } + + @Override + public String getUsername() + { + return user.getUserName(); + } + + /** + * 账户是否未过期,过期无法验证 + */ + @JSONField(serialize = false) + @Override + public boolean isAccountNonExpired() + { + return true; + } + + /** + * 指定用户是否解锁,锁定的用户无法进行身份验证 + * + * @return + */ + @JSONField(serialize = false) + @Override + public boolean isAccountNonLocked() + { + return true; + } + + /** + * 指示是否已过期的用户的凭据(密码),过期的凭据防止认证 + * + * @return + */ + @JSONField(serialize = false) + @Override + public boolean isCredentialsNonExpired() + { + return true; + } + + /** + * 是否可用 ,禁用的用户不能身份验证 + * + * @return + */ + @JSONField(serialize = false) + @Override + public boolean isEnabled() + { + return true; + } + + public Long getLoginTime() + { + return loginTime; + } + + public void setLoginTime(Long loginTime) + { + this.loginTime = loginTime; + } + + public String getIpaddr() + { + return ipaddr; + } + + public void setIpaddr(String ipaddr) + { + this.ipaddr = ipaddr; + } + + public String getLoginLocation() + { + return loginLocation; + } + + public void setLoginLocation(String loginLocation) + { + this.loginLocation = loginLocation; + } + + public String getBrowser() + { + return browser; + } + + public void setBrowser(String browser) + { + this.browser = browser; + } + + public String getOs() + { + return os; + } + + public void setOs(String os) + { + this.os = os; + } + + public Long getExpireTime() + { + return expireTime; + } + + public void setExpireTime(Long expireTime) + { + this.expireTime = expireTime; + } + + public Set getPermissions() + { + return permissions; + } + + public void setPermissions(Set permissions) + { + this.permissions = permissions; + } + + public SysUser getUser() + { + return user; + } + + public void setUser(SysUser user) + { + this.user = user; + } + + @Override + public Collection getAuthorities() + { + return null; + } +} diff --git a/bs-common/src/main/java/com/bs/common/core/domain/model/RegisterBody.java b/bs-common/src/main/java/com/bs/common/core/domain/model/RegisterBody.java new file mode 100644 index 0000000..dba2c9f --- /dev/null +++ b/bs-common/src/main/java/com/bs/common/core/domain/model/RegisterBody.java @@ -0,0 +1,11 @@ +package com.bs.common.core.domain.model; + +/** + * 用户注册对象 + * + * @author bs + */ +public class RegisterBody extends LoginBody +{ + +} diff --git a/bs-common/src/main/java/com/bs/common/core/page/PageDomain.java b/bs-common/src/main/java/com/bs/common/core/page/PageDomain.java new file mode 100644 index 0000000..9a8cb43 --- /dev/null +++ b/bs-common/src/main/java/com/bs/common/core/page/PageDomain.java @@ -0,0 +1,101 @@ +package com.bs.common.core.page; + +import com.bs.common.utils.StringUtils; + +/** + * 分页数据 + * + * @author bs + */ +public class PageDomain +{ + /** 当前记录起始索引 */ + private Integer pageNum; + + /** 每页显示记录数 */ + private Integer pageSize; + + /** 排序列 */ + private String orderByColumn; + + /** 排序的方向desc或者asc */ + private String isAsc = "asc"; + + /** 分页参数合理化 */ + private Boolean reasonable = true; + + public String getOrderBy() + { + if (StringUtils.isEmpty(orderByColumn)) + { + return ""; + } + return StringUtils.toUnderScoreCase(orderByColumn) + " " + isAsc; + } + + public Integer getPageNum() + { + return pageNum; + } + + public void setPageNum(Integer pageNum) + { + this.pageNum = pageNum; + } + + public Integer getPageSize() + { + return pageSize; + } + + public void setPageSize(Integer pageSize) + { + this.pageSize = pageSize; + } + + public String getOrderByColumn() + { + return orderByColumn; + } + + public void setOrderByColumn(String orderByColumn) + { + this.orderByColumn = orderByColumn; + } + + public String getIsAsc() + { + return isAsc; + } + + public void setIsAsc(String isAsc) + { + if (StringUtils.isNotEmpty(isAsc)) + { + // 兼容前端排序类型 + if ("ascending".equals(isAsc)) + { + isAsc = "asc"; + } + else if ("descending".equals(isAsc)) + { + isAsc = "desc"; + } + this.isAsc = isAsc; + } + } + + public Boolean getReasonable() + { + if (StringUtils.isNull(reasonable)) + { + return Boolean.TRUE; + } + return reasonable; + } + + public void setReasonable(Boolean reasonable) + { + this.reasonable = reasonable; + } +} diff --git a/bs-common/src/main/java/com/bs/common/core/page/TableDataInfo.java b/bs-common/src/main/java/com/bs/common/core/page/TableDataInfo.java new file mode 100644 index 0000000..9f96f91 --- /dev/null +++ b/bs-common/src/main/java/com/bs/common/core/page/TableDataInfo.java @@ -0,0 +1,85 @@ +package com.bs.common.core.page; + +import java.io.Serializable; +import java.util.List; + +/** + * 表格分页数据对象 + * + * @author bs + */ +public class TableDataInfo implements Serializable +{ + private static final long serialVersionUID = 1L; + + /** 总记录数 */ + private long total; + + /** 列表数据 */ + private List rows; + + /** 消息状态码 */ + private int code; + + /** 消息内容 */ + private String msg; + + /** + * 表格数据对象 + */ + public TableDataInfo() + { + } + + /** + * 分页 + * + * @param list 列表数据 + * @param total 总记录数 + */ + public TableDataInfo(List list, int total) + { + this.rows = list; + this.total = total; + } + + public long getTotal() + { + return total; + } + + public void setTotal(long total) + { + this.total = total; + } + + public List getRows() + { + return rows; + } + + public void setRows(List rows) + { + this.rows = rows; + } + + public int getCode() + { + return code; + } + + public void setCode(int code) + { + this.code = code; + } + + public String getMsg() + { + return msg; + } + + public void setMsg(String msg) + { + this.msg = msg; + } +} diff --git a/bs-common/src/main/java/com/bs/common/core/page/TableSupport.java b/bs-common/src/main/java/com/bs/common/core/page/TableSupport.java new file mode 100644 index 0000000..ba7c34c --- /dev/null +++ b/bs-common/src/main/java/com/bs/common/core/page/TableSupport.java @@ -0,0 +1,56 @@ +package com.bs.common.core.page; + +import com.bs.common.core.text.Convert; +import com.bs.common.utils.ServletUtils; + +/** + * 表格数据处理 + * + * @author bs + */ +public class TableSupport +{ + /** + * 当前记录起始索引 + */ + public static final String PAGE_NUM = "pageNum"; + + /** + * 每页显示记录数 + */ + public static final String PAGE_SIZE = "pageSize"; + + /** + * 排序列 + */ + public static final String ORDER_BY_COLUMN = "orderByColumn"; + + /** + * 排序的方向 "desc" 或者 "asc". + */ + public static final String IS_ASC = "isAsc"; + + /** + * 分页参数合理化 + */ + public static final String REASONABLE = "reasonable"; + + /** + * 封装分页对象 + */ + public static PageDomain getPageDomain() + { + PageDomain pageDomain = new PageDomain(); + pageDomain.setPageNum(Convert.toInt(ServletUtils.getParameter(PAGE_NUM), 1)); + pageDomain.setPageSize(Convert.toInt(ServletUtils.getParameter(PAGE_SIZE), 10)); + pageDomain.setOrderByColumn(ServletUtils.getParameter(ORDER_BY_COLUMN)); + pageDomain.setIsAsc(ServletUtils.getParameter(IS_ASC)); + pageDomain.setReasonable(ServletUtils.getParameterToBool(REASONABLE)); + return pageDomain; + } + + public static PageDomain buildPageRequest() + { + return getPageDomain(); + } +} diff --git a/bs-common/src/main/java/com/bs/common/core/redis/RedisCache.java b/bs-common/src/main/java/com/bs/common/core/redis/RedisCache.java new file mode 100644 index 0000000..d83dbe9 --- /dev/null +++ b/bs-common/src/main/java/com/bs/common/core/redis/RedisCache.java @@ -0,0 +1,268 @@ +package com.bs.common.core.redis; + +import java.util.Collection; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.TimeUnit; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.BoundSetOperations; +import org.springframework.data.redis.core.HashOperations; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.core.ValueOperations; +import org.springframework.stereotype.Component; + +/** + * spring redis 工具类 + * + * @author bs + **/ +@SuppressWarnings(value = { "unchecked", "rawtypes" }) +@Component +public class RedisCache +{ + @Autowired + public RedisTemplate redisTemplate; + + /** + * 缓存基本的对象,Integer、String、实体类等 + * + * @param key 缓存的键值 + * @param value 缓存的值 + */ + public void setCacheObject(final String key, final T value) + { + redisTemplate.opsForValue().set(key, value); + } + + /** + * 缓存基本的对象,Integer、String、实体类等 + * + * @param key 缓存的键值 + * @param value 缓存的值 + * @param timeout 时间 + * @param timeUnit 时间颗粒度 + */ + public void setCacheObject(final String key, final T value, final Integer timeout, final TimeUnit timeUnit) + { + redisTemplate.opsForValue().set(key, value, timeout, timeUnit); + } + + /** + * 设置有效时间 + * + * @param key Redis键 + * @param timeout 超时时间 + * @return true=设置成功;false=设置失败 + */ + public boolean expire(final String key, final long timeout) + { + return expire(key, timeout, TimeUnit.SECONDS); + } + + /** + * 设置有效时间 + * + * @param key Redis键 + * @param timeout 超时时间 + * @param unit 时间单位 + * @return true=设置成功;false=设置失败 + */ + public boolean expire(final String key, final long timeout, final TimeUnit unit) + { + return redisTemplate.expire(key, timeout, unit); + } + + /** + * 获取有效时间 + * + * @param key Redis键 + * @return 有效时间 + */ + public long getExpire(final String key) + { + return redisTemplate.getExpire(key); + } + + /** + * 判断 key是否存在 + * + * @param key 键 + * @return true 存在 false不存在 + */ + public Boolean hasKey(String key) + { + return redisTemplate.hasKey(key); + } + + /** + * 获得缓存的基本对象。 + * + * @param key 缓存键值 + * @return 缓存键值对应的数据 + */ + public T getCacheObject(final String key) + { + ValueOperations operation = redisTemplate.opsForValue(); + return operation.get(key); + } + + /** + * 删除单个对象 + * + * @param key + */ + public boolean deleteObject(final String key) + { + return redisTemplate.delete(key); + } + + /** + * 删除集合对象 + * + * @param collection 多个对象 + * @return + */ + public boolean deleteObject(final Collection collection) + { + return redisTemplate.delete(collection) > 0; + } + + /** + * 缓存List数据 + * + * @param key 缓存的键值 + * @param dataList 待缓存的List数据 + * @return 缓存的对象 + */ + public long setCacheList(final String key, final List dataList) + { + Long count = redisTemplate.opsForList().rightPushAll(key, dataList); + return count == null ? 0 : count; + } + + /** + * 获得缓存的list对象 + * + * @param key 缓存的键值 + * @return 缓存键值对应的数据 + */ + public List getCacheList(final String key) + { + return redisTemplate.opsForList().range(key, 0, -1); + } + + /** + * 缓存Set + * + * @param key 缓存键值 + * @param dataSet 缓存的数据 + * @return 缓存数据的对象 + */ + public BoundSetOperations setCacheSet(final String key, final Set dataSet) + { + BoundSetOperations setOperation = redisTemplate.boundSetOps(key); + Iterator it = dataSet.iterator(); + while (it.hasNext()) + { + setOperation.add(it.next()); + } + return setOperation; + } + + /** + * 获得缓存的set + * + * @param key + * @return + */ + public Set getCacheSet(final String key) + { + return redisTemplate.opsForSet().members(key); + } + + /** + * 缓存Map + * + * @param key + * @param dataMap + */ + public void setCacheMap(final String key, final Map dataMap) + { + if (dataMap != null) { + redisTemplate.opsForHash().putAll(key, dataMap); + } + } + + /** + * 获得缓存的Map + * + * @param key + * @return + */ + public Map getCacheMap(final String key) + { + return redisTemplate.opsForHash().entries(key); + } + + /** + * 往Hash中存入数据 + * + * @param key Redis键 + * @param hKey Hash键 + * @param value 值 + */ + public void setCacheMapValue(final String key, final String hKey, final T value) + { + redisTemplate.opsForHash().put(key, hKey, value); + } + + /** + * 获取Hash中的数据 + * + * @param key Redis键 + * @param hKey Hash键 + * @return Hash中的对象 + */ + public T getCacheMapValue(final String key, final String hKey) + { + HashOperations opsForHash = redisTemplate.opsForHash(); + return opsForHash.get(key, hKey); + } + + /** + * 获取多个Hash中的数据 + * + * @param key Redis键 + * @param hKeys Hash键集合 + * @return Hash对象集合 + */ + public List getMultiCacheMapValue(final String key, final Collection hKeys) + { + return redisTemplate.opsForHash().multiGet(key, hKeys); + } + + /** + * 删除Hash中的某条数据 + * + * @param key Redis键 + * @param hKey Hash键 + * @return 是否成功 + */ + public boolean deleteCacheMapValue(final String key, final String hKey) + { + return redisTemplate.opsForHash().delete(key, hKey) > 0; + } + + /** + * 获得缓存的基本对象列表 + * + * @param pattern 字符串前缀 + * @return 对象列表 + */ + public Collection keys(final String pattern) + { + return redisTemplate.keys(pattern); + } +} diff --git a/bs-common/src/main/java/com/bs/common/core/text/CharsetKit.java b/bs-common/src/main/java/com/bs/common/core/text/CharsetKit.java new file mode 100644 index 0000000..ef506dd --- /dev/null +++ b/bs-common/src/main/java/com/bs/common/core/text/CharsetKit.java @@ -0,0 +1,86 @@ +package com.bs.common.core.text; + +import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; +import com.bs.common.utils.StringUtils; + +/** + * 字符集工具类 + * + * @author bs + */ +public class CharsetKit +{ + /** ISO-8859-1 */ + public static final String ISO_8859_1 = "ISO-8859-1"; + /** UTF-8 */ + public static final String UTF_8 = "UTF-8"; + /** GBK */ + public static final String GBK = "GBK"; + + /** ISO-8859-1 */ + public static final Charset CHARSET_ISO_8859_1 = Charset.forName(ISO_8859_1); + /** UTF-8 */ + public static final Charset CHARSET_UTF_8 = Charset.forName(UTF_8); + /** GBK */ + public static final Charset CHARSET_GBK = Charset.forName(GBK); + + /** + * 转换为Charset对象 + * + * @param charset 字符集,为空则返回默认字符集 + * @return Charset + */ + public static Charset charset(String charset) + { + return StringUtils.isEmpty(charset) ? Charset.defaultCharset() : Charset.forName(charset); + } + + /** + * 转换字符串的字符集编码 + * + * @param source 字符串 + * @param srcCharset 源字符集,默认ISO-8859-1 + * @param destCharset 目标字符集,默认UTF-8 + * @return 转换后的字符集 + */ + public static String convert(String source, String srcCharset, String destCharset) + { + return convert(source, Charset.forName(srcCharset), Charset.forName(destCharset)); + } + + /** + * 转换字符串的字符集编码 + * + * @param source 字符串 + * @param srcCharset 源字符集,默认ISO-8859-1 + * @param destCharset 目标字符集,默认UTF-8 + * @return 转换后的字符集 + */ + public static String convert(String source, Charset srcCharset, Charset destCharset) + { + if (null == srcCharset) + { + srcCharset = StandardCharsets.ISO_8859_1; + } + + if (null == destCharset) + { + destCharset = StandardCharsets.UTF_8; + } + + if (StringUtils.isEmpty(source) || srcCharset.equals(destCharset)) + { + return source; + } + return new String(source.getBytes(srcCharset), destCharset); + } + + /** + * @return 系统字符集编码 + */ + public static String systemCharset() + { + return Charset.defaultCharset().name(); + } +} diff --git a/bs-common/src/main/java/com/bs/common/core/text/Convert.java b/bs-common/src/main/java/com/bs/common/core/text/Convert.java new file mode 100644 index 0000000..e6cb7cf --- /dev/null +++ b/bs-common/src/main/java/com/bs/common/core/text/Convert.java @@ -0,0 +1,1000 @@ +package com.bs.common.core.text; + +import java.math.BigDecimal; +import java.math.BigInteger; +import java.nio.ByteBuffer; +import java.nio.charset.Charset; +import java.text.NumberFormat; +import java.util.Set; +import com.bs.common.utils.StringUtils; +import org.apache.commons.lang3.ArrayUtils; + +/** + * 类型转换器 + * + * @author bs + */ +public class Convert +{ + /** + * 转换为字符串
+ * 如果给定的值为null,或者转换失败,返回默认值
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @param defaultValue 转换错误时的默认值 + * @return 结果 + */ + public static String toStr(Object value, String defaultValue) + { + if (null == value) + { + return defaultValue; + } + if (value instanceof String) + { + return (String) value; + } + return value.toString(); + } + + /** + * 转换为字符串
+ * 如果给定的值为null,或者转换失败,返回默认值null
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static String toStr(Object value) + { + return toStr(value, null); + } + + /** + * 转换为字符
+ * 如果给定的值为null,或者转换失败,返回默认值
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @param defaultValue 转换错误时的默认值 + * @return 结果 + */ + public static Character toChar(Object value, Character defaultValue) + { + if (null == value) + { + return defaultValue; + } + if (value instanceof Character) + { + return (Character) value; + } + + final String valueStr = toStr(value, null); + return StringUtils.isEmpty(valueStr) ? defaultValue : valueStr.charAt(0); + } + + /** + * 转换为字符
+ * 如果给定的值为null,或者转换失败,返回默认值null
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static Character toChar(Object value) + { + return toChar(value, null); + } + + /** + * 转换为byte
+ * 如果给定的值为null,或者转换失败,返回默认值
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @param defaultValue 转换错误时的默认值 + * @return 结果 + */ + public static Byte toByte(Object value, Byte defaultValue) + { + if (value == null) + { + return defaultValue; + } + if (value instanceof Byte) + { + return (Byte) value; + } + if (value instanceof Number) + { + return ((Number) value).byteValue(); + } + final String valueStr = toStr(value, null); + if (StringUtils.isEmpty(valueStr)) + { + return defaultValue; + } + try + { + return Byte.parseByte(valueStr); + } + catch (Exception e) + { + return defaultValue; + } + } + + /** + * 转换为byte
+ * 如果给定的值为null,或者转换失败,返回默认值null
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static Byte toByte(Object value) + { + return toByte(value, null); + } + + /** + * 转换为Short
+ * 如果给定的值为null,或者转换失败,返回默认值
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @param defaultValue 转换错误时的默认值 + * @return 结果 + */ + public static Short toShort(Object value, Short defaultValue) + { + if (value == null) + { + return defaultValue; + } + if (value instanceof Short) + { + return (Short) value; + } + if (value instanceof Number) + { + return ((Number) value).shortValue(); + } + final String valueStr = toStr(value, null); + if (StringUtils.isEmpty(valueStr)) + { + return defaultValue; + } + try + { + return Short.parseShort(valueStr.trim()); + } + catch (Exception e) + { + return defaultValue; + } + } + + /** + * 转换为Short
+ * 如果给定的值为null,或者转换失败,返回默认值null
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static Short toShort(Object value) + { + return toShort(value, null); + } + + /** + * 转换为Number
+ * 如果给定的值为空,或者转换失败,返回默认值
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @param defaultValue 转换错误时的默认值 + * @return 结果 + */ + public static Number toNumber(Object value, Number defaultValue) + { + if (value == null) + { + return defaultValue; + } + if (value instanceof Number) + { + return (Number) value; + } + final String valueStr = toStr(value, null); + if (StringUtils.isEmpty(valueStr)) + { + return defaultValue; + } + try + { + return NumberFormat.getInstance().parse(valueStr); + } + catch (Exception e) + { + return defaultValue; + } + } + + /** + * 转换为Number
+ * 如果给定的值为空,或者转换失败,返回默认值null
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static Number toNumber(Object value) + { + return toNumber(value, null); + } + + /** + * 转换为int
+ * 如果给定的值为空,或者转换失败,返回默认值
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @param defaultValue 转换错误时的默认值 + * @return 结果 + */ + public static Integer toInt(Object value, Integer defaultValue) + { + if (value == null) + { + return defaultValue; + } + if (value instanceof Integer) + { + return (Integer) value; + } + if (value instanceof Number) + { + return ((Number) value).intValue(); + } + final String valueStr = toStr(value, null); + if (StringUtils.isEmpty(valueStr)) + { + return defaultValue; + } + try + { + return Integer.parseInt(valueStr.trim()); + } + catch (Exception e) + { + return defaultValue; + } + } + + /** + * 转换为int
+ * 如果给定的值为null,或者转换失败,返回默认值null
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static Integer toInt(Object value) + { + return toInt(value, null); + } + + /** + * 转换为Integer数组
+ * + * @param str 被转换的值 + * @return 结果 + */ + public static Integer[] toIntArray(String str) + { + return toIntArray(",", str); + } + + /** + * 转换为Long数组
+ * + * @param str 被转换的值 + * @return 结果 + */ + public static Long[] toLongArray(String str) + { + return toLongArray(",", str); + } + + /** + * 转换为Integer数组
+ * + * @param split 分隔符 + * @param split 被转换的值 + * @return 结果 + */ + public static Integer[] toIntArray(String split, String str) + { + if (StringUtils.isEmpty(str)) + { + return new Integer[] {}; + } + String[] arr = str.split(split); + final Integer[] ints = new Integer[arr.length]; + for (int i = 0; i < arr.length; i++) + { + final Integer v = toInt(arr[i], 0); + ints[i] = v; + } + return ints; + } + + /** + * 转换为Long数组
+ * + * @param split 分隔符 + * @param str 被转换的值 + * @return 结果 + */ + public static Long[] toLongArray(String split, String str) + { + if (StringUtils.isEmpty(str)) + { + return new Long[] {}; + } + String[] arr = str.split(split); + final Long[] longs = new Long[arr.length]; + for (int i = 0; i < arr.length; i++) + { + final Long v = toLong(arr[i], null); + longs[i] = v; + } + return longs; + } + + /** + * 转换为String数组
+ * + * @param str 被转换的值 + * @return 结果 + */ + public static String[] toStrArray(String str) + { + return toStrArray(",", str); + } + + /** + * 转换为String数组
+ * + * @param split 分隔符 + * @param split 被转换的值 + * @return 结果 + */ + public static String[] toStrArray(String split, String str) + { + return str.split(split); + } + + /** + * 转换为long
+ * 如果给定的值为空,或者转换失败,返回默认值
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @param defaultValue 转换错误时的默认值 + * @return 结果 + */ + public static Long toLong(Object value, Long defaultValue) + { + if (value == null) + { + return defaultValue; + } + if (value instanceof Long) + { + return (Long) value; + } + if (value instanceof Number) + { + return ((Number) value).longValue(); + } + final String valueStr = toStr(value, null); + if (StringUtils.isEmpty(valueStr)) + { + return defaultValue; + } + try + { + // 支持科学计数法 + return new BigDecimal(valueStr.trim()).longValue(); + } + catch (Exception e) + { + return defaultValue; + } + } + + /** + * 转换为long
+ * 如果给定的值为null,或者转换失败,返回默认值null
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static Long toLong(Object value) + { + return toLong(value, null); + } + + /** + * 转换为double
+ * 如果给定的值为空,或者转换失败,返回默认值
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @param defaultValue 转换错误时的默认值 + * @return 结果 + */ + public static Double toDouble(Object value, Double defaultValue) + { + if (value == null) + { + return defaultValue; + } + if (value instanceof Double) + { + return (Double) value; + } + if (value instanceof Number) + { + return ((Number) value).doubleValue(); + } + final String valueStr = toStr(value, null); + if (StringUtils.isEmpty(valueStr)) + { + return defaultValue; + } + try + { + // 支持科学计数法 + return new BigDecimal(valueStr.trim()).doubleValue(); + } + catch (Exception e) + { + return defaultValue; + } + } + + /** + * 转换为double
+ * 如果给定的值为空,或者转换失败,返回默认值null
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static Double toDouble(Object value) + { + return toDouble(value, null); + } + + /** + * 转换为Float
+ * 如果给定的值为空,或者转换失败,返回默认值
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @param defaultValue 转换错误时的默认值 + * @return 结果 + */ + public static Float toFloat(Object value, Float defaultValue) + { + if (value == null) + { + return defaultValue; + } + if (value instanceof Float) + { + return (Float) value; + } + if (value instanceof Number) + { + return ((Number) value).floatValue(); + } + final String valueStr = toStr(value, null); + if (StringUtils.isEmpty(valueStr)) + { + return defaultValue; + } + try + { + return Float.parseFloat(valueStr.trim()); + } + catch (Exception e) + { + return defaultValue; + } + } + + /** + * 转换为Float
+ * 如果给定的值为空,或者转换失败,返回默认值null
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static Float toFloat(Object value) + { + return toFloat(value, null); + } + + /** + * 转换为boolean
+ * String支持的值为:true、false、yes、ok、no,1,0 如果给定的值为空,或者转换失败,返回默认值
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @param defaultValue 转换错误时的默认值 + * @return 结果 + */ + public static Boolean toBool(Object value, Boolean defaultValue) + { + if (value == null) + { + return defaultValue; + } + if (value instanceof Boolean) + { + return (Boolean) value; + } + String valueStr = toStr(value, null); + if (StringUtils.isEmpty(valueStr)) + { + return defaultValue; + } + valueStr = valueStr.trim().toLowerCase(); + switch (valueStr) + { + case "true": + case "yes": + case "ok": + case "1": + return true; + case "false": + case "no": + case "0": + return false; + default: + return defaultValue; + } + } + + /** + * 转换为boolean
+ * 如果给定的值为空,或者转换失败,返回默认值null
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static Boolean toBool(Object value) + { + return toBool(value, null); + } + + /** + * 转换为Enum对象
+ * 如果给定的值为空,或者转换失败,返回默认值
+ * + * @param clazz Enum的Class + * @param value 值 + * @param defaultValue 默认值 + * @return Enum + */ + public static > E toEnum(Class clazz, Object value, E defaultValue) + { + if (value == null) + { + return defaultValue; + } + if (clazz.isAssignableFrom(value.getClass())) + { + @SuppressWarnings("unchecked") + E myE = (E) value; + return myE; + } + final String valueStr = toStr(value, null); + if (StringUtils.isEmpty(valueStr)) + { + return defaultValue; + } + try + { + return Enum.valueOf(clazz, valueStr); + } + catch (Exception e) + { + return defaultValue; + } + } + + /** + * 转换为Enum对象
+ * 如果给定的值为空,或者转换失败,返回默认值null
+ * + * @param clazz Enum的Class + * @param value 值 + * @return Enum + */ + public static > E toEnum(Class clazz, Object value) + { + return toEnum(clazz, value, null); + } + + /** + * 转换为BigInteger
+ * 如果给定的值为空,或者转换失败,返回默认值
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @param defaultValue 转换错误时的默认值 + * @return 结果 + */ + public static BigInteger toBigInteger(Object value, BigInteger defaultValue) + { + if (value == null) + { + return defaultValue; + } + if (value instanceof BigInteger) + { + return (BigInteger) value; + } + if (value instanceof Long) + { + return BigInteger.valueOf((Long) value); + } + final String valueStr = toStr(value, null); + if (StringUtils.isEmpty(valueStr)) + { + return defaultValue; + } + try + { + return new BigInteger(valueStr); + } + catch (Exception e) + { + return defaultValue; + } + } + + /** + * 转换为BigInteger
+ * 如果给定的值为空,或者转换失败,返回默认值null
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static BigInteger toBigInteger(Object value) + { + return toBigInteger(value, null); + } + + /** + * 转换为BigDecimal
+ * 如果给定的值为空,或者转换失败,返回默认值
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @param defaultValue 转换错误时的默认值 + * @return 结果 + */ + public static BigDecimal toBigDecimal(Object value, BigDecimal defaultValue) + { + if (value == null) + { + return defaultValue; + } + if (value instanceof BigDecimal) + { + return (BigDecimal) value; + } + if (value instanceof Long) + { + return new BigDecimal((Long) value); + } + if (value instanceof Double) + { + return BigDecimal.valueOf((Double) value); + } + if (value instanceof Integer) + { + return new BigDecimal((Integer) value); + } + final String valueStr = toStr(value, null); + if (StringUtils.isEmpty(valueStr)) + { + return defaultValue; + } + try + { + return new BigDecimal(valueStr); + } + catch (Exception e) + { + return defaultValue; + } + } + + /** + * 转换为BigDecimal
+ * 如果给定的值为空,或者转换失败,返回默认值
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static BigDecimal toBigDecimal(Object value) + { + return toBigDecimal(value, null); + } + + /** + * 将对象转为字符串
+ * 1、Byte数组和ByteBuffer会被转换为对应字符串的数组 2、对象数组会调用Arrays.toString方法 + * + * @param obj 对象 + * @return 字符串 + */ + public static String utf8Str(Object obj) + { + return str(obj, CharsetKit.CHARSET_UTF_8); + } + + /** + * 将对象转为字符串
+ * 1、Byte数组和ByteBuffer会被转换为对应字符串的数组 2、对象数组会调用Arrays.toString方法 + * + * @param obj 对象 + * @param charsetName 字符集 + * @return 字符串 + */ + public static String str(Object obj, String charsetName) + { + return str(obj, Charset.forName(charsetName)); + } + + /** + * 将对象转为字符串
+ * 1、Byte数组和ByteBuffer会被转换为对应字符串的数组 2、对象数组会调用Arrays.toString方法 + * + * @param obj 对象 + * @param charset 字符集 + * @return 字符串 + */ + public static String str(Object obj, Charset charset) + { + if (null == obj) + { + return null; + } + + if (obj instanceof String) + { + return (String) obj; + } + else if (obj instanceof byte[]) + { + return str((byte[]) obj, charset); + } + else if (obj instanceof Byte[]) + { + byte[] bytes = ArrayUtils.toPrimitive((Byte[]) obj); + return str(bytes, charset); + } + else if (obj instanceof ByteBuffer) + { + return str((ByteBuffer) obj, charset); + } + return obj.toString(); + } + + /** + * 将byte数组转为字符串 + * + * @param bytes byte数组 + * @param charset 字符集 + * @return 字符串 + */ + public static String str(byte[] bytes, String charset) + { + return str(bytes, StringUtils.isEmpty(charset) ? Charset.defaultCharset() : Charset.forName(charset)); + } + + /** + * 解码字节码 + * + * @param data 字符串 + * @param charset 字符集,如果此字段为空,则解码的结果取决于平台 + * @return 解码后的字符串 + */ + public static String str(byte[] data, Charset charset) + { + if (data == null) + { + return null; + } + + if (null == charset) + { + return new String(data); + } + return new String(data, charset); + } + + /** + * 将编码的byteBuffer数据转换为字符串 + * + * @param data 数据 + * @param charset 字符集,如果为空使用当前系统字符集 + * @return 字符串 + */ + public static String str(ByteBuffer data, String charset) + { + if (data == null) + { + return null; + } + + return str(data, Charset.forName(charset)); + } + + /** + * 将编码的byteBuffer数据转换为字符串 + * + * @param data 数据 + * @param charset 字符集,如果为空使用当前系统字符集 + * @return 字符串 + */ + public static String str(ByteBuffer data, Charset charset) + { + if (null == charset) + { + charset = Charset.defaultCharset(); + } + return charset.decode(data).toString(); + } + + // ----------------------------------------------------------------------- 全角半角转换 + /** + * 半角转全角 + * + * @param input String. + * @return 全角字符串. + */ + public static String toSBC(String input) + { + return toSBC(input, null); + } + + /** + * 半角转全角 + * + * @param input String + * @param notConvertSet 不替换的字符集合 + * @return 全角字符串. + */ + public static String toSBC(String input, Set notConvertSet) + { + char[] c = input.toCharArray(); + for (int i = 0; i < c.length; i++) + { + if (null != notConvertSet && notConvertSet.contains(c[i])) + { + // 跳过不替换的字符 + continue; + } + + if (c[i] == ' ') + { + c[i] = '\u3000'; + } + else if (c[i] < '\177') + { + c[i] = (char) (c[i] + 65248); + + } + } + return new String(c); + } + + /** + * 全角转半角 + * + * @param input String. + * @return 半角字符串 + */ + public static String toDBC(String input) + { + return toDBC(input, null); + } + + /** + * 替换全角为半角 + * + * @param text 文本 + * @param notConvertSet 不替换的字符集合 + * @return 替换后的字符 + */ + public static String toDBC(String text, Set notConvertSet) + { + char[] c = text.toCharArray(); + for (int i = 0; i < c.length; i++) + { + if (null != notConvertSet && notConvertSet.contains(c[i])) + { + // 跳过不替换的字符 + continue; + } + + if (c[i] == '\u3000') + { + c[i] = ' '; + } + else if (c[i] > '\uFF00' && c[i] < '\uFF5F') + { + c[i] = (char) (c[i] - 65248); + } + } + String returnString = new String(c); + + return returnString; + } + + /** + * 数字金额大写转换 先写个完整的然后将如零拾替换成零 + * + * @param n 数字 + * @return 中文大写数字 + */ + public static String digitUppercase(double n) + { + String[] fraction = { "角", "分" }; + String[] digit = { "零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖" }; + String[][] unit = { { "元", "万", "亿" }, { "", "拾", "佰", "仟" } }; + + String head = n < 0 ? "负" : ""; + n = Math.abs(n); + + String s = ""; + for (int i = 0; i < fraction.length; i++) + { + s += (digit[(int) (Math.floor(n * 10 * Math.pow(10, i)) % 10)] + fraction[i]).replaceAll("(零.)+", ""); + } + if (s.length() < 1) + { + s = "整"; + } + int integerPart = (int) Math.floor(n); + + for (int i = 0; i < unit[0].length && integerPart > 0; i++) + { + String p = ""; + for (int j = 0; j < unit[1].length && n > 0; j++) + { + p = digit[integerPart % 10] + unit[1][j] + p; + integerPart = integerPart / 10; + } + s = p.replaceAll("(零.)*零$", "").replaceAll("^$", "零") + unit[0][i] + s; + } + return head + s.replaceAll("(零.)*零元", "元").replaceFirst("(零.)+", "").replaceAll("(零.)+", "零").replaceAll("^整$", "零元整"); + } +} diff --git a/bs-common/src/main/java/com/bs/common/core/text/StrFormatter.java b/bs-common/src/main/java/com/bs/common/core/text/StrFormatter.java new file mode 100644 index 0000000..dbec7de --- /dev/null +++ b/bs-common/src/main/java/com/bs/common/core/text/StrFormatter.java @@ -0,0 +1,92 @@ +package com.bs.common.core.text; + +import com.bs.common.utils.StringUtils; + +/** + * 字符串格式化 + * + * @author bs + */ +public class StrFormatter +{ + public static final String EMPTY_JSON = "{}"; + public static final char C_BACKSLASH = '\\'; + public static final char C_DELIM_START = '{'; + public static final char C_DELIM_END = '}'; + + /** + * 格式化字符串
+ * 此方法只是简单将占位符 {} 按照顺序替换为参数
+ * 如果想输出 {} 使用 \\转义 { 即可,如果想输出 {} 之前的 \ 使用双转义符 \\\\ 即可
+ * 例:
+ * 通常使用:format("this is {} for {}", "a", "b") -> this is a for b
+ * 转义{}: format("this is \\{} for {}", "a", "b") -> this is \{} for a
+ * 转义\: format("this is \\\\{} for {}", "a", "b") -> this is \a for b
+ * + * @param strPattern 字符串模板 + * @param argArray 参数列表 + * @return 结果 + */ + public static String format(final String strPattern, final Object... argArray) + { + if (StringUtils.isEmpty(strPattern) || StringUtils.isEmpty(argArray)) + { + return strPattern; + } + final int strPatternLength = strPattern.length(); + + // 初始化定义好的长度以获得更好的性能 + StringBuilder sbuf = new StringBuilder(strPatternLength + 50); + + int handledPosition = 0; + int delimIndex;// 占位符所在位置 + for (int argIndex = 0; argIndex < argArray.length; argIndex++) + { + delimIndex = strPattern.indexOf(EMPTY_JSON, handledPosition); + if (delimIndex == -1) + { + if (handledPosition == 0) + { + return strPattern; + } + else + { // 字符串模板剩余部分不再包含占位符,加入剩余部分后返回结果 + sbuf.append(strPattern, handledPosition, strPatternLength); + return sbuf.toString(); + } + } + else + { + if (delimIndex > 0 && strPattern.charAt(delimIndex - 1) == C_BACKSLASH) + { + if (delimIndex > 1 && strPattern.charAt(delimIndex - 2) == C_BACKSLASH) + { + // 转义符之前还有一个转义符,占位符依旧有效 + sbuf.append(strPattern, handledPosition, delimIndex - 1); + sbuf.append(Convert.utf8Str(argArray[argIndex])); + handledPosition = delimIndex + 2; + } + else + { + // 占位符被转义 + argIndex--; + sbuf.append(strPattern, handledPosition, delimIndex - 1); + sbuf.append(C_DELIM_START); + handledPosition = delimIndex + 1; + } + } + else + { + // 正常占位符 + sbuf.append(strPattern, handledPosition, delimIndex); + sbuf.append(Convert.utf8Str(argArray[argIndex])); + handledPosition = delimIndex + 2; + } + } + } + // 加入最后一个占位符后所有的字符 + sbuf.append(strPattern, handledPosition, strPattern.length()); + + return sbuf.toString(); + } +} diff --git a/bs-common/src/main/java/com/bs/common/enums/BusinessStatus.java b/bs-common/src/main/java/com/bs/common/enums/BusinessStatus.java new file mode 100644 index 0000000..08c7d85 --- /dev/null +++ b/bs-common/src/main/java/com/bs/common/enums/BusinessStatus.java @@ -0,0 +1,20 @@ +package com.bs.common.enums; + +/** + * 操作状态 + * + * @author bs + * + */ +public enum BusinessStatus +{ + /** + * 成功 + */ + SUCCESS, + + /** + * 失败 + */ + FAIL, +} diff --git a/bs-common/src/main/java/com/bs/common/enums/BusinessType.java b/bs-common/src/main/java/com/bs/common/enums/BusinessType.java new file mode 100644 index 0000000..67d9a91 --- /dev/null +++ b/bs-common/src/main/java/com/bs/common/enums/BusinessType.java @@ -0,0 +1,59 @@ +package com.bs.common.enums; + +/** + * 业务操作类型 + * + * @author bs + */ +public enum BusinessType +{ + /** + * 其它 + */ + OTHER, + + /** + * 新增 + */ + INSERT, + + /** + * 修改 + */ + UPDATE, + + /** + * 删除 + */ + DELETE, + + /** + * 授权 + */ + GRANT, + + /** + * 导出 + */ + EXPORT, + + /** + * 导入 + */ + IMPORT, + + /** + * 强退 + */ + FORCE, + + /** + * 生成代码 + */ + GENCODE, + + /** + * 清空数据 + */ + CLEAN, +} diff --git a/bs-common/src/main/java/com/bs/common/enums/DataSourceType.java b/bs-common/src/main/java/com/bs/common/enums/DataSourceType.java new file mode 100644 index 0000000..0dec5b9 --- /dev/null +++ b/bs-common/src/main/java/com/bs/common/enums/DataSourceType.java @@ -0,0 +1,19 @@ +package com.bs.common.enums; + +/** + * 数据源 + * + * @author bs + */ +public enum DataSourceType +{ + /** + * 主库 + */ + MASTER, + + /** + * 从库 + */ + SLAVE +} diff --git a/bs-common/src/main/java/com/bs/common/enums/HttpMethod.java b/bs-common/src/main/java/com/bs/common/enums/HttpMethod.java new file mode 100644 index 0000000..c6a53b7 --- /dev/null +++ b/bs-common/src/main/java/com/bs/common/enums/HttpMethod.java @@ -0,0 +1,36 @@ +package com.bs.common.enums; + +import java.util.HashMap; +import java.util.Map; +import org.springframework.lang.Nullable; + +/** + * 请求方式 + * + * @author bs + */ +public enum HttpMethod +{ + GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS, TRACE; + + private static final Map mappings = new HashMap<>(16); + + static + { + for (HttpMethod httpMethod : values()) + { + mappings.put(httpMethod.name(), httpMethod); + } + } + + @Nullable + public static HttpMethod resolve(@Nullable String method) + { + return (method != null ? mappings.get(method) : null); + } + + public boolean matches(String method) + { + return (this == resolve(method)); + } +} diff --git a/bs-common/src/main/java/com/bs/common/enums/LimitType.java b/bs-common/src/main/java/com/bs/common/enums/LimitType.java new file mode 100644 index 0000000..da1074b --- /dev/null +++ b/bs-common/src/main/java/com/bs/common/enums/LimitType.java @@ -0,0 +1,20 @@ +package com.bs.common.enums; + +/** + * 限流类型 + * + * @author bs + */ + +public enum LimitType +{ + /** + * 默认策略全局限流 + */ + DEFAULT, + + /** + * 根据请求者IP进行限流 + */ + IP +} diff --git a/bs-common/src/main/java/com/bs/common/enums/OperatorType.java b/bs-common/src/main/java/com/bs/common/enums/OperatorType.java new file mode 100644 index 0000000..c47c9d4 --- /dev/null +++ b/bs-common/src/main/java/com/bs/common/enums/OperatorType.java @@ -0,0 +1,24 @@ +package com.bs.common.enums; + +/** + * 操作人类别 + * + * @author bs + */ +public enum OperatorType +{ + /** + * 其它 + */ + OTHER, + + /** + * 后台用户 + */ + MANAGE, + + /** + * 手机端用户 + */ + MOBILE +} diff --git a/bs-common/src/main/java/com/bs/common/enums/UserStatus.java b/bs-common/src/main/java/com/bs/common/enums/UserStatus.java new file mode 100644 index 0000000..047b855 --- /dev/null +++ b/bs-common/src/main/java/com/bs/common/enums/UserStatus.java @@ -0,0 +1,30 @@ +package com.bs.common.enums; + +/** + * 用户状态 + * + * @author bs + */ +public enum UserStatus +{ + OK("0", "正常"), DISABLE("1", "停用"), DELETED("2", "删除"); + + private final String code; + private final String info; + + UserStatus(String code, String info) + { + this.code = code; + this.info = info; + } + + public String getCode() + { + return code; + } + + public String getInfo() + { + return info; + } +} diff --git a/bs-common/src/main/java/com/bs/common/exception/DemoModeException.java b/bs-common/src/main/java/com/bs/common/exception/DemoModeException.java new file mode 100644 index 0000000..2840d39 --- /dev/null +++ b/bs-common/src/main/java/com/bs/common/exception/DemoModeException.java @@ -0,0 +1,15 @@ +package com.bs.common.exception; + +/** + * 演示模式异常 + * + * @author bs + */ +public class DemoModeException extends RuntimeException +{ + private static final long serialVersionUID = 1L; + + public DemoModeException() + { + } +} diff --git a/bs-common/src/main/java/com/bs/common/exception/GlobalException.java b/bs-common/src/main/java/com/bs/common/exception/GlobalException.java new file mode 100644 index 0000000..bc8d687 --- /dev/null +++ b/bs-common/src/main/java/com/bs/common/exception/GlobalException.java @@ -0,0 +1,58 @@ +package com.bs.common.exception; + +/** + * 全局异常 + * + * @author bs + */ +public class GlobalException extends RuntimeException +{ + private static final long serialVersionUID = 1L; + + /** + * 错误提示 + */ + private String message; + + /** + * 错误明细,内部调试错误 + * + * 和 {@link CommonResult#getDetailMessage()} 一致的设计 + */ + private String detailMessage; + + /** + * 空构造方法,避免反序列化问题 + */ + public GlobalException() + { + } + + public GlobalException(String message) + { + this.message = message; + } + + public String getDetailMessage() + { + return detailMessage; + } + + public GlobalException setDetailMessage(String detailMessage) + { + this.detailMessage = detailMessage; + return this; + } + + @Override + public String getMessage() + { + return message; + } + + public GlobalException setMessage(String message) + { + this.message = message; + return this; + } +} diff --git a/bs-common/src/main/java/com/bs/common/exception/ServiceException.java b/bs-common/src/main/java/com/bs/common/exception/ServiceException.java new file mode 100644 index 0000000..ec3e7a4 --- /dev/null +++ b/bs-common/src/main/java/com/bs/common/exception/ServiceException.java @@ -0,0 +1,74 @@ +package com.bs.common.exception; + +/** + * 业务异常 + * + * @author bs + */ +public final class ServiceException extends RuntimeException +{ + private static final long serialVersionUID = 1L; + + /** + * 错误码 + */ + private Integer code; + + /** + * 错误提示 + */ + private String message; + + /** + * 错误明细,内部调试错误 + * + * 和 {@link CommonResult#getDetailMessage()} 一致的设计 + */ + private String detailMessage; + + /** + * 空构造方法,避免反序列化问题 + */ + public ServiceException() + { + } + + public ServiceException(String message) + { + this.message = message; + } + + public ServiceException(String message, Integer code) + { + this.message = message; + this.code = code; + } + + public String getDetailMessage() + { + return detailMessage; + } + + @Override + public String getMessage() + { + return message; + } + + public Integer getCode() + { + return code; + } + + public ServiceException setMessage(String message) + { + this.message = message; + return this; + } + + public ServiceException setDetailMessage(String detailMessage) + { + this.detailMessage = detailMessage; + return this; + } +} diff --git a/bs-common/src/main/java/com/bs/common/exception/UtilException.java b/bs-common/src/main/java/com/bs/common/exception/UtilException.java new file mode 100644 index 0000000..df7a1ef --- /dev/null +++ b/bs-common/src/main/java/com/bs/common/exception/UtilException.java @@ -0,0 +1,26 @@ +package com.bs.common.exception; + +/** + * 工具类异常 + * + * @author bs + */ +public class UtilException extends RuntimeException +{ + private static final long serialVersionUID = 8247610319171014183L; + + public UtilException(Throwable e) + { + super(e.getMessage(), e); + } + + public UtilException(String message) + { + super(message); + } + + public UtilException(String message, Throwable throwable) + { + super(message, throwable); + } +} diff --git a/bs-common/src/main/java/com/bs/common/exception/base/BaseException.java b/bs-common/src/main/java/com/bs/common/exception/base/BaseException.java new file mode 100644 index 0000000..9506f66 --- /dev/null +++ b/bs-common/src/main/java/com/bs/common/exception/base/BaseException.java @@ -0,0 +1,97 @@ +package com.bs.common.exception.base; + +import com.bs.common.utils.MessageUtils; +import com.bs.common.utils.StringUtils; + +/** + * 基础异常 + * + * @author bs + */ +public class BaseException extends RuntimeException +{ + private static final long serialVersionUID = 1L; + + /** + * 所属模块 + */ + private String module; + + /** + * 错误码 + */ + private String code; + + /** + * 错误码对应的参数 + */ + private Object[] args; + + /** + * 错误消息 + */ + private String defaultMessage; + + public BaseException(String module, String code, Object[] args, String defaultMessage) + { + this.module = module; + this.code = code; + this.args = args; + this.defaultMessage = defaultMessage; + } + + public BaseException(String module, String code, Object[] args) + { + this(module, code, args, null); + } + + public BaseException(String module, String defaultMessage) + { + this(module, null, null, defaultMessage); + } + + public BaseException(String code, Object[] args) + { + this(null, code, args, null); + } + + public BaseException(String defaultMessage) + { + this(null, null, null, defaultMessage); + } + + @Override + public String getMessage() + { + String message = null; + if (!StringUtils.isEmpty(code)) + { + message = MessageUtils.message(code, args); + } + if (message == null) + { + message = defaultMessage; + } + return message; + } + + public String getModule() + { + return module; + } + + public String getCode() + { + return code; + } + + public Object[] getArgs() + { + return args; + } + + public String getDefaultMessage() + { + return defaultMessage; + } +} diff --git a/bs-common/src/main/java/com/bs/common/exception/file/FileException.java b/bs-common/src/main/java/com/bs/common/exception/file/FileException.java new file mode 100644 index 0000000..778277f --- /dev/null +++ b/bs-common/src/main/java/com/bs/common/exception/file/FileException.java @@ -0,0 +1,19 @@ +package com.bs.common.exception.file; + +import com.bs.common.exception.base.BaseException; + +/** + * 文件信息异常类 + * + * @author bs + */ +public class FileException extends BaseException +{ + private static final long serialVersionUID = 1L; + + public FileException(String code, Object[] args) + { + super("file", code, args, null); + } + +} diff --git a/bs-common/src/main/java/com/bs/common/exception/file/FileNameLengthLimitExceededException.java b/bs-common/src/main/java/com/bs/common/exception/file/FileNameLengthLimitExceededException.java new file mode 100644 index 0000000..74d915c --- /dev/null +++ b/bs-common/src/main/java/com/bs/common/exception/file/FileNameLengthLimitExceededException.java @@ -0,0 +1,16 @@ +package com.bs.common.exception.file; + +/** + * 文件名称超长限制异常类 + * + * @author bs + */ +public class FileNameLengthLimitExceededException extends FileException +{ + private static final long serialVersionUID = 1L; + + public FileNameLengthLimitExceededException(int defaultFileNameLength) + { + super("upload.filename.exceed.length", new Object[] { defaultFileNameLength }); + } +} diff --git a/bs-common/src/main/java/com/bs/common/exception/file/FileSizeLimitExceededException.java b/bs-common/src/main/java/com/bs/common/exception/file/FileSizeLimitExceededException.java new file mode 100644 index 0000000..6d82643 --- /dev/null +++ b/bs-common/src/main/java/com/bs/common/exception/file/FileSizeLimitExceededException.java @@ -0,0 +1,16 @@ +package com.bs.common.exception.file; + +/** + * 文件名大小限制异常类 + * + * @author bs + */ +public class FileSizeLimitExceededException extends FileException +{ + private static final long serialVersionUID = 1L; + + public FileSizeLimitExceededException(long defaultMaxSize) + { + super("upload.exceed.maxSize", new Object[] { defaultMaxSize }); + } +} diff --git a/bs-common/src/main/java/com/bs/common/exception/file/FileUploadException.java b/bs-common/src/main/java/com/bs/common/exception/file/FileUploadException.java new file mode 100644 index 0000000..462a5cb --- /dev/null +++ b/bs-common/src/main/java/com/bs/common/exception/file/FileUploadException.java @@ -0,0 +1,61 @@ +package com.bs.common.exception.file; + +import java.io.PrintStream; +import java.io.PrintWriter; + +/** + * 文件上传异常类 + * + * @author bs + */ +public class FileUploadException extends Exception +{ + + private static final long serialVersionUID = 1L; + + private final Throwable cause; + + public FileUploadException() + { + this(null, null); + } + + public FileUploadException(final String msg) + { + this(msg, null); + } + + public FileUploadException(String msg, Throwable cause) + { + super(msg); + this.cause = cause; + } + + @Override + public void printStackTrace(PrintStream stream) + { + super.printStackTrace(stream); + if (cause != null) + { + stream.println("Caused by:"); + cause.printStackTrace(stream); + } + } + + @Override + public void printStackTrace(PrintWriter writer) + { + super.printStackTrace(writer); + if (cause != null) + { + writer.println("Caused by:"); + cause.printStackTrace(writer); + } + } + + @Override + public Throwable getCause() + { + return cause; + } +} diff --git a/bs-common/src/main/java/com/bs/common/exception/file/InvalidExtensionException.java b/bs-common/src/main/java/com/bs/common/exception/file/InvalidExtensionException.java new file mode 100644 index 0000000..0cb5bc6 --- /dev/null +++ b/bs-common/src/main/java/com/bs/common/exception/file/InvalidExtensionException.java @@ -0,0 +1,80 @@ +package com.bs.common.exception.file; + +import java.util.Arrays; + +/** + * 文件上传 误异常类 + * + * @author bs + */ +public class InvalidExtensionException extends FileUploadException +{ + private static final long serialVersionUID = 1L; + + private String[] allowedExtension; + private String extension; + private String filename; + + public InvalidExtensionException(String[] allowedExtension, String extension, String filename) + { + super("文件[" + filename + "]后缀[" + extension + "]不正确,请上传" + Arrays.toString(allowedExtension) + "格式"); + this.allowedExtension = allowedExtension; + this.extension = extension; + this.filename = filename; + } + + public String[] getAllowedExtension() + { + return allowedExtension; + } + + public String getExtension() + { + return extension; + } + + public String getFilename() + { + return filename; + } + + public static class InvalidImageExtensionException extends InvalidExtensionException + { + private static final long serialVersionUID = 1L; + + public InvalidImageExtensionException(String[] allowedExtension, String extension, String filename) + { + super(allowedExtension, extension, filename); + } + } + + public static class InvalidFlashExtensionException extends InvalidExtensionException + { + private static final long serialVersionUID = 1L; + + public InvalidFlashExtensionException(String[] allowedExtension, String extension, String filename) + { + super(allowedExtension, extension, filename); + } + } + + public static class InvalidMediaExtensionException extends InvalidExtensionException + { + private static final long serialVersionUID = 1L; + + public InvalidMediaExtensionException(String[] allowedExtension, String extension, String filename) + { + super(allowedExtension, extension, filename); + } + } + + public static class InvalidVideoExtensionException extends InvalidExtensionException + { + private static final long serialVersionUID = 1L; + + public InvalidVideoExtensionException(String[] allowedExtension, String extension, String filename) + { + super(allowedExtension, extension, filename); + } + } +} diff --git a/bs-common/src/main/java/com/bs/common/exception/job/TaskException.java b/bs-common/src/main/java/com/bs/common/exception/job/TaskException.java new file mode 100644 index 0000000..fdbee48 --- /dev/null +++ b/bs-common/src/main/java/com/bs/common/exception/job/TaskException.java @@ -0,0 +1,34 @@ +package com.bs.common.exception.job; + +/** + * 计划策略异常 + * + * @author bs + */ +public class TaskException extends Exception +{ + private static final long serialVersionUID = 1L; + + private Code code; + + public TaskException(String msg, Code code) + { + this(msg, code, null); + } + + public TaskException(String msg, Code code, Exception nestedEx) + { + super(msg, nestedEx); + this.code = code; + } + + public Code getCode() + { + return code; + } + + public enum Code + { + TASK_EXISTS, NO_TASK_EXISTS, TASK_ALREADY_STARTED, UNKNOWN, CONFIG_ERROR, TASK_NODE_NOT_AVAILABLE + } +} diff --git a/bs-common/src/main/java/com/bs/common/exception/user/BlackListException.java b/bs-common/src/main/java/com/bs/common/exception/user/BlackListException.java new file mode 100644 index 0000000..268fbef --- /dev/null +++ b/bs-common/src/main/java/com/bs/common/exception/user/BlackListException.java @@ -0,0 +1,16 @@ +package com.bs.common.exception.user; + +/** + * 黑名单IP异常类 + * + * @author bs + */ +public class BlackListException extends UserException +{ + private static final long serialVersionUID = 1L; + + public BlackListException() + { + super("login.blocked", null); + } +} diff --git a/bs-common/src/main/java/com/bs/common/exception/user/CaptchaException.java b/bs-common/src/main/java/com/bs/common/exception/user/CaptchaException.java new file mode 100644 index 0000000..bc8d5cb --- /dev/null +++ b/bs-common/src/main/java/com/bs/common/exception/user/CaptchaException.java @@ -0,0 +1,16 @@ +package com.bs.common.exception.user; + +/** + * 验证码错误异常类 + * + * @author bs + */ +public class CaptchaException extends UserException +{ + private static final long serialVersionUID = 1L; + + public CaptchaException() + { + super("user.jcaptcha.error", null); + } +} diff --git a/bs-common/src/main/java/com/bs/common/exception/user/CaptchaExpireException.java b/bs-common/src/main/java/com/bs/common/exception/user/CaptchaExpireException.java new file mode 100644 index 0000000..5e93d41 --- /dev/null +++ b/bs-common/src/main/java/com/bs/common/exception/user/CaptchaExpireException.java @@ -0,0 +1,16 @@ +package com.bs.common.exception.user; + +/** + * 验证码失效异常类 + * + * @author bs + */ +public class CaptchaExpireException extends UserException +{ + private static final long serialVersionUID = 1L; + + public CaptchaExpireException() + { + super("user.jcaptcha.expire", null); + } +} diff --git a/bs-common/src/main/java/com/bs/common/exception/user/UserException.java b/bs-common/src/main/java/com/bs/common/exception/user/UserException.java new file mode 100644 index 0000000..93ffd2c --- /dev/null +++ b/bs-common/src/main/java/com/bs/common/exception/user/UserException.java @@ -0,0 +1,18 @@ +package com.bs.common.exception.user; + +import com.bs.common.exception.base.BaseException; + +/** + * 用户信息异常类 + * + * @author bs + */ +public class UserException extends BaseException +{ + private static final long serialVersionUID = 1L; + + public UserException(String code, Object[] args) + { + super("user", code, args, null); + } +} diff --git a/bs-common/src/main/java/com/bs/common/exception/user/UserNotExistsException.java b/bs-common/src/main/java/com/bs/common/exception/user/UserNotExistsException.java new file mode 100644 index 0000000..2862e11 --- /dev/null +++ b/bs-common/src/main/java/com/bs/common/exception/user/UserNotExistsException.java @@ -0,0 +1,16 @@ +package com.bs.common.exception.user; + +/** + * 用户不存在异常类 + * + * @author bs + */ +public class UserNotExistsException extends UserException +{ + private static final long serialVersionUID = 1L; + + public UserNotExistsException() + { + super("user.not.exists", null); + } +} diff --git a/bs-common/src/main/java/com/bs/common/exception/user/UserPasswordNotMatchException.java b/bs-common/src/main/java/com/bs/common/exception/user/UserPasswordNotMatchException.java new file mode 100644 index 0000000..f5af1bd --- /dev/null +++ b/bs-common/src/main/java/com/bs/common/exception/user/UserPasswordNotMatchException.java @@ -0,0 +1,16 @@ +package com.bs.common.exception.user; + +/** + * 用户密码不正确或不符合规范异常类 + * + * @author bs + */ +public class UserPasswordNotMatchException extends UserException +{ + private static final long serialVersionUID = 1L; + + public UserPasswordNotMatchException() + { + super("user.password.not.match", null); + } +} diff --git a/bs-common/src/main/java/com/bs/common/exception/user/UserPasswordRetryLimitExceedException.java b/bs-common/src/main/java/com/bs/common/exception/user/UserPasswordRetryLimitExceedException.java new file mode 100644 index 0000000..e4f0fe2 --- /dev/null +++ b/bs-common/src/main/java/com/bs/common/exception/user/UserPasswordRetryLimitExceedException.java @@ -0,0 +1,16 @@ +package com.bs.common.exception.user; + +/** + * 用户错误最大次数异常类 + * + * @author bs + */ +public class UserPasswordRetryLimitExceedException extends UserException +{ + private static final long serialVersionUID = 1L; + + public UserPasswordRetryLimitExceedException(int retryLimitCount, int lockTime) + { + super("user.password.retry.limit.exceed", new Object[] { retryLimitCount, lockTime }); + } +} diff --git a/bs-common/src/main/java/com/bs/common/filter/PortFilter.java b/bs-common/src/main/java/com/bs/common/filter/PortFilter.java new file mode 100644 index 0000000..502e894 --- /dev/null +++ b/bs-common/src/main/java/com/bs/common/filter/PortFilter.java @@ -0,0 +1,47 @@ +package com.bs.common.filter; + +import com.alibaba.fastjson2.JSONObject; +import com.bs.common.utils.ServletUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.servlet.*; +import java.io.IOException; +import java.util.Map; + +/** + * Repeatable 过滤器 + * + * @author ruoyi + */ +public class PortFilter implements Filter { + private static final Logger LOGGER = LoggerFactory.getLogger(PortFilter.class); + + @Override + public void init(FilterConfig filterConfig) throws ServletException { + + } + + @Override + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) + throws IOException, ServletException { + Map paramMap = request.getParameterMap(); + //获取请求参数 + String queryString = ServletUtils.getRequest().getQueryString(); + //同一次请求,放同一个log。info 中, + //防止同时请求多个接口,把同一个请求信息冲散,不便查看 + LOGGER.info("\r\n请求的链接:" + ServletUtils.getRequest().getRequestURL().toString() + +"\r\n"+"请求方式:" + ServletUtils.getRequest().getMethod() + +"\r\n"+"请求的接口是:" + ServletUtils.getRequest().getRequestURI() + +"\r\n"+"请求参数map:{}", ServletUtils.getParamMap(request) + +"\r\n"+"请求参数map:{}", new JSONObject(paramMap) + +"\r\n"+"请求参数:{}",queryString); + + chain.doFilter(request, response); + } + + @Override + public void destroy() { + + } +} diff --git a/bs-common/src/main/java/com/bs/common/filter/PropertyPreExcludeFilter.java b/bs-common/src/main/java/com/bs/common/filter/PropertyPreExcludeFilter.java new file mode 100644 index 0000000..fc6c46b --- /dev/null +++ b/bs-common/src/main/java/com/bs/common/filter/PropertyPreExcludeFilter.java @@ -0,0 +1,24 @@ +package com.bs.common.filter; + +import com.alibaba.fastjson2.filter.SimplePropertyPreFilter; + +/** + * 排除JSON敏感属性 + * + * @author bs + */ +public class PropertyPreExcludeFilter extends SimplePropertyPreFilter +{ + public PropertyPreExcludeFilter() + { + } + + public PropertyPreExcludeFilter addExcludes(String... filters) + { + for (int i = 0; i < filters.length; i++) + { + this.getExcludes().add(filters[i]); + } + return this; + } +} diff --git a/bs-common/src/main/java/com/bs/common/filter/RepeatableFilter.java b/bs-common/src/main/java/com/bs/common/filter/RepeatableFilter.java new file mode 100644 index 0000000..fb286ad --- /dev/null +++ b/bs-common/src/main/java/com/bs/common/filter/RepeatableFilter.java @@ -0,0 +1,52 @@ +package com.bs.common.filter; + +import java.io.IOException; +import javax.servlet.Filter; +import javax.servlet.FilterChain; +import javax.servlet.FilterConfig; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.http.HttpServletRequest; +import org.springframework.http.MediaType; +import com.bs.common.utils.StringUtils; + +/** + * Repeatable 过滤器 + * + * @author bs + */ +public class RepeatableFilter implements Filter +{ + @Override + public void init(FilterConfig filterConfig) throws ServletException + { + + } + + @Override + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) + throws IOException, ServletException + { + ServletRequest requestWrapper = null; + if (request instanceof HttpServletRequest + && StringUtils.startsWithIgnoreCase(request.getContentType(), MediaType.APPLICATION_JSON_VALUE)) + { + requestWrapper = new RepeatedlyRequestWrapper((HttpServletRequest) request, response); + } + if (null == requestWrapper) + { + chain.doFilter(request, response); + } + else + { + chain.doFilter(requestWrapper, response); + } + } + + @Override + public void destroy() + { + + } +} diff --git a/bs-common/src/main/java/com/bs/common/filter/RepeatedlyRequestWrapper.java b/bs-common/src/main/java/com/bs/common/filter/RepeatedlyRequestWrapper.java new file mode 100644 index 0000000..45345b0 --- /dev/null +++ b/bs-common/src/main/java/com/bs/common/filter/RepeatedlyRequestWrapper.java @@ -0,0 +1,76 @@ +package com.bs.common.filter; + +import java.io.BufferedReader; +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStreamReader; +import javax.servlet.ReadListener; +import javax.servlet.ServletInputStream; +import javax.servlet.ServletResponse; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletRequestWrapper; +import com.bs.common.utils.http.HttpHelper; +import com.bs.common.constant.Constants; + +/** + * 构建可重复读取inputStream的request + * + * @author bs + */ +public class RepeatedlyRequestWrapper extends HttpServletRequestWrapper +{ + private final byte[] body; + + public RepeatedlyRequestWrapper(HttpServletRequest request, ServletResponse response) throws IOException + { + super(request); + request.setCharacterEncoding(Constants.UTF8); + response.setCharacterEncoding(Constants.UTF8); + + body = HttpHelper.getBodyString(request).getBytes(Constants.UTF8); + } + + @Override + public BufferedReader getReader() throws IOException + { + return new BufferedReader(new InputStreamReader(getInputStream())); + } + + @Override + public ServletInputStream getInputStream() throws IOException + { + final ByteArrayInputStream bais = new ByteArrayInputStream(body); + return new ServletInputStream() + { + @Override + public int read() throws IOException + { + return bais.read(); + } + + @Override + public int available() throws IOException + { + return body.length; + } + + @Override + public boolean isFinished() + { + return false; + } + + @Override + public boolean isReady() + { + return false; + } + + @Override + public void setReadListener(ReadListener readListener) + { + + } + }; + } +} diff --git a/bs-common/src/main/java/com/bs/common/filter/XssFilter.java b/bs-common/src/main/java/com/bs/common/filter/XssFilter.java new file mode 100644 index 0000000..a4b65d3 --- /dev/null +++ b/bs-common/src/main/java/com/bs/common/filter/XssFilter.java @@ -0,0 +1,71 @@ +package com.bs.common.filter; + +import com.bs.common.enums.HttpMethod; +import com.bs.common.utils.StringUtils; + +import javax.servlet.*; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +/** + * 防止XSS攻击的过滤器 + * + * @author bs + */ +public class XssFilter implements Filter +{ + /** + * 排除链接 + */ + public List excludes = new ArrayList<>(); + + @Override + public void init(FilterConfig filterConfig) throws ServletException + { + String tempExcludes = filterConfig.getInitParameter("excludes"); + if (StringUtils.isNotEmpty(tempExcludes)) + { + String[] url = tempExcludes.split(","); + for (int i = 0; url != null && i < url.length; i++) + { + excludes.add(url[i]); + } + } + } + + @Override + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) + throws IOException, ServletException + { + HttpServletRequest req = (HttpServletRequest) request; + HttpServletResponse resp = (HttpServletResponse) response; + if (handleExcludeURL(req, resp)) + { + chain.doFilter(request, response); + return; + } + XssHttpServletRequestWrapper xssRequest = new XssHttpServletRequestWrapper((HttpServletRequest) request); + chain.doFilter(xssRequest, response); + } + + private boolean handleExcludeURL(HttpServletRequest request, HttpServletResponse response) + { + String url = request.getServletPath(); + String method = request.getMethod(); + // GET DELETE 不过滤 + if (method == null || HttpMethod.GET.matches(method) || HttpMethod.DELETE.matches(method)) + { + return true; + } + return StringUtils.matches(url, excludes); + } + + @Override + public void destroy() + { + + } +} diff --git a/bs-common/src/main/java/com/bs/common/filter/XssHttpServletRequestWrapper.java b/bs-common/src/main/java/com/bs/common/filter/XssHttpServletRequestWrapper.java new file mode 100644 index 0000000..68ca842 --- /dev/null +++ b/bs-common/src/main/java/com/bs/common/filter/XssHttpServletRequestWrapper.java @@ -0,0 +1,111 @@ +package com.bs.common.filter; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import javax.servlet.ReadListener; +import javax.servlet.ServletInputStream; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletRequestWrapper; +import org.apache.commons.io.IOUtils; +import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; +import com.bs.common.utils.StringUtils; +import com.bs.common.utils.html.EscapeUtil; + +/** + * XSS过滤处理 + * + * @author bs + */ +public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper +{ + /** + * @param request + */ + public XssHttpServletRequestWrapper(HttpServletRequest request) + { + super(request); + } + + @Override + public String[] getParameterValues(String name) + { + String[] values = super.getParameterValues(name); + if (values != null) + { + int length = values.length; + String[] escapesValues = new String[length]; + for (int i = 0; i < length; i++) + { + // 防xss攻击和过滤前后空格 + escapesValues[i] = EscapeUtil.clean(values[i]).trim(); + } + return escapesValues; + } + return super.getParameterValues(name); + } + + @Override + public ServletInputStream getInputStream() throws IOException + { + // 非json类型,直接返回 + if (!isJsonRequest()) + { + return super.getInputStream(); + } + + // 为空,直接返回 + String json = IOUtils.toString(super.getInputStream(), "utf-8"); + if (StringUtils.isEmpty(json)) + { + return super.getInputStream(); + } + + // xss过滤 + json = EscapeUtil.clean(json).trim(); + byte[] jsonBytes = json.getBytes("utf-8"); + final ByteArrayInputStream bis = new ByteArrayInputStream(jsonBytes); + return new ServletInputStream() + { + @Override + public boolean isFinished() + { + return true; + } + + @Override + public boolean isReady() + { + return true; + } + + @Override + public int available() throws IOException + { + return jsonBytes.length; + } + + @Override + public void setReadListener(ReadListener readListener) + { + } + + @Override + public int read() throws IOException + { + return bis.read(); + } + }; + } + + /** + * 是否是Json请求 + * + * @param request + */ + public boolean isJsonRequest() + { + String header = super.getHeader(HttpHeaders.CONTENT_TYPE); + return StringUtils.startsWithIgnoreCase(header, MediaType.APPLICATION_JSON_VALUE); + } +} diff --git a/bs-common/src/main/java/com/bs/common/mybatis/handler/DefaultDBFieldHandler.java b/bs-common/src/main/java/com/bs/common/mybatis/handler/DefaultDBFieldHandler.java new file mode 100644 index 0000000..4c25141 --- /dev/null +++ b/bs-common/src/main/java/com/bs/common/mybatis/handler/DefaultDBFieldHandler.java @@ -0,0 +1,76 @@ +package com.bs.common.mybatis.handler; + +import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; +import com.bs.common.utils.SecurityUtils; +import org.apache.ibatis.reflection.MetaObject; + +import java.time.LocalDateTime; +import java.util.Objects; + +/** + * 通用参数填充实现类 + * + * 如果没有显式的对通用参数进行赋值,这里会对通用参数进行填充、赋值 + * + * @author hexiaowu + */ +public class DefaultDBFieldHandler implements MetaObjectHandler { + + @Override + public void insertFill(MetaObject metaObject) { + /** + * createBy 创建人 + */ + boolean createByOf = metaObject.hasSetter("createBy"); + if(createByOf){ + this.setFieldValByName("createBy", SecurityUtils.getUsername(), metaObject); + } + + /** + * createDate 创建时间 + */ + boolean createTime = metaObject.hasSetter("createTime"); + if(createTime){ + this.setFieldValByName("createTime", LocalDateTime.now() , metaObject); + } + /** + * createDate 创建时间 + */ + boolean delFlag = metaObject.hasSetter("delFlag"); + if(delFlag){ + this.setFieldValByName("delFlag", "0", metaObject); + } + /** + *部门id + */ + boolean deptId = metaObject.hasSetter("createDept"); + if(deptId){ + this.setFieldValByName("createDept", SecurityUtils.getDeptId(), metaObject); + } + + } + + @Override + public void updateFill(MetaObject metaObject) { + + /** + * updateBy 更新人 + */ + boolean updateByOf = metaObject.hasSetter("updateBy"); + if(updateByOf){ + if (Objects.nonNull(SecurityUtils.getUsername())) { + this.setFieldValByName("updateBy", SecurityUtils.getUsername(), metaObject); + } + } + + + /** + * updateDate 更新时间 + */ + + boolean updateTimeOf = metaObject.hasSetter("updateTime"); + if(updateTimeOf){ + this.setFieldValByName("updateTime", LocalDateTime.now(), metaObject); + } + } +} diff --git a/bs-common/src/main/java/com/bs/common/mybatis/mapper/BaseMapperX.java b/bs-common/src/main/java/com/bs/common/mybatis/mapper/BaseMapperX.java new file mode 100644 index 0000000..529e708 --- /dev/null +++ b/bs-common/src/main/java/com/bs/common/mybatis/mapper/BaseMapperX.java @@ -0,0 +1,94 @@ +package com.bs.common.mybatis.mapper; + +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.support.SFunction; +import com.bs.common.mybatis.pojo.PageParam; +import com.bs.common.mybatis.pojo.PageResult; +import com.bs.common.mybatis.util.MyBatisUtils; +import com.github.yulichang.base.MPJBaseMapper; +import org.apache.ibatis.annotations.Param; + +import java.util.Collection; +import java.util.List; + +/** + * 在 MyBatis Plus 的 BaseMapper 的基础上拓展,提供更多的能力 + */ +public interface BaseMapperX extends MPJBaseMapper { + + default PageResult selectPage(PageParam pageParam, @Param("ew") Wrapper queryWrapper) { + // MyBatis Plus 查询 + IPage mpPage = MyBatisUtils.buildPage(pageParam); + selectPage(mpPage, queryWrapper); + // 转换返回 + return new PageResult<>(mpPage.getRecords(), mpPage.getTotal()); + } + + default T selectOne(String field, Object value) { + return selectOne(new QueryWrapper().eq(field, value)); + } + + default T selectOne(SFunction field, Object value) { + return selectOne(new LambdaQueryWrapper().eq(field, value)); + } + + default T selectOne(String field1, Object value1, String field2, Object value2) { + return selectOne(new QueryWrapper().eq(field1, value1).eq(field2, value2)); + } + + default T selectOne(SFunction field1, Object value1, SFunction field2, Object value2) { + return selectOne(new LambdaQueryWrapper().eq(field1, value1).eq(field2, value2)); + } + + default Long selectCount() { + return selectCount(new QueryWrapper()); + } + + default Long selectCount(String field, Object value) { + return selectCount(new QueryWrapper().eq(field, value)); + } + + default Long selectCount(SFunction field, Object value) { + return selectCount(new LambdaQueryWrapper().eq(field, value)); + } + + default List selectList() { + return selectList(new QueryWrapper<>()); + } + + default List selectList(String field, Object value) { + return selectList(new QueryWrapper().eq(field, value)); + } + + default List selectList(SFunction field, Object value) { + return selectList(new LambdaQueryWrapper().eq(field, value)); + } + + default List selectList(String field, Collection values) { + return selectList(new QueryWrapper().in(field, values)); + } + + default List selectList(SFunction field, Collection values) { + return selectList(new LambdaQueryWrapper().in(field, values)); + } + + /** + * 逐条插入,适合少量数据插入,或者对性能要求不高的场景 + * + * 如果大量,请使用 {@link com.baomidou.mybatisplus.extension.service.impl.ServiceImpl#saveBatch(Collection)} 方法 + * 使用示例,可见 RoleMenuBatchInsertMapper、UserRoleBatchInsertMapper 类 + * + * @param entities 实体们 + */ + default void insertBatch(Collection entities) { + entities.forEach(this::insert); + } + + default void updateBatch(T update) { + update(update, new QueryWrapper<>()); + } + +} diff --git a/bs-common/src/main/java/com/bs/common/mybatis/pojo/PageParam.java b/bs-common/src/main/java/com/bs/common/mybatis/pojo/PageParam.java new file mode 100644 index 0000000..94470cc --- /dev/null +++ b/bs-common/src/main/java/com/bs/common/mybatis/pojo/PageParam.java @@ -0,0 +1,30 @@ +package com.bs.common.mybatis.pojo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.Max; +import javax.validation.constraints.Min; +import javax.validation.constraints.NotNull; +import java.io.Serializable; + +@ApiModel("分页参数") +@Data +public class PageParam implements Serializable { + + private static final Integer PAGE_NO = 1; + private static final Integer PAGE_SIZE = 10; + + @ApiModelProperty(value = "页码,从 1 开始", required = true,example = "1") + @NotNull(message = "页码不能为空") + @Min(value = 1, message = "页码最小值为 1") + private Integer pageNo = PAGE_NO; + + @ApiModelProperty(value = "每页条数,最大值为 100", required = true, example = "10") + @NotNull(message = "每页条数不能为空") + @Min(value = 1, message = "每页条数最小值为 1") + @Max(value = 100, message = "每页条数最大值为 100") + private Integer pageSize = PAGE_SIZE; + +} diff --git a/bs-common/src/main/java/com/bs/common/mybatis/pojo/PageResult.java b/bs-common/src/main/java/com/bs/common/mybatis/pojo/PageResult.java new file mode 100644 index 0000000..085af92 --- /dev/null +++ b/bs-common/src/main/java/com/bs/common/mybatis/pojo/PageResult.java @@ -0,0 +1,42 @@ +package com.bs.common.mybatis.pojo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; + +@ApiModel("分页结果") +@Data +public final class PageResult implements Serializable { + + @ApiModelProperty(value = "数据", required = true) + private List list; + + @ApiModelProperty(value = "总量", required = true) + private Long total; + + public PageResult() { + } + + public PageResult(List list, Long total) { + this.list = list; + this.total = total; + } + + public PageResult(Long total) { + this.list = new ArrayList<>(); + this.total = total; + } + + public static PageResult empty() { + return new PageResult<>(0L); + } + + public static PageResult empty(Long total) { + return new PageResult<>(total); + } + +} diff --git a/bs-common/src/main/java/com/bs/common/mybatis/pojo/SortingField.java b/bs-common/src/main/java/com/bs/common/mybatis/pojo/SortingField.java new file mode 100644 index 0000000..a54bb4d --- /dev/null +++ b/bs-common/src/main/java/com/bs/common/mybatis/pojo/SortingField.java @@ -0,0 +1,56 @@ +package com.bs.common.mybatis.pojo; + +import java.io.Serializable; + +/** + * 排序字段 DTO + * + * 类名加了 ing 的原因是,避免和 ES SortField 重名。 + */ +public class SortingField implements Serializable { + + /** + * 顺序 - 升序 + */ + public static final String ORDER_ASC = "asc"; + /** + * 顺序 - 降序 + */ + public static final String ORDER_DESC = "desc"; + + /** + * 字段 + */ + private String field; + /** + * 顺序 + */ + private String order; + + // 空构造方法,解决反序列化 + public SortingField() { + } + + public SortingField(String field, String order) { + this.field = field; + this.order = order; + } + + public String getField() { + return field; + } + + public SortingField setField(String field) { + this.field = field; + return this; + } + + public String getOrder() { + return order; + } + + public SortingField setOrder(String order) { + this.order = order; + return this; + } +} diff --git a/bs-common/src/main/java/com/bs/common/mybatis/util/JdbcUtils.java b/bs-common/src/main/java/com/bs/common/mybatis/util/JdbcUtils.java new file mode 100644 index 0000000..a3e0859 --- /dev/null +++ b/bs-common/src/main/java/com/bs/common/mybatis/util/JdbcUtils.java @@ -0,0 +1,42 @@ +package com.bs.common.mybatis.util; + +import com.baomidou.mybatisplus.annotation.DbType; + +import java.sql.Connection; +import java.sql.DriverManager; + +/** + * JDBC 工具类 + * + * hasPermi + */ +public class JdbcUtils { + + /** + * 判断连接是否正确 + * + * @param url 数据源连接 + * @param username 账号 + * @param password 密码 + * @return 是否正确 + */ + public static boolean isConnectionOK(String url, String username, String password) { + try (Connection ignored = DriverManager.getConnection(url, username, password)) { + return true; + } catch (Exception ex) { + return false; + } + } + + /** + * 获得 URL 对应的 DB 类型 + * + * @param url URL + * @return DB 类型 + */ + public static DbType getDbType(String url) { + String name = com.alibaba.druid.util.JdbcUtils.getDbType(url, null); + return DbType.getDbType(name); + } + +} diff --git a/bs-common/src/main/java/com/bs/common/mybatis/util/MyBatisUtils.java b/bs-common/src/main/java/com/bs/common/mybatis/util/MyBatisUtils.java new file mode 100644 index 0000000..a37a19a --- /dev/null +++ b/bs-common/src/main/java/com/bs/common/mybatis/util/MyBatisUtils.java @@ -0,0 +1,83 @@ +package com.bs.common.mybatis.util; + +import com.baomidou.mybatisplus.core.metadata.OrderItem; +import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; +import com.baomidou.mybatisplus.extension.plugins.inner.InnerInterceptor; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.bs.common.mybatis.pojo.PageParam; +import com.bs.common.mybatis.pojo.SortingField; +import net.sf.jsqlparser.expression.Alias; +import net.sf.jsqlparser.schema.Column; +import net.sf.jsqlparser.schema.Table; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.stream.Collectors; + +/** + * MyBatis 工具类 + */ +public class MyBatisUtils { + + private static final String MYSQL_ESCAPE_CHARACTER = "`"; + + public static Page buildPage(PageParam pageParam) { + return buildPage(pageParam, null); + } + + public static Page buildPage(PageParam pageParam, Collection sortingFields) { + // 页码 + 数量 + Page page = new Page<>(pageParam.getPageNo(), pageParam.getPageSize()); + // 排序字段 + if (!sortingFields.isEmpty()) { + page.addOrder(sortingFields.stream().map(sortingField -> SortingField.ORDER_ASC.equals(sortingField.getOrder()) ? + OrderItem.asc(sortingField.getField()) : OrderItem.desc(sortingField.getField())) + .collect(Collectors.toList())); + } + return page; + } + + /** + * 将拦截器添加到链中 + * 由于 MybatisPlusInterceptor 不支持添加拦截器,所以只能全量设置 + * + * @param interceptor 链 + * @param inner 拦截器 + * @param index 位置 + */ + public static void addInterceptor(MybatisPlusInterceptor interceptor, InnerInterceptor inner, int index) { + List inners = new ArrayList<>(interceptor.getInterceptors()); + inners.add(index, inner); + interceptor.setInterceptors(inners); + } + + /** + * 获得 Table 对应的表名 + * + * 兼容 MySQL 转义表名 `t_xxx` + * + * @param table 表 + * @return 去除转移字符后的表名 + */ + public static String getTableName(Table table) { + String tableName = table.getName(); + if (tableName.startsWith(MYSQL_ESCAPE_CHARACTER) && tableName.endsWith(MYSQL_ESCAPE_CHARACTER)) { + tableName = tableName.substring(1, tableName.length() - 1); + } + return tableName; + } + + /** + * 构建 Column 对象 + * + * @param tableName 表名 + * @param tableAlias 别名 + * @param column 字段名 + * @return Column 对象 + */ + public static Column buildColumn(String tableName, Alias tableAlias, String column) { + return new Column(tableAlias != null ? tableAlias.getName() + "." + column : column); + } + +} diff --git a/bs-common/src/main/java/com/bs/common/utils/Arith.java b/bs-common/src/main/java/com/bs/common/utils/Arith.java new file mode 100644 index 0000000..6d580a4 --- /dev/null +++ b/bs-common/src/main/java/com/bs/common/utils/Arith.java @@ -0,0 +1,114 @@ +package com.bs.common.utils; + +import java.math.BigDecimal; +import java.math.RoundingMode; + +/** + * 精确的浮点数运算 + * + * @author bs + */ +public class Arith +{ + + /** 默认除法运算精度 */ + private static final int DEF_DIV_SCALE = 10; + + /** 这个类不能实例化 */ + private Arith() + { + } + + /** + * 提供精确的加法运算。 + * @param v1 被加数 + * @param v2 加数 + * @return 两个参数的和 + */ + public static double add(double v1, double v2) + { + BigDecimal b1 = new BigDecimal(Double.toString(v1)); + BigDecimal b2 = new BigDecimal(Double.toString(v2)); + return b1.add(b2).doubleValue(); + } + + /** + * 提供精确的减法运算。 + * @param v1 被减数 + * @param v2 减数 + * @return 两个参数的差 + */ + public static double sub(double v1, double v2) + { + BigDecimal b1 = new BigDecimal(Double.toString(v1)); + BigDecimal b2 = new BigDecimal(Double.toString(v2)); + return b1.subtract(b2).doubleValue(); + } + + /** + * 提供精确的乘法运算。 + * @param v1 被乘数 + * @param v2 乘数 + * @return 两个参数的积 + */ + public static double mul(double v1, double v2) + { + BigDecimal b1 = new BigDecimal(Double.toString(v1)); + BigDecimal b2 = new BigDecimal(Double.toString(v2)); + return b1.multiply(b2).doubleValue(); + } + + /** + * 提供(相对)精确的除法运算,当发生除不尽的情况时,精确到 + * 小数点以后10位,以后的数字四舍五入。 + * @param v1 被除数 + * @param v2 除数 + * @return 两个参数的商 + */ + public static double div(double v1, double v2) + { + return div(v1, v2, DEF_DIV_SCALE); + } + + /** + * 提供(相对)精确的除法运算。当发生除不尽的情况时,由scale参数指 + * 定精度,以后的数字四舍五入。 + * @param v1 被除数 + * @param v2 除数 + * @param scale 表示表示需要精确到小数点以后几位。 + * @return 两个参数的商 + */ + public static double div(double v1, double v2, int scale) + { + if (scale < 0) + { + throw new IllegalArgumentException( + "The scale must be a positive integer or zero"); + } + BigDecimal b1 = new BigDecimal(Double.toString(v1)); + BigDecimal b2 = new BigDecimal(Double.toString(v2)); + if (b1.compareTo(BigDecimal.ZERO) == 0) + { + return BigDecimal.ZERO.doubleValue(); + } + return b1.divide(b2, scale, RoundingMode.HALF_UP).doubleValue(); + } + + /** + * 提供精确的小数位四舍五入处理。 + * @param v 需要四舍五入的数字 + * @param scale 小数点后保留几位 + * @return 四舍五入后的结果 + */ + public static double round(double v, int scale) + { + if (scale < 0) + { + throw new IllegalArgumentException( + "The scale must be a positive integer or zero"); + } + BigDecimal b = new BigDecimal(Double.toString(v)); + BigDecimal one = BigDecimal.ONE; + return b.divide(one, scale, RoundingMode.HALF_UP).doubleValue(); + } +} diff --git a/bs-common/src/main/java/com/bs/common/utils/DateUtils.java b/bs-common/src/main/java/com/bs/common/utils/DateUtils.java new file mode 100644 index 0000000..4457e04 --- /dev/null +++ b/bs-common/src/main/java/com/bs/common/utils/DateUtils.java @@ -0,0 +1,191 @@ +package com.bs.common.utils; + +import java.lang.management.ManagementFactory; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.LocalTime; +import java.time.ZoneId; +import java.time.ZonedDateTime; +import java.util.Date; +import org.apache.commons.lang3.time.DateFormatUtils; + +/** + * 时间工具类 + * + * @author bs + */ +public class DateUtils extends org.apache.commons.lang3.time.DateUtils +{ + public static String YYYY = "yyyy"; + + public static String YYYY_MM = "yyyy-MM"; + + public static String YYYY_MM_DD = "yyyy-MM-dd"; + + public static String YYYYMMDDHHMMSS = "yyyyMMddHHmmss"; + + public static String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss"; + + private static String[] parsePatterns = { + "yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm", "yyyy-MM", + "yyyy/MM/dd", "yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm", "yyyy/MM", + "yyyy.MM.dd", "yyyy.MM.dd HH:mm:ss", "yyyy.MM.dd HH:mm", "yyyy.MM"}; + + /** + * 获取当前Date型日期 + * + * @return Date() 当前日期 + */ + public static Date getNowDate() + { + return new Date(); + } + + /** + * 获取当前日期, 默认格式为yyyy-MM-dd + * + * @return String + */ + public static String getDate() + { + return dateTimeNow(YYYY_MM_DD); + } + + public static final String getTime() + { + return dateTimeNow(YYYY_MM_DD_HH_MM_SS); + } + + public static final String dateTimeNow() + { + return dateTimeNow(YYYYMMDDHHMMSS); + } + + public static final String dateTimeNow(final String format) + { + return parseDateToStr(format, new Date()); + } + + public static final String dateTime(final Date date) + { + return parseDateToStr(YYYY_MM_DD, date); + } + + public static final String parseDateToStr(final String format, final Date date) + { + return new SimpleDateFormat(format).format(date); + } + + public static final Date dateTime(final String format, final String ts) + { + try + { + return new SimpleDateFormat(format).parse(ts); + } + catch (ParseException e) + { + throw new RuntimeException(e); + } + } + + /** + * 日期路径 即年/月/日 如2018/08/08 + */ + public static final String datePath() + { + Date now = new Date(); + return DateFormatUtils.format(now, "yyyy/MM/dd"); + } + + /** + * 日期路径 即年/月/日 如20180808 + */ + public static final String dateTime() + { + Date now = new Date(); + return DateFormatUtils.format(now, "yyyyMMdd"); + } + + /** + * 日期型字符串转化为日期 格式 + */ + public static Date parseDate(Object str) + { + if (str == null) + { + return null; + } + try + { + return parseDate(str.toString(), parsePatterns); + } + catch (ParseException e) + { + return null; + } + } + + /** + * 获取服务器启动时间 + */ + public static Date getServerStartDate() + { + long time = ManagementFactory.getRuntimeMXBean().getStartTime(); + return new Date(time); + } + + /** + * 计算相差天数 + */ + public static int differentDaysByMillisecond(Date date1, Date date2) + { + return Math.abs((int) ((date2.getTime() - date1.getTime()) / (1000 * 3600 * 24))); + } + + /** + * 计算时间差 + * + * @param endDate 最后时间 + * @param startTime 开始时间 + * @return 时间差(天/小时/分钟) + */ + public static String timeDistance(Date endDate, Date startTime) + { + long nd = 1000 * 24 * 60 * 60; + long nh = 1000 * 60 * 60; + long nm = 1000 * 60; + // long ns = 1000; + // 获得两个时间的毫秒时间差异 + long diff = endDate.getTime() - startTime.getTime(); + // 计算差多少天 + long day = diff / nd; + // 计算差多少小时 + long hour = diff % nd / nh; + // 计算差多少分钟 + long min = diff % nd % nh / nm; + // 计算差多少秒//输出结果 + // long sec = diff % nd % nh % nm / ns; + return day + "天" + hour + "小时" + min + "分钟"; + } + + /** + * 增加 LocalDateTime ==> Date + */ + public static Date toDate(LocalDateTime temporalAccessor) + { + ZonedDateTime zdt = temporalAccessor.atZone(ZoneId.systemDefault()); + return Date.from(zdt.toInstant()); + } + + /** + * 增加 LocalDate ==> Date + */ + public static Date toDate(LocalDate temporalAccessor) + { + LocalDateTime localDateTime = LocalDateTime.of(temporalAccessor, LocalTime.of(0, 0, 0)); + ZonedDateTime zdt = localDateTime.atZone(ZoneId.systemDefault()); + return Date.from(zdt.toInstant()); + } +} diff --git a/bs-common/src/main/java/com/bs/common/utils/DictUtils.java b/bs-common/src/main/java/com/bs/common/utils/DictUtils.java new file mode 100644 index 0000000..9157b6a --- /dev/null +++ b/bs-common/src/main/java/com/bs/common/utils/DictUtils.java @@ -0,0 +1,187 @@ +package com.bs.common.utils; + +import com.alibaba.fastjson2.JSONArray; +import com.bs.common.constant.CacheConstants; +import com.bs.common.core.domain.entity.SysDictData; +import com.bs.common.core.redis.RedisCache; +import com.bs.common.utils.spring.SpringUtils; + +import java.util.Collection; +import java.util.List; + +/** + * 字典工具类 + * + * @author bs + */ +public class DictUtils +{ + /** + * 分隔符 + */ + public static final String SEPARATOR = ","; + + /** + * 设置字典缓存 + * + * @param key 参数键 + * @param dictDatas 字典数据列表 + */ + public static void setDictCache(String key, List dictDatas) + { + SpringUtils.getBean(RedisCache.class).setCacheObject(getCacheKey(key), dictDatas); + } + + /** + * 获取字典缓存 + * + * @param key 参数键 + * @return dictDatas 字典数据列表 + */ + public static List getDictCache(String key) + { + JSONArray arrayCache = SpringUtils.getBean(RedisCache.class).getCacheObject(getCacheKey(key)); + if (StringUtils.isNotNull(arrayCache)) + { + return arrayCache.toList(SysDictData.class); + } + return null; + } + + /** + * 根据字典类型和字典值获取字典标签 + * + * @param dictType 字典类型 + * @param dictValue 字典值 + * @return 字典标签 + */ + public static String getDictLabel(String dictType, String dictValue) + { + return getDictLabel(dictType, dictValue, SEPARATOR); + } + + /** + * 根据字典类型和字典标签获取字典值 + * + * @param dictType 字典类型 + * @param dictLabel 字典标签 + * @return 字典值 + */ + public static String getDictValue(String dictType, String dictLabel) + { + return getDictValue(dictType, dictLabel, SEPARATOR); + } + + /** + * 根据字典类型和字典值获取字典标签 + * + * @param dictType 字典类型 + * @param dictValue 字典值 + * @param separator 分隔符 + * @return 字典标签 + */ + public static String getDictLabel(String dictType, String dictValue, String separator) + { + StringBuilder propertyString = new StringBuilder(); + List datas = getDictCache(dictType); + + if (StringUtils.isNotNull(datas)) + { + if (StringUtils.containsAny(separator, dictValue)) + { + for (SysDictData dict : datas) + { + for (String value : dictValue.split(separator)) + { + if (value.equals(dict.getDictValue())) + { + propertyString.append(dict.getDictLabel()).append(separator); + break; + } + } + } + } + else + { + for (SysDictData dict : datas) + { + if (dictValue.equals(dict.getDictValue())) + { + return dict.getDictLabel(); + } + } + } + } + return StringUtils.stripEnd(propertyString.toString(), separator); + } + + /** + * 根据字典类型和字典标签获取字典值 + * + * @param dictType 字典类型 + * @param dictLabel 字典标签 + * @param separator 分隔符 + * @return 字典值 + */ + public static String getDictValue(String dictType, String dictLabel, String separator) + { + StringBuilder propertyString = new StringBuilder(); + List datas = getDictCache(dictType); + + if (StringUtils.containsAny(separator, dictLabel) && StringUtils.isNotEmpty(datas)) + { + for (SysDictData dict : datas) + { + for (String label : dictLabel.split(separator)) + { + if (label.equals(dict.getDictLabel())) + { + propertyString.append(dict.getDictValue()).append(separator); + break; + } + } + } + } + else + { + for (SysDictData dict : datas) + { + if (dictLabel.equals(dict.getDictLabel())) + { + return dict.getDictValue(); + } + } + } + return StringUtils.stripEnd(propertyString.toString(), separator); + } + + /** + * 删除指定字典缓存 + * + * @param key 字典键 + */ + public static void removeDictCache(String key) + { + SpringUtils.getBean(RedisCache.class).deleteObject(getCacheKey(key)); + } + + /** + * 清空字典缓存 + */ + public static void clearDictCache() + { + Collection keys = SpringUtils.getBean(RedisCache.class).keys(CacheConstants.SYS_DICT_KEY + "*"); + SpringUtils.getBean(RedisCache.class).deleteObject(keys); + } + + /** + * 设置cache key + * + * @param configKey 参数键 + * @return 缓存键key + */ + public static String getCacheKey(String configKey) + { + return CacheConstants.SYS_DICT_KEY + configKey; + } +} diff --git a/bs-common/src/main/java/com/bs/common/utils/ExceptionUtil.java b/bs-common/src/main/java/com/bs/common/utils/ExceptionUtil.java new file mode 100644 index 0000000..6acd2cf --- /dev/null +++ b/bs-common/src/main/java/com/bs/common/utils/ExceptionUtil.java @@ -0,0 +1,39 @@ +package com.bs.common.utils; + +import java.io.PrintWriter; +import java.io.StringWriter; +import org.apache.commons.lang3.exception.ExceptionUtils; + +/** + * 错误信息处理类。 + * + * @author bs + */ +public class ExceptionUtil +{ + /** + * 获取exception的详细错误信息。 + */ + public static String getExceptionMessage(Throwable e) + { + StringWriter sw = new StringWriter(); + e.printStackTrace(new PrintWriter(sw, true)); + return sw.toString(); + } + + public static String getRootErrorMessage(Exception e) + { + Throwable root = ExceptionUtils.getRootCause(e); + root = (root == null ? e : root); + if (root == null) + { + return ""; + } + String msg = root.getMessage(); + if (msg == null) + { + return "null"; + } + return StringUtils.defaultString(msg); + } +} diff --git a/bs-common/src/main/java/com/bs/common/utils/FileUtil.java b/bs-common/src/main/java/com/bs/common/utils/FileUtil.java new file mode 100644 index 0000000..4faf5f6 --- /dev/null +++ b/bs-common/src/main/java/com/bs/common/utils/FileUtil.java @@ -0,0 +1,939 @@ +package com.bs.common.utils; + +import cn.hutool.core.codec.Base64; +import cn.hutool.core.io.IoUtil; +import cn.hutool.core.util.IdUtil; +import cn.hutool.poi.excel.BigExcelWriter; +import cn.hutool.poi.excel.ExcelUtil; +import com.bs.common.constant.Constants; +import com.bs.common.core.domain.AjaxResult; +import com.bs.common.exception.ServiceException; +import com.bs.common.utils.uuid.IdUtils; +import lombok.extern.slf4j.Slf4j; +import org.apache.poi.util.IOUtils; +import org.apache.poi.xssf.streaming.SXSSFSheet; +import org.apache.tools.zip.ZipEntry; +import org.apache.tools.zip.ZipOutputStream; +import org.springframework.core.io.ClassPathResource; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.ServletOutputStream; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.awt.image.BufferedImage; +import java.io.*; +import java.net.URLEncoder; +import java.security.MessageDigest; +import java.security.SecureRandom; +import java.text.DecimalFormat; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; +import java.util.Map; + +/** + * File工具类,扩展 hutool 工具包 + */ +@Slf4j +public class FileUtil extends cn.hutool.core.io.FileUtil { + + /** + * 定义GB的计算常量 + */ + private static final int GB = 1024 * 1024 * 1024; + /** + * 定义MB的计算常量 + */ + private static final int MB = 1024 * 1024; + /** + * 定义KB的计算常量 + */ + private static final int KB = 1024; + + /** + * 格式化小数 + */ + private static final DecimalFormat DF = new DecimalFormat("0.00"); + /** + * 系统临时目录 + *
+ * windows 包含路径分割符,但Linux 不包含, + * 在windows \\==\ 前提下, + * 为安全起见 同意拼装 路径分割符, + *
+     *       java.io.tmpdir
+     *       windows : C:\Users/xxx\AppData\Local\Temp\
+     *       linux: /temp
+     * 
+ */ + public static final String SYS_TEM_DIR = System.getProperty("java.io.tmpdir") + File.separator; + + private static final int FILE_READ_BTYE = 1024; + + /** + * MultipartFile转File + */ + public static File toFile(MultipartFile multipartFile) { + // 获取文件名 + String fileName = multipartFile.getOriginalFilename(); + // 获取文件后缀 + String prefix = "." + getExtensionName(fileName); + File file = null; + try { + // 用uuid作为文件名,防止生成的临时文件重复 + file = File.createTempFile(IdUtil.simpleUUID(), prefix); + // MultipartFile to File + multipartFile.transferTo(file); + } catch (IOException e) { + e.printStackTrace(); + } + return file; + } + + /** + * 获取文件扩展名,不带 . + */ + public static String getExtensionName(String filename) { + if ((filename != null) && (filename.length() > 0)) { + int dot = filename.lastIndexOf('.'); + if ((dot > -1) && (dot < (filename.length() - 1))) { + return filename.substring(dot + 1); + } + } + return filename; + } + + public static String getExtensionNameBase64(String filename) { + if (filename.contains("data:image/png;base64")) { + return "png"; + }else if(filename.contains("data:image/jpg;base64")){ + return "jpg"; + }else if(filename.contains("data:image/jpeg;base64")){ + return "jpeg"; + } + return "bmp"; + } + /** + * Java文件操作 获取不带扩展名的文件名 + */ + public static String getFileNameNoEx(String filename) { + if ((filename != null) && (filename.length() > 0)) { + int dot = filename.lastIndexOf('.'); + if ((dot > -1) && (dot < (filename.length()))) { + return filename.substring(0, dot); + } + } + return filename; + } + + /** + * 文件大小转换 + */ + public static String getSize(long size) { + String resultSize; + if (size / GB >= 1) { + //如果当前Byte的值大于等于1GB + resultSize = DF.format(size / (float) GB) + "GB "; + } else if (size / MB >= 1) { + //如果当前Byte的值大于等于1MB + resultSize = DF.format(size / (float) MB) + "MB "; + } else if (size / KB >= 1) { + //如果当前Byte的值大于等于1KB + resultSize = DF.format(size / (float) KB) + "KB "; + } else { + resultSize = size + "B "; + } + return resultSize; + } + + + /** + * 将文件名解析成文件的上传路径 + */ + public static File upload(MultipartFile file, String filePath) { + //String name = getFileNameNoEx(file.getOriginalFilename()); + String suffix = getExtensionName(file.getOriginalFilename()); + StringBuffer nowStr = fileRename(); + try { + String fileName = nowStr + "." + suffix; + String path = filePath + fileName; + // getCanonicalFile 可解析正确各种路径 + File dest = new File(path).getCanonicalFile(); + // 检测是否存在目录 + if (!dest.getParentFile().exists()) { + dest.getParentFile().mkdirs(); + } + // 文件写入 + file.transferTo(dest); + return dest; + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + public static String fileToBase64(File file) throws Exception { + FileInputStream inputFile = new FileInputStream(file); + String base64; + byte[] buffer = new byte[(int) file.length()]; + inputFile.read(buffer); + inputFile.close(); + base64 = Base64.encode(buffer); + return base64.replaceAll("[\\s*\t\n\r]", ""); + } + + + public static String getFileType(String type) { + String documents = "txt doc pdf ppt pps xlsx xls docx"; + String music = "mp3 wav wma mpa ram ra aac aif m4a"; + String video = "avi mpg mpe mpeg asf wmv mov qt rm mp4 flv m4v webm ogv ogg"; + String image = "bmp dib pcp dif wmf gif jpg tif eps psd cdr iff tga pcd mpt png jpeg"; + if (image.contains(type)) { + return "pic"; + } else if (documents.contains(type)) { + return "txt"; + } else if (music.contains(type)) { + return "music"; + } else if (video.contains(type)) { + return "vedio"; + } else { + return "other"; + } + } + + + public static void checkSize(long maxSize, long size) { + // 1M + int len = 1024 * 1024; + if (size > (maxSize * len)) { + throw new ServiceException("文件超出规定大小"); + + } + } + + /** + * 判断两个文件是否相同 + */ + public static boolean check(File file1, File file2) { + String img1Md5 = getMd5(file1); + String img2Md5 = getMd5(file2); + return img1Md5.equals(img2Md5); + } + + /** + * 判断两个文件是否相同 + */ + public static boolean check(String file1Md5, String file2Md5) { + return file1Md5.equals(file2Md5); + } + + private static byte[] getByte(File file) { + // 得到文件长度 + byte[] b = new byte[(int) file.length()]; + try { + InputStream in = new FileInputStream(file); + try { + in.read(b); + } catch (IOException e) { + e.printStackTrace(); + } + } catch (FileNotFoundException e) { + e.printStackTrace(); + return null; + } + return b; + } + + private static String getMd5(byte[] bytes) { + // 16进制字符 + char[] hexDigits = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'}; + try { + MessageDigest mdTemp = MessageDigest.getInstance("MD5"); + mdTemp.update(bytes); + byte[] md = mdTemp.digest(); + int j = md.length; + char[] str = new char[j * 2]; + int k = 0; + // 移位 输出字符串 + for (byte byte0 : md) { + str[k++] = hexDigits[byte0 >>> 4 & 0xf]; + str[k++] = hexDigits[byte0 & 0xf]; + } + return new String(str); + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + /** + * 下载文件 + * + * @param request / + * @param response / + * @param file / + */ + public static void downloadFile(HttpServletRequest request, HttpServletResponse response, File file, boolean deleteOnExit) { + response.setCharacterEncoding(request.getCharacterEncoding()); + response.setContentType("application/octet-stream"); + FileInputStream fis = null; + try { + fis = new FileInputStream(file); + response.setHeader("Content-Disposition", "attachment; filename=" + file.getName()); + IOUtils.copy(fis, response.getOutputStream()); + response.flushBuffer(); + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (fis != null) { + try { + fis.close(); + if (deleteOnExit) { + file.deleteOnExit(); + } + } catch (IOException e) { + e.printStackTrace(); + } + } + } + } + + public static String getMd5(File file) { + return getMd5(getByte(file)); + } + + /** + * 读取json文件,返回json串 + * + * @param fileName + * @return + */ + public static String readJsonFile(String fileName) { + String jsonStr = ""; + try { + File jsonFile = new File(fileName); + FileReader fileReader = new FileReader(jsonFile); + + Reader reader = new InputStreamReader(new FileInputStream(jsonFile), "utf-8"); + int ch = 0; + StringBuffer sb = new StringBuffer(); + while ((ch = reader.read()) != -1) { + sb.append((char) ch); + } + fileReader.close(); + reader.close(); + jsonStr = sb.toString(); + return jsonStr; + } catch (IOException e) { + e.printStackTrace(); + return null; + } + } + + public static BufferedImage inputImage(MultipartFile file) { + BufferedImage srcImage = null; + try { + FileInputStream in = (FileInputStream) file.getInputStream(); + srcImage = javax.imageio.ImageIO.read(in); + } catch (IOException e) { + System.out.println("读取图片文件出错!" + e.getMessage()); + } + return srcImage; + } + + /** + * 自动调节精度(经验数值) + * + * @param size 源图片大小 + * @return 图片压缩质量比 + */ + public static float getAccuracy(long size) { + float accuracy; + if (size < 400) { + accuracy = 0.85f; + } else if (size < 900) { + accuracy = 0.75f; + } else if (size < 2047) { + accuracy = 0.6f; + } else if (size < 3275) { + accuracy = 0.44f; + } else { + accuracy = 0.4f; + } + return accuracy; + } + + /** + * 上传文件重命名 + * + * @return 新的文件名 + */ + public static StringBuffer fileRename() { + SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS"); + String time = sdf.format(new Date()); + StringBuffer buf = new StringBuffer(time); + SecureRandom r = new SecureRandom(); + //循环取得三个不大于10的随机整数 + for (int x = 0; x < 3; x++) { + buf.append(r.nextInt(10)); + } + return buf; + } + + /** + * 对中文字符进行UTF-8编码 + * + * @param source 要转义的字符串 + * @return + * @throws UnsupportedEncodingException + */ + public static String transformStyle(String source) throws UnsupportedEncodingException { + char[] arr = source.toCharArray(); + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < arr.length; i++) { + char temp = arr[i]; + if (isChinese(temp)) { + sb.append(URLEncoder.encode("" + temp, Constants.UTF8)); + continue; + } + sb.append(arr[i]); + } + return sb.toString(); + } + + /** + * 判断是不是中文字符 + * + * @param c + * @return + */ + public static boolean isChinese(char c) { + + Character.UnicodeBlock ub = Character.UnicodeBlock.of(c); + + if (ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS + + || ub == Character.UnicodeBlock.CJK_COMPATIBILITY_IDEOGRAPHS + + || ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A + + || ub == Character.UnicodeBlock.GENERAL_PUNCTUATION + + || ub == Character.UnicodeBlock.CJK_SYMBOLS_AND_PUNCTUATION + + || ub == Character.UnicodeBlock.HALFWIDTH_AND_FULLWIDTH_FORMS) { + + return true; + + } + + return false; + + } + + + /** + * 上传文件重命名Mos系统 + * + * @return 新的文件名 + */ + public static String fileRenameMos(String prefix, String suffix) { + // 生成唯一的文件名[带前缀以及后缀] + String fileName = (prefix == null ? "" + : prefix.trim()) + IdUtils.simpleUUID() + (suffix == null ? "" + : suffix.trim()); + return fileName; + } + + /** + * 上传文件Mos系统 + */ + public static File uploadMos(MultipartFile file, String path) { + try { + // getCanonicalFile 可解析正确各种路径 + File dest = new File(path).getCanonicalFile(); + // 检测是否存在目录 + if (!dest.getParentFile().exists()) { + dest.getParentFile().mkdirs(); + } + // 文件写入 + file.transferTo(dest); + return dest; + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + public static File uploadMosBase64(String imageStr, String path) { + try { + // getCanonicalFile 可解析正确各种路径 + File dest = new File(path).getCanonicalFile(); + // 检测是否存在目录 + if (!dest.getParentFile().exists()) { + dest.getParentFile().mkdirs(); + } + byte[] bytes=Base64.decode(imageStr); //imageStr.getBytes(); + FileOutputStream fos = new FileOutputStream(dest); + try{ + // 文件写入 + fos.write(bytes,0,bytes.length); + fos.flush(); + }catch (IOException e){ + e.printStackTrace(); + }finally { + fos.close(); + } + return dest; + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + /** + * 读取文件,返回文件字符串. + * + * @param in 文件输入流 + * @param encoding 文件编码 + * @return String + */ + public static String readFile(InputStream in, String encoding) { + if (in == null) { + return null; + } + + StringBuffer sb = new StringBuffer(); + InputStreamReader reader = null; + try { + reader = new InputStreamReader(in, encoding); + int tmp = -1; + char temp; + while ((tmp = reader.read()) != -1) { + temp = (char) tmp; + sb.append(temp); + } + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (reader != null) { + try { + reader.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (in != null) { + try { + in.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + return sb.toString(); + } + + /** + * 将inputStream写入文件并关闭inputStream. + * + * @param is 文件输入流 + * @param filePath 文件路径 + * @param append true为追加,false为覆盖 + * @return 是否成功 + */ + public static boolean writeFile(InputStream is, String filePath, + boolean append) { + FileOutputStream fos = null; + try { + if (makeDir(filePath) && is != null) { + fos = new FileOutputStream(filePath, append); + byte[] buffer = new byte[FILE_READ_BTYE * FILE_READ_BTYE]; + // int bytesum = 0; + int byteread = 0; + while ((byteread = is.read(buffer)) != -1) { + // bytesum+=byteread; + fos.write(buffer, 0, byteread); + fos.flush(); + } + } + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (fos != null) { + try { + fos.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (is != null) { + try { + is.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + return true; + } + + /** + * 将字符串写入到文件. + * + * @param str 字符串 + * @param filePath 文件路径 + * @param encoding 编码 + * @param append 是否累加 + * @return 是否成功 + */ + public static boolean writeFile(String str, String filePath, + String encoding, boolean append) { + FileOutputStream fos = null; + Writer out = null; + boolean isSucc = false; + try { + if (makeDir(filePath)) { + fos = new FileOutputStream(new File(filePath), append); + out = new OutputStreamWriter(fos, encoding); + out.write(str); + + out.flush(); + out.close(); + + fos.flush(); + fos.close(); + } else { + isSucc = false; + } + isSucc = true; + } catch (IOException e) { + e.printStackTrace(); + isSucc = false; + } finally { + if (fos != null) { + try { + fos.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (out != null) { + try { + out.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + return isSucc; + } + + /** + * 创建文件夹。 + * + * @param destDirName 目标文件夹 + * @return 是否创建成功 + */ + public static boolean createDir(String destDirName) { + if (validateEmail(destDirName)) { + return false; + } + File dir = new File(destDirName); + if (dir.exists()) { // 目录已经存在,不用创建 + return true; + } + // 创建单个目录 + if (dir.mkdirs()) { // 创建目录成功 + return true; + } + return true; + } + + public static boolean validateEmail(String s) { + return StringUtils.isEmpty(s) + || s.matches("^([a-zA-Z0-9_\\-\\.]+)@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.)|(([a" + + "-zA-Z0-9\\-]+\\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\\]?)$"); + } + + + /** + * 根据文件创建目录. + * + * @param file 文件 + * @return 是否成功 + */ + public static boolean makeDir(File file) { + if (!file.exists()) { + makeDir(file.getAbsolutePath()); + } + return true; + } + + /** + * 根据文件名创建目录 + * + * @param fileName + * @return + */ + public static boolean makeDir(String fileName) { + int index = 0; + int index1 = fileName.lastIndexOf("/"); + int index2 = fileName.lastIndexOf("\\"); + if (index1 > index2) { + index = index1; + } else { + index = index2; + } + fileName = fileName.substring(0, index); + File file = new File(fileName); + file.setWritable(true, false); + if (!file.exists()) { + if (!file.mkdirs()) { + return false; + } + } + return true; + } + + /** + * 删除单个文件 。 + * + * @param sPath 被删除文件的文件名 + * @return 单个文件删除成功返回true,否则返回false + */ + public static boolean deleteFile(String sPath) { + Boolean flag = false; + File file = new File(sPath); + // 路径为文件且不为空则进行删除 + if (file.isFile() && file.exists()) { + file.delete(); + flag = true; + } + return flag; + } + + /** + * 删除单个文件 。 + * + * @param file 被删除文件 + * @return 单个文件删除成功返回true,否则返回false + */ + public static boolean deleteFile(File file) { + Boolean flag = false; + // 路径为文件且不为空则进行删除 + if (file.isFile() && file.exists()) { + file.delete(); + flag = true; + } + return flag; + } + + /** + * 删除文件夹。 + * + * @param sPath 文件夹路径 + * @param flags true删除文件夹,false只删除文件夹下的文件 + * @return 是否删除成功 + */ + public static boolean deleteDirectory(String sPath, Boolean flags) { + // 如果sPath不以文件分隔符结尾,自动添加文件分隔符 + if (!sPath.endsWith(File.separator)) { + sPath = sPath + File.separator; + } + File dirFile = new File(sPath); + // 如果dir对应的文件不存在,或者不是一个目录,则退出 + if (!dirFile.exists() || !dirFile.isDirectory()) { + return false; + } + Boolean flag = true; + // 删除文件夹下的所有文件(包括子目录) + File[] files = dirFile.listFiles(); + for (int i = 0; i < files.length; i++) { + // 删除子文件 + if (files[i].isFile()) { + flag = deleteFile(files[i].getAbsolutePath()); + if (!flag) { + break; + } + } else { + // 删除子目录 + flag = deleteDirectory(files[i].getAbsolutePath(), true); + if (!flag) { + break; + } + } + } + if (!flag) { + return false; + } + if (flags) { + // 删除当前目录 + return dirFile.delete(); + } + return true; + } + + /** + * 文件打包(指定文件). + * + * @param zipFilePath 打包后压缩包的路径 + * @param files 需要打包的文件 + * @param targetFileNames 打包后文件的名称 + * @param encoding 文件名编码 + * @return flag 是否打包成功 + */ + public static Boolean zipFile(String zipFilePath, File[] files, + String[] targetFileNames, String encoding) { + Boolean flag = false; + if (StringUtils.isEmpty(zipFilePath) || files == null + || files.length == 0) { + return flag; + } + if (targetFileNames != null && targetFileNames.length != files.length) { + return flag; + } + byte[] buffer = new byte[FILE_READ_BTYE]; + try { + ZipOutputStream out = new ZipOutputStream(new FileOutputStream( + zipFilePath)); + for (int i = 0; i < files.length; i++) { + FileInputStream fis = new FileInputStream(files[i]); + if (targetFileNames != null) { + if (String.valueOf(targetFileNames[i].toCharArray()[0]) + .equals("/")) { + out.putNextEntry(new ZipEntry(targetFileNames[i] + .substring(1, targetFileNames[i].length()))); + } else { + out.putNextEntry(new ZipEntry(targetFileNames[i])); + } + } else { + out.putNextEntry(new ZipEntry(files[i].getName())); + } + if (StringUtils.isNotEmpty(encoding)) { + out.setEncoding(encoding); + } + int len; + while ((len = fis.read(buffer)) > 0) { + out.write(buffer, 0, len); + } + out.closeEntry(); + fis.close(); + } + out.close(); + flag = true; + } catch (FileNotFoundException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + return flag; + } + + /** + * inputStream 转 File + */ + static File inputStreamToFile(InputStream ins, String name) throws Exception { + File file = new File(SYS_TEM_DIR + name); + if (file.exists()) { + return file; + } + OutputStream os = new FileOutputStream(file); + int bytesRead; + int len = 8192; + byte[] buffer = new byte[len]; + while ((bytesRead = ins.read(buffer, 0, len)) != -1) { + os.write(buffer, 0, bytesRead); + } + os.close(); + ins.close(); + return file; + } + + /** + * 导出excel + */ + public static void downloadExcel(List> list, HttpServletResponse response) throws IOException { + String tempPath = SYS_TEM_DIR + IdUtil.fastSimpleUUID() + ".xlsx"; + File file = new File(tempPath); + BigExcelWriter writer = ExcelUtil.getBigWriter(file); + // 一次性写出内容,使用默认样式,强制输出标题 + writer.write(list, true); + SXSSFSheet sheet = (SXSSFSheet) writer.getSheet(); + //上面需要强转SXSSFSheet 不然没有trackAllColumnsForAutoSizing方法 + sheet.trackAllColumnsForAutoSizing(); + //列宽自适应 + writer.autoSizeColumnAll(); + //response为HttpServletResponse对象 + response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8"); + //test.xls是弹出下载对话框的文件名,不能为中文,中文请自行编码 + response.setHeader("Content-Disposition", "attachment;filename=file.xlsx"); + ServletOutputStream out = response.getOutputStream(); + // 终止后删除临时文件 + file.deleteOnExit(); + writer.flush(out, true); + //此处记得关闭输出Servlet流 + IoUtil.close(out); + } + + + /** + * 下载项目根目录下doc下的文件 + * + * @param response response + * @param fileName 文件名 + * @return 返回结果 成功或者文件不存在 + */ + public static AjaxResult downloadFile(HttpServletResponse response, String fileName) { + ClassPathResource classPathResource = new ClassPathResource(File.separator+"import_template"+File.separator+"material_export"+File.separator+fileName); + InputStream stream = null; + try { + stream = classPathResource.getInputStream(); + if (stream == null) { + log.error("文件没有找到"); + } + response.setHeader("content-type", "application/octet-stream"); + response.setContentType("application/octet-stream"); + String name = URLEncoder.encode(fileName, "UTF-8"); + response.setHeader("Content-Disposition", "attachment;filename=" + java.net.URLDecoder.decode(name, "ISO-8859-1")); + } catch (UnsupportedEncodingException e) { + log.error("文件名转换编码出现问题:" + e.getMessage()); + }catch (Exception e){ + log.error( e.getMessage()); + } + byte[] buff = new byte[1024]; + BufferedInputStream bis = null; + OutputStream os = null; + try { + os = response.getOutputStream(); + bis = new BufferedInputStream(stream); + int i = bis.read(buff); + while (i != -1) { + os.write(buff, 0, buff.length); + os.flush(); + i = bis.read(buff); + } + } catch (FileNotFoundException e) { + e.printStackTrace(); + log.error("系统找不到指定的文件:" + e.getMessage()); + return AjaxResult.error("500", "系统找不到指定的文件"); + } catch (IOException e) { + e.printStackTrace(); + log.error("Io流写入出现错误:" + e.getMessage()); + return AjaxResult.error("500", "Io流写入出现错误"); + } finally { + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + e.printStackTrace(); + log.error("关闭流出现错误:" + e.getMessage()); + return AjaxResult.error("500", "关闭流出现错误"); + } + } + } + return AjaxResult.success(); + } + + +} diff --git a/bs-common/src/main/java/com/bs/common/utils/LogUtils.java b/bs-common/src/main/java/com/bs/common/utils/LogUtils.java new file mode 100644 index 0000000..22f9291 --- /dev/null +++ b/bs-common/src/main/java/com/bs/common/utils/LogUtils.java @@ -0,0 +1,18 @@ +package com.bs.common.utils; + +/** + * 处理并记录日志文件 + * + * @author bs + */ +public class LogUtils +{ + public static String getBlock(Object msg) + { + if (msg == null) + { + msg = ""; + } + return "[" + msg.toString() + "]"; + } +} diff --git a/bs-common/src/main/java/com/bs/common/utils/MessageUtils.java b/bs-common/src/main/java/com/bs/common/utils/MessageUtils.java new file mode 100644 index 0000000..241f9df --- /dev/null +++ b/bs-common/src/main/java/com/bs/common/utils/MessageUtils.java @@ -0,0 +1,26 @@ +package com.bs.common.utils; + +import org.springframework.context.MessageSource; +import org.springframework.context.i18n.LocaleContextHolder; +import com.bs.common.utils.spring.SpringUtils; + +/** + * 获取i18n资源文件 + * + * @author bs + */ +public class MessageUtils +{ + /** + * 根据消息键和参数 获取消息 委托给spring messageSource + * + * @param code 消息键 + * @param args 参数 + * @return 获取国际化翻译值 + */ + public static String message(String code, Object... args) + { + MessageSource messageSource = SpringUtils.getBean(MessageSource.class); + return messageSource.getMessage(code, args, LocaleContextHolder.getLocale()); + } +} diff --git a/bs-common/src/main/java/com/bs/common/utils/OsInfoUtil.java b/bs-common/src/main/java/com/bs/common/utils/OsInfoUtil.java new file mode 100644 index 0000000..ed5601e --- /dev/null +++ b/bs-common/src/main/java/com/bs/common/utils/OsInfoUtil.java @@ -0,0 +1,137 @@ +package com.bs.common.utils; + + +public class OsInfoUtil { + private static String OS = System.getProperty("os.name").toLowerCase(); + + private static OsInfoUtil _instance = new OsInfoUtil(); + + private SystemEnum platform; + + private OsInfoUtil() { + } + + public static boolean isLinux() { + return OS.indexOf("linux") >= 0; + } + + public static boolean isMacOS() { + return OS.indexOf("mac") >= 0 && OS.indexOf("os") > 0 && OS.indexOf("x") < 0; + } + + public static boolean isMacOSX() { + return OS.indexOf("mac") >= 0 && OS.indexOf("os") > 0 && OS.indexOf("x") > 0; + } + + public static boolean isWindows() { + return OS.indexOf("windows") >= 0; + } + + public static boolean isOS2() { + return OS.indexOf("os/2") >= 0; + } + + public static boolean isSolaris() { + return OS.indexOf("solaris") >= 0; + } + + public static boolean isSunOS() { + return OS.indexOf("sunos") >= 0; + } + + public static boolean isMPEiX() { + return OS.indexOf("mpe/ix") >= 0; + } + + public static boolean isHPUX() { + return OS.indexOf("hp-ux") >= 0; + } + + public static boolean isAix() { + return OS.indexOf("aix") >= 0; + } + + public static boolean isOS390() { + return OS.indexOf("os/390") >= 0; + } + + public static boolean isFreeBSD() { + return OS.indexOf("freebsd") >= 0; + } + + public static boolean isIrix() { + return OS.indexOf("irix") >= 0; + } + + public static boolean isDigitalUnix() { + return OS.indexOf("digital") >= 0 && OS.indexOf("unix") > 0; + } + + public static boolean isNetWare() { + return OS.indexOf("netware") >= 0; + } + + public static boolean isOSF1() { + return OS.indexOf("osf1") >= 0; + } + + public static boolean isOpenVMS() { + return OS.indexOf("openvms") >= 0; + } + + /** + * 获取操作系统名字 + * + * @return 操作系统名 + */ + public static SystemEnum getOSname() { + if (isAix()) { + _instance.platform = SystemEnum.AIX; + } else if (isDigitalUnix()) { + _instance.platform = SystemEnum.DIGITAL_UNIX; + } else if (isFreeBSD()) { + _instance.platform = SystemEnum.FreeBSD; + } else if (isHPUX()) { + _instance.platform = SystemEnum.HP_UX; + } else if (isIrix()) { + _instance.platform = SystemEnum.IRIX; + } else if (isLinux()) { + _instance.platform = SystemEnum.LINUX; + } else if (isMacOS()) { + _instance.platform = SystemEnum.MAC_OS; + } else if (isMacOSX()) { + _instance.platform = SystemEnum.MAC_OS_X; + } else if (isMPEiX()) { + _instance.platform = SystemEnum.MPEiX; + } else if (isNetWare()) { + _instance.platform = SystemEnum.NETWARE_411; + } else if (isOpenVMS()) { + _instance.platform = SystemEnum.OPENVMS; + } else if (isOS2()) { + _instance.platform = SystemEnum.OS2; + } else if (isOS390()) { + _instance.platform = SystemEnum.OS390; + } else if (isOSF1()) { + _instance.platform = SystemEnum.OSF1; + } else if (isSolaris()) { + _instance.platform = SystemEnum.SOLARIS; + } else if (isSunOS()) { + _instance.platform = SystemEnum.SUNOS; + } else if (isWindows()) { + _instance.platform = SystemEnum.WINDOWS; + } else { + _instance.platform = SystemEnum.OTHERS; + } + return _instance.platform; + } + + /** + * @param args + */ + public static void main(String[] args) { + System.out.println(OsInfoUtil.getOSname());// 获取系统类型 + System.out.println(OsInfoUtil.isMacOSX());// 判断是否为windows系统 + } + + +} diff --git a/bs-common/src/main/java/com/bs/common/utils/PageUtils.java b/bs-common/src/main/java/com/bs/common/utils/PageUtils.java new file mode 100644 index 0000000..9c6443d --- /dev/null +++ b/bs-common/src/main/java/com/bs/common/utils/PageUtils.java @@ -0,0 +1,35 @@ +package com.bs.common.utils; + +import com.github.pagehelper.PageHelper; +import com.bs.common.core.page.PageDomain; +import com.bs.common.core.page.TableSupport; +import com.bs.common.utils.sql.SqlUtil; + +/** + * 分页工具类 + * + * @author bs + */ +public class PageUtils extends PageHelper +{ + /** + * 设置请求分页数据 + */ + public static void startPage() + { + PageDomain pageDomain = TableSupport.buildPageRequest(); + Integer pageNum = pageDomain.getPageNum(); + Integer pageSize = pageDomain.getPageSize(); + String orderBy = SqlUtil.escapeOrderBySql(pageDomain.getOrderBy()); + Boolean reasonable = pageDomain.getReasonable(); + PageHelper.startPage(pageNum, pageSize, orderBy).setReasonable(reasonable); + } + + /** + * 清理分页的线程变量 + */ + public static void clearPage() + { + PageHelper.clearPage(); + } +} diff --git a/bs-common/src/main/java/com/bs/common/utils/SecurityUtils.java b/bs-common/src/main/java/com/bs/common/utils/SecurityUtils.java new file mode 100644 index 0000000..31984f7 --- /dev/null +++ b/bs-common/src/main/java/com/bs/common/utils/SecurityUtils.java @@ -0,0 +1,144 @@ +package com.bs.common.utils; + +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import com.bs.common.constant.HttpStatus; +import com.bs.common.core.domain.model.LoginUser; +import com.bs.common.exception.ServiceException; + +/** + * 安全服务工具类 + * + * @author bs + */ +public class SecurityUtils +{ + /** + * 用户ID + **/ + public static Long getUserId() + { + try + { + return getLoginUser().getUserId(); + } + catch (Exception e) + { + throw new ServiceException("获取用户ID异常", HttpStatus.UNAUTHORIZED); + } + } + + /** + * 获取租户id + **/ + public static Long getTenantId() { + try { + return getLoginUser().getTenantId(); + } catch (Exception e) { + //e.printStackTrace(); + //throw new ServiceException("获取租户id异常", HttpStatus.UNAUTHORIZED); + //log.info("此异常只有在获取不到的场景才会触发(此时不用理会err),如果当前场景下应当获取到信息,应及时处理(全局搜索这段话)"); + //log.error("获取租户id异常",e.getMessage()); + return null; + + } + } + /** + * 是否租户账号 + **/ + public static Boolean isTenant() { + if(getTenantId()!=0L){ + return true; + } + return false; + } + /** + * 获取部门ID + **/ + public static Long getDeptId() + { + try + { + return getLoginUser().getDeptId(); + } + catch (Exception e) + { + throw new ServiceException("获取部门ID异常", HttpStatus.UNAUTHORIZED); + } + } + + /** + * 获取用户账户 + **/ + public static Long getUsername() + { + try + { + return getLoginUser().getUserId(); + } + catch (Exception e) + { + return null; + } + } + + /** + * 获取用户 + **/ + public static LoginUser getLoginUser() + { + try + { + return (LoginUser) getAuthentication().getPrincipal(); + } + catch (Exception e) + { + throw new ServiceException("获取用户信息异常", HttpStatus.UNAUTHORIZED); + } + } + + /** + * 获取Authentication + */ + public static Authentication getAuthentication() + { + return SecurityContextHolder.getContext().getAuthentication(); + } + + /** + * 生成BCryptPasswordEncoder密码 + * + * @param password 密码 + * @return 加密字符串 + */ + public static String encryptPassword(String password) + { + BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder(); + return passwordEncoder.encode(password); + } + + /** + * 判断密码是否相同 + * + * @param rawPassword 真实密码 + * @param encodedPassword 加密后字符 + * @return 结果 + */ + public static boolean matchesPassword(String rawPassword, String encodedPassword) + { + BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder(); + return passwordEncoder.matches(rawPassword, encodedPassword); + } + + /** + * 是否为管理员 + * + * @param userId 用户ID + * @return 结果 + */ + public static boolean isAdmin(Long userId) + { + return userId != null && 1L == userId; + } +} diff --git a/bs-common/src/main/java/com/bs/common/utils/ServletUtils.java b/bs-common/src/main/java/com/bs/common/utils/ServletUtils.java new file mode 100644 index 0000000..e08c4fd --- /dev/null +++ b/bs-common/src/main/java/com/bs/common/utils/ServletUtils.java @@ -0,0 +1,218 @@ +package com.bs.common.utils; + +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.net.URLDecoder; +import java.net.URLEncoder; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; +import javax.servlet.ServletRequest; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; +import org.springframework.web.context.request.RequestAttributes; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; +import com.bs.common.constant.Constants; +import com.bs.common.core.text.Convert; + +/** + * 客户端工具类 + * + * @author bs + */ +public class ServletUtils +{ + /** + * 获取String参数 + */ + public static String getParameter(String name) + { + return getRequest().getParameter(name); + } + + /** + * 获取String参数 + */ + public static String getParameter(String name, String defaultValue) + { + return Convert.toStr(getRequest().getParameter(name), defaultValue); + } + + /** + * 获取Integer参数 + */ + public static Integer getParameterToInt(String name) + { + return Convert.toInt(getRequest().getParameter(name)); + } + + /** + * 获取Integer参数 + */ + public static Integer getParameterToInt(String name, Integer defaultValue) + { + return Convert.toInt(getRequest().getParameter(name), defaultValue); + } + + /** + * 获取Boolean参数 + */ + public static Boolean getParameterToBool(String name) + { + return Convert.toBool(getRequest().getParameter(name)); + } + + /** + * 获取Boolean参数 + */ + public static Boolean getParameterToBool(String name, Boolean defaultValue) + { + return Convert.toBool(getRequest().getParameter(name), defaultValue); + } + + /** + * 获得所有请求参数 + * + * @param request 请求对象{@link ServletRequest} + * @return Map + */ + public static Map getParams(ServletRequest request) + { + final Map map = request.getParameterMap(); + return Collections.unmodifiableMap(map); + } + + /** + * 获得所有请求参数 + * + * @param request 请求对象{@link ServletRequest} + * @return Map + */ + public static Map getParamMap(ServletRequest request) + { + Map params = new HashMap<>(); + for (Map.Entry entry : getParams(request).entrySet()) + { + params.put(entry.getKey(), StringUtils.join(entry.getValue(), ",")); + } + return params; + } + + /** + * 获取request + */ + public static HttpServletRequest getRequest() + { + return getRequestAttributes().getRequest(); + } + + /** + * 获取response + */ + public static HttpServletResponse getResponse() + { + return getRequestAttributes().getResponse(); + } + + /** + * 获取session + */ + public static HttpSession getSession() + { + return getRequest().getSession(); + } + + public static ServletRequestAttributes getRequestAttributes() + { + RequestAttributes attributes = RequestContextHolder.getRequestAttributes(); + return (ServletRequestAttributes) attributes; + } + + /** + * 将字符串渲染到客户端 + * + * @param response 渲染对象 + * @param string 待渲染的字符串 + */ + public static void renderString(HttpServletResponse response, String string) + { + try + { + response.setStatus(200); + response.setContentType("application/json"); + response.setCharacterEncoding("utf-8"); + response.getWriter().print(string); + } + catch (IOException e) + { + e.printStackTrace(); + } + } + + /** + * 是否是Ajax异步请求 + * + * @param request + */ + public static boolean isAjaxRequest(HttpServletRequest request) + { + String accept = request.getHeader("accept"); + if (accept != null && accept.contains("application/json")) + { + return true; + } + + String xRequestedWith = request.getHeader("X-Requested-With"); + if (xRequestedWith != null && xRequestedWith.contains("XMLHttpRequest")) + { + return true; + } + + String uri = request.getRequestURI(); + if (StringUtils.inStringIgnoreCase(uri, ".json", ".xml")) + { + return true; + } + + String ajax = request.getParameter("__ajax"); + return StringUtils.inStringIgnoreCase(ajax, "json", "xml"); + } + + /** + * 内容编码 + * + * @param str 内容 + * @return 编码后的内容 + */ + public static String urlEncode(String str) + { + try + { + return URLEncoder.encode(str, Constants.UTF8); + } + catch (UnsupportedEncodingException e) + { + return StringUtils.EMPTY; + } + } + + /** + * 内容解码 + * + * @param str 内容 + * @return 解码后的内容 + */ + public static String urlDecode(String str) + { + try + { + return URLDecoder.decode(str, Constants.UTF8); + } + catch (UnsupportedEncodingException e) + { + return StringUtils.EMPTY; + } + } +} diff --git a/bs-common/src/main/java/com/bs/common/utils/StringUtils.java b/bs-common/src/main/java/com/bs/common/utils/StringUtils.java new file mode 100644 index 0000000..986a02a --- /dev/null +++ b/bs-common/src/main/java/com/bs/common/utils/StringUtils.java @@ -0,0 +1,614 @@ +package com.bs.common.utils; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import org.springframework.util.AntPathMatcher; +import com.bs.common.constant.Constants; +import com.bs.common.core.text.StrFormatter; + +/** + * 字符串工具类 + * + * @author bs + */ +public class StringUtils extends org.apache.commons.lang3.StringUtils +{ + /** 空字符串 */ + private static final String NULLSTR = ""; + + /** 下划线 */ + private static final char SEPARATOR = '_'; + + /** + * 获取参数不为空值 + * + * @param value defaultValue 要判断的value + * @return value 返回值 + */ + public static T nvl(T value, T defaultValue) + { + return value != null ? value : defaultValue; + } + + /** + * * 判断一个Collection是否为空, 包含List,Set,Queue + * + * @param coll 要判断的Collection + * @return true:为空 false:非空 + */ + public static boolean isEmpty(Collection coll) + { + return isNull(coll) || coll.isEmpty(); + } + + /** + * * 判断一个Collection是否非空,包含List,Set,Queue + * + * @param coll 要判断的Collection + * @return true:非空 false:空 + */ + public static boolean isNotEmpty(Collection coll) + { + return !isEmpty(coll); + } + + /** + * * 判断一个对象数组是否为空 + * + * @param objects 要判断的对象数组 + ** @return true:为空 false:非空 + */ + public static boolean isEmpty(Object[] objects) + { + return isNull(objects) || (objects.length == 0); + } + + /** + * * 判断一个对象数组是否非空 + * + * @param objects 要判断的对象数组 + * @return true:非空 false:空 + */ + public static boolean isNotEmpty(Object[] objects) + { + return !isEmpty(objects); + } + + /** + * * 判断一个Map是否为空 + * + * @param map 要判断的Map + * @return true:为空 false:非空 + */ + public static boolean isEmpty(Map map) + { + return isNull(map) || map.isEmpty(); + } + + /** + * * 判断一个Map是否为空 + * + * @param map 要判断的Map + * @return true:非空 false:空 + */ + public static boolean isNotEmpty(Map map) + { + return !isEmpty(map); + } + + /** + * * 判断一个字符串是否为空串 + * + * @param str String + * @return true:为空 false:非空 + */ + public static boolean isEmpty(String str) + { + return isNull(str) || NULLSTR.equals(str.trim()); + } + + /** + * * 判断一个字符串是否为非空串 + * + * @param str String + * @return true:非空串 false:空串 + */ + public static boolean isNotEmpty(String str) + { + return !isEmpty(str); + } + + /** + * * 判断一个对象是否为空 + * + * @param object Object + * @return true:为空 false:非空 + */ + public static boolean isNull(Object object) + { + return object == null; + } + + /** + * * 判断一个对象是否非空 + * + * @param object Object + * @return true:非空 false:空 + */ + public static boolean isNotNull(Object object) + { + return !isNull(object); + } + + /** + * * 判断一个对象是否是数组类型(Java基本型别的数组) + * + * @param object 对象 + * @return true:是数组 false:不是数组 + */ + public static boolean isArray(Object object) + { + return isNotNull(object) && object.getClass().isArray(); + } + + /** + * 去空格 + */ + public static String trim(String str) + { + return (str == null ? "" : str.trim()); + } + + /** + * 截取字符串 + * + * @param str 字符串 + * @param start 开始 + * @return 结果 + */ + public static String substring(final String str, int start) + { + if (str == null) + { + return NULLSTR; + } + + if (start < 0) + { + start = str.length() + start; + } + + if (start < 0) + { + start = 0; + } + if (start > str.length()) + { + return NULLSTR; + } + + return str.substring(start); + } + + /** + * 截取字符串 + * + * @param str 字符串 + * @param start 开始 + * @param end 结束 + * @return 结果 + */ + public static String substring(final String str, int start, int end) + { + if (str == null) + { + return NULLSTR; + } + + if (end < 0) + { + end = str.length() + end; + } + if (start < 0) + { + start = str.length() + start; + } + + if (end > str.length()) + { + end = str.length(); + } + + if (start > end) + { + return NULLSTR; + } + + if (start < 0) + { + start = 0; + } + if (end < 0) + { + end = 0; + } + + return str.substring(start, end); + } + + /** + * 格式化文本, {} 表示占位符
+ * 此方法只是简单将占位符 {} 按照顺序替换为参数
+ * 如果想输出 {} 使用 \\转义 { 即可,如果想输出 {} 之前的 \ 使用双转义符 \\\\ 即可
+ * 例:
+ * 通常使用:format("this is {} for {}", "a", "b") -> this is a for b
+ * 转义{}: format("this is \\{} for {}", "a", "b") -> this is \{} for a
+ * 转义\: format("this is \\\\{} for {}", "a", "b") -> this is \a for b
+ * + * @param template 文本模板,被替换的部分用 {} 表示 + * @param params 参数值 + * @return 格式化后的文本 + */ + public static String format(String template, Object... params) + { + if (isEmpty(params) || isEmpty(template)) + { + return template; + } + return StrFormatter.format(template, params); + } + + /** + * 是否为http(s)://开头 + * + * @param link 链接 + * @return 结果 + */ + public static boolean ishttp(String link) + { + return StringUtils.startsWithAny(link, Constants.HTTP, Constants.HTTPS); + } + + /** + * 字符串转set + * + * @param str 字符串 + * @param sep 分隔符 + * @return set集合 + */ + public static final Set str2Set(String str, String sep) + { + return new HashSet(str2List(str, sep, true, false)); + } + + /** + * 字符串转list + * + * @param str 字符串 + * @param sep 分隔符 + * @param filterBlank 过滤纯空白 + * @param trim 去掉首尾空白 + * @return list集合 + */ + public static final List str2List(String str, String sep, boolean filterBlank, boolean trim) + { + List list = new ArrayList(); + if (StringUtils.isEmpty(str)) + { + return list; + } + + // 过滤空白字符串 + if (filterBlank && StringUtils.isBlank(str)) + { + return list; + } + String[] split = str.split(sep); + for (String string : split) + { + if (filterBlank && StringUtils.isBlank(string)) + { + continue; + } + if (trim) + { + string = string.trim(); + } + list.add(string); + } + + return list; + } + + /** + * 判断给定的collection列表中是否包含数组array 判断给定的数组array中是否包含给定的元素value + * + * @param collection 给定的集合 + * @param array 给定的数组 + * @return boolean 结果 + */ + public static boolean containsAny(Collection collection, String... array) + { + if (isEmpty(collection) || isEmpty(array)) + { + return false; + } + else + { + for (String str : array) + { + if (collection.contains(str)) + { + return true; + } + } + return false; + } + } + + /** + * 查找指定字符串是否包含指定字符串列表中的任意一个字符串同时串忽略大小写 + * + * @param cs 指定字符串 + * @param searchCharSequences 需要检查的字符串数组 + * @return 是否包含任意一个字符串 + */ + public static boolean containsAnyIgnoreCase(CharSequence cs, CharSequence... searchCharSequences) + { + if (isEmpty(cs) || isEmpty(searchCharSequences)) + { + return false; + } + for (CharSequence testStr : searchCharSequences) + { + if (containsIgnoreCase(cs, testStr)) + { + return true; + } + } + return false; + } + + /** + * 驼峰转下划线命名 + */ + public static String toUnderScoreCase(String str) + { + if (str == null) + { + return null; + } + StringBuilder sb = new StringBuilder(); + // 前置字符是否大写 + boolean preCharIsUpperCase = true; + // 当前字符是否大写 + boolean curreCharIsUpperCase = true; + // 下一字符是否大写 + boolean nexteCharIsUpperCase = true; + for (int i = 0; i < str.length(); i++) + { + char c = str.charAt(i); + if (i > 0) + { + preCharIsUpperCase = Character.isUpperCase(str.charAt(i - 1)); + } + else + { + preCharIsUpperCase = false; + } + + curreCharIsUpperCase = Character.isUpperCase(c); + + if (i < (str.length() - 1)) + { + nexteCharIsUpperCase = Character.isUpperCase(str.charAt(i + 1)); + } + + if (preCharIsUpperCase && curreCharIsUpperCase && !nexteCharIsUpperCase) + { + sb.append(SEPARATOR); + } + else if ((i != 0 && !preCharIsUpperCase) && curreCharIsUpperCase) + { + sb.append(SEPARATOR); + } + sb.append(Character.toLowerCase(c)); + } + + return sb.toString(); + } + + /** + * 是否包含字符串 + * + * @param str 验证字符串 + * @param strs 字符串组 + * @return 包含返回true + */ + public static boolean inStringIgnoreCase(String str, String... strs) + { + if (str != null && strs != null) + { + for (String s : strs) + { + if (str.equalsIgnoreCase(trim(s))) + { + return true; + } + } + } + return false; + } + + /** + * 将下划线大写方式命名的字符串转换为驼峰式。如果转换前的下划线大写方式命名的字符串为空,则返回空字符串。 例如:HELLO_WORLD->HelloWorld + * + * @param name 转换前的下划线大写方式命名的字符串 + * @return 转换后的驼峰式命名的字符串 + */ + public static String convertToCamelCase(String name) + { + StringBuilder result = new StringBuilder(); + // 快速检查 + if (name == null || name.isEmpty()) + { + // 没必要转换 + return ""; + } + else if (!name.contains("_")) + { + // 不含下划线,仅将首字母大写 + return name.substring(0, 1).toUpperCase() + name.substring(1); + } + // 用下划线将原始字符串分割 + String[] camels = name.split("_"); + for (String camel : camels) + { + // 跳过原始字符串中开头、结尾的下换线或双重下划线 + if (camel.isEmpty()) + { + continue; + } + // 首字母大写 + result.append(camel.substring(0, 1).toUpperCase()); + result.append(camel.substring(1).toLowerCase()); + } + return result.toString(); + } + + /** + * 驼峰式命名法 + * 例如:user_name->userName + */ + public static String toCamelCase(String s) + { + if (s == null) + { + return null; + } + if (s.indexOf(SEPARATOR) == -1) + { + return s; + } + s = s.toLowerCase(); + StringBuilder sb = new StringBuilder(s.length()); + boolean upperCase = false; + for (int i = 0; i < s.length(); i++) + { + char c = s.charAt(i); + + if (c == SEPARATOR) + { + upperCase = true; + } + else if (upperCase) + { + sb.append(Character.toUpperCase(c)); + upperCase = false; + } + else + { + sb.append(c); + } + } + return sb.toString(); + } + + /** + * 查找指定字符串是否匹配指定字符串列表中的任意一个字符串 + * + * @param str 指定字符串 + * @param strs 需要检查的字符串数组 + * @return 是否匹配 + */ + public static boolean matches(String str, List strs) + { + if (isEmpty(str) || isEmpty(strs)) + { + return false; + } + for (String pattern : strs) + { + if (isMatch(pattern, str)) + { + return true; + } + } + return false; + } + + /** + * 判断url是否与规则配置: + * ? 表示单个字符; + * * 表示一层路径内的任意字符串,不可跨层级; + * ** 表示任意层路径; + * + * @param pattern 匹配规则 + * @param url 需要匹配的url + * @return + */ + public static boolean isMatch(String pattern, String url) + { + AntPathMatcher matcher = new AntPathMatcher(); + return matcher.match(pattern, url); + } + + @SuppressWarnings("unchecked") + public static T cast(Object obj) + { + return (T) obj; + } + + /** + * 数字左边补齐0,使之达到指定长度。注意,如果数字转换为字符串后,长度大于size,则只保留 最后size个字符。 + * + * @param num 数字对象 + * @param size 字符串指定长度 + * @return 返回数字的字符串格式,该字符串为指定长度。 + */ + public static final String padl(final Number num, final int size) + { + return padl(num.toString(), size, '0'); + } + + /** + * 字符串左补齐。如果原始字符串s长度大于size,则只保留最后size个字符。 + * + * @param s 原始字符串 + * @param size 字符串指定长度 + * @param c 用于补齐的字符 + * @return 返回指定长度的字符串,由原字符串左补齐或截取得到。 + */ + public static final String padl(final String s, final int size, final char c) + { + final StringBuilder sb = new StringBuilder(size); + if (s != null) + { + final int len = s.length(); + if (s.length() <= size) + { + for (int i = size - len; i > 0; i--) + { + sb.append(c); + } + sb.append(s); + } + else + { + return s.substring(len - size, len); + } + } + else + { + for (int i = size; i > 0; i--) + { + sb.append(c); + } + } + return sb.toString(); + } +} diff --git a/bs-common/src/main/java/com/bs/common/utils/SystemEnum.java b/bs-common/src/main/java/com/bs/common/utils/SystemEnum.java new file mode 100644 index 0000000..c3c7d9c --- /dev/null +++ b/bs-common/src/main/java/com/bs/common/utils/SystemEnum.java @@ -0,0 +1,36 @@ +package com.bs.common.utils; + +public enum SystemEnum { + + ANY("any"), + LINUX("Linux"), + MAC_OS("Mac OS"), + MAC_OS_X("Mac OS X"), + WINDOWS("Windows"), + OS2("OS/2"), + SOLARIS("Solaris"), + SUNOS("SunOS"), + MPEiX("MPE/iX"), + HP_UX("HP-UX"), + AIX("AIX"), + OS390("OS/390"), + FreeBSD("FreeBSD"), + IRIX("Irix"), + DIGITAL_UNIX("Digital Unix"), + NETWARE_411("NetWare"), + OSF1("OSF1"), + OPENVMS("OpenVMS"), + OTHERS("Others"); + + SystemEnum(String desc) { + this.description = desc; + } + + @Override + public String toString() { + return description; + } + + private String description; + +} diff --git a/bs-common/src/main/java/com/bs/common/utils/Threads.java b/bs-common/src/main/java/com/bs/common/utils/Threads.java new file mode 100644 index 0000000..427607f --- /dev/null +++ b/bs-common/src/main/java/com/bs/common/utils/Threads.java @@ -0,0 +1,99 @@ +package com.bs.common.utils; + +import java.util.concurrent.CancellationException; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Future; +import java.util.concurrent.TimeUnit; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * 线程相关工具类. + * + * @author bs + */ +public class Threads +{ + private static final Logger logger = LoggerFactory.getLogger(Threads.class); + + /** + * sleep等待,单位为毫秒 + */ + public static void sleep(long milliseconds) + { + try + { + Thread.sleep(milliseconds); + } + catch (InterruptedException e) + { + return; + } + } + + /** + * 停止线程池 + * 先使用shutdown, 停止接收新任务并尝试完成所有已存在任务. + * 如果超时, 则调用shutdownNow, 取消在workQueue中Pending的任务,并中断所有阻塞函数. + * 如果仍然超時,則強制退出. + * 另对在shutdown时线程本身被调用中断做了处理. + */ + public static void shutdownAndAwaitTermination(ExecutorService pool) + { + if (pool != null && !pool.isShutdown()) + { + pool.shutdown(); + try + { + if (!pool.awaitTermination(120, TimeUnit.SECONDS)) + { + pool.shutdownNow(); + if (!pool.awaitTermination(120, TimeUnit.SECONDS)) + { + logger.info("Pool did not terminate"); + } + } + } + catch (InterruptedException ie) + { + pool.shutdownNow(); + Thread.currentThread().interrupt(); + } + } + } + + /** + * 打印线程异常信息 + */ + public static void printException(Runnable r, Throwable t) + { + if (t == null && r instanceof Future) + { + try + { + Future future = (Future) r; + if (future.isDone()) + { + future.get(); + } + } + catch (CancellationException ce) + { + t = ce; + } + catch (ExecutionException ee) + { + t = ee.getCause(); + } + catch (InterruptedException ie) + { + Thread.currentThread().interrupt(); + } + } + if (t != null) + { + logger.error(t.getMessage(), t); + } + } +} diff --git a/bs-common/src/main/java/com/bs/common/utils/bean/BeanUtils.java b/bs-common/src/main/java/com/bs/common/utils/bean/BeanUtils.java new file mode 100644 index 0000000..ed9b96e --- /dev/null +++ b/bs-common/src/main/java/com/bs/common/utils/bean/BeanUtils.java @@ -0,0 +1,110 @@ +package com.bs.common.utils.bean; + +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * Bean 工具类 + * + * @author bs + */ +public class BeanUtils extends org.springframework.beans.BeanUtils +{ + /** Bean方法名中属性名开始的下标 */ + private static final int BEAN_METHOD_PROP_INDEX = 3; + + /** * 匹配getter方法的正则表达式 */ + private static final Pattern GET_PATTERN = Pattern.compile("get(\\p{javaUpperCase}\\w*)"); + + /** * 匹配setter方法的正则表达式 */ + private static final Pattern SET_PATTERN = Pattern.compile("set(\\p{javaUpperCase}\\w*)"); + + /** + * Bean属性复制工具方法。 + * + * @param dest 目标对象 + * @param src 源对象 + */ + public static void copyBeanProp(Object dest, Object src) + { + try + { + copyProperties(src, dest); + } + catch (Exception e) + { + e.printStackTrace(); + } + } + + /** + * 获取对象的setter方法。 + * + * @param obj 对象 + * @return 对象的setter方法列表 + */ + public static List getSetterMethods(Object obj) + { + // setter方法列表 + List setterMethods = new ArrayList(); + + // 获取所有方法 + Method[] methods = obj.getClass().getMethods(); + + // 查找setter方法 + + for (Method method : methods) + { + Matcher m = SET_PATTERN.matcher(method.getName()); + if (m.matches() && (method.getParameterTypes().length == 1)) + { + setterMethods.add(method); + } + } + // 返回setter方法列表 + return setterMethods; + } + + /** + * 获取对象的getter方法。 + * + * @param obj 对象 + * @return 对象的getter方法列表 + */ + + public static List getGetterMethods(Object obj) + { + // getter方法列表 + List getterMethods = new ArrayList(); + // 获取所有方法 + Method[] methods = obj.getClass().getMethods(); + // 查找getter方法 + for (Method method : methods) + { + Matcher m = GET_PATTERN.matcher(method.getName()); + if (m.matches() && (method.getParameterTypes().length == 0)) + { + getterMethods.add(method); + } + } + // 返回getter方法列表 + return getterMethods; + } + + /** + * 检查Bean方法名中的属性名是否相等。
+ * 如getName()和setName()属性名一样,getName()和setAge()属性名不一样。 + * + * @param m1 方法名1 + * @param m2 方法名2 + * @return 属性名一样返回true,否则返回false + */ + + public static boolean isMethodPropEquals(String m1, String m2) + { + return m1.substring(BEAN_METHOD_PROP_INDEX).equals(m2.substring(BEAN_METHOD_PROP_INDEX)); + } +} diff --git a/bs-common/src/main/java/com/bs/common/utils/bean/BeanValidators.java b/bs-common/src/main/java/com/bs/common/utils/bean/BeanValidators.java new file mode 100644 index 0000000..61b5394 --- /dev/null +++ b/bs-common/src/main/java/com/bs/common/utils/bean/BeanValidators.java @@ -0,0 +1,24 @@ +package com.bs.common.utils.bean; + +import java.util.Set; +import javax.validation.ConstraintViolation; +import javax.validation.ConstraintViolationException; +import javax.validation.Validator; + +/** + * bean对象属性验证 + * + * @author bs + */ +public class BeanValidators +{ + public static void validateWithException(Validator validator, Object object, Class... groups) + throws ConstraintViolationException + { + Set> constraintViolations = validator.validate(object, groups); + if (!constraintViolations.isEmpty()) + { + throw new ConstraintViolationException(constraintViolations); + } + } +} diff --git a/bs-common/src/main/java/com/bs/common/utils/collection/CollectionUtils.java b/bs-common/src/main/java/com/bs/common/utils/collection/CollectionUtils.java new file mode 100644 index 0000000..95d8c2a --- /dev/null +++ b/bs-common/src/main/java/com/bs/common/utils/collection/CollectionUtils.java @@ -0,0 +1,187 @@ +package com.bs.common.utils.collection; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.CollectionUtil; +import com.google.common.collect.ImmutableMap; + +import java.util.*; +import java.util.function.BinaryOperator; +import java.util.function.Function; +import java.util.function.Predicate; +import java.util.function.Supplier; +import java.util.stream.Collectors; + +/** + * Collection 工具类 + * + * hasPermi + */ +public class CollectionUtils { + + public static boolean containsAny(Object source, Object... targets) { + return Arrays.asList(targets).contains(source); + } + + public static boolean isAnyEmpty(Collection... collections) { + return Arrays.stream(collections).anyMatch(CollectionUtil::isEmpty); + } + + public static List filterList(Collection from, Predicate predicate) { + if (CollUtil.isEmpty(from)) { + return new ArrayList<>(); + } + return from.stream().filter(predicate).collect(Collectors.toList()); + } + + public static List distinct(Collection from, Function keyMapper) { + if (CollUtil.isEmpty(from)) { + return new ArrayList<>(); + } + return distinct(from, keyMapper, (t1, t2) -> t1); + } + + public static List distinct(Collection from, Function keyMapper, BinaryOperator cover) { + if (CollUtil.isEmpty(from)) { + return new ArrayList<>(); + } + return new ArrayList<>(convertMap(from, keyMapper, Function.identity(), cover).values()); + } + + public static List convertList(Collection from, Function func) { + if (CollUtil.isEmpty(from)) { + return new ArrayList<>(); + } + return from.stream().map(func).filter(Objects::nonNull).collect(Collectors.toList()); + } + + public static List convertList(Collection from, Function func, Predicate filter) { + if (CollUtil.isEmpty(from)) { + return new ArrayList<>(); + } + return from.stream().filter(filter).map(func).filter(Objects::nonNull).collect(Collectors.toList()); + } + + public static Set convertSet(Collection from, Function func) { + if (CollUtil.isEmpty(from)) { + return new HashSet<>(); + } + return from.stream().map(func).filter(Objects::nonNull).collect(Collectors.toSet()); + } + + public static Set convertSet(Collection from, Function func, Predicate filter) { + if (CollUtil.isEmpty(from)) { + return new HashSet<>(); + } + return from.stream().filter(filter).map(func).filter(Objects::nonNull).collect(Collectors.toSet()); + } + + public static Map convertMap(Collection from, Function keyFunc) { + if (CollUtil.isEmpty(from)) { + return new HashMap<>(); + } + return convertMap(from, keyFunc, Function.identity()); + } + + public static Map convertMap(Collection from, Function keyFunc, Supplier> supplier) { + if (CollUtil.isEmpty(from)) { + return supplier.get(); + } + return convertMap(from, keyFunc, Function.identity(), supplier); + } + + public static Map convertMap(Collection from, Function keyFunc, Function valueFunc) { + if (CollUtil.isEmpty(from)) { + return new HashMap<>(); + } + return convertMap(from, keyFunc, valueFunc, (v1, v2) -> v1); + } + + public static Map convertMap(Collection from, Function keyFunc, Function valueFunc, BinaryOperator mergeFunction) { + if (CollUtil.isEmpty(from)) { + return new HashMap<>(); + } + return convertMap(from, keyFunc, valueFunc, mergeFunction, HashMap::new); + } + + public static Map convertMap(Collection from, Function keyFunc, Function valueFunc, Supplier> supplier) { + if (CollUtil.isEmpty(from)) { + return supplier.get(); + } + return convertMap(from, keyFunc, valueFunc, (v1, v2) -> v1, supplier); + } + + public static Map convertMap(Collection from, Function keyFunc, Function valueFunc, BinaryOperator mergeFunction, Supplier> supplier) { + if (CollUtil.isEmpty(from)) { + return new HashMap<>(); + } + return from.stream().collect(Collectors.toMap(keyFunc, valueFunc, mergeFunction, supplier)); + } + + public static Map> convertMultiMap(Collection from, Function keyFunc) { + if (CollUtil.isEmpty(from)) { + return new HashMap<>(); + } + return from.stream().collect(Collectors.groupingBy(keyFunc, Collectors.mapping(t -> t, Collectors.toList()))); + } + + public static Map> convertMultiMap(Collection from, Function keyFunc, Function valueFunc) { + if (CollUtil.isEmpty(from)) { + return new HashMap<>(); + } + return from.stream() + .collect(Collectors.groupingBy(keyFunc, Collectors.mapping(valueFunc, Collectors.toList()))); + } + + // 暂时没想好名字,先以 2 结尾噶 + public static Map> convertMultiMap2(Collection from, Function keyFunc, Function valueFunc) { + if (CollUtil.isEmpty(from)) { + return new HashMap<>(); + } + return from.stream().collect(Collectors.groupingBy(keyFunc, Collectors.mapping(valueFunc, Collectors.toSet()))); + } + + public static Map convertImmutableMap(Collection from, Function keyFunc) { + if (CollUtil.isEmpty(from)) { + return Collections.emptyMap(); + } + ImmutableMap.Builder builder = ImmutableMap.builder(); + from.forEach(item -> builder.put(keyFunc.apply(item), item)); + return builder.build(); + } + + public static boolean containsAny(Collection source, Collection candidates) { + return org.springframework.util.CollectionUtils.containsAny(source, candidates); + } + + public static T getFirst(List from) { + return !CollectionUtil.isEmpty(from) ? from.get(0) : null; + } + + public static T findFirst(List from, Predicate predicate) { + if (CollUtil.isEmpty(from)) { + return null; + } + return from.stream().filter(predicate).findFirst().orElse(null); + } + + public static > V getMaxValue(List from, Function valueFunc) { + if (CollUtil.isEmpty(from)) { + return null; + } + assert from.size() > 0; // 断言,避免告警 + T t = from.stream().max(Comparator.comparing(valueFunc)).get(); + return valueFunc.apply(t); + } + + public static void addIfNotNull(Collection coll, T item) { + if (item == null) { + return; + } + coll.add(item); + } + + public static Collection singleton(T deptId) { + return deptId == null ? Collections.emptyList() : Collections.singleton(deptId); + } + +} diff --git a/bs-common/src/main/java/com/bs/common/utils/file/FileTypeUtils.java b/bs-common/src/main/java/com/bs/common/utils/file/FileTypeUtils.java new file mode 100644 index 0000000..4833abc --- /dev/null +++ b/bs-common/src/main/java/com/bs/common/utils/file/FileTypeUtils.java @@ -0,0 +1,77 @@ +package com.bs.common.utils.file; + +import org.apache.commons.lang3.StringUtils; + +import java.io.File; + +/** + * 文件类型工具类 + * + * @author bs + */ +public class FileTypeUtils +{ + /** + * 获取文件类型 + *

+ * 例如: bs.txt, 返回: txt + * + * @param file 文件名 + * @return 后缀(不含".") + */ + public static String getFileType(File file) + { + if (null == file) + { + return StringUtils.EMPTY; + } + return getFileType(file.getName()); + } + + /** + * 获取文件类型 + *

+ * 例如: bs.txt, 返回: txt + * + * @param fileName 文件名 + * @return 后缀(不含".") + */ + public static String getFileType(String fileName) + { + int separatorIndex = fileName.lastIndexOf("."); + if (separatorIndex < 0) + { + return ""; + } + return fileName.substring(separatorIndex + 1).toLowerCase(); + } + + /** + * 获取文件类型 + * + * @param photoByte 文件字节码 + * @return 后缀(不含".") + */ + public static String getFileExtendName(byte[] photoByte) + { + String strFileExtendName = "JPG"; + if ((photoByte[0] == 71) && (photoByte[1] == 73) && (photoByte[2] == 70) && (photoByte[3] == 56) + && ((photoByte[4] == 55) || (photoByte[4] == 57)) && (photoByte[5] == 97)) + { + strFileExtendName = "GIF"; + } + else if ((photoByte[6] == 74) && (photoByte[7] == 70) && (photoByte[8] == 73) && (photoByte[9] == 70)) + { + strFileExtendName = "JPG"; + } + else if ((photoByte[0] == 66) && (photoByte[1] == 77)) + { + strFileExtendName = "BMP"; + } + else if ((photoByte[1] == 80) && (photoByte[2] == 78) && (photoByte[3] == 71)) + { + strFileExtendName = "PNG"; + } + return strFileExtendName; + } +} diff --git a/bs-common/src/main/java/com/bs/common/utils/file/FileUploadUtils.java b/bs-common/src/main/java/com/bs/common/utils/file/FileUploadUtils.java new file mode 100644 index 0000000..1eb8efa --- /dev/null +++ b/bs-common/src/main/java/com/bs/common/utils/file/FileUploadUtils.java @@ -0,0 +1,232 @@ +package com.bs.common.utils.file; + +import java.io.File; +import java.io.IOException; +import java.nio.file.Paths; +import java.util.Objects; +import org.apache.commons.io.FilenameUtils; +import org.springframework.web.multipart.MultipartFile; +import com.bs.common.config.BsConfig; +import com.bs.common.constant.Constants; +import com.bs.common.exception.file.FileNameLengthLimitExceededException; +import com.bs.common.exception.file.FileSizeLimitExceededException; +import com.bs.common.exception.file.InvalidExtensionException; +import com.bs.common.utils.DateUtils; +import com.bs.common.utils.StringUtils; +import com.bs.common.utils.uuid.Seq; + +/** + * 文件上传工具类 + * + * @author bs + */ +public class FileUploadUtils +{ + /** + * 默认大小 50M + */ + public static final long DEFAULT_MAX_SIZE = 50 * 1024 * 1024; + + /** + * 默认的文件名最大长度 100 + */ + public static final int DEFAULT_FILE_NAME_LENGTH = 100; + + /** + * 默认上传的地址 + */ + private static String defaultBaseDir = BsConfig.getProfile(); + + public static void setDefaultBaseDir(String defaultBaseDir) + { + FileUploadUtils.defaultBaseDir = defaultBaseDir; + } + + public static String getDefaultBaseDir() + { + return defaultBaseDir; + } + + /** + * 以默认配置进行文件上传 + * + * @param file 上传的文件 + * @return 文件名称 + * @throws Exception + */ + public static final String upload(MultipartFile file) throws IOException + { + try + { + return upload(getDefaultBaseDir(), file, MimeTypeUtils.DEFAULT_ALLOWED_EXTENSION); + } + catch (Exception e) + { + throw new IOException(e.getMessage(), e); + } + } + + /** + * 根据文件路径上传 + * + * @param baseDir 相对应用的基目录 + * @param file 上传的文件 + * @return 文件名称 + * @throws IOException + */ + public static final String upload(String baseDir, MultipartFile file) throws IOException + { + try + { + return upload(baseDir, file, MimeTypeUtils.DEFAULT_ALLOWED_EXTENSION); + } + catch (Exception e) + { + throw new IOException(e.getMessage(), e); + } + } + + /** + * 文件上传 + * + * @param baseDir 相对应用的基目录 + * @param file 上传的文件 + * @param allowedExtension 上传文件类型 + * @return 返回上传成功的文件名 + * @throws FileSizeLimitExceededException 如果超出最大大小 + * @throws FileNameLengthLimitExceededException 文件名太长 + * @throws IOException 比如读写文件出错时 + * @throws InvalidExtensionException 文件校验异常 + */ + public static final String upload(String baseDir, MultipartFile file, String[] allowedExtension) + throws FileSizeLimitExceededException, IOException, FileNameLengthLimitExceededException, + InvalidExtensionException + { + int fileNamelength = Objects.requireNonNull(file.getOriginalFilename()).length(); + if (fileNamelength > FileUploadUtils.DEFAULT_FILE_NAME_LENGTH) + { + throw new FileNameLengthLimitExceededException(FileUploadUtils.DEFAULT_FILE_NAME_LENGTH); + } + + assertAllowed(file, allowedExtension); + + String fileName = extractFilename(file); + + String absPath = getAbsoluteFile(baseDir, fileName).getAbsolutePath(); + file.transferTo(Paths.get(absPath)); + return getPathFileName(baseDir, fileName); + } + + /** + * 编码文件名 + */ + public static final String extractFilename(MultipartFile file) + { + return StringUtils.format("{}/{}_{}.{}", DateUtils.datePath(), + FilenameUtils.getBaseName(file.getOriginalFilename()), Seq.getId(Seq.uploadSeqType), getExtension(file)); + } + + public static final File getAbsoluteFile(String uploadDir, String fileName) throws IOException + { + File desc = new File(uploadDir + File.separator + fileName); + + if (!desc.exists()) + { + if (!desc.getParentFile().exists()) + { + desc.getParentFile().mkdirs(); + } + } + return desc; + } + + public static final String getPathFileName(String uploadDir, String fileName) throws IOException + { + int dirLastIndex = BsConfig.getProfile().length() + 1; + String currentDir = StringUtils.substring(uploadDir, dirLastIndex); + return Constants.RESOURCE_PREFIX + "/" + currentDir + "/" + fileName; + } + + /** + * 文件大小校验 + * + * @param file 上传的文件 + * @return + * @throws FileSizeLimitExceededException 如果超出最大大小 + * @throws InvalidExtensionException + */ + public static final void assertAllowed(MultipartFile file, String[] allowedExtension) + throws FileSizeLimitExceededException, InvalidExtensionException + { + long size = file.getSize(); + if (size > DEFAULT_MAX_SIZE) + { + throw new FileSizeLimitExceededException(DEFAULT_MAX_SIZE / 1024 / 1024); + } + + String fileName = file.getOriginalFilename(); + String extension = getExtension(file); + if (allowedExtension != null && !isAllowedExtension(extension, allowedExtension)) + { + if (allowedExtension == MimeTypeUtils.IMAGE_EXTENSION) + { + throw new InvalidExtensionException.InvalidImageExtensionException(allowedExtension, extension, + fileName); + } + else if (allowedExtension == MimeTypeUtils.FLASH_EXTENSION) + { + throw new InvalidExtensionException.InvalidFlashExtensionException(allowedExtension, extension, + fileName); + } + else if (allowedExtension == MimeTypeUtils.MEDIA_EXTENSION) + { + throw new InvalidExtensionException.InvalidMediaExtensionException(allowedExtension, extension, + fileName); + } + else if (allowedExtension == MimeTypeUtils.VIDEO_EXTENSION) + { + throw new InvalidExtensionException.InvalidVideoExtensionException(allowedExtension, extension, + fileName); + } + else + { + throw new InvalidExtensionException(allowedExtension, extension, fileName); + } + } + } + + /** + * 判断MIME类型是否是允许的MIME类型 + * + * @param extension + * @param allowedExtension + * @return + */ + public static final boolean isAllowedExtension(String extension, String[] allowedExtension) + { + for (String str : allowedExtension) + { + if (str.equalsIgnoreCase(extension)) + { + return true; + } + } + return false; + } + + /** + * 获取文件名的后缀 + * + * @param file 表单文件 + * @return 后缀名 + */ + public static final String getExtension(MultipartFile file) + { + String extension = FilenameUtils.getExtension(file.getOriginalFilename()); + if (StringUtils.isEmpty(extension)) + { + extension = MimeTypeUtils.getExtension(Objects.requireNonNull(file.getContentType())); + } + return extension; + } +} diff --git a/bs-common/src/main/java/com/bs/common/utils/file/FileUtils.java b/bs-common/src/main/java/com/bs/common/utils/file/FileUtils.java new file mode 100644 index 0000000..3368ecc --- /dev/null +++ b/bs-common/src/main/java/com/bs/common/utils/file/FileUtils.java @@ -0,0 +1,291 @@ +package com.bs.common.utils.file; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import org.apache.commons.io.IOUtils; +import org.apache.commons.lang3.ArrayUtils; +import com.bs.common.config.BsConfig; +import com.bs.common.utils.DateUtils; +import com.bs.common.utils.StringUtils; +import com.bs.common.utils.uuid.IdUtils; +import org.apache.commons.io.FilenameUtils; + +/** + * 文件处理工具类 + * + * @author bs + */ +public class FileUtils +{ + public static String FILENAME_PATTERN = "[a-zA-Z0-9_\\-\\|\\.\\u4e00-\\u9fa5]+"; + + /** + * 输出指定文件的byte数组 + * + * @param filePath 文件路径 + * @param os 输出流 + * @return + */ + public static void writeBytes(String filePath, OutputStream os) throws IOException + { + FileInputStream fis = null; + try + { + File file = new File(filePath); + if (!file.exists()) + { + throw new FileNotFoundException(filePath); + } + fis = new FileInputStream(file); + byte[] b = new byte[1024]; + int length; + while ((length = fis.read(b)) > 0) + { + os.write(b, 0, length); + } + } + catch (IOException e) + { + throw e; + } + finally + { + IOUtils.close(os); + IOUtils.close(fis); + } + } + + /** + * 写数据到文件中 + * + * @param data 数据 + * @return 目标文件 + * @throws IOException IO异常 + */ + public static String writeImportBytes(byte[] data) throws IOException + { + return writeBytes(data, BsConfig.getImportPath()); + } + + /** + * 写数据到文件中 + * + * @param data 数据 + * @param uploadDir 目标文件 + * @return 目标文件 + * @throws IOException IO异常 + */ + public static String writeBytes(byte[] data, String uploadDir) throws IOException + { + FileOutputStream fos = null; + String pathName = ""; + try + { + String extension = getFileExtendName(data); + pathName = DateUtils.datePath() + "/" + IdUtils.fastUUID() + "." + extension; + File file = FileUploadUtils.getAbsoluteFile(uploadDir, pathName); + fos = new FileOutputStream(file); + fos.write(data); + } + finally + { + IOUtils.close(fos); + } + return FileUploadUtils.getPathFileName(uploadDir, pathName); + } + + /** + * 删除文件 + * + * @param filePath 文件 + * @return + */ + public static boolean deleteFile(String filePath) + { + boolean flag = false; + File file = new File(filePath); + // 路径为文件且不为空则进行删除 + if (file.isFile() && file.exists()) + { + flag = file.delete(); + } + return flag; + } + + /** + * 文件名称验证 + * + * @param filename 文件名称 + * @return true 正常 false 非法 + */ + public static boolean isValidFilename(String filename) + { + return filename.matches(FILENAME_PATTERN); + } + + /** + * 检查文件是否可下载 + * + * @param resource 需要下载的文件 + * @return true 正常 false 非法 + */ + public static boolean checkAllowDownload(String resource) + { + // 禁止目录上跳级别 + if (StringUtils.contains(resource, "..")) + { + return false; + } + + // 检查允许下载的文件规则 + if (ArrayUtils.contains(MimeTypeUtils.DEFAULT_ALLOWED_EXTENSION, FileTypeUtils.getFileType(resource))) + { + return true; + } + + // 不在允许下载的文件规则 + return false; + } + + /** + * 下载文件名重新编码 + * + * @param request 请求对象 + * @param fileName 文件名 + * @return 编码后的文件名 + */ + public static String setFileDownloadHeader(HttpServletRequest request, String fileName) throws UnsupportedEncodingException + { + final String agent = request.getHeader("USER-AGENT"); + String filename = fileName; + if (agent.contains("MSIE")) + { + // IE浏览器 + filename = URLEncoder.encode(filename, "utf-8"); + filename = filename.replace("+", " "); + } + else if (agent.contains("Firefox")) + { + // 火狐浏览器 + filename = new String(fileName.getBytes(), "ISO8859-1"); + } + else if (agent.contains("Chrome")) + { + // google浏览器 + filename = URLEncoder.encode(filename, "utf-8"); + } + else + { + // 其它浏览器 + filename = URLEncoder.encode(filename, "utf-8"); + } + return filename; + } + + /** + * 下载文件名重新编码 + * + * @param response 响应对象 + * @param realFileName 真实文件名 + */ + public static void setAttachmentResponseHeader(HttpServletResponse response, String realFileName) throws UnsupportedEncodingException + { + String percentEncodedFileName = percentEncode(realFileName); + + StringBuilder contentDispositionValue = new StringBuilder(); + contentDispositionValue.append("attachment; filename=") + .append(percentEncodedFileName) + .append(";") + .append("filename*=") + .append("utf-8''") + .append(percentEncodedFileName); + + response.addHeader("Access-Control-Expose-Headers", "Content-Disposition,download-filename"); + response.setHeader("Content-disposition", contentDispositionValue.toString()); + response.setHeader("download-filename", percentEncodedFileName); + } + + /** + * 百分号编码工具方法 + * + * @param s 需要百分号编码的字符串 + * @return 百分号编码后的字符串 + */ + public static String percentEncode(String s) throws UnsupportedEncodingException + { + String encode = URLEncoder.encode(s, StandardCharsets.UTF_8.toString()); + return encode.replaceAll("\\+", "%20"); + } + + /** + * 获取图像后缀 + * + * @param photoByte 图像数据 + * @return 后缀名 + */ + public static String getFileExtendName(byte[] photoByte) + { + String strFileExtendName = "jpg"; + if ((photoByte[0] == 71) && (photoByte[1] == 73) && (photoByte[2] == 70) && (photoByte[3] == 56) + && ((photoByte[4] == 55) || (photoByte[4] == 57)) && (photoByte[5] == 97)) + { + strFileExtendName = "gif"; + } + else if ((photoByte[6] == 74) && (photoByte[7] == 70) && (photoByte[8] == 73) && (photoByte[9] == 70)) + { + strFileExtendName = "jpg"; + } + else if ((photoByte[0] == 66) && (photoByte[1] == 77)) + { + strFileExtendName = "bmp"; + } + else if ((photoByte[1] == 80) && (photoByte[2] == 78) && (photoByte[3] == 71)) + { + strFileExtendName = "png"; + } + return strFileExtendName; + } + + /** + * 获取文件名称 /profile/upload/2022/04/16/bs.png -- bs.png + * + * @param fileName 路径名称 + * @return 没有文件路径的名称 + */ + public static String getName(String fileName) + { + if (fileName == null) + { + return null; + } + int lastUnixPos = fileName.lastIndexOf('/'); + int lastWindowsPos = fileName.lastIndexOf('\\'); + int index = Math.max(lastUnixPos, lastWindowsPos); + return fileName.substring(index + 1); + } + + /** + * 获取不带后缀文件名称 /profile/upload/2022/04/16/bs.png -- bs + * + * @param fileName 路径名称 + * @return 没有文件路径和后缀的名称 + */ + public static String getNameNotSuffix(String fileName) + { + if (fileName == null) + { + return null; + } + String baseName = FilenameUtils.getBaseName(fileName); + return baseName; + } +} diff --git a/bs-common/src/main/java/com/bs/common/utils/file/ImageUtils.java b/bs-common/src/main/java/com/bs/common/utils/file/ImageUtils.java new file mode 100644 index 0000000..50f5cf3 --- /dev/null +++ b/bs-common/src/main/java/com/bs/common/utils/file/ImageUtils.java @@ -0,0 +1,98 @@ +package com.bs.common.utils.file; + +import java.io.ByteArrayInputStream; +import java.io.FileInputStream; +import java.io.InputStream; +import java.net.URL; +import java.net.URLConnection; +import java.util.Arrays; +import org.apache.poi.util.IOUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import com.bs.common.config.BsConfig; +import com.bs.common.constant.Constants; +import com.bs.common.utils.StringUtils; + +/** + * 图片处理工具类 + * + * @author bs + */ +public class ImageUtils +{ + private static final Logger log = LoggerFactory.getLogger(ImageUtils.class); + + public static byte[] getImage(String imagePath) + { + InputStream is = getFile(imagePath); + try + { + return IOUtils.toByteArray(is); + } + catch (Exception e) + { + log.error("图片加载异常 {}", e); + return null; + } + finally + { + IOUtils.closeQuietly(is); + } + } + + public static InputStream getFile(String imagePath) + { + try + { + byte[] result = readFile(imagePath); + result = Arrays.copyOf(result, result.length); + return new ByteArrayInputStream(result); + } + catch (Exception e) + { + log.error("获取图片异常 {}", e); + } + return null; + } + + /** + * 读取文件为字节数据 + * + * @param url 地址 + * @return 字节数据 + */ + public static byte[] readFile(String url) + { + InputStream in = null; + try + { + if (url.startsWith("http")) + { + // 网络地址 + URL urlObj = new URL(url); + URLConnection urlConnection = urlObj.openConnection(); + urlConnection.setConnectTimeout(30 * 1000); + urlConnection.setReadTimeout(60 * 1000); + urlConnection.setDoInput(true); + in = urlConnection.getInputStream(); + } + else + { + // 本机地址 + String localPath = BsConfig.getProfile(); + String downloadPath = localPath + StringUtils.substringAfter(url, Constants.RESOURCE_PREFIX); + in = new FileInputStream(downloadPath); + } + return IOUtils.toByteArray(in); + } + catch (Exception e) + { + log.error("获取文件路径异常 {}", e); + return null; + } + finally + { + IOUtils.closeQuietly(in); + } + } +} diff --git a/bs-common/src/main/java/com/bs/common/utils/file/MimeTypeUtils.java b/bs-common/src/main/java/com/bs/common/utils/file/MimeTypeUtils.java new file mode 100644 index 0000000..f4d879c --- /dev/null +++ b/bs-common/src/main/java/com/bs/common/utils/file/MimeTypeUtils.java @@ -0,0 +1,59 @@ +package com.bs.common.utils.file; + +/** + * 媒体类型工具类 + * + * @author bs + */ +public class MimeTypeUtils +{ + public static final String IMAGE_PNG = "image/png"; + + public static final String IMAGE_JPG = "image/jpg"; + + public static final String IMAGE_JPEG = "image/jpeg"; + + public static final String IMAGE_BMP = "image/bmp"; + + public static final String IMAGE_GIF = "image/gif"; + + public static final String[] IMAGE_EXTENSION = { "bmp", "gif", "jpg", "jpeg", "png" }; + + public static final String[] FLASH_EXTENSION = { "swf", "flv" }; + + public static final String[] MEDIA_EXTENSION = { "swf", "flv", "mp3", "wav", "wma", "wmv", "mid", "avi", "mpg", + "asf", "rm", "rmvb" }; + + public static final String[] VIDEO_EXTENSION = { "mp4", "avi", "rmvb" }; + + public static final String[] DEFAULT_ALLOWED_EXTENSION = { + // 图片 + "bmp", "gif", "jpg", "jpeg", "png", + // word excel powerpoint + "doc", "docx", "xls", "xlsx", "ppt", "pptx", "html", "htm", "txt", + // 压缩文件 + "rar", "zip", "gz", "bz2", + // 视频格式 + "mp4", "avi", "rmvb", + // pdf + "pdf" }; + + public static String getExtension(String prefix) + { + switch (prefix) + { + case IMAGE_PNG: + return "png"; + case IMAGE_JPG: + return "jpg"; + case IMAGE_JPEG: + return "jpeg"; + case IMAGE_BMP: + return "bmp"; + case IMAGE_GIF: + return "gif"; + default: + return ""; + } + } +} diff --git a/bs-common/src/main/java/com/bs/common/utils/html/EscapeUtil.java b/bs-common/src/main/java/com/bs/common/utils/html/EscapeUtil.java new file mode 100644 index 0000000..c239f5e --- /dev/null +++ b/bs-common/src/main/java/com/bs/common/utils/html/EscapeUtil.java @@ -0,0 +1,167 @@ +package com.bs.common.utils.html; + +import com.bs.common.utils.StringUtils; + +/** + * 转义和反转义工具类 + * + * @author bs + */ +public class EscapeUtil +{ + public static final String RE_HTML_MARK = "(<[^<]*?>)|(<[\\s]*?/[^<]*?>)|(<[^<]*?/[\\s]*?>)"; + + private static final char[][] TEXT = new char[64][]; + + static + { + for (int i = 0; i < 64; i++) + { + TEXT[i] = new char[] { (char) i }; + } + + // special HTML characters + TEXT['\''] = "'".toCharArray(); // 单引号 + TEXT['"'] = """.toCharArray(); // 双引号 + TEXT['&'] = "&".toCharArray(); // &符 + TEXT['<'] = "<".toCharArray(); // 小于号 + TEXT['>'] = ">".toCharArray(); // 大于号 + } + + /** + * 转义文本中的HTML字符为安全的字符 + * + * @param text 被转义的文本 + * @return 转义后的文本 + */ + public static String escape(String text) + { + return encode(text); + } + + /** + * 还原被转义的HTML特殊字符 + * + * @param content 包含转义符的HTML内容 + * @return 转换后的字符串 + */ + public static String unescape(String content) + { + return decode(content); + } + + /** + * 清除所有HTML标签,但是不删除标签内的内容 + * + * @param content 文本 + * @return 清除标签后的文本 + */ + public static String clean(String content) + { + return new HTMLFilter().filter(content); + } + + /** + * Escape编码 + * + * @param text 被编码的文本 + * @return 编码后的字符 + */ + private static String encode(String text) + { + if (StringUtils.isEmpty(text)) + { + return StringUtils.EMPTY; + } + + final StringBuilder tmp = new StringBuilder(text.length() * 6); + char c; + for (int i = 0; i < text.length(); i++) + { + c = text.charAt(i); + if (c < 256) + { + tmp.append("%"); + if (c < 16) + { + tmp.append("0"); + } + tmp.append(Integer.toString(c, 16)); + } + else + { + tmp.append("%u"); + if (c <= 0xfff) + { + // issue#I49JU8@Gitee + tmp.append("0"); + } + tmp.append(Integer.toString(c, 16)); + } + } + return tmp.toString(); + } + + /** + * Escape解码 + * + * @param content 被转义的内容 + * @return 解码后的字符串 + */ + public static String decode(String content) + { + if (StringUtils.isEmpty(content)) + { + return content; + } + + StringBuilder tmp = new StringBuilder(content.length()); + int lastPos = 0, pos = 0; + char ch; + while (lastPos < content.length()) + { + pos = content.indexOf("%", lastPos); + if (pos == lastPos) + { + if (content.charAt(pos + 1) == 'u') + { + ch = (char) Integer.parseInt(content.substring(pos + 2, pos + 6), 16); + tmp.append(ch); + lastPos = pos + 6; + } + else + { + ch = (char) Integer.parseInt(content.substring(pos + 1, pos + 3), 16); + tmp.append(ch); + lastPos = pos + 3; + } + } + else + { + if (pos == -1) + { + tmp.append(content.substring(lastPos)); + lastPos = content.length(); + } + else + { + tmp.append(content.substring(lastPos, pos)); + lastPos = pos; + } + } + } + return tmp.toString(); + } + + public static void main(String[] args) + { + String html = ""; + String escape = EscapeUtil.escape(html); + // String html = "ipt>alert(\"XSS\")ipt>"; + // String html = "<123"; + // String html = "123>"; + System.out.println("clean: " + EscapeUtil.clean(html)); + System.out.println("escape: " + escape); + System.out.println("unescape: " + EscapeUtil.unescape(escape)); + } +} diff --git a/bs-common/src/main/java/com/bs/common/utils/html/HTMLFilter.java b/bs-common/src/main/java/com/bs/common/utils/html/HTMLFilter.java new file mode 100644 index 0000000..f6f3f05 --- /dev/null +++ b/bs-common/src/main/java/com/bs/common/utils/html/HTMLFilter.java @@ -0,0 +1,570 @@ +package com.bs.common.utils.html; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * HTML过滤器,用于去除XSS漏洞隐患。 + * + * @author bs + */ +public final class HTMLFilter +{ + /** + * regex flag union representing /si modifiers in php + **/ + private static final int REGEX_FLAGS_SI = Pattern.CASE_INSENSITIVE | Pattern.DOTALL; + private static final Pattern P_COMMENTS = Pattern.compile("", Pattern.DOTALL); + private static final Pattern P_COMMENT = Pattern.compile("^!--(.*)--$", REGEX_FLAGS_SI); + private static final Pattern P_TAGS = Pattern.compile("<(.*?)>", Pattern.DOTALL); + private static final Pattern P_END_TAG = Pattern.compile("^/([a-z0-9]+)", REGEX_FLAGS_SI); + private static final Pattern P_START_TAG = Pattern.compile("^([a-z0-9]+)(.*?)(/?)$", REGEX_FLAGS_SI); + private static final Pattern P_QUOTED_ATTRIBUTES = Pattern.compile("([a-z0-9]+)=([\"'])(.*?)\\2", REGEX_FLAGS_SI); + private static final Pattern P_UNQUOTED_ATTRIBUTES = Pattern.compile("([a-z0-9]+)(=)([^\"\\s']+)", REGEX_FLAGS_SI); + private static final Pattern P_PROTOCOL = Pattern.compile("^([^:]+):", REGEX_FLAGS_SI); + private static final Pattern P_ENTITY = Pattern.compile("&#(\\d+);?"); + private static final Pattern P_ENTITY_UNICODE = Pattern.compile("&#x([0-9a-f]+);?"); + private static final Pattern P_ENCODE = Pattern.compile("%([0-9a-f]{2});?"); + private static final Pattern P_VALID_ENTITIES = Pattern.compile("&([^&;]*)(?=(;|&|$))"); + private static final Pattern P_VALID_QUOTES = Pattern.compile("(>|^)([^<]+?)(<|$)", Pattern.DOTALL); + private static final Pattern P_END_ARROW = Pattern.compile("^>"); + private static final Pattern P_BODY_TO_END = Pattern.compile("<([^>]*?)(?=<|$)"); + private static final Pattern P_XML_CONTENT = Pattern.compile("(^|>)([^<]*?)(?=>)"); + private static final Pattern P_STRAY_LEFT_ARROW = Pattern.compile("<([^>]*?)(?=<|$)"); + private static final Pattern P_STRAY_RIGHT_ARROW = Pattern.compile("(^|>)([^<]*?)(?=>)"); + private static final Pattern P_AMP = Pattern.compile("&"); + private static final Pattern P_QUOTE = Pattern.compile("\""); + private static final Pattern P_LEFT_ARROW = Pattern.compile("<"); + private static final Pattern P_RIGHT_ARROW = Pattern.compile(">"); + private static final Pattern P_BOTH_ARROWS = Pattern.compile("<>"); + + // @xxx could grow large... maybe use sesat's ReferenceMap + private static final ConcurrentMap P_REMOVE_PAIR_BLANKS = new ConcurrentHashMap<>(); + private static final ConcurrentMap P_REMOVE_SELF_BLANKS = new ConcurrentHashMap<>(); + + /** + * set of allowed html elements, along with allowed attributes for each element + **/ + private final Map> vAllowed; + /** + * counts of open tags for each (allowable) html element + **/ + private final Map vTagCounts = new HashMap<>(); + + /** + * html elements which must always be self-closing (e.g. "") + **/ + private final String[] vSelfClosingTags; + /** + * html elements which must always have separate opening and closing tags (e.g. "") + **/ + private final String[] vNeedClosingTags; + /** + * set of disallowed html elements + **/ + private final String[] vDisallowed; + /** + * attributes which should be checked for valid protocols + **/ + private final String[] vProtocolAtts; + /** + * allowed protocols + **/ + private final String[] vAllowedProtocols; + /** + * tags which should be removed if they contain no content (e.g. "" or "") + **/ + private final String[] vRemoveBlanks; + /** + * entities allowed within html markup + **/ + private final String[] vAllowedEntities; + /** + * flag determining whether comments are allowed in input String. + */ + private final boolean stripComment; + private final boolean encodeQuotes; + /** + * flag determining whether to try to make tags when presented with "unbalanced" angle brackets (e.g. "" + * becomes " text "). If set to false, unbalanced angle brackets will be html escaped. + */ + private final boolean alwaysMakeTags; + + /** + * Default constructor. + */ + public HTMLFilter() + { + vAllowed = new HashMap<>(); + + final ArrayList a_atts = new ArrayList<>(); + a_atts.add("href"); + a_atts.add("target"); + vAllowed.put("a", a_atts); + + final ArrayList img_atts = new ArrayList<>(); + img_atts.add("src"); + img_atts.add("width"); + img_atts.add("height"); + img_atts.add("alt"); + vAllowed.put("img", img_atts); + + final ArrayList no_atts = new ArrayList<>(); + vAllowed.put("b", no_atts); + vAllowed.put("strong", no_atts); + vAllowed.put("i", no_atts); + vAllowed.put("em", no_atts); + + vSelfClosingTags = new String[] { "img" }; + vNeedClosingTags = new String[] { "a", "b", "strong", "i", "em" }; + vDisallowed = new String[] {}; + vAllowedProtocols = new String[] { "http", "mailto", "https" }; // no ftp. + vProtocolAtts = new String[] { "src", "href" }; + vRemoveBlanks = new String[] { "a", "b", "strong", "i", "em" }; + vAllowedEntities = new String[] { "amp", "gt", "lt", "quot" }; + stripComment = true; + encodeQuotes = true; + alwaysMakeTags = false; + } + + /** + * Map-parameter configurable constructor. + * + * @param conf map containing configuration. keys match field names. + */ + @SuppressWarnings("unchecked") + public HTMLFilter(final Map conf) + { + + assert conf.containsKey("vAllowed") : "configuration requires vAllowed"; + assert conf.containsKey("vSelfClosingTags") : "configuration requires vSelfClosingTags"; + assert conf.containsKey("vNeedClosingTags") : "configuration requires vNeedClosingTags"; + assert conf.containsKey("vDisallowed") : "configuration requires vDisallowed"; + assert conf.containsKey("vAllowedProtocols") : "configuration requires vAllowedProtocols"; + assert conf.containsKey("vProtocolAtts") : "configuration requires vProtocolAtts"; + assert conf.containsKey("vRemoveBlanks") : "configuration requires vRemoveBlanks"; + assert conf.containsKey("vAllowedEntities") : "configuration requires vAllowedEntities"; + + vAllowed = Collections.unmodifiableMap((HashMap>) conf.get("vAllowed")); + vSelfClosingTags = (String[]) conf.get("vSelfClosingTags"); + vNeedClosingTags = (String[]) conf.get("vNeedClosingTags"); + vDisallowed = (String[]) conf.get("vDisallowed"); + vAllowedProtocols = (String[]) conf.get("vAllowedProtocols"); + vProtocolAtts = (String[]) conf.get("vProtocolAtts"); + vRemoveBlanks = (String[]) conf.get("vRemoveBlanks"); + vAllowedEntities = (String[]) conf.get("vAllowedEntities"); + stripComment = conf.containsKey("stripComment") ? (Boolean) conf.get("stripComment") : true; + encodeQuotes = conf.containsKey("encodeQuotes") ? (Boolean) conf.get("encodeQuotes") : true; + alwaysMakeTags = conf.containsKey("alwaysMakeTags") ? (Boolean) conf.get("alwaysMakeTags") : true; + } + + private void reset() + { + vTagCounts.clear(); + } + + // --------------------------------------------------------------- + // my versions of some PHP library functions + public static String chr(final int decimal) + { + return String.valueOf((char) decimal); + } + + public static String htmlSpecialChars(final String s) + { + String result = s; + result = regexReplace(P_AMP, "&", result); + result = regexReplace(P_QUOTE, """, result); + result = regexReplace(P_LEFT_ARROW, "<", result); + result = regexReplace(P_RIGHT_ARROW, ">", result); + return result; + } + + // --------------------------------------------------------------- + + /** + * given a user submitted input String, filter out any invalid or restricted html. + * + * @param input text (i.e. submitted by a user) than may contain html + * @return "clean" version of input, with only valid, whitelisted html elements allowed + */ + public String filter(final String input) + { + reset(); + String s = input; + + s = escapeComments(s); + + s = balanceHTML(s); + + s = checkTags(s); + + s = processRemoveBlanks(s); + + // s = validateEntities(s); + + return s; + } + + public boolean isAlwaysMakeTags() + { + return alwaysMakeTags; + } + + public boolean isStripComments() + { + return stripComment; + } + + private String escapeComments(final String s) + { + final Matcher m = P_COMMENTS.matcher(s); + final StringBuffer buf = new StringBuffer(); + if (m.find()) + { + final String match = m.group(1); // (.*?) + m.appendReplacement(buf, Matcher.quoteReplacement("")); + } + m.appendTail(buf); + + return buf.toString(); + } + + private String balanceHTML(String s) + { + if (alwaysMakeTags) + { + // + // try and form html + // + s = regexReplace(P_END_ARROW, "", s); + // 不追加结束标签 + s = regexReplace(P_BODY_TO_END, "<$1>", s); + s = regexReplace(P_XML_CONTENT, "$1<$2", s); + + } + else + { + // + // escape stray brackets + // + s = regexReplace(P_STRAY_LEFT_ARROW, "<$1", s); + s = regexReplace(P_STRAY_RIGHT_ARROW, "$1$2><", s); + + // + // the last regexp causes '<>' entities to appear + // (we need to do a lookahead assertion so that the last bracket can + // be used in the next pass of the regexp) + // + s = regexReplace(P_BOTH_ARROWS, "", s); + } + + return s; + } + + private String checkTags(String s) + { + Matcher m = P_TAGS.matcher(s); + + final StringBuffer buf = new StringBuffer(); + while (m.find()) + { + String replaceStr = m.group(1); + replaceStr = processTag(replaceStr); + m.appendReplacement(buf, Matcher.quoteReplacement(replaceStr)); + } + m.appendTail(buf); + + // these get tallied in processTag + // (remember to reset before subsequent calls to filter method) + final StringBuilder sBuilder = new StringBuilder(buf.toString()); + for (String key : vTagCounts.keySet()) + { + for (int ii = 0; ii < vTagCounts.get(key); ii++) + { + sBuilder.append(""); + } + } + s = sBuilder.toString(); + + return s; + } + + private String processRemoveBlanks(final String s) + { + String result = s; + for (String tag : vRemoveBlanks) + { + if (!P_REMOVE_PAIR_BLANKS.containsKey(tag)) + { + P_REMOVE_PAIR_BLANKS.putIfAbsent(tag, Pattern.compile("<" + tag + "(\\s[^>]*)?>")); + } + result = regexReplace(P_REMOVE_PAIR_BLANKS.get(tag), "", result); + if (!P_REMOVE_SELF_BLANKS.containsKey(tag)) + { + P_REMOVE_SELF_BLANKS.putIfAbsent(tag, Pattern.compile("<" + tag + "(\\s[^>]*)?/>")); + } + result = regexReplace(P_REMOVE_SELF_BLANKS.get(tag), "", result); + } + + return result; + } + + private static String regexReplace(final Pattern regex_pattern, final String replacement, final String s) + { + Matcher m = regex_pattern.matcher(s); + return m.replaceAll(replacement); + } + + private String processTag(final String s) + { + // ending tags + Matcher m = P_END_TAG.matcher(s); + if (m.find()) + { + final String name = m.group(1).toLowerCase(); + if (allowed(name)) + { + if (!inArray(name, vSelfClosingTags)) + { + if (vTagCounts.containsKey(name)) + { + vTagCounts.put(name, vTagCounts.get(name) - 1); + return ""; + } + } + } + } + + // starting tags + m = P_START_TAG.matcher(s); + if (m.find()) + { + final String name = m.group(1).toLowerCase(); + final String body = m.group(2); + String ending = m.group(3); + + // debug( "in a starting tag, name='" + name + "'; body='" + body + "'; ending='" + ending + "'" ); + if (allowed(name)) + { + final StringBuilder params = new StringBuilder(); + + final Matcher m2 = P_QUOTED_ATTRIBUTES.matcher(body); + final Matcher m3 = P_UNQUOTED_ATTRIBUTES.matcher(body); + final List paramNames = new ArrayList<>(); + final List paramValues = new ArrayList<>(); + while (m2.find()) + { + paramNames.add(m2.group(1)); // ([a-z0-9]+) + paramValues.add(m2.group(3)); // (.*?) + } + while (m3.find()) + { + paramNames.add(m3.group(1)); // ([a-z0-9]+) + paramValues.add(m3.group(3)); // ([^\"\\s']+) + } + + String paramName, paramValue; + for (int ii = 0; ii < paramNames.size(); ii++) + { + paramName = paramNames.get(ii).toLowerCase(); + paramValue = paramValues.get(ii); + + // debug( "paramName='" + paramName + "'" ); + // debug( "paramValue='" + paramValue + "'" ); + // debug( "allowed? " + vAllowed.get( name ).contains( paramName ) ); + + if (allowedAttribute(name, paramName)) + { + if (inArray(paramName, vProtocolAtts)) + { + paramValue = processParamProtocol(paramValue); + } + params.append(' ').append(paramName).append("=\\\"").append(paramValue).append("\\\""); + } + } + + if (inArray(name, vSelfClosingTags)) + { + ending = " /"; + } + + if (inArray(name, vNeedClosingTags)) + { + ending = ""; + } + + if (ending == null || ending.length() < 1) + { + if (vTagCounts.containsKey(name)) + { + vTagCounts.put(name, vTagCounts.get(name) + 1); + } + else + { + vTagCounts.put(name, 1); + } + } + else + { + ending = " /"; + } + return "<" + name + params + ending + ">"; + } + else + { + return ""; + } + } + + // comments + m = P_COMMENT.matcher(s); + if (!stripComment && m.find()) + { + return "<" + m.group() + ">"; + } + + return ""; + } + + private String processParamProtocol(String s) + { + s = decodeEntities(s); + final Matcher m = P_PROTOCOL.matcher(s); + if (m.find()) + { + final String protocol = m.group(1); + if (!inArray(protocol, vAllowedProtocols)) + { + // bad protocol, turn into local anchor link instead + s = "#" + s.substring(protocol.length() + 1); + if (s.startsWith("#//")) + { + s = "#" + s.substring(3); + } + } + } + + return s; + } + + private String decodeEntities(String s) + { + StringBuffer buf = new StringBuffer(); + + Matcher m = P_ENTITY.matcher(s); + while (m.find()) + { + final String match = m.group(1); + final int decimal = Integer.decode(match).intValue(); + m.appendReplacement(buf, Matcher.quoteReplacement(chr(decimal))); + } + m.appendTail(buf); + s = buf.toString(); + + buf = new StringBuffer(); + m = P_ENTITY_UNICODE.matcher(s); + while (m.find()) + { + final String match = m.group(1); + final int decimal = Integer.valueOf(match, 16).intValue(); + m.appendReplacement(buf, Matcher.quoteReplacement(chr(decimal))); + } + m.appendTail(buf); + s = buf.toString(); + + buf = new StringBuffer(); + m = P_ENCODE.matcher(s); + while (m.find()) + { + final String match = m.group(1); + final int decimal = Integer.valueOf(match, 16).intValue(); + m.appendReplacement(buf, Matcher.quoteReplacement(chr(decimal))); + } + m.appendTail(buf); + s = buf.toString(); + + s = validateEntities(s); + return s; + } + + private String validateEntities(final String s) + { + StringBuffer buf = new StringBuffer(); + + // validate entities throughout the string + Matcher m = P_VALID_ENTITIES.matcher(s); + while (m.find()) + { + final String one = m.group(1); // ([^&;]*) + final String two = m.group(2); // (?=(;|&|$)) + m.appendReplacement(buf, Matcher.quoteReplacement(checkEntity(one, two))); + } + m.appendTail(buf); + + return encodeQuotes(buf.toString()); + } + + private String encodeQuotes(final String s) + { + if (encodeQuotes) + { + StringBuffer buf = new StringBuffer(); + Matcher m = P_VALID_QUOTES.matcher(s); + while (m.find()) + { + final String one = m.group(1); // (>|^) + final String two = m.group(2); // ([^<]+?) + final String three = m.group(3); // (<|$) + // 不替换双引号为",防止json格式无效 regexReplace(P_QUOTE, """, two) + m.appendReplacement(buf, Matcher.quoteReplacement(one + two + three)); + } + m.appendTail(buf); + return buf.toString(); + } + else + { + return s; + } + } + + private String checkEntity(final String preamble, final String term) + { + + return ";".equals(term) && isValidEntity(preamble) ? '&' + preamble : "&" + preamble; + } + + private boolean isValidEntity(final String entity) + { + return inArray(entity, vAllowedEntities); + } + + private static boolean inArray(final String s, final String[] array) + { + for (String item : array) + { + if (item != null && item.equals(s)) + { + return true; + } + } + return false; + } + + private boolean allowed(final String name) + { + return (vAllowed.isEmpty() || vAllowed.containsKey(name)) && !inArray(name, vDisallowed); + } + + private boolean allowedAttribute(final String name, final String paramName) + { + return allowed(name) && (vAllowed.isEmpty() || vAllowed.get(name).contains(paramName)); + } +} diff --git a/bs-common/src/main/java/com/bs/common/utils/http/HttpHelper.java b/bs-common/src/main/java/com/bs/common/utils/http/HttpHelper.java new file mode 100644 index 0000000..f7cc1b2 --- /dev/null +++ b/bs-common/src/main/java/com/bs/common/utils/http/HttpHelper.java @@ -0,0 +1,55 @@ +package com.bs.common.utils.http; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.nio.charset.StandardCharsets; +import javax.servlet.ServletRequest; +import org.apache.commons.lang3.exception.ExceptionUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * 通用http工具封装 + * + * @author bs + */ +public class HttpHelper +{ + private static final Logger LOGGER = LoggerFactory.getLogger(HttpHelper.class); + + public static String getBodyString(ServletRequest request) + { + StringBuilder sb = new StringBuilder(); + BufferedReader reader = null; + try (InputStream inputStream = request.getInputStream()) + { + reader = new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8)); + String line = ""; + while ((line = reader.readLine()) != null) + { + sb.append(line); + } + } + catch (IOException e) + { + LOGGER.warn("getBodyString出现问题!"); + } + finally + { + if (reader != null) + { + try + { + reader.close(); + } + catch (IOException e) + { + LOGGER.error(ExceptionUtils.getMessage(e)); + } + } + } + return sb.toString(); + } +} diff --git a/bs-common/src/main/java/com/bs/common/utils/http/HttpUtils.java b/bs-common/src/main/java/com/bs/common/utils/http/HttpUtils.java new file mode 100644 index 0000000..b0c2fd8 --- /dev/null +++ b/bs-common/src/main/java/com/bs/common/utils/http/HttpUtils.java @@ -0,0 +1,274 @@ +package com.bs.common.utils.http; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.PrintWriter; +import java.net.ConnectException; +import java.net.SocketTimeoutException; +import java.net.URL; +import java.net.URLConnection; +import java.nio.charset.StandardCharsets; +import java.security.cert.X509Certificate; +import javax.net.ssl.HostnameVerifier; +import javax.net.ssl.HttpsURLConnection; +import javax.net.ssl.SSLContext; +import javax.net.ssl.SSLSession; +import javax.net.ssl.TrustManager; +import javax.net.ssl.X509TrustManager; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import com.bs.common.constant.Constants; +import com.bs.common.utils.StringUtils; + +/** + * 通用http发送方法 + * + * @author bs + */ +public class HttpUtils +{ + private static final Logger log = LoggerFactory.getLogger(HttpUtils.class); + + /** + * 向指定 URL 发送GET方法的请求 + * + * @param url 发送请求的 URL + * @return 所代表远程资源的响应结果 + */ + public static String sendGet(String url) + { + return sendGet(url, StringUtils.EMPTY); + } + + /** + * 向指定 URL 发送GET方法的请求 + * + * @param url 发送请求的 URL + * @param param 请求参数,请求参数应该是 name1=value1&name2=value2 的形式。 + * @return 所代表远程资源的响应结果 + */ + public static String sendGet(String url, String param) + { + return sendGet(url, param, Constants.UTF8); + } + + /** + * 向指定 URL 发送GET方法的请求 + * + * @param url 发送请求的 URL + * @param param 请求参数,请求参数应该是 name1=value1&name2=value2 的形式。 + * @param contentType 编码类型 + * @return 所代表远程资源的响应结果 + */ + public static String sendGet(String url, String param, String contentType) + { + StringBuilder result = new StringBuilder(); + BufferedReader in = null; + try + { + String urlNameString = StringUtils.isNotBlank(param) ? url + "?" + param : url; + log.info("sendGet - {}", urlNameString); + URL realUrl = new URL(urlNameString); + URLConnection connection = realUrl.openConnection(); + connection.setRequestProperty("accept", "*/*"); + connection.setRequestProperty("connection", "Keep-Alive"); + connection.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)"); + connection.connect(); + in = new BufferedReader(new InputStreamReader(connection.getInputStream(), contentType)); + String line; + while ((line = in.readLine()) != null) + { + result.append(line); + } + log.info("recv - {}", result); + } + catch (ConnectException e) + { + log.error("调用HttpUtils.sendGet ConnectException, url=" + url + ",param=" + param, e); + } + catch (SocketTimeoutException e) + { + log.error("调用HttpUtils.sendGet SocketTimeoutException, url=" + url + ",param=" + param, e); + } + catch (IOException e) + { + log.error("调用HttpUtils.sendGet IOException, url=" + url + ",param=" + param, e); + } + catch (Exception e) + { + log.error("调用HttpsUtil.sendGet Exception, url=" + url + ",param=" + param, e); + } + finally + { + try + { + if (in != null) + { + in.close(); + } + } + catch (Exception ex) + { + log.error("调用in.close Exception, url=" + url + ",param=" + param, ex); + } + } + return result.toString(); + } + + /** + * 向指定 URL 发送POST方法的请求 + * + * @param url 发送请求的 URL + * @param param 请求参数,请求参数应该是 name1=value1&name2=value2 的形式。 + * @return 所代表远程资源的响应结果 + */ + public static String sendPost(String url, String param) + { + PrintWriter out = null; + BufferedReader in = null; + StringBuilder result = new StringBuilder(); + try + { + log.info("sendPost - {}", url); + URL realUrl = new URL(url); + URLConnection conn = realUrl.openConnection(); + conn.setRequestProperty("accept", "*/*"); + conn.setRequestProperty("connection", "Keep-Alive"); + conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)"); + conn.setRequestProperty("Accept-Charset", "utf-8"); + conn.setRequestProperty("contentType", "utf-8"); + conn.setDoOutput(true); + conn.setDoInput(true); + out = new PrintWriter(conn.getOutputStream()); + out.print(param); + out.flush(); + in = new BufferedReader(new InputStreamReader(conn.getInputStream(), StandardCharsets.UTF_8)); + String line; + while ((line = in.readLine()) != null) + { + result.append(line); + } + log.info("recv - {}", result); + } + catch (ConnectException e) + { + log.error("调用HttpUtils.sendPost ConnectException, url=" + url + ",param=" + param, e); + } + catch (SocketTimeoutException e) + { + log.error("调用HttpUtils.sendPost SocketTimeoutException, url=" + url + ",param=" + param, e); + } + catch (IOException e) + { + log.error("调用HttpUtils.sendPost IOException, url=" + url + ",param=" + param, e); + } + catch (Exception e) + { + log.error("调用HttpsUtil.sendPost Exception, url=" + url + ",param=" + param, e); + } + finally + { + try + { + if (out != null) + { + out.close(); + } + if (in != null) + { + in.close(); + } + } + catch (IOException ex) + { + log.error("调用in.close Exception, url=" + url + ",param=" + param, ex); + } + } + return result.toString(); + } + + public static String sendSSLPost(String url, String param) + { + StringBuilder result = new StringBuilder(); + String urlNameString = url + "?" + param; + try + { + log.info("sendSSLPost - {}", urlNameString); + SSLContext sc = SSLContext.getInstance("SSL"); + sc.init(null, new TrustManager[] { new TrustAnyTrustManager() }, new java.security.SecureRandom()); + URL console = new URL(urlNameString); + HttpsURLConnection conn = (HttpsURLConnection) console.openConnection(); + conn.setRequestProperty("accept", "*/*"); + conn.setRequestProperty("connection", "Keep-Alive"); + conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)"); + conn.setRequestProperty("Accept-Charset", "utf-8"); + conn.setRequestProperty("contentType", "utf-8"); + conn.setDoOutput(true); + conn.setDoInput(true); + + conn.setSSLSocketFactory(sc.getSocketFactory()); + conn.setHostnameVerifier(new TrustAnyHostnameVerifier()); + conn.connect(); + InputStream is = conn.getInputStream(); + BufferedReader br = new BufferedReader(new InputStreamReader(is)); + String ret = ""; + while ((ret = br.readLine()) != null) + { + if (ret != null && !"".equals(ret.trim())) + { + result.append(new String(ret.getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8)); + } + } + log.info("recv - {}", result); + conn.disconnect(); + br.close(); + } + catch (ConnectException e) + { + log.error("调用HttpUtils.sendSSLPost ConnectException, url=" + url + ",param=" + param, e); + } + catch (SocketTimeoutException e) + { + log.error("调用HttpUtils.sendSSLPost SocketTimeoutException, url=" + url + ",param=" + param, e); + } + catch (IOException e) + { + log.error("调用HttpUtils.sendSSLPost IOException, url=" + url + ",param=" + param, e); + } + catch (Exception e) + { + log.error("调用HttpsUtil.sendSSLPost Exception, url=" + url + ",param=" + param, e); + } + return result.toString(); + } + + private static class TrustAnyTrustManager implements X509TrustManager + { + @Override + public void checkClientTrusted(X509Certificate[] chain, String authType) + { + } + + @Override + public void checkServerTrusted(X509Certificate[] chain, String authType) + { + } + + @Override + public X509Certificate[] getAcceptedIssuers() + { + return new X509Certificate[] {}; + } + } + + private static class TrustAnyHostnameVerifier implements HostnameVerifier + { + @Override + public boolean verify(String hostname, SSLSession session) + { + return true; + } + } +} diff --git a/bs-common/src/main/java/com/bs/common/utils/ip/AddressUtils.java b/bs-common/src/main/java/com/bs/common/utils/ip/AddressUtils.java new file mode 100644 index 0000000..8a922e4 --- /dev/null +++ b/bs-common/src/main/java/com/bs/common/utils/ip/AddressUtils.java @@ -0,0 +1,56 @@ +package com.bs.common.utils.ip; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONObject; +import com.bs.common.config.BsConfig; +import com.bs.common.constant.Constants; +import com.bs.common.utils.StringUtils; +import com.bs.common.utils.http.HttpUtils; + +/** + * 获取地址类 + * + * @author bs + */ +public class AddressUtils +{ + private static final Logger log = LoggerFactory.getLogger(AddressUtils.class); + + // IP地址查询 + public static final String IP_URL = "http://whois.pconline.com.cn/ipJson.jsp"; + + // 未知地址 + public static final String UNKNOWN = "XX XX"; + + public static String getRealAddressByIP(String ip) + { + // 内网不查询 + if (IpUtils.internalIp(ip)) + { + return "内网IP"; + } + if (BsConfig.isAddressEnabled()) + { + try + { + String rspStr = HttpUtils.sendGet(IP_URL, "ip=" + ip + "&json=true", Constants.GBK); + if (StringUtils.isEmpty(rspStr)) + { + log.error("获取地理位置异常 {}", ip); + return UNKNOWN; + } + JSONObject obj = JSON.parseObject(rspStr); + String region = obj.getString("pro"); + String city = obj.getString("city"); + return String.format("%s %s", region, city); + } + catch (Exception e) + { + log.error("获取地理位置异常 {}", ip); + } + } + return UNKNOWN; + } +} diff --git a/bs-common/src/main/java/com/bs/common/utils/ip/IpUtils.java b/bs-common/src/main/java/com/bs/common/utils/ip/IpUtils.java new file mode 100644 index 0000000..39888b3 --- /dev/null +++ b/bs-common/src/main/java/com/bs/common/utils/ip/IpUtils.java @@ -0,0 +1,382 @@ +package com.bs.common.utils.ip; + +import java.net.InetAddress; +import java.net.UnknownHostException; +import javax.servlet.http.HttpServletRequest; +import com.bs.common.utils.ServletUtils; +import com.bs.common.utils.StringUtils; + +/** + * 获取IP方法 + * + * @author bs + */ +public class IpUtils +{ + public final static String REGX_0_255 = "(25[0-5]|2[0-4]\\d|1\\d{2}|[1-9]\\d|\\d)"; + // 匹配 ip + public final static String REGX_IP = "((" + REGX_0_255 + "\\.){3}" + REGX_0_255 + ")"; + public final static String REGX_IP_WILDCARD = "(((\\*\\.){3}\\*)|(" + REGX_0_255 + "(\\.\\*){3})|(" + REGX_0_255 + "\\." + REGX_0_255 + ")(\\.\\*){2}" + "|((" + REGX_0_255 + "\\.){3}\\*))"; + // 匹配网段 + public final static String REGX_IP_SEG = "(" + REGX_IP + "\\-" + REGX_IP + ")"; + + /** + * 获取客户端IP + * + * @return IP地址 + */ + public static String getIpAddr() + { + return getIpAddr(ServletUtils.getRequest()); + } + + /** + * 获取客户端IP + * + * @param request 请求对象 + * @return IP地址 + */ + public static String getIpAddr(HttpServletRequest request) + { + if (request == null) + { + return "unknown"; + } + String ip = request.getHeader("x-forwarded-for"); + if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) + { + ip = request.getHeader("Proxy-Client-IP"); + } + if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) + { + ip = request.getHeader("X-Forwarded-For"); + } + if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) + { + ip = request.getHeader("WL-Proxy-Client-IP"); + } + if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) + { + ip = request.getHeader("X-Real-IP"); + } + + if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) + { + ip = request.getRemoteAddr(); + } + + return "0:0:0:0:0:0:0:1".equals(ip) ? "127.0.0.1" : getMultistageReverseProxyIp(ip); + } + + /** + * 检查是否为内部IP地址 + * + * @param ip IP地址 + * @return 结果 + */ + public static boolean internalIp(String ip) + { + byte[] addr = textToNumericFormatV4(ip); + return internalIp(addr) || "127.0.0.1".equals(ip); + } + + /** + * 检查是否为内部IP地址 + * + * @param addr byte地址 + * @return 结果 + */ + private static boolean internalIp(byte[] addr) + { + if (StringUtils.isNull(addr) || addr.length < 2) + { + return true; + } + final byte b0 = addr[0]; + final byte b1 = addr[1]; + // 10.x.x.x/8 + final byte SECTION_1 = 0x0A; + // 172.16.x.x/12 + final byte SECTION_2 = (byte) 0xAC; + final byte SECTION_3 = (byte) 0x10; + final byte SECTION_4 = (byte) 0x1F; + // 192.168.x.x/16 + final byte SECTION_5 = (byte) 0xC0; + final byte SECTION_6 = (byte) 0xA8; + switch (b0) + { + case SECTION_1: + return true; + case SECTION_2: + if (b1 >= SECTION_3 && b1 <= SECTION_4) + { + return true; + } + case SECTION_5: + switch (b1) + { + case SECTION_6: + return true; + } + default: + return false; + } + } + + /** + * 将IPv4地址转换成字节 + * + * @param text IPv4地址 + * @return byte 字节 + */ + public static byte[] textToNumericFormatV4(String text) + { + if (text.length() == 0) + { + return null; + } + + byte[] bytes = new byte[4]; + String[] elements = text.split("\\.", -1); + try + { + long l; + int i; + switch (elements.length) + { + case 1: + l = Long.parseLong(elements[0]); + if ((l < 0L) || (l > 4294967295L)) + { + return null; + } + bytes[0] = (byte) (int) (l >> 24 & 0xFF); + bytes[1] = (byte) (int) ((l & 0xFFFFFF) >> 16 & 0xFF); + bytes[2] = (byte) (int) ((l & 0xFFFF) >> 8 & 0xFF); + bytes[3] = (byte) (int) (l & 0xFF); + break; + case 2: + l = Integer.parseInt(elements[0]); + if ((l < 0L) || (l > 255L)) + { + return null; + } + bytes[0] = (byte) (int) (l & 0xFF); + l = Integer.parseInt(elements[1]); + if ((l < 0L) || (l > 16777215L)) + { + return null; + } + bytes[1] = (byte) (int) (l >> 16 & 0xFF); + bytes[2] = (byte) (int) ((l & 0xFFFF) >> 8 & 0xFF); + bytes[3] = (byte) (int) (l & 0xFF); + break; + case 3: + for (i = 0; i < 2; ++i) + { + l = Integer.parseInt(elements[i]); + if ((l < 0L) || (l > 255L)) + { + return null; + } + bytes[i] = (byte) (int) (l & 0xFF); + } + l = Integer.parseInt(elements[2]); + if ((l < 0L) || (l > 65535L)) + { + return null; + } + bytes[2] = (byte) (int) (l >> 8 & 0xFF); + bytes[3] = (byte) (int) (l & 0xFF); + break; + case 4: + for (i = 0; i < 4; ++i) + { + l = Integer.parseInt(elements[i]); + if ((l < 0L) || (l > 255L)) + { + return null; + } + bytes[i] = (byte) (int) (l & 0xFF); + } + break; + default: + return null; + } + } + catch (NumberFormatException e) + { + return null; + } + return bytes; + } + + /** + * 获取IP地址 + * + * @return 本地IP地址 + */ + public static String getHostIp() + { + try + { + return InetAddress.getLocalHost().getHostAddress(); + } + catch (UnknownHostException e) + { + } + return "127.0.0.1"; + } + + /** + * 获取主机名 + * + * @return 本地主机名 + */ + public static String getHostName() + { + try + { + return InetAddress.getLocalHost().getHostName(); + } + catch (UnknownHostException e) + { + } + return "未知"; + } + + /** + * 从多级反向代理中获得第一个非unknown IP地址 + * + * @param ip 获得的IP地址 + * @return 第一个非unknown IP地址 + */ + public static String getMultistageReverseProxyIp(String ip) + { + // 多级反向代理检测 + if (ip != null && ip.indexOf(",") > 0) + { + final String[] ips = ip.trim().split(","); + for (String subIp : ips) + { + if (false == isUnknown(subIp)) + { + ip = subIp; + break; + } + } + } + return StringUtils.substring(ip, 0, 255); + } + + /** + * 检测给定字符串是否为未知,多用于检测HTTP请求相关 + * + * @param checkString 被检测的字符串 + * @return 是否未知 + */ + public static boolean isUnknown(String checkString) + { + return StringUtils.isBlank(checkString) || "unknown".equalsIgnoreCase(checkString); + } + + /** + * 是否为IP + */ + public static boolean isIP(String ip) + { + return StringUtils.isNotBlank(ip) && ip.matches(REGX_IP); + } + + /** + * 是否为IP,或 *为间隔的通配符地址 + */ + public static boolean isIpWildCard(String ip) + { + return StringUtils.isNotBlank(ip) && ip.matches(REGX_IP_WILDCARD); + } + + /** + * 检测参数是否在ip通配符里 + */ + public static boolean ipIsInWildCardNoCheck(String ipWildCard, String ip) + { + String[] s1 = ipWildCard.split("\\."); + String[] s2 = ip.split("\\."); + boolean isMatchedSeg = true; + for (int i = 0; i < s1.length && !s1[i].equals("*"); i++) + { + if (!s1[i].equals(s2[i])) + { + isMatchedSeg = false; + break; + } + } + return isMatchedSeg; + } + + /** + * 是否为特定格式如:“10.10.10.1-10.10.10.99”的ip段字符串 + */ + public static boolean isIPSegment(String ipSeg) + { + return StringUtils.isNotBlank(ipSeg) && ipSeg.matches(REGX_IP_SEG); + } + + /** + * 判断ip是否在指定网段中 + */ + public static boolean ipIsInNetNoCheck(String iparea, String ip) + { + int idx = iparea.indexOf('-'); + String[] sips = iparea.substring(0, idx).split("\\."); + String[] sipe = iparea.substring(idx + 1).split("\\."); + String[] sipt = ip.split("\\."); + long ips = 0L, ipe = 0L, ipt = 0L; + for (int i = 0; i < 4; ++i) + { + ips = ips << 8 | Integer.parseInt(sips[i]); + ipe = ipe << 8 | Integer.parseInt(sipe[i]); + ipt = ipt << 8 | Integer.parseInt(sipt[i]); + } + if (ips > ipe) + { + long t = ips; + ips = ipe; + ipe = t; + } + return ips <= ipt && ipt <= ipe; + } + + /** + * 校验ip是否符合过滤串规则 + * + * @param filter 过滤IP列表,支持后缀'*'通配,支持网段如:`10.10.10.1-10.10.10.99` + * @param ip 校验IP地址 + * @return boolean 结果 + */ + public static boolean isMatchedIp(String filter, String ip) + { + if (StringUtils.isEmpty(filter) || StringUtils.isEmpty(ip)) + { + return false; + } + String[] ips = filter.split(";"); + for (String iStr : ips) + { + if (isIP(iStr) && iStr.equals(ip)) + { + return true; + } + else if (isIpWildCard(iStr) && ipIsInWildCardNoCheck(iStr, ip)) + { + return true; + } + else if (isIPSegment(iStr) && ipIsInNetNoCheck(iStr, ip)) + { + return true; + } + } + return false; + } +} diff --git a/bs-common/src/main/java/com/bs/common/utils/poi/ExcelHandlerAdapter.java b/bs-common/src/main/java/com/bs/common/utils/poi/ExcelHandlerAdapter.java new file mode 100644 index 0000000..ccc8d8f --- /dev/null +++ b/bs-common/src/main/java/com/bs/common/utils/poi/ExcelHandlerAdapter.java @@ -0,0 +1,19 @@ +package com.bs.common.utils.poi; + +/** + * Excel数据格式处理适配器 + * + * @author bs + */ +public interface ExcelHandlerAdapter +{ + /** + * 格式化 + * + * @param value 单元格数据值 + * @param args excel注解args参数组 + * + * @return 处理后的值 + */ + Object format(Object value, String[] args); +} diff --git a/bs-common/src/main/java/com/bs/common/utils/poi/ExcelUtil.java b/bs-common/src/main/java/com/bs/common/utils/poi/ExcelUtil.java new file mode 100644 index 0000000..b09f714 --- /dev/null +++ b/bs-common/src/main/java/com/bs/common/utils/poi/ExcelUtil.java @@ -0,0 +1,1745 @@ +package com.bs.common.utils.poi; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.lang.reflect.ParameterizedType; +import java.math.BigDecimal; +import java.text.DecimalFormat; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Comparator; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.UUID; +import java.util.stream.Collectors; +import javax.servlet.http.HttpServletResponse; +import org.apache.commons.lang3.ArrayUtils; +import org.apache.commons.lang3.RegExUtils; +import org.apache.commons.lang3.reflect.FieldUtils; +import org.apache.poi.hssf.usermodel.HSSFClientAnchor; +import org.apache.poi.hssf.usermodel.HSSFPicture; +import org.apache.poi.hssf.usermodel.HSSFPictureData; +import org.apache.poi.hssf.usermodel.HSSFShape; +import org.apache.poi.hssf.usermodel.HSSFSheet; +import org.apache.poi.hssf.usermodel.HSSFWorkbook; +import org.apache.poi.ooxml.POIXMLDocumentPart; +import org.apache.poi.ss.usermodel.BorderStyle; +import org.apache.poi.ss.usermodel.Cell; +import org.apache.poi.ss.usermodel.CellStyle; +import org.apache.poi.ss.usermodel.CellType; +import org.apache.poi.ss.usermodel.ClientAnchor; +import org.apache.poi.ss.usermodel.DataValidation; +import org.apache.poi.ss.usermodel.DataValidationConstraint; +import org.apache.poi.ss.usermodel.DataValidationHelper; +import org.apache.poi.ss.usermodel.DateUtil; +import org.apache.poi.ss.usermodel.Drawing; +import org.apache.poi.ss.usermodel.FillPatternType; +import org.apache.poi.ss.usermodel.Font; +import org.apache.poi.ss.usermodel.HorizontalAlignment; +import org.apache.poi.ss.usermodel.IndexedColors; +import org.apache.poi.ss.usermodel.Name; +import org.apache.poi.ss.usermodel.PictureData; +import org.apache.poi.ss.usermodel.Row; +import org.apache.poi.ss.usermodel.Sheet; +import org.apache.poi.ss.usermodel.VerticalAlignment; +import org.apache.poi.ss.usermodel.Workbook; +import org.apache.poi.ss.usermodel.WorkbookFactory; +import org.apache.poi.ss.util.CellRangeAddress; +import org.apache.poi.ss.util.CellRangeAddressList; +import org.apache.poi.util.IOUtils; +import org.apache.poi.xssf.streaming.SXSSFWorkbook; +import org.apache.poi.xssf.usermodel.XSSFClientAnchor; +import org.apache.poi.xssf.usermodel.XSSFDataValidation; +import org.apache.poi.xssf.usermodel.XSSFDrawing; +import org.apache.poi.xssf.usermodel.XSSFPicture; +import org.apache.poi.xssf.usermodel.XSSFShape; +import org.apache.poi.xssf.usermodel.XSSFSheet; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import org.openxmlformats.schemas.drawingml.x2006.spreadsheetDrawing.CTMarker; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import com.bs.common.annotation.Excel; +import com.bs.common.annotation.Excel.ColumnType; +import com.bs.common.annotation.Excel.Type; +import com.bs.common.annotation.Excels; +import com.bs.common.config.BsConfig; +import com.bs.common.core.domain.AjaxResult; +import com.bs.common.core.text.Convert; +import com.bs.common.exception.UtilException; +import com.bs.common.utils.DateUtils; +import com.bs.common.utils.DictUtils; +import com.bs.common.utils.StringUtils; +import com.bs.common.utils.file.FileTypeUtils; +import com.bs.common.utils.file.FileUtils; +import com.bs.common.utils.file.ImageUtils; +import com.bs.common.utils.reflect.ReflectUtils; + +/** + * Excel相关处理 + * + * @author bs + */ +public class ExcelUtil +{ + private static final Logger log = LoggerFactory.getLogger(ExcelUtil.class); + + public static final String FORMULA_REGEX_STR = "=|-|\\+|@"; + + public static final String[] FORMULA_STR = { "=", "-", "+", "@" }; + + /** + * 用于dictType属性数据存储,避免重复查缓存 + */ + public Map sysDictMap = new HashMap(); + + /** + * Excel sheet最大行数,默认65536 + */ + public static final int sheetSize = 65536; + + /** + * 工作表名称 + */ + private String sheetName; + + /** + * 导出类型(EXPORT:导出数据;IMPORT:导入模板) + */ + private Type type; + + /** + * 工作薄对象 + */ + private Workbook wb; + + /** + * 工作表对象 + */ + private Sheet sheet; + + /** + * 样式列表 + */ + private Map styles; + + /** + * 导入导出数据列表 + */ + private List list; + + /** + * 注解列表 + */ + private List fields; + + /** + * 当前行号 + */ + private int rownum; + + /** + * 标题 + */ + private String title; + + /** + * 最大高度 + */ + private short maxHeight; + + /** + * 合并后最后行数 + */ + private int subMergedLastRowNum = 0; + + /** + * 合并后开始行数 + */ + private int subMergedFirstRowNum = 1; + + /** + * 对象的子列表方法 + */ + private Method subMethod; + + /** + * 对象的子列表属性 + */ + private List subFields; + + /** + * 统计列表 + */ + private Map statistics = new HashMap(); + + /** + * 数字格式 + */ + private static final DecimalFormat DOUBLE_FORMAT = new DecimalFormat("######0.00"); + + /** + * 实体对象 + */ + public Class clazz; + + /** + * 需要排除列属性 + */ + public String[] excludeFields; + + public ExcelUtil(Class clazz) + { + this.clazz = clazz; + } + + /** + * 隐藏Excel中列属性 + * + * @param fields 列属性名 示例[单个"name"/多个"id","name"] + * @throws Exception + */ + public void hideColumn(String... fields) + { + this.excludeFields = fields; + } + + public void init(List list, String sheetName, String title, Type type) + { + if (list == null) + { + list = new ArrayList(); + } + this.list = list; + this.sheetName = sheetName; + this.type = type; + this.title = title; + createExcelField(); + createWorkbook(); + createTitle(); + createSubHead(); + } + + /** + * 创建excel第一行标题 + */ + public void createTitle() + { + if (StringUtils.isNotEmpty(title)) + { + subMergedFirstRowNum++; + subMergedLastRowNum++; + int titleLastCol = this.fields.size() - 1; + if (isSubList()) + { + titleLastCol = titleLastCol + subFields.size() - 1; + } + Row titleRow = sheet.createRow(rownum == 0 ? rownum++ : 0); + titleRow.setHeightInPoints(30); + Cell titleCell = titleRow.createCell(0); + titleCell.setCellStyle(styles.get("title")); + titleCell.setCellValue(title); + sheet.addMergedRegion(new CellRangeAddress(titleRow.getRowNum(), titleRow.getRowNum(), titleRow.getRowNum(), titleLastCol)); + } + } + + /** + * 创建对象的子列表名称 + */ + public void createSubHead() + { + if (isSubList()) + { + subMergedFirstRowNum++; + subMergedLastRowNum++; + Row subRow = sheet.createRow(rownum); + int excelNum = 0; + for (Object[] objects : fields) + { + Excel attr = (Excel) objects[1]; + Cell headCell1 = subRow.createCell(excelNum); + headCell1.setCellValue(attr.name()); + headCell1.setCellStyle(styles.get(StringUtils.format("header_{}_{}", attr.headerColor(), attr.headerBackgroundColor()))); + excelNum++; + } + int headFirstRow = excelNum - 1; + int headLastRow = headFirstRow + subFields.size() - 1; + if (headLastRow > headFirstRow) + { + sheet.addMergedRegion(new CellRangeAddress(rownum, rownum, headFirstRow, headLastRow)); + } + rownum++; + } + } + + /** + * 对excel表单默认第一个索引名转换成list + * + * @param is 输入流 + * @return 转换后集合 + */ + public List importExcel(InputStream is) throws Exception + { + return importExcel(is, 0); + } + + /** + * 对excel表单默认第一个索引名转换成list + * + * @param is 输入流 + * @param titleNum 标题占用行数 + * @return 转换后集合 + */ + public List importExcel(InputStream is, int titleNum) throws Exception + { + return importExcel(StringUtils.EMPTY, is, titleNum); + } + + /** + * 对excel表单指定表格索引名转换成list + * + * @param sheetName 表格索引名 + * @param titleNum 标题占用行数 + * @param is 输入流 + * @return 转换后集合 + */ + public List importExcel(String sheetName, InputStream is, int titleNum) throws Exception + { + this.type = Type.IMPORT; + this.wb = WorkbookFactory.create(is); + List list = new ArrayList(); + // 如果指定sheet名,则取指定sheet中的内容 否则默认指向第1个sheet + Sheet sheet = StringUtils.isNotEmpty(sheetName) ? wb.getSheet(sheetName) : wb.getSheetAt(0); + if (sheet == null) + { + throw new IOException("文件sheet不存在"); + } + boolean isXSSFWorkbook = !(wb instanceof HSSFWorkbook); + Map pictures; + if (isXSSFWorkbook) + { + pictures = getSheetPictures07((XSSFSheet) sheet, (XSSFWorkbook) wb); + } + else + { + pictures = getSheetPictures03((HSSFSheet) sheet, (HSSFWorkbook) wb); + } + // 获取最后一个非空行的行下标,比如总行数为n,则返回的为n-1 + int rows = sheet.getLastRowNum(); + + if (rows > 0) + { + // 定义一个map用于存放excel列的序号和field. + Map cellMap = new HashMap(); + // 获取表头 + Row heard = sheet.getRow(titleNum); + for (int i = 0; i < heard.getPhysicalNumberOfCells(); i++) + { + Cell cell = heard.getCell(i); + if (StringUtils.isNotNull(cell)) + { + String value = this.getCellValue(heard, i).toString(); + cellMap.put(value, i); + } + else + { + cellMap.put(null, i); + } + } + // 有数据时才处理 得到类的所有field. + List fields = this.getFields(); + Map fieldsMap = new HashMap(); + for (Object[] objects : fields) + { + Excel attr = (Excel) objects[1]; + Integer column = cellMap.get(attr.name()); + if (column != null) + { + fieldsMap.put(column, objects); + } + } + for (int i = titleNum + 1; i <= rows; i++) + { + // 从第2行开始取数据,默认第一行是表头. + Row row = sheet.getRow(i); + // 判断当前行是否是空行 + if (isRowEmpty(row)) + { + continue; + } + T entity = null; + for (Map.Entry entry : fieldsMap.entrySet()) + { + Object val = this.getCellValue(row, entry.getKey()); + + // 如果不存在实例则新建. + entity = (entity == null ? clazz.newInstance() : entity); + // 从map中得到对应列的field. + Field field = (Field) entry.getValue()[0]; + Excel attr = (Excel) entry.getValue()[1]; + // 取得类型,并根据对象类型设置值. + Class fieldType = field.getType(); + if (String.class == fieldType) + { + String s = Convert.toStr(val); + if (StringUtils.endsWith(s, ".0")) + { + val = StringUtils.substringBefore(s, ".0"); + } + else + { + String dateFormat = field.getAnnotation(Excel.class).dateFormat(); + if (StringUtils.isNotEmpty(dateFormat)) + { + val = parseDateToStr(dateFormat, val); + } + else + { + val = Convert.toStr(val); + } + } + } + else if ((Integer.TYPE == fieldType || Integer.class == fieldType) && StringUtils.isNumeric(Convert.toStr(val))) + { + val = Convert.toInt(val); + } + else if ((Long.TYPE == fieldType || Long.class == fieldType) && StringUtils.isNumeric(Convert.toStr(val))) + { + val = Convert.toLong(val); + } + else if (Double.TYPE == fieldType || Double.class == fieldType) + { + val = Convert.toDouble(val); + } + else if (Float.TYPE == fieldType || Float.class == fieldType) + { + val = Convert.toFloat(val); + } + else if (BigDecimal.class == fieldType) + { + val = Convert.toBigDecimal(val); + } + else if (Date.class == fieldType) + { + if (val instanceof String) + { + val = DateUtils.parseDate(val); + } + else if (val instanceof Double) + { + val = DateUtil.getJavaDate((Double) val); + } + } + else if (Boolean.TYPE == fieldType || Boolean.class == fieldType) + { + val = Convert.toBool(val, false); + } + if (StringUtils.isNotNull(fieldType)) + { + String propertyName = field.getName(); + if (StringUtils.isNotEmpty(attr.targetAttr())) + { + propertyName = field.getName() + "." + attr.targetAttr(); + } + else if (StringUtils.isNotEmpty(attr.readConverterExp())) + { + val = reverseByExp(Convert.toStr(val), attr.readConverterExp(), attr.separator()); + } + else if (StringUtils.isNotEmpty(attr.dictType())) + { + val = reverseDictByExp(Convert.toStr(val), attr.dictType(), attr.separator()); + } + else if (!attr.handler().equals(ExcelHandlerAdapter.class)) + { + val = dataFormatHandlerAdapter(val, attr); + } + else if (ColumnType.IMAGE == attr.cellType() && StringUtils.isNotEmpty(pictures)) + { + PictureData image = pictures.get(row.getRowNum() + "_" + entry.getKey()); + if (image == null) + { + val = ""; + } + else + { + byte[] data = image.getData(); + val = FileUtils.writeImportBytes(data); + } + } + ReflectUtils.invokeSetter(entity, propertyName, val); + } + } + list.add(entity); + } + } + return list; + } + + /** + * 对list数据源将其里面的数据导入到excel表单 + * + * @param list 导出数据集合 + * @param sheetName 工作表的名称 + * @return 结果 + */ + public AjaxResult exportExcel(List list, String sheetName) + { + return exportExcel(list, sheetName, StringUtils.EMPTY); + } + + /** + * 对list数据源将其里面的数据导入到excel表单 + * + * @param list 导出数据集合 + * @param sheetName 工作表的名称 + * @param title 标题 + * @return 结果 + */ + public AjaxResult exportExcel(List list, String sheetName, String title) + { + this.init(list, sheetName, title, Type.EXPORT); + return exportExcel(); + } + + /** + * 对list数据源将其里面的数据导入到excel表单 + * + * @param response 返回数据 + * @param list 导出数据集合 + * @param sheetName 工作表的名称 + * @return 结果 + */ + public void exportExcel(HttpServletResponse response, List list, String sheetName) + { + exportExcel(response, list, sheetName, StringUtils.EMPTY); + } + + /** + * 对list数据源将其里面的数据导入到excel表单 + * + * @param response 返回数据 + * @param list 导出数据集合 + * @param sheetName 工作表的名称 + * @param title 标题 + * @return 结果 + */ + public void exportExcel(HttpServletResponse response, List list, String sheetName, String title) + { + response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); + response.setCharacterEncoding("utf-8"); + this.init(list, sheetName, title, Type.EXPORT); + exportExcel(response); + } + + /** + * 对list数据源将其里面的数据导入到excel表单 + * + * @param sheetName 工作表的名称 + * @return 结果 + */ + public AjaxResult importTemplateExcel(String sheetName) + { + return importTemplateExcel(sheetName, StringUtils.EMPTY); + } + + /** + * 对list数据源将其里面的数据导入到excel表单 + * + * @param sheetName 工作表的名称 + * @param title 标题 + * @return 结果 + */ + public AjaxResult importTemplateExcel(String sheetName, String title) + { + this.init(null, sheetName, title, Type.IMPORT); + return exportExcel(); + } + + /** + * 对list数据源将其里面的数据导入到excel表单 + * + * @param sheetName 工作表的名称 + * @return 结果 + */ + public void importTemplateExcel(HttpServletResponse response, String sheetName) + { + importTemplateExcel(response, sheetName, StringUtils.EMPTY); + } + + /** + * 对list数据源将其里面的数据导入到excel表单 + * + * @param sheetName 工作表的名称 + * @param title 标题 + * @return 结果 + */ + public void importTemplateExcel(HttpServletResponse response, String sheetName, String title) + { + response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); + response.setCharacterEncoding("utf-8"); + this.init(null, sheetName, title, Type.IMPORT); + exportExcel(response); + } + + /** + * 对list数据源将其里面的数据导入到excel表单 + * + * @return 结果 + */ + public void exportExcel(HttpServletResponse response) + { + try + { + writeSheet(); + wb.write(response.getOutputStream()); + } + catch (Exception e) + { + log.error("导出Excel异常{}", e.getMessage()); + } + finally + { + IOUtils.closeQuietly(wb); + } + } + + /** + * 对list数据源将其里面的数据导入到excel表单 + * + * @return 结果 + */ + public AjaxResult exportExcel() + { + OutputStream out = null; + try + { + writeSheet(); + String filename = encodingFilename(sheetName); + out = new FileOutputStream(getAbsoluteFile(filename)); + wb.write(out); + return AjaxResult.success(filename); + } + catch (Exception e) + { + log.error("导出Excel异常{}", e.getMessage()); + throw new UtilException("导出Excel失败,请联系网站管理员!"); + } + finally + { + IOUtils.closeQuietly(wb); + IOUtils.closeQuietly(out); + } + } + + /** + * 创建写入数据到Sheet + */ + public void writeSheet() + { + // 取出一共有多少个sheet. + int sheetNo = Math.max(1, (int) Math.ceil(list.size() * 1.0 / sheetSize)); + for (int index = 0; index < sheetNo; index++) + { + createSheet(sheetNo, index); + + // 产生一行 + Row row = sheet.createRow(rownum); + int column = 0; + // 写入各个字段的列头名称 + for (Object[] os : fields) + { + Field field = (Field) os[0]; + Excel excel = (Excel) os[1]; + if (Collection.class.isAssignableFrom(field.getType())) + { + for (Field subField : subFields) + { + Excel subExcel = subField.getAnnotation(Excel.class); + this.createHeadCell(subExcel, row, column++); + } + } + else + { + this.createHeadCell(excel, row, column++); + } + } + if (Type.EXPORT.equals(type)) + { + fillExcelData(index, row); + addStatisticsRow(); + } + } + } + + /** + * 填充excel数据 + * + * @param index 序号 + * @param row 单元格行 + */ + @SuppressWarnings("unchecked") + public void fillExcelData(int index, Row row) + { + int startNo = index * sheetSize; + int endNo = Math.min(startNo + sheetSize, list.size()); + int rowNo = (1 + rownum) - startNo; + for (int i = startNo; i < endNo; i++) + { + rowNo = isSubList() ? (i > 1 ? rowNo + 1 : rowNo + i) : i + 1 + rownum - startNo; + row = sheet.createRow(rowNo); + // 得到导出对象. + T vo = (T) list.get(i); + Collection subList = null; + if (isSubList()) + { + if (isSubListValue(vo)) + { + subList = getListCellValue(vo); + subMergedLastRowNum = subMergedLastRowNum + subList.size(); + } + else + { + subMergedFirstRowNum++; + subMergedLastRowNum++; + } + } + int column = 0; + for (Object[] os : fields) + { + Field field = (Field) os[0]; + Excel excel = (Excel) os[1]; + if (Collection.class.isAssignableFrom(field.getType()) && StringUtils.isNotNull(subList)) + { + boolean subFirst = false; + for (Object obj : subList) + { + if (subFirst) + { + rowNo++; + row = sheet.createRow(rowNo); + } + List subFields = FieldUtils.getFieldsListWithAnnotation(obj.getClass(), Excel.class); + int subIndex = 0; + for (Field subField : subFields) + { + if (subField.isAnnotationPresent(Excel.class)) + { + subField.setAccessible(true); + Excel attr = subField.getAnnotation(Excel.class); + this.addCell(attr, row, (T) obj, subField, column + subIndex); + } + subIndex++; + } + subFirst = true; + } + this.subMergedFirstRowNum = this.subMergedFirstRowNum + subList.size(); + } + else + { + this.addCell(excel, row, vo, field, column++); + } + } + } + } + + /** + * 创建表格样式 + * + * @param wb 工作薄对象 + * @return 样式列表 + */ + private Map createStyles(Workbook wb) + { + // 写入各条记录,每条记录对应excel表中的一行 + Map styles = new HashMap(); + CellStyle style = wb.createCellStyle(); + style.setAlignment(HorizontalAlignment.CENTER); + style.setVerticalAlignment(VerticalAlignment.CENTER); + Font titleFont = wb.createFont(); + titleFont.setFontName("Arial"); + titleFont.setFontHeightInPoints((short) 16); + titleFont.setBold(true); + style.setFont(titleFont); + styles.put("title", style); + + style = wb.createCellStyle(); + style.setAlignment(HorizontalAlignment.CENTER); + style.setVerticalAlignment(VerticalAlignment.CENTER); + style.setBorderRight(BorderStyle.THIN); + style.setRightBorderColor(IndexedColors.GREY_50_PERCENT.getIndex()); + style.setBorderLeft(BorderStyle.THIN); + style.setLeftBorderColor(IndexedColors.GREY_50_PERCENT.getIndex()); + style.setBorderTop(BorderStyle.THIN); + style.setTopBorderColor(IndexedColors.GREY_50_PERCENT.getIndex()); + style.setBorderBottom(BorderStyle.THIN); + style.setBottomBorderColor(IndexedColors.GREY_50_PERCENT.getIndex()); + Font dataFont = wb.createFont(); + dataFont.setFontName("Arial"); + dataFont.setFontHeightInPoints((short) 10); + style.setFont(dataFont); + styles.put("data", style); + + style = wb.createCellStyle(); + style.setAlignment(HorizontalAlignment.CENTER); + style.setVerticalAlignment(VerticalAlignment.CENTER); + Font totalFont = wb.createFont(); + totalFont.setFontName("Arial"); + totalFont.setFontHeightInPoints((short) 10); + style.setFont(totalFont); + styles.put("total", style); + + styles.putAll(annotationHeaderStyles(wb, styles)); + + styles.putAll(annotationDataStyles(wb)); + + return styles; + } + + /** + * 根据Excel注解创建表格头样式 + * + * @param wb 工作薄对象 + * @return 自定义样式列表 + */ + private Map annotationHeaderStyles(Workbook wb, Map styles) + { + Map headerStyles = new HashMap(); + for (Object[] os : fields) + { + Excel excel = (Excel) os[1]; + String key = StringUtils.format("header_{}_{}", excel.headerColor(), excel.headerBackgroundColor()); + if (!headerStyles.containsKey(key)) + { + CellStyle style = wb.createCellStyle(); + style.cloneStyleFrom(styles.get("data")); + style.setAlignment(HorizontalAlignment.CENTER); + style.setVerticalAlignment(VerticalAlignment.CENTER); + style.setFillForegroundColor(excel.headerBackgroundColor().index); + style.setFillPattern(FillPatternType.SOLID_FOREGROUND); + Font headerFont = wb.createFont(); + headerFont.setFontName("Arial"); + headerFont.setFontHeightInPoints((short) 10); + headerFont.setBold(true); + headerFont.setColor(excel.headerColor().index); + style.setFont(headerFont); + headerStyles.put(key, style); + } + } + return headerStyles; + } + + /** + * 根据Excel注解创建表格列样式 + * + * @param wb 工作薄对象 + * @return 自定义样式列表 + */ + private Map annotationDataStyles(Workbook wb) + { + Map styles = new HashMap(); + for (Object[] os : fields) + { + Excel excel = (Excel) os[1]; + String key = StringUtils.format("data_{}_{}_{}", excel.align(), excel.color(), excel.backgroundColor()); + if (!styles.containsKey(key)) + { + CellStyle style = wb.createCellStyle(); + style.setAlignment(excel.align()); + style.setVerticalAlignment(VerticalAlignment.CENTER); + style.setBorderRight(BorderStyle.THIN); + style.setRightBorderColor(IndexedColors.GREY_50_PERCENT.getIndex()); + style.setBorderLeft(BorderStyle.THIN); + style.setLeftBorderColor(IndexedColors.GREY_50_PERCENT.getIndex()); + style.setBorderTop(BorderStyle.THIN); + style.setTopBorderColor(IndexedColors.GREY_50_PERCENT.getIndex()); + style.setBorderBottom(BorderStyle.THIN); + style.setBottomBorderColor(IndexedColors.GREY_50_PERCENT.getIndex()); + style.setFillPattern(FillPatternType.SOLID_FOREGROUND); + style.setFillForegroundColor(excel.backgroundColor().getIndex()); + Font dataFont = wb.createFont(); + dataFont.setFontName("Arial"); + dataFont.setFontHeightInPoints((short) 10); + dataFont.setColor(excel.color().index); + style.setFont(dataFont); + styles.put(key, style); + } + } + return styles; + } + + /** + * 创建单元格 + */ + public Cell createHeadCell(Excel attr, Row row, int column) + { + // 创建列 + Cell cell = row.createCell(column); + // 写入列信息 + cell.setCellValue(attr.name()); + setDataValidation(attr, row, column); + cell.setCellStyle(styles.get(StringUtils.format("header_{}_{}", attr.headerColor(), attr.headerBackgroundColor()))); + if (isSubList()) + { + // 填充默认样式,防止合并单元格样式失效 + sheet.setDefaultColumnStyle(column, styles.get(StringUtils.format("data_{}_{}_{}", attr.align(), attr.color(), attr.backgroundColor()))); + if (attr.needMerge()) + { + sheet.addMergedRegion(new CellRangeAddress(rownum - 1, rownum, column, column)); + } + } + return cell; + } + + /** + * 设置单元格信息 + * + * @param value 单元格值 + * @param attr 注解相关 + * @param cell 单元格信息 + */ + public void setCellVo(Object value, Excel attr, Cell cell) + { + if (ColumnType.STRING == attr.cellType()) + { + String cellValue = Convert.toStr(value); + // 对于任何以表达式触发字符 =-+@开头的单元格,直接使用tab字符作为前缀,防止CSV注入。 + if (StringUtils.startsWithAny(cellValue, FORMULA_STR)) + { + cellValue = RegExUtils.replaceFirst(cellValue, FORMULA_REGEX_STR, "\t$0"); + } + if (value instanceof Collection && StringUtils.equals("[]", cellValue)) + { + cellValue = StringUtils.EMPTY; + } + cell.setCellValue(StringUtils.isNull(cellValue) ? attr.defaultValue() : cellValue + attr.suffix()); + } + else if (ColumnType.NUMERIC == attr.cellType()) + { + if (StringUtils.isNotNull(value)) + { + cell.setCellValue(StringUtils.contains(Convert.toStr(value), ".") ? Convert.toDouble(value) : Convert.toInt(value)); + } + } + else if (ColumnType.IMAGE == attr.cellType()) + { + ClientAnchor anchor = new XSSFClientAnchor(0, 0, 0, 0, (short) cell.getColumnIndex(), cell.getRow().getRowNum(), (short) (cell.getColumnIndex() + 1), cell.getRow().getRowNum() + 1); + String imagePath = Convert.toStr(value); + if (StringUtils.isNotEmpty(imagePath)) + { + byte[] data = ImageUtils.getImage(imagePath); + getDrawingPatriarch(cell.getSheet()).createPicture(anchor, + cell.getSheet().getWorkbook().addPicture(data, getImageType(data))); + } + } + } + + /** + * 获取画布 + */ + public static Drawing getDrawingPatriarch(Sheet sheet) + { + if (sheet.getDrawingPatriarch() == null) + { + sheet.createDrawingPatriarch(); + } + return sheet.getDrawingPatriarch(); + } + + /** + * 获取图片类型,设置图片插入类型 + */ + public int getImageType(byte[] value) + { + String type = FileTypeUtils.getFileExtendName(value); + if ("JPG".equalsIgnoreCase(type)) + { + return Workbook.PICTURE_TYPE_JPEG; + } + else if ("PNG".equalsIgnoreCase(type)) + { + return Workbook.PICTURE_TYPE_PNG; + } + return Workbook.PICTURE_TYPE_JPEG; + } + + /** + * 创建表格样式 + */ + public void setDataValidation(Excel attr, Row row, int column) + { + if (attr.name().indexOf("注:") >= 0) + { + sheet.setColumnWidth(column, 6000); + } + else + { + // 设置列宽 + sheet.setColumnWidth(column, (int) ((attr.width() + 0.72) * 256)); + } + if (StringUtils.isNotEmpty(attr.prompt()) || attr.combo().length > 0) + { + if (attr.combo().length > 15 || StringUtils.join(attr.combo()).length() > 255) + { + // 如果下拉数大于15或字符串长度大于255,则使用一个新sheet存储,避免生成的模板下拉值获取不到 + setXSSFValidationWithHidden(sheet, attr.combo(), attr.prompt(), 1, 100, column, column); + } + else + { + // 提示信息或只能选择不能输入的列内容. + setPromptOrValidation(sheet, attr.combo(), attr.prompt(), 1, 100, column, column); + } + } + } + + /** + * 添加单元格 + */ + public Cell addCell(Excel attr, Row row, T vo, Field field, int column) + { + Cell cell = null; + try + { + // 设置行高 + row.setHeight(maxHeight); + // 根据Excel中设置情况决定是否导出,有些情况需要保持为空,希望用户填写这一列. + if (attr.isExport()) + { + // 创建cell + cell = row.createCell(column); + if (isSubListValue(vo) && getListCellValue(vo).size() > 1 && attr.needMerge()) + { + CellRangeAddress cellAddress = new CellRangeAddress(subMergedFirstRowNum, subMergedLastRowNum, column, column); + sheet.addMergedRegion(cellAddress); + } + cell.setCellStyle(styles.get(StringUtils.format("data_{}_{}_{}", attr.align(), attr.color(), attr.backgroundColor()))); + + // 用于读取对象中的属性 + Object value = getTargetValue(vo, field, attr); + String dateFormat = attr.dateFormat(); + String readConverterExp = attr.readConverterExp(); + String separator = attr.separator(); + String dictType = attr.dictType(); + if (StringUtils.isNotEmpty(dateFormat) && StringUtils.isNotNull(value)) + { + cell.setCellValue(parseDateToStr(dateFormat, value)); + } + else if (StringUtils.isNotEmpty(readConverterExp) && StringUtils.isNotNull(value)) + { + cell.setCellValue(convertByExp(Convert.toStr(value), readConverterExp, separator)); + } + else if (StringUtils.isNotEmpty(dictType) && StringUtils.isNotNull(value)) + { + if (!sysDictMap.containsKey(dictType + value)) + { + String lable = convertDictByExp(Convert.toStr(value), dictType, separator); + sysDictMap.put(dictType + value, lable); + } + cell.setCellValue(sysDictMap.get(dictType + value)); + } + else if (value instanceof BigDecimal && -1 != attr.scale()) + { + cell.setCellValue((((BigDecimal) value).setScale(attr.scale(), attr.roundingMode())).doubleValue()); + } + else if (!attr.handler().equals(ExcelHandlerAdapter.class)) + { + cell.setCellValue(dataFormatHandlerAdapter(value, attr)); + } + else + { + // 设置列类型 + setCellVo(value, attr, cell); + } + addStatisticsData(column, Convert.toStr(value), attr); + } + } + catch (Exception e) + { + log.error("导出Excel失败{}", e); + } + return cell; + } + + /** + * 设置 POI XSSFSheet 单元格提示或选择框 + * + * @param sheet 表单 + * @param textlist 下拉框显示的内容 + * @param promptContent 提示内容 + * @param firstRow 开始行 + * @param endRow 结束行 + * @param firstCol 开始列 + * @param endCol 结束列 + */ + public void setPromptOrValidation(Sheet sheet, String[] textlist, String promptContent, int firstRow, int endRow, + int firstCol, int endCol) + { + DataValidationHelper helper = sheet.getDataValidationHelper(); + DataValidationConstraint constraint = textlist.length > 0 ? helper.createExplicitListConstraint(textlist) : helper.createCustomConstraint("DD1"); + CellRangeAddressList regions = new CellRangeAddressList(firstRow, endRow, firstCol, endCol); + DataValidation dataValidation = helper.createValidation(constraint, regions); + if (StringUtils.isNotEmpty(promptContent)) + { + // 如果设置了提示信息则鼠标放上去提示 + dataValidation.createPromptBox("", promptContent); + dataValidation.setShowPromptBox(true); + } + // 处理Excel兼容性问题 + if (dataValidation instanceof XSSFDataValidation) + { + dataValidation.setSuppressDropDownArrow(true); + dataValidation.setShowErrorBox(true); + } + else + { + dataValidation.setSuppressDropDownArrow(false); + } + sheet.addValidationData(dataValidation); + } + + /** + * 设置某些列的值只能输入预制的数据,显示下拉框(兼容超出一定数量的下拉框). + * + * @param sheet 要设置的sheet. + * @param textlist 下拉框显示的内容 + * @param promptContent 提示内容 + * @param firstRow 开始行 + * @param endRow 结束行 + * @param firstCol 开始列 + * @param endCol 结束列 + */ + public void setXSSFValidationWithHidden(Sheet sheet, String[] textlist, String promptContent, int firstRow, int endRow, int firstCol, int endCol) + { + String hideSheetName = "combo_" + firstCol + "_" + endCol; + Sheet hideSheet = wb.createSheet(hideSheetName); // 用于存储 下拉菜单数据 + for (int i = 0; i < textlist.length; i++) + { + hideSheet.createRow(i).createCell(0).setCellValue(textlist[i]); + } + // 创建名称,可被其他单元格引用 + Name name = wb.createName(); + name.setNameName(hideSheetName + "_data"); + name.setRefersToFormula(hideSheetName + "!$A$1:$A$" + textlist.length); + DataValidationHelper helper = sheet.getDataValidationHelper(); + // 加载下拉列表内容 + DataValidationConstraint constraint = helper.createFormulaListConstraint(hideSheetName + "_data"); + // 设置数据有效性加载在哪个单元格上,四个参数分别是:起始行、终止行、起始列、终止列 + CellRangeAddressList regions = new CellRangeAddressList(firstRow, endRow, firstCol, endCol); + // 数据有效性对象 + DataValidation dataValidation = helper.createValidation(constraint, regions); + if (StringUtils.isNotEmpty(promptContent)) + { + // 如果设置了提示信息则鼠标放上去提示 + dataValidation.createPromptBox("", promptContent); + dataValidation.setShowPromptBox(true); + } + // 处理Excel兼容性问题 + if (dataValidation instanceof XSSFDataValidation) + { + dataValidation.setSuppressDropDownArrow(true); + dataValidation.setShowErrorBox(true); + } + else + { + dataValidation.setSuppressDropDownArrow(false); + } + + sheet.addValidationData(dataValidation); + // 设置hiddenSheet隐藏 + wb.setSheetHidden(wb.getSheetIndex(hideSheet), true); + } + + /** + * 解析导出值 0=男,1=女,2=未知 + * + * @param propertyValue 参数值 + * @param converterExp 翻译注解 + * @param separator 分隔符 + * @return 解析后值 + */ + public static String convertByExp(String propertyValue, String converterExp, String separator) + { + StringBuilder propertyString = new StringBuilder(); + String[] convertSource = converterExp.split(","); + for (String item : convertSource) + { + String[] itemArray = item.split("="); + if (StringUtils.containsAny(propertyValue, separator)) + { + for (String value : propertyValue.split(separator)) + { + if (itemArray[0].equals(value)) + { + propertyString.append(itemArray[1] + separator); + break; + } + } + } + else + { + if (itemArray[0].equals(propertyValue)) + { + return itemArray[1]; + } + } + } + return StringUtils.stripEnd(propertyString.toString(), separator); + } + + /** + * 反向解析值 男=0,女=1,未知=2 + * + * @param propertyValue 参数值 + * @param converterExp 翻译注解 + * @param separator 分隔符 + * @return 解析后值 + */ + public static String reverseByExp(String propertyValue, String converterExp, String separator) + { + StringBuilder propertyString = new StringBuilder(); + String[] convertSource = converterExp.split(","); + for (String item : convertSource) + { + String[] itemArray = item.split("="); + if (StringUtils.containsAny(propertyValue, separator)) + { + for (String value : propertyValue.split(separator)) + { + if (itemArray[1].equals(value)) + { + propertyString.append(itemArray[0] + separator); + break; + } + } + } + else + { + if (itemArray[1].equals(propertyValue)) + { + return itemArray[0]; + } + } + } + return StringUtils.stripEnd(propertyString.toString(), separator); + } + + /** + * 解析字典值 + * + * @param dictValue 字典值 + * @param dictType 字典类型 + * @param separator 分隔符 + * @return 字典标签 + */ + public static String convertDictByExp(String dictValue, String dictType, String separator) + { + return DictUtils.getDictLabel(dictType, dictValue, separator); + } + + /** + * 反向解析值字典值 + * + * @param dictLabel 字典标签 + * @param dictType 字典类型 + * @param separator 分隔符 + * @return 字典值 + */ + public static String reverseDictByExp(String dictLabel, String dictType, String separator) + { + return DictUtils.getDictValue(dictType, dictLabel, separator); + } + + /** + * 数据处理器 + * + * @param value 数据值 + * @param excel 数据注解 + * @return + */ + public String dataFormatHandlerAdapter(Object value, Excel excel) + { + try + { + Object instance = excel.handler().newInstance(); + Method formatMethod = excel.handler().getMethod("format", new Class[] { Object.class, String[].class }); + value = formatMethod.invoke(instance, value, excel.args()); + } + catch (Exception e) + { + log.error("不能格式化数据 " + excel.handler(), e.getMessage()); + } + return Convert.toStr(value); + } + + /** + * 合计统计信息 + */ + private void addStatisticsData(Integer index, String text, Excel entity) + { + if (entity != null && entity.isStatistics()) + { + Double temp = 0D; + if (!statistics.containsKey(index)) + { + statistics.put(index, temp); + } + try + { + temp = Double.valueOf(text); + } + catch (NumberFormatException e) + { + } + statistics.put(index, statistics.get(index) + temp); + } + } + + /** + * 创建统计行 + */ + public void addStatisticsRow() + { + if (statistics.size() > 0) + { + Row row = sheet.createRow(sheet.getLastRowNum() + 1); + Set keys = statistics.keySet(); + Cell cell = row.createCell(0); + cell.setCellStyle(styles.get("total")); + cell.setCellValue("合计"); + + for (Integer key : keys) + { + cell = row.createCell(key); + cell.setCellStyle(styles.get("total")); + cell.setCellValue(DOUBLE_FORMAT.format(statistics.get(key))); + } + statistics.clear(); + } + } + + /** + * 编码文件名 + */ + public String encodingFilename(String filename) + { + filename = UUID.randomUUID() + "_" + filename + ".xlsx"; + return filename; + } + + /** + * 获取下载路径 + * + * @param filename 文件名称 + */ + public String getAbsoluteFile(String filename) + { + String downloadPath = BsConfig.getDownloadPath() + filename; + File desc = new File(downloadPath); + if (!desc.getParentFile().exists()) + { + desc.getParentFile().mkdirs(); + } + return downloadPath; + } + + /** + * 获取bean中的属性值 + * + * @param vo 实体对象 + * @param field 字段 + * @param excel 注解 + * @return 最终的属性值 + * @throws Exception + */ + private Object getTargetValue(T vo, Field field, Excel excel) throws Exception + { + Object o = field.get(vo); + if (StringUtils.isNotEmpty(excel.targetAttr())) + { + String target = excel.targetAttr(); + if (target.contains(".")) + { + String[] targets = target.split("[.]"); + for (String name : targets) + { + o = getValue(o, name); + } + } + else + { + o = getValue(o, target); + } + } + return o; + } + + /** + * 以类的属性的get方法方法形式获取值 + * + * @param o + * @param name + * @return value + * @throws Exception + */ + private Object getValue(Object o, String name) throws Exception + { + if (StringUtils.isNotNull(o) && StringUtils.isNotEmpty(name)) + { + Class clazz = o.getClass(); + Field field = clazz.getDeclaredField(name); + field.setAccessible(true); + o = field.get(o); + } + return o; + } + + /** + * 得到所有定义字段 + */ + private void createExcelField() + { + this.fields = getFields(); + this.fields = this.fields.stream().sorted(Comparator.comparing(objects -> ((Excel) objects[1]).sort())).collect(Collectors.toList()); + this.maxHeight = getRowHeight(); + } + + /** + * 获取字段注解信息 + */ + public List getFields() + { + List fields = new ArrayList(); + List tempFields = new ArrayList<>(); + tempFields.addAll(Arrays.asList(clazz.getSuperclass().getDeclaredFields())); + tempFields.addAll(Arrays.asList(clazz.getDeclaredFields())); + for (Field field : tempFields) + { + if (!ArrayUtils.contains(this.excludeFields, field.getName())) + { + // 单注解 + if (field.isAnnotationPresent(Excel.class)) + { + Excel attr = field.getAnnotation(Excel.class); + if (attr != null && (attr.type() == Type.ALL || attr.type() == type)) + { + field.setAccessible(true); + fields.add(new Object[] { field, attr }); + } + if (Collection.class.isAssignableFrom(field.getType())) + { + subMethod = getSubMethod(field.getName(), clazz); + ParameterizedType pt = (ParameterizedType) field.getGenericType(); + Class subClass = (Class) pt.getActualTypeArguments()[0]; + this.subFields = FieldUtils.getFieldsListWithAnnotation(subClass, Excel.class); + } + } + + // 多注解 + if (field.isAnnotationPresent(Excels.class)) + { + Excels attrs = field.getAnnotation(Excels.class); + Excel[] excels = attrs.value(); + for (Excel attr : excels) + { + if (!ArrayUtils.contains(this.excludeFields, field.getName() + "." + attr.targetAttr()) + && (attr != null && (attr.type() == Type.ALL || attr.type() == type))) + { + field.setAccessible(true); + fields.add(new Object[] { field, attr }); + } + } + } + } + } + return fields; + } + + /** + * 根据注解获取最大行高 + */ + public short getRowHeight() + { + double maxHeight = 0; + for (Object[] os : this.fields) + { + Excel excel = (Excel) os[1]; + maxHeight = Math.max(maxHeight, excel.height()); + } + return (short) (maxHeight * 20); + } + + /** + * 创建一个工作簿 + */ + public void createWorkbook() + { + this.wb = new SXSSFWorkbook(500); + this.sheet = wb.createSheet(); + wb.setSheetName(0, sheetName); + this.styles = createStyles(wb); + } + + /** + * 创建工作表 + * + * @param sheetNo sheet数量 + * @param index 序号 + */ + public void createSheet(int sheetNo, int index) + { + // 设置工作表的名称. + if (sheetNo > 1 && index > 0) + { + this.sheet = wb.createSheet(); + this.createTitle(); + wb.setSheetName(index, sheetName + index); + } + } + + /** + * 获取单元格值 + * + * @param row 获取的行 + * @param column 获取单元格列号 + * @return 单元格值 + */ + public Object getCellValue(Row row, int column) + { + if (row == null) + { + return row; + } + Object val = ""; + try + { + Cell cell = row.getCell(column); + if (StringUtils.isNotNull(cell)) + { + if (cell.getCellType() == CellType.NUMERIC || cell.getCellType() == CellType.FORMULA) + { + val = cell.getNumericCellValue(); + if (DateUtil.isCellDateFormatted(cell)) + { + val = DateUtil.getJavaDate((Double) val); // POI Excel 日期格式转换 + } + else + { + if ((Double) val % 1 != 0) + { + val = new BigDecimal(val.toString()); + } + else + { + val = new DecimalFormat("0").format(val); + } + } + } + else if (cell.getCellType() == CellType.STRING) + { + val = cell.getStringCellValue(); + } + else if (cell.getCellType() == CellType.BOOLEAN) + { + val = cell.getBooleanCellValue(); + } + else if (cell.getCellType() == CellType.ERROR) + { + val = cell.getErrorCellValue(); + } + + } + } + catch (Exception e) + { + return val; + } + return val; + } + + /** + * 判断是否是空行 + * + * @param row 判断的行 + * @return + */ + private boolean isRowEmpty(Row row) + { + if (row == null) + { + return true; + } + for (int i = row.getFirstCellNum(); i < row.getLastCellNum(); i++) + { + Cell cell = row.getCell(i); + if (cell != null && cell.getCellType() != CellType.BLANK) + { + return false; + } + } + return true; + } + + /** + * 获取Excel2003图片 + * + * @param sheet 当前sheet对象 + * @param workbook 工作簿对象 + * @return Map key:图片单元格索引(1_1)String,value:图片流PictureData + */ + public static Map getSheetPictures03(HSSFSheet sheet, HSSFWorkbook workbook) + { + Map sheetIndexPicMap = new HashMap(); + List pictures = workbook.getAllPictures(); + if (!pictures.isEmpty()) + { + for (HSSFShape shape : sheet.getDrawingPatriarch().getChildren()) + { + HSSFClientAnchor anchor = (HSSFClientAnchor) shape.getAnchor(); + if (shape instanceof HSSFPicture) + { + HSSFPicture pic = (HSSFPicture) shape; + int pictureIndex = pic.getPictureIndex() - 1; + HSSFPictureData picData = pictures.get(pictureIndex); + String picIndex = anchor.getRow1() + "_" + anchor.getCol1(); + sheetIndexPicMap.put(picIndex, picData); + } + } + return sheetIndexPicMap; + } + else + { + return sheetIndexPicMap; + } + } + + /** + * 获取Excel2007图片 + * + * @param sheet 当前sheet对象 + * @param workbook 工作簿对象 + * @return Map key:图片单元格索引(1_1)String,value:图片流PictureData + */ + public static Map getSheetPictures07(XSSFSheet sheet, XSSFWorkbook workbook) + { + Map sheetIndexPicMap = new HashMap(); + for (POIXMLDocumentPart dr : sheet.getRelations()) + { + if (dr instanceof XSSFDrawing) + { + XSSFDrawing drawing = (XSSFDrawing) dr; + List shapes = drawing.getShapes(); + for (XSSFShape shape : shapes) + { + if (shape instanceof XSSFPicture) + { + XSSFPicture pic = (XSSFPicture) shape; + XSSFClientAnchor anchor = pic.getPreferredSize(); + CTMarker ctMarker = anchor.getFrom(); + String picIndex = ctMarker.getRow() + "_" + ctMarker.getCol(); + sheetIndexPicMap.put(picIndex, pic.getPictureData()); + } + } + } + } + return sheetIndexPicMap; + } + + /** + * 格式化不同类型的日期对象 + * + * @param dateFormat 日期格式 + * @param val 被格式化的日期对象 + * @return 格式化后的日期字符 + */ + public String parseDateToStr(String dateFormat, Object val) + { + if (val == null) + { + return ""; + } + String str; + if (val instanceof Date) + { + str = DateUtils.parseDateToStr(dateFormat, (Date) val); + } + else if (val instanceof LocalDateTime) + { + str = DateUtils.parseDateToStr(dateFormat, DateUtils.toDate((LocalDateTime) val)); + } + else if (val instanceof LocalDate) + { + str = DateUtils.parseDateToStr(dateFormat, DateUtils.toDate((LocalDate) val)); + } + else + { + str = val.toString(); + } + return str; + } + + /** + * 是否有对象的子列表 + */ + public boolean isSubList() + { + return StringUtils.isNotNull(subFields) && subFields.size() > 0; + } + + /** + * 是否有对象的子列表,集合不为空 + */ + public boolean isSubListValue(T vo) + { + return StringUtils.isNotNull(subFields) && subFields.size() > 0 && StringUtils.isNotNull(getListCellValue(vo)) && getListCellValue(vo).size() > 0; + } + + /** + * 获取集合的值 + */ + public Collection getListCellValue(Object obj) + { + Object value; + try + { + value = subMethod.invoke(obj, new Object[] {}); + } + catch (Exception e) + { + return new ArrayList(); + } + return (Collection) value; + } + + /** + * 获取对象的子列表方法 + * + * @param name 名称 + * @param pojoClass 类对象 + * @return 子列表方法 + */ + public Method getSubMethod(String name, Class pojoClass) + { + StringBuffer getMethodName = new StringBuffer("get"); + getMethodName.append(name.substring(0, 1).toUpperCase()); + getMethodName.append(name.substring(1)); + Method method = null; + try + { + method = pojoClass.getMethod(getMethodName.toString(), new Class[] {}); + } + catch (Exception e) + { + log.error("获取对象异常{}", e.getMessage()); + } + return method; + } +} diff --git a/bs-common/src/main/java/com/bs/common/utils/reflect/ReflectUtils.java b/bs-common/src/main/java/com/bs/common/utils/reflect/ReflectUtils.java new file mode 100644 index 0000000..491d8bf --- /dev/null +++ b/bs-common/src/main/java/com/bs/common/utils/reflect/ReflectUtils.java @@ -0,0 +1,406 @@ +package com.bs.common.utils.reflect; + +import com.bs.common.core.text.Convert; +import com.bs.common.utils.DateUtils; +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.Validate; +import org.apache.poi.ss.usermodel.DateUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.lang.reflect.*; +import java.util.Date; + +/** + * 反射工具类. 提供调用getter/setter方法, 访问私有变量, 调用私有方法, 获取泛型类型Class, 被AOP过的真实类等工具函数. + * + * @author bs + */ +@SuppressWarnings("rawtypes") +public class ReflectUtils +{ + private static final String SETTER_PREFIX = "set"; + + private static final String GETTER_PREFIX = "get"; + + private static final String CGLIB_CLASS_SEPARATOR = "$$"; + + private static Logger logger = LoggerFactory.getLogger(ReflectUtils.class); + + /** + * 调用Getter方法. + * 支持多级,如:对象名.对象名.方法 + */ + @SuppressWarnings("unchecked") + public static E invokeGetter(Object obj, String propertyName) + { + Object object = obj; + for (String name : StringUtils.split(propertyName, ".")) + { + String getterMethodName = GETTER_PREFIX + StringUtils.capitalize(name); + object = invokeMethod(object, getterMethodName, new Class[] {}, new Object[] {}); + } + return (E) object; + } + + /** + * 调用Setter方法, 仅匹配方法名。 + * 支持多级,如:对象名.对象名.方法 + */ + public static void invokeSetter(Object obj, String propertyName, E value) + { + Object object = obj; + String[] names = StringUtils.split(propertyName, "."); + for (int i = 0; i < names.length; i++) + { + if (i < names.length - 1) + { + String getterMethodName = GETTER_PREFIX + StringUtils.capitalize(names[i]); + object = invokeMethod(object, getterMethodName, new Class[] {}, new Object[] {}); + } + else + { + String setterMethodName = SETTER_PREFIX + StringUtils.capitalize(names[i]); + invokeMethodByName(object, setterMethodName, new Object[] { value }); + } + } + } + + /** + * 直接读取对象属性值, 无视private/protected修饰符, 不经过getter函数. + */ + @SuppressWarnings("unchecked") + public static E getFieldValue(final Object obj, final String fieldName) + { + Field field = getAccessibleField(obj, fieldName); + if (field == null) + { + logger.debug("在 [" + obj.getClass() + "] 中,没有找到 [" + fieldName + "] 字段 "); + return null; + } + E result = null; + try + { + result = (E) field.get(obj); + } + catch (IllegalAccessException e) + { + logger.error("不可能抛出的异常{}", e.getMessage()); + } + return result; + } + + /** + * 直接设置对象属性值, 无视private/protected修饰符, 不经过setter函数. + */ + public static void setFieldValue(final Object obj, final String fieldName, final E value) + { + Field field = getAccessibleField(obj, fieldName); + if (field == null) + { + // throw new IllegalArgumentException("在 [" + obj.getClass() + "] 中,没有找到 [" + fieldName + "] 字段 "); + logger.debug("在 [" + obj.getClass() + "] 中,没有找到 [" + fieldName + "] 字段 "); + return; + } + try + { + field.set(obj, value); + } + catch (IllegalAccessException e) + { + logger.error("不可能抛出的异常: {}", e.getMessage()); + } + } + + /** + * 直接调用对象方法, 无视private/protected修饰符. + * 用于一次性调用的情况,否则应使用getAccessibleMethod()函数获得Method后反复调用. + * 同时匹配方法名+参数类型, + */ + @SuppressWarnings("unchecked") + public static E invokeMethod(final Object obj, final String methodName, final Class[] parameterTypes, + final Object[] args) + { + if (obj == null || methodName == null) + { + return null; + } + Method method = getAccessibleMethod(obj, methodName, parameterTypes); + if (method == null) + { + logger.debug("在 [" + obj.getClass() + "] 中,没有找到 [" + methodName + "] 方法 "); + return null; + } + try + { + return (E) method.invoke(obj, args); + } + catch (Exception e) + { + String msg = "method: " + method + ", obj: " + obj + ", args: " + args + ""; + throw convertReflectionExceptionToUnchecked(msg, e); + } + } + + /** + * 直接调用对象方法, 无视private/protected修饰符, + * 用于一次性调用的情况,否则应使用getAccessibleMethodByName()函数获得Method后反复调用. + * 只匹配函数名,如果有多个同名函数调用第一个。 + */ + @SuppressWarnings("unchecked") + public static E invokeMethodByName(final Object obj, final String methodName, final Object[] args) + { + Method method = getAccessibleMethodByName(obj, methodName, args.length); + if (method == null) + { + // 如果为空不报错,直接返回空。 + logger.debug("在 [" + obj.getClass() + "] 中,没有找到 [" + methodName + "] 方法 "); + return null; + } + try + { + // 类型转换(将参数数据类型转换为目标方法参数类型) + Class[] cs = method.getParameterTypes(); + for (int i = 0; i < cs.length; i++) + { + if (args[i] != null && !args[i].getClass().equals(cs[i])) + { + if (cs[i] == String.class) + { + args[i] = Convert.toStr(args[i]); + if (StringUtils.endsWith((String) args[i], ".0")) + { + args[i] = StringUtils.substringBefore((String) args[i], ".0"); + } + } + else if (cs[i] == Integer.class) + { + args[i] = Convert.toInt(args[i]); + } + else if (cs[i] == Long.class) + { + args[i] = Convert.toLong(args[i]); + } + else if (cs[i] == Double.class) + { + args[i] = Convert.toDouble(args[i]); + } + else if (cs[i] == Float.class) + { + args[i] = Convert.toFloat(args[i]); + } + else if (cs[i] == Date.class) + { + if (args[i] instanceof String) + { + args[i] = DateUtils.parseDate(args[i]); + } + else + { + args[i] = DateUtil.getJavaDate((Double) args[i]); + } + } + else if (cs[i] == boolean.class || cs[i] == Boolean.class) + { + args[i] = Convert.toBool(args[i]); + } + } + } + return (E) method.invoke(obj, args); + } + catch (Exception e) + { + String msg = "method: " + method + ", obj: " + obj + ", args: " + args + ""; + throw convertReflectionExceptionToUnchecked(msg, e); + } + } + + /** + * 循环向上转型, 获取对象的DeclaredField, 并强制设置为可访问. + * 如向上转型到Object仍无法找到, 返回null. + */ + public static Field getAccessibleField(final Object obj, final String fieldName) + { + // 为空不报错。直接返回 null + if (obj == null) + { + return null; + } + Validate.notBlank(fieldName, "fieldName can't be blank"); + for (Class superClass = obj.getClass(); superClass != Object.class; superClass = superClass.getSuperclass()) + { + try + { + Field field = superClass.getDeclaredField(fieldName); + makeAccessible(field); + return field; + } + catch (NoSuchFieldException e) + { + continue; + } + } + return null; + } + + /** + * 循环向上转型, 获取对象的DeclaredMethod,并强制设置为可访问. + * 如向上转型到Object仍无法找到, 返回null. + * 匹配函数名+参数类型。 + * 用于方法需要被多次调用的情况. 先使用本函数先取得Method,然后调用Method.invoke(Object obj, Object... args) + */ + public static Method getAccessibleMethod(final Object obj, final String methodName, + final Class... parameterTypes) + { + // 为空不报错。直接返回 null + if (obj == null) + { + return null; + } + Validate.notBlank(methodName, "methodName can't be blank"); + for (Class searchType = obj.getClass(); searchType != Object.class; searchType = searchType.getSuperclass()) + { + try + { + Method method = searchType.getDeclaredMethod(methodName, parameterTypes); + makeAccessible(method); + return method; + } + catch (NoSuchMethodException e) + { + continue; + } + } + return null; + } + + /** + * 循环向上转型, 获取对象的DeclaredMethod,并强制设置为可访问. + * 如向上转型到Object仍无法找到, 返回null. + * 只匹配函数名。 + * 用于方法需要被多次调用的情况. 先使用本函数先取得Method,然后调用Method.invoke(Object obj, Object... args) + */ + public static Method getAccessibleMethodByName(final Object obj, final String methodName, int argsNum) + { + // 为空不报错。直接返回 null + if (obj == null) + { + return null; + } + Validate.notBlank(methodName, "methodName can't be blank"); + for (Class searchType = obj.getClass(); searchType != Object.class; searchType = searchType.getSuperclass()) + { + Method[] methods = searchType.getDeclaredMethods(); + for (Method method : methods) + { + if (method.getName().equals(methodName) && method.getParameterTypes().length == argsNum) + { + makeAccessible(method); + return method; + } + } + } + return null; + } + + /** + * 改变private/protected的方法为public,尽量不调用实际改动的语句,避免JDK的SecurityManager抱怨。 + */ + public static void makeAccessible(Method method) + { + if ((!Modifier.isPublic(method.getModifiers()) || !Modifier.isPublic(method.getDeclaringClass().getModifiers())) + && !method.isAccessible()) + { + method.setAccessible(true); + } + } + + /** + * 改变private/protected的成员变量为public,尽量不调用实际改动的语句,避免JDK的SecurityManager抱怨。 + */ + public static void makeAccessible(Field field) + { + if ((!Modifier.isPublic(field.getModifiers()) || !Modifier.isPublic(field.getDeclaringClass().getModifiers()) + || Modifier.isFinal(field.getModifiers())) && !field.isAccessible()) + { + field.setAccessible(true); + } + } + + /** + * 通过反射, 获得Class定义中声明的泛型参数的类型, 注意泛型必须定义在父类处 + * 如无法找到, 返回Object.class. + */ + @SuppressWarnings("unchecked") + public static Class getClassGenricType(final Class clazz) + { + return getClassGenricType(clazz, 0); + } + + /** + * 通过反射, 获得Class定义中声明的父类的泛型参数的类型. + * 如无法找到, 返回Object.class. + */ + public static Class getClassGenricType(final Class clazz, final int index) + { + Type genType = clazz.getGenericSuperclass(); + + if (!(genType instanceof ParameterizedType)) + { + logger.debug(clazz.getSimpleName() + "'s superclass not ParameterizedType"); + return Object.class; + } + + Type[] params = ((ParameterizedType) genType).getActualTypeArguments(); + + if (index >= params.length || index < 0) + { + logger.debug("Index: " + index + ", Size of " + clazz.getSimpleName() + "'s Parameterized Type: " + + params.length); + return Object.class; + } + if (!(params[index] instanceof Class)) + { + logger.debug(clazz.getSimpleName() + " not set the actual class on superclass generic parameter"); + return Object.class; + } + + return (Class) params[index]; + } + + public static Class getUserClass(Object instance) + { + if (instance == null) + { + throw new RuntimeException("Instance must not be null"); + } + Class clazz = instance.getClass(); + if (clazz != null && clazz.getName().contains(CGLIB_CLASS_SEPARATOR)) + { + Class superClass = clazz.getSuperclass(); + if (superClass != null && !Object.class.equals(superClass)) + { + return superClass; + } + } + return clazz; + + } + + /** + * 将反射时的checked exception转换为unchecked exception. + */ + public static RuntimeException convertReflectionExceptionToUnchecked(String msg, Exception e) + { + if (e instanceof IllegalAccessException || e instanceof IllegalArgumentException + || e instanceof NoSuchMethodException) + { + return new IllegalArgumentException(msg, e); + } + else if (e instanceof InvocationTargetException) + { + return new RuntimeException(msg, ((InvocationTargetException) e).getTargetException()); + } + return new RuntimeException(msg, e); + } +} diff --git a/bs-common/src/main/java/com/bs/common/utils/sign/Base64.java b/bs-common/src/main/java/com/bs/common/utils/sign/Base64.java new file mode 100644 index 0000000..563716d --- /dev/null +++ b/bs-common/src/main/java/com/bs/common/utils/sign/Base64.java @@ -0,0 +1,291 @@ +package com.bs.common.utils.sign; + +/** + * Base64工具类 + * + * @author bs + */ +public final class Base64 +{ + static private final int BASELENGTH = 128; + static private final int LOOKUPLENGTH = 64; + static private final int TWENTYFOURBITGROUP = 24; + static private final int EIGHTBIT = 8; + static private final int SIXTEENBIT = 16; + static private final int FOURBYTE = 4; + static private final int SIGN = -128; + static private final char PAD = '='; + static final private byte[] base64Alphabet = new byte[BASELENGTH]; + static final private char[] lookUpBase64Alphabet = new char[LOOKUPLENGTH]; + + static + { + for (int i = 0; i < BASELENGTH; ++i) + { + base64Alphabet[i] = -1; + } + for (int i = 'Z'; i >= 'A'; i--) + { + base64Alphabet[i] = (byte) (i - 'A'); + } + for (int i = 'z'; i >= 'a'; i--) + { + base64Alphabet[i] = (byte) (i - 'a' + 26); + } + + for (int i = '9'; i >= '0'; i--) + { + base64Alphabet[i] = (byte) (i - '0' + 52); + } + + base64Alphabet['+'] = 62; + base64Alphabet['/'] = 63; + + for (int i = 0; i <= 25; i++) + { + lookUpBase64Alphabet[i] = (char) ('A' + i); + } + + for (int i = 26, j = 0; i <= 51; i++, j++) + { + lookUpBase64Alphabet[i] = (char) ('a' + j); + } + + for (int i = 52, j = 0; i <= 61; i++, j++) + { + lookUpBase64Alphabet[i] = (char) ('0' + j); + } + lookUpBase64Alphabet[62] = (char) '+'; + lookUpBase64Alphabet[63] = (char) '/'; + } + + private static boolean isWhiteSpace(char octect) + { + return (octect == 0x20 || octect == 0xd || octect == 0xa || octect == 0x9); + } + + private static boolean isPad(char octect) + { + return (octect == PAD); + } + + private static boolean isData(char octect) + { + return (octect < BASELENGTH && base64Alphabet[octect] != -1); + } + + /** + * Encodes hex octects into Base64 + * + * @param binaryData Array containing binaryData + * @return Encoded Base64 array + */ + public static String encode(byte[] binaryData) + { + if (binaryData == null) + { + return null; + } + + int lengthDataBits = binaryData.length * EIGHTBIT; + if (lengthDataBits == 0) + { + return ""; + } + + int fewerThan24bits = lengthDataBits % TWENTYFOURBITGROUP; + int numberTriplets = lengthDataBits / TWENTYFOURBITGROUP; + int numberQuartet = fewerThan24bits != 0 ? numberTriplets + 1 : numberTriplets; + char encodedData[] = null; + + encodedData = new char[numberQuartet * 4]; + + byte k = 0, l = 0, b1 = 0, b2 = 0, b3 = 0; + + int encodedIndex = 0; + int dataIndex = 0; + + for (int i = 0; i < numberTriplets; i++) + { + b1 = binaryData[dataIndex++]; + b2 = binaryData[dataIndex++]; + b3 = binaryData[dataIndex++]; + + l = (byte) (b2 & 0x0f); + k = (byte) (b1 & 0x03); + + byte val1 = ((b1 & SIGN) == 0) ? (byte) (b1 >> 2) : (byte) ((b1) >> 2 ^ 0xc0); + byte val2 = ((b2 & SIGN) == 0) ? (byte) (b2 >> 4) : (byte) ((b2) >> 4 ^ 0xf0); + byte val3 = ((b3 & SIGN) == 0) ? (byte) (b3 >> 6) : (byte) ((b3) >> 6 ^ 0xfc); + + encodedData[encodedIndex++] = lookUpBase64Alphabet[val1]; + encodedData[encodedIndex++] = lookUpBase64Alphabet[val2 | (k << 4)]; + encodedData[encodedIndex++] = lookUpBase64Alphabet[(l << 2) | val3]; + encodedData[encodedIndex++] = lookUpBase64Alphabet[b3 & 0x3f]; + } + + // form integral number of 6-bit groups + if (fewerThan24bits == EIGHTBIT) + { + b1 = binaryData[dataIndex]; + k = (byte) (b1 & 0x03); + byte val1 = ((b1 & SIGN) == 0) ? (byte) (b1 >> 2) : (byte) ((b1) >> 2 ^ 0xc0); + encodedData[encodedIndex++] = lookUpBase64Alphabet[val1]; + encodedData[encodedIndex++] = lookUpBase64Alphabet[k << 4]; + encodedData[encodedIndex++] = PAD; + encodedData[encodedIndex++] = PAD; + } + else if (fewerThan24bits == SIXTEENBIT) + { + b1 = binaryData[dataIndex]; + b2 = binaryData[dataIndex + 1]; + l = (byte) (b2 & 0x0f); + k = (byte) (b1 & 0x03); + + byte val1 = ((b1 & SIGN) == 0) ? (byte) (b1 >> 2) : (byte) ((b1) >> 2 ^ 0xc0); + byte val2 = ((b2 & SIGN) == 0) ? (byte) (b2 >> 4) : (byte) ((b2) >> 4 ^ 0xf0); + + encodedData[encodedIndex++] = lookUpBase64Alphabet[val1]; + encodedData[encodedIndex++] = lookUpBase64Alphabet[val2 | (k << 4)]; + encodedData[encodedIndex++] = lookUpBase64Alphabet[l << 2]; + encodedData[encodedIndex++] = PAD; + } + return new String(encodedData); + } + + /** + * Decodes Base64 data into octects + * + * @param encoded string containing Base64 data + * @return Array containind decoded data. + */ + public static byte[] decode(String encoded) + { + if (encoded == null) + { + return null; + } + + char[] base64Data = encoded.toCharArray(); + // remove white spaces + int len = removeWhiteSpace(base64Data); + + if (len % FOURBYTE != 0) + { + return null;// should be divisible by four + } + + int numberQuadruple = (len / FOURBYTE); + + if (numberQuadruple == 0) + { + return new byte[0]; + } + + byte decodedData[] = null; + byte b1 = 0, b2 = 0, b3 = 0, b4 = 0; + char d1 = 0, d2 = 0, d3 = 0, d4 = 0; + + int i = 0; + int encodedIndex = 0; + int dataIndex = 0; + decodedData = new byte[(numberQuadruple) * 3]; + + for (; i < numberQuadruple - 1; i++) + { + + if (!isData((d1 = base64Data[dataIndex++])) || !isData((d2 = base64Data[dataIndex++])) + || !isData((d3 = base64Data[dataIndex++])) || !isData((d4 = base64Data[dataIndex++]))) + { + return null; + } // if found "no data" just return null + + b1 = base64Alphabet[d1]; + b2 = base64Alphabet[d2]; + b3 = base64Alphabet[d3]; + b4 = base64Alphabet[d4]; + + decodedData[encodedIndex++] = (byte) (b1 << 2 | b2 >> 4); + decodedData[encodedIndex++] = (byte) (((b2 & 0xf) << 4) | ((b3 >> 2) & 0xf)); + decodedData[encodedIndex++] = (byte) (b3 << 6 | b4); + } + + if (!isData((d1 = base64Data[dataIndex++])) || !isData((d2 = base64Data[dataIndex++]))) + { + return null;// if found "no data" just return null + } + + b1 = base64Alphabet[d1]; + b2 = base64Alphabet[d2]; + + d3 = base64Data[dataIndex++]; + d4 = base64Data[dataIndex++]; + if (!isData((d3)) || !isData((d4))) + {// Check if they are PAD characters + if (isPad(d3) && isPad(d4)) + { + if ((b2 & 0xf) != 0)// last 4 bits should be zero + { + return null; + } + byte[] tmp = new byte[i * 3 + 1]; + System.arraycopy(decodedData, 0, tmp, 0, i * 3); + tmp[encodedIndex] = (byte) (b1 << 2 | b2 >> 4); + return tmp; + } + else if (!isPad(d3) && isPad(d4)) + { + b3 = base64Alphabet[d3]; + if ((b3 & 0x3) != 0)// last 2 bits should be zero + { + return null; + } + byte[] tmp = new byte[i * 3 + 2]; + System.arraycopy(decodedData, 0, tmp, 0, i * 3); + tmp[encodedIndex++] = (byte) (b1 << 2 | b2 >> 4); + tmp[encodedIndex] = (byte) (((b2 & 0xf) << 4) | ((b3 >> 2) & 0xf)); + return tmp; + } + else + { + return null; + } + } + else + { // No PAD e.g 3cQl + b3 = base64Alphabet[d3]; + b4 = base64Alphabet[d4]; + decodedData[encodedIndex++] = (byte) (b1 << 2 | b2 >> 4); + decodedData[encodedIndex++] = (byte) (((b2 & 0xf) << 4) | ((b3 >> 2) & 0xf)); + decodedData[encodedIndex++] = (byte) (b3 << 6 | b4); + + } + return decodedData; + } + + /** + * remove WhiteSpace from MIME containing encoded Base64 data. + * + * @param data the byte array of base64 data (with WS) + * @return the new length + */ + private static int removeWhiteSpace(char[] data) + { + if (data == null) + { + return 0; + } + + // count characters that's not whitespace + int newSize = 0; + int len = data.length; + for (int i = 0; i < len; i++) + { + if (!isWhiteSpace(data[i])) + { + data[newSize++] = data[i]; + } + } + return newSize; + } +} diff --git a/bs-common/src/main/java/com/bs/common/utils/sign/Md5Utils.java b/bs-common/src/main/java/com/bs/common/utils/sign/Md5Utils.java new file mode 100644 index 0000000..c083a9a --- /dev/null +++ b/bs-common/src/main/java/com/bs/common/utils/sign/Md5Utils.java @@ -0,0 +1,67 @@ +package com.bs.common.utils.sign; + +import java.nio.charset.StandardCharsets; +import java.security.MessageDigest; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Md5加密方法 + * + * @author bs + */ +public class Md5Utils +{ + private static final Logger log = LoggerFactory.getLogger(Md5Utils.class); + + private static byte[] md5(String s) + { + MessageDigest algorithm; + try + { + algorithm = MessageDigest.getInstance("MD5"); + algorithm.reset(); + algorithm.update(s.getBytes("UTF-8")); + byte[] messageDigest = algorithm.digest(); + return messageDigest; + } + catch (Exception e) + { + log.error("MD5 Error...", e); + } + return null; + } + + private static final String toHex(byte hash[]) + { + if (hash == null) + { + return null; + } + StringBuffer buf = new StringBuffer(hash.length * 2); + int i; + + for (i = 0; i < hash.length; i++) + { + if ((hash[i] & 0xff) < 0x10) + { + buf.append("0"); + } + buf.append(Long.toString(hash[i] & 0xff, 16)); + } + return buf.toString(); + } + + public static String hash(String s) + { + try + { + return new String(toHex(md5(s)).getBytes(StandardCharsets.UTF_8), StandardCharsets.UTF_8); + } + catch (Exception e) + { + log.error("not supported charset...{}", e); + return s; + } + } +} diff --git a/bs-common/src/main/java/com/bs/common/utils/spring/SpringUtils.java b/bs-common/src/main/java/com/bs/common/utils/spring/SpringUtils.java new file mode 100644 index 0000000..db9dcf3 --- /dev/null +++ b/bs-common/src/main/java/com/bs/common/utils/spring/SpringUtils.java @@ -0,0 +1,158 @@ +package com.bs.common.utils.spring; + +import org.springframework.aop.framework.AopContext; +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.NoSuchBeanDefinitionException; +import org.springframework.beans.factory.config.BeanFactoryPostProcessor; +import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.stereotype.Component; +import com.bs.common.utils.StringUtils; + +/** + * spring工具类 方便在非spring管理环境中获取bean + * + * @author bs + */ +@Component +public final class SpringUtils implements BeanFactoryPostProcessor, ApplicationContextAware +{ + /** Spring应用上下文环境 */ + private static ConfigurableListableBeanFactory beanFactory; + + private static ApplicationContext applicationContext; + + @Override + public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException + { + SpringUtils.beanFactory = beanFactory; + } + + @Override + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException + { + SpringUtils.applicationContext = applicationContext; + } + + /** + * 获取对象 + * + * @param name + * @return Object 一个以所给名字注册的bean的实例 + * @throws org.springframework.beans.BeansException + * + */ + @SuppressWarnings("unchecked") + public static T getBean(String name) throws BeansException + { + return (T) beanFactory.getBean(name); + } + + /** + * 获取类型为requiredType的对象 + * + * @param clz + * @return + * @throws org.springframework.beans.BeansException + * + */ + public static T getBean(Class clz) throws BeansException + { + T result = (T) beanFactory.getBean(clz); + return result; + } + + /** + * 如果BeanFactory包含一个与所给名称匹配的bean定义,则返回true + * + * @param name + * @return boolean + */ + public static boolean containsBean(String name) + { + return beanFactory.containsBean(name); + } + + /** + * 判断以给定名字注册的bean定义是一个singleton还是一个prototype。 如果与给定名字相应的bean定义没有被找到,将会抛出一个异常(NoSuchBeanDefinitionException) + * + * @param name + * @return boolean + * @throws org.springframework.beans.factory.NoSuchBeanDefinitionException + * + */ + public static boolean isSingleton(String name) throws NoSuchBeanDefinitionException + { + return beanFactory.isSingleton(name); + } + + /** + * @param name + * @return Class 注册对象的类型 + * @throws org.springframework.beans.factory.NoSuchBeanDefinitionException + * + */ + public static Class getType(String name) throws NoSuchBeanDefinitionException + { + return beanFactory.getType(name); + } + + /** + * 如果给定的bean名字在bean定义中有别名,则返回这些别名 + * + * @param name + * @return + * @throws org.springframework.beans.factory.NoSuchBeanDefinitionException + * + */ + public static String[] getAliases(String name) throws NoSuchBeanDefinitionException + { + return beanFactory.getAliases(name); + } + + /** + * 获取aop代理对象 + * + * @param invoker + * @return + */ + @SuppressWarnings("unchecked") + public static T getAopProxy(T invoker) + { + return (T) AopContext.currentProxy(); + } + + /** + * 获取当前的环境配置,无配置返回null + * + * @return 当前的环境配置 + */ + public static String[] getActiveProfiles() + { + return applicationContext.getEnvironment().getActiveProfiles(); + } + + /** + * 获取当前的环境配置,当有多个环境配置时,只获取第一个 + * + * @return 当前的环境配置 + */ + public static String getActiveProfile() + { + final String[] activeProfiles = getActiveProfiles(); + return StringUtils.isNotEmpty(activeProfiles) ? activeProfiles[0] : null; + } + + /** + * 获取配置文件中的值 + * + * @param key 配置文件的key + * @return 当前的配置文件的值 + * + */ + public static String getRequiredProperty(String key) + { + return applicationContext.getEnvironment().getRequiredProperty(key); + } +} diff --git a/bs-common/src/main/java/com/bs/common/utils/sql/SqlUtil.java b/bs-common/src/main/java/com/bs/common/utils/sql/SqlUtil.java new file mode 100644 index 0000000..3f9a5e8 --- /dev/null +++ b/bs-common/src/main/java/com/bs/common/utils/sql/SqlUtil.java @@ -0,0 +1,70 @@ +package com.bs.common.utils.sql; + +import com.bs.common.exception.UtilException; +import com.bs.common.utils.StringUtils; + +/** + * sql操作工具类 + * + * @author bs + */ +public class SqlUtil +{ + /** + * 定义常用的 sql关键字 + */ + public static String SQL_REGEX = "and |extractvalue|updatexml|exec |insert |select |delete |update |drop |count |chr |mid |master |truncate |char |declare |or |+|user()"; + + /** + * 仅支持字母、数字、下划线、空格、逗号、小数点(支持多个字段排序) + */ + public static String SQL_PATTERN = "[a-zA-Z0-9_\\ \\,\\.]+"; + + /** + * 限制orderBy最大长度 + */ + private static final int ORDER_BY_MAX_LENGTH = 500; + + /** + * 检查字符,防止注入绕过 + */ + public static String escapeOrderBySql(String value) + { + if (StringUtils.isNotEmpty(value) && !isValidOrderBySql(value)) + { + throw new UtilException("参数不符合规范,不能进行查询"); + } + if (StringUtils.length(value) > ORDER_BY_MAX_LENGTH) + { + throw new UtilException("参数已超过最大限制,不能进行查询"); + } + return value; + } + + /** + * 验证 order by 语法是否符合规范 + */ + public static boolean isValidOrderBySql(String value) + { + return value.matches(SQL_PATTERN); + } + + /** + * SQL关键字检查 + */ + public static void filterKeyword(String value) + { + if (StringUtils.isEmpty(value)) + { + return; + } + String[] sqlKeywords = StringUtils.split(SQL_REGEX, "\\|"); + for (String sqlKeyword : sqlKeywords) + { + if (StringUtils.indexOfIgnoreCase(value, sqlKeyword) > -1) + { + throw new UtilException("参数存在SQL注入风险"); + } + } + } +} diff --git a/bs-common/src/main/java/com/bs/common/utils/uuid/IdUtils.java b/bs-common/src/main/java/com/bs/common/utils/uuid/IdUtils.java new file mode 100644 index 0000000..7ab5dd0 --- /dev/null +++ b/bs-common/src/main/java/com/bs/common/utils/uuid/IdUtils.java @@ -0,0 +1,49 @@ +package com.bs.common.utils.uuid; + +/** + * ID生成器工具类 + * + * @author bs + */ +public class IdUtils +{ + /** + * 获取随机UUID + * + * @return 随机UUID + */ + public static String randomUUID() + { + return UUID.randomUUID().toString(); + } + + /** + * 简化的UUID,去掉了横线 + * + * @return 简化的UUID,去掉了横线 + */ + public static String simpleUUID() + { + return UUID.randomUUID().toString(true); + } + + /** + * 获取随机UUID,使用性能更好的ThreadLocalRandom生成UUID + * + * @return 随机UUID + */ + public static String fastUUID() + { + return UUID.fastUUID().toString(); + } + + /** + * 简化的UUID,去掉了横线,使用性能更好的ThreadLocalRandom生成UUID + * + * @return 简化的UUID,去掉了横线 + */ + public static String fastSimpleUUID() + { + return UUID.fastUUID().toString(true); + } +} diff --git a/bs-common/src/main/java/com/bs/common/utils/uuid/Seq.java b/bs-common/src/main/java/com/bs/common/utils/uuid/Seq.java new file mode 100644 index 0000000..ff1b954 --- /dev/null +++ b/bs-common/src/main/java/com/bs/common/utils/uuid/Seq.java @@ -0,0 +1,86 @@ +package com.bs.common.utils.uuid; + +import java.util.concurrent.atomic.AtomicInteger; +import com.bs.common.utils.DateUtils; +import com.bs.common.utils.StringUtils; + +/** + * @author bs 序列生成类 + */ +public class Seq +{ + // 通用序列类型 + public static final String commSeqType = "COMMON"; + + // 上传序列类型 + public static final String uploadSeqType = "UPLOAD"; + + // 通用接口序列数 + private static AtomicInteger commSeq = new AtomicInteger(1); + + // 上传接口序列数 + private static AtomicInteger uploadSeq = new AtomicInteger(1); + + // 机器标识 + private static final String machineCode = "A"; + + /** + * 获取通用序列号 + * + * @return 序列值 + */ + public static String getId() + { + return getId(commSeqType); + } + + /** + * 默认16位序列号 yyMMddHHmmss + 一位机器标识 + 3长度循环递增字符串 + * + * @return 序列值 + */ + public static String getId(String type) + { + AtomicInteger atomicInt = commSeq; + if (uploadSeqType.equals(type)) + { + atomicInt = uploadSeq; + } + return getId(atomicInt, 3); + } + + /** + * 通用接口序列号 yyMMddHHmmss + 一位机器标识 + length长度循环递增字符串 + * + * @param atomicInt 序列数 + * @param length 数值长度 + * @return 序列值 + */ + public static String getId(AtomicInteger atomicInt, int length) + { + String result = DateUtils.dateTimeNow(); + result += machineCode; + result += getSeq(atomicInt, length); + return result; + } + + /** + * 序列循环递增字符串[1, 10 的 (length)幂次方), 用0左补齐length位数 + * + * @return 序列值 + */ + private synchronized static String getSeq(AtomicInteger atomicInt, int length) + { + // 先取值再+1 + int value = atomicInt.getAndIncrement(); + + // 如果更新后值>=10 的 (length)幂次方则重置为1 + int maxSeq = (int) Math.pow(10, length); + if (atomicInt.get() >= maxSeq) + { + atomicInt.set(1); + } + // 转字符串,用0左补齐 + return StringUtils.padl(value, length); + } +} diff --git a/bs-common/src/main/java/com/bs/common/utils/uuid/UUID.java b/bs-common/src/main/java/com/bs/common/utils/uuid/UUID.java new file mode 100644 index 0000000..5799b75 --- /dev/null +++ b/bs-common/src/main/java/com/bs/common/utils/uuid/UUID.java @@ -0,0 +1,484 @@ +package com.bs.common.utils.uuid; + +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.security.SecureRandom; +import java.util.Random; +import java.util.concurrent.ThreadLocalRandom; +import com.bs.common.exception.UtilException; + +/** + * 提供通用唯一识别码(universally unique identifier)(UUID)实现 + * + * @author bs + */ +public final class UUID implements java.io.Serializable, Comparable +{ + private static final long serialVersionUID = -1185015143654744140L; + + /** + * SecureRandom 的单例 + * + */ + private static class Holder + { + static final SecureRandom numberGenerator = getSecureRandom(); + } + + /** 此UUID的最高64有效位 */ + private final long mostSigBits; + + /** 此UUID的最低64有效位 */ + private final long leastSigBits; + + /** + * 私有构造 + * + * @param data 数据 + */ + private UUID(byte[] data) + { + long msb = 0; + long lsb = 0; + assert data.length == 16 : "data must be 16 bytes in length"; + for (int i = 0; i < 8; i++) + { + msb = (msb << 8) | (data[i] & 0xff); + } + for (int i = 8; i < 16; i++) + { + lsb = (lsb << 8) | (data[i] & 0xff); + } + this.mostSigBits = msb; + this.leastSigBits = lsb; + } + + /** + * 使用指定的数据构造新的 UUID。 + * + * @param mostSigBits 用于 {@code UUID} 的最高有效 64 位 + * @param leastSigBits 用于 {@code UUID} 的最低有效 64 位 + */ + public UUID(long mostSigBits, long leastSigBits) + { + this.mostSigBits = mostSigBits; + this.leastSigBits = leastSigBits; + } + + /** + * 获取类型 4(伪随机生成的)UUID 的静态工厂。 + * + * @return 随机生成的 {@code UUID} + */ + public static UUID fastUUID() + { + return randomUUID(false); + } + + /** + * 获取类型 4(伪随机生成的)UUID 的静态工厂。 使用加密的强伪随机数生成器生成该 UUID。 + * + * @return 随机生成的 {@code UUID} + */ + public static UUID randomUUID() + { + return randomUUID(true); + } + + /** + * 获取类型 4(伪随机生成的)UUID 的静态工厂。 使用加密的强伪随机数生成器生成该 UUID。 + * + * @param isSecure 是否使用{@link SecureRandom}如果是可以获得更安全的随机码,否则可以得到更好的性能 + * @return 随机生成的 {@code UUID} + */ + public static UUID randomUUID(boolean isSecure) + { + final Random ng = isSecure ? Holder.numberGenerator : getRandom(); + + byte[] randomBytes = new byte[16]; + ng.nextBytes(randomBytes); + randomBytes[6] &= 0x0f; /* clear version */ + randomBytes[6] |= 0x40; /* set to version 4 */ + randomBytes[8] &= 0x3f; /* clear variant */ + randomBytes[8] |= 0x80; /* set to IETF variant */ + return new UUID(randomBytes); + } + + /** + * 根据指定的字节数组获取类型 3(基于名称的)UUID 的静态工厂。 + * + * @param name 用于构造 UUID 的字节数组。 + * + * @return 根据指定数组生成的 {@code UUID} + */ + public static UUID nameUUIDFromBytes(byte[] name) + { + MessageDigest md; + try + { + md = MessageDigest.getInstance("MD5"); + } + catch (NoSuchAlgorithmException nsae) + { + throw new InternalError("MD5 not supported"); + } + byte[] md5Bytes = md.digest(name); + md5Bytes[6] &= 0x0f; /* clear version */ + md5Bytes[6] |= 0x30; /* set to version 3 */ + md5Bytes[8] &= 0x3f; /* clear variant */ + md5Bytes[8] |= 0x80; /* set to IETF variant */ + return new UUID(md5Bytes); + } + + /** + * 根据 {@link #toString()} 方法中描述的字符串标准表示形式创建{@code UUID}。 + * + * @param name 指定 {@code UUID} 字符串 + * @return 具有指定值的 {@code UUID} + * @throws IllegalArgumentException 如果 name 与 {@link #toString} 中描述的字符串表示形式不符抛出此异常 + * + */ + public static UUID fromString(String name) + { + String[] components = name.split("-"); + if (components.length != 5) + { + throw new IllegalArgumentException("Invalid UUID string: " + name); + } + for (int i = 0; i < 5; i++) + { + components[i] = "0x" + components[i]; + } + + long mostSigBits = Long.decode(components[0]).longValue(); + mostSigBits <<= 16; + mostSigBits |= Long.decode(components[1]).longValue(); + mostSigBits <<= 16; + mostSigBits |= Long.decode(components[2]).longValue(); + + long leastSigBits = Long.decode(components[3]).longValue(); + leastSigBits <<= 48; + leastSigBits |= Long.decode(components[4]).longValue(); + + return new UUID(mostSigBits, leastSigBits); + } + + /** + * 返回此 UUID 的 128 位值中的最低有效 64 位。 + * + * @return 此 UUID 的 128 位值中的最低有效 64 位。 + */ + public long getLeastSignificantBits() + { + return leastSigBits; + } + + /** + * 返回此 UUID 的 128 位值中的最高有效 64 位。 + * + * @return 此 UUID 的 128 位值中最高有效 64 位。 + */ + public long getMostSignificantBits() + { + return mostSigBits; + } + + /** + * 与此 {@code UUID} 相关联的版本号. 版本号描述此 {@code UUID} 是如何生成的。 + *

+ * 版本号具有以下含意: + *

    + *
  • 1 基于时间的 UUID + *
  • 2 DCE 安全 UUID + *
  • 3 基于名称的 UUID + *
  • 4 随机生成的 UUID + *
+ * + * @return 此 {@code UUID} 的版本号 + */ + public int version() + { + // Version is bits masked by 0x000000000000F000 in MS long + return (int) ((mostSigBits >> 12) & 0x0f); + } + + /** + * 与此 {@code UUID} 相关联的变体号。变体号描述 {@code UUID} 的布局。 + *

+ * 变体号具有以下含意: + *

    + *
  • 0 为 NCS 向后兼容保留 + *
  • 2 IETF RFC 4122(Leach-Salz), 用于此类 + *
  • 6 保留,微软向后兼容 + *
  • 7 保留供以后定义使用 + *
+ * + * @return 此 {@code UUID} 相关联的变体号 + */ + public int variant() + { + // This field is composed of a varying number of bits. + // 0 - - Reserved for NCS backward compatibility + // 1 0 - The IETF aka Leach-Salz variant (used by this class) + // 1 1 0 Reserved, Microsoft backward compatibility + // 1 1 1 Reserved for future definition. + return (int) ((leastSigBits >>> (64 - (leastSigBits >>> 62))) & (leastSigBits >> 63)); + } + + /** + * 与此 UUID 相关联的时间戳值。 + * + *

+ * 60 位的时间戳值根据此 {@code UUID} 的 time_low、time_mid 和 time_hi 字段构造。
+ * 所得到的时间戳以 100 毫微秒为单位,从 UTC(通用协调时间) 1582 年 10 月 15 日零时开始。 + * + *

+ * 时间戳值仅在在基于时间的 UUID(其 version 类型为 1)中才有意义。
+ * 如果此 {@code UUID} 不是基于时间的 UUID,则此方法抛出 UnsupportedOperationException。 + * + * @throws UnsupportedOperationException 如果此 {@code UUID} 不是 version 为 1 的 UUID。 + */ + public long timestamp() throws UnsupportedOperationException + { + checkTimeBase(); + return (mostSigBits & 0x0FFFL) << 48// + | ((mostSigBits >> 16) & 0x0FFFFL) << 32// + | mostSigBits >>> 32; + } + + /** + * 与此 UUID 相关联的时钟序列值。 + * + *

+ * 14 位的时钟序列值根据此 UUID 的 clock_seq 字段构造。clock_seq 字段用于保证在基于时间的 UUID 中的时间唯一性。 + *

+ * {@code clockSequence} 值仅在基于时间的 UUID(其 version 类型为 1)中才有意义。 如果此 UUID 不是基于时间的 UUID,则此方法抛出 + * UnsupportedOperationException。 + * + * @return 此 {@code UUID} 的时钟序列 + * + * @throws UnsupportedOperationException 如果此 UUID 的 version 不为 1 + */ + public int clockSequence() throws UnsupportedOperationException + { + checkTimeBase(); + return (int) ((leastSigBits & 0x3FFF000000000000L) >>> 48); + } + + /** + * 与此 UUID 相关的节点值。 + * + *

+ * 48 位的节点值根据此 UUID 的 node 字段构造。此字段旨在用于保存机器的 IEEE 802 地址,该地址用于生成此 UUID 以保证空间唯一性。 + *

+ * 节点值仅在基于时间的 UUID(其 version 类型为 1)中才有意义。
+ * 如果此 UUID 不是基于时间的 UUID,则此方法抛出 UnsupportedOperationException。 + * + * @return 此 {@code UUID} 的节点值 + * + * @throws UnsupportedOperationException 如果此 UUID 的 version 不为 1 + */ + public long node() throws UnsupportedOperationException + { + checkTimeBase(); + return leastSigBits & 0x0000FFFFFFFFFFFFL; + } + + /** + * 返回此{@code UUID} 的字符串表现形式。 + * + *

+ * UUID 的字符串表示形式由此 BNF 描述: + * + *

+     * {@code
+     * UUID                   = ----
+     * time_low               = 4*
+     * time_mid               = 2*
+     * time_high_and_version  = 2*
+     * variant_and_sequence   = 2*
+     * node                   = 6*
+     * hexOctet               = 
+     * hexDigit               = [0-9a-fA-F]
+     * }
+     * 
+ * + * + * + * @return 此{@code UUID} 的字符串表现形式 + * @see #toString(boolean) + */ + @Override + public String toString() + { + return toString(false); + } + + /** + * 返回此{@code UUID} 的字符串表现形式。 + * + *

+ * UUID 的字符串表示形式由此 BNF 描述: + * + *

+     * {@code
+     * UUID                   = ----
+     * time_low               = 4*
+     * time_mid               = 2*
+     * time_high_and_version  = 2*
+     * variant_and_sequence   = 2*
+     * node                   = 6*
+     * hexOctet               = 
+     * hexDigit               = [0-9a-fA-F]
+     * }
+     * 
+ * + * + * + * @param isSimple 是否简单模式,简单模式为不带'-'的UUID字符串 + * @return 此{@code UUID} 的字符串表现形式 + */ + public String toString(boolean isSimple) + { + final StringBuilder builder = new StringBuilder(isSimple ? 32 : 36); + // time_low + builder.append(digits(mostSigBits >> 32, 8)); + if (!isSimple) + { + builder.append('-'); + } + // time_mid + builder.append(digits(mostSigBits >> 16, 4)); + if (!isSimple) + { + builder.append('-'); + } + // time_high_and_version + builder.append(digits(mostSigBits, 4)); + if (!isSimple) + { + builder.append('-'); + } + // variant_and_sequence + builder.append(digits(leastSigBits >> 48, 4)); + if (!isSimple) + { + builder.append('-'); + } + // node + builder.append(digits(leastSigBits, 12)); + + return builder.toString(); + } + + /** + * 返回此 UUID 的哈希码。 + * + * @return UUID 的哈希码值。 + */ + @Override + public int hashCode() + { + long hilo = mostSigBits ^ leastSigBits; + return ((int) (hilo >> 32)) ^ (int) hilo; + } + + /** + * 将此对象与指定对象比较。 + *

+ * 当且仅当参数不为 {@code null}、而是一个 UUID 对象、具有与此 UUID 相同的 varriant、包含相同的值(每一位均相同)时,结果才为 {@code true}。 + * + * @param obj 要与之比较的对象 + * + * @return 如果对象相同,则返回 {@code true};否则返回 {@code false} + */ + @Override + public boolean equals(Object obj) + { + if ((null == obj) || (obj.getClass() != UUID.class)) + { + return false; + } + UUID id = (UUID) obj; + return (mostSigBits == id.mostSigBits && leastSigBits == id.leastSigBits); + } + + // Comparison Operations + + /** + * 将此 UUID 与指定的 UUID 比较。 + * + *

+ * 如果两个 UUID 不同,且第一个 UUID 的最高有效字段大于第二个 UUID 的对应字段,则第一个 UUID 大于第二个 UUID。 + * + * @param val 与此 UUID 比较的 UUID + * + * @return 在此 UUID 小于、等于或大于 val 时,分别返回 -1、0 或 1。 + * + */ + @Override + public int compareTo(UUID val) + { + // The ordering is intentionally set up so that the UUIDs + // can simply be numerically compared as two numbers + return (this.mostSigBits < val.mostSigBits ? -1 : // + (this.mostSigBits > val.mostSigBits ? 1 : // + (this.leastSigBits < val.leastSigBits ? -1 : // + (this.leastSigBits > val.leastSigBits ? 1 : // + 0)))); + } + + // ------------------------------------------------------------------------------------------------------------------- + // Private method start + /** + * 返回指定数字对应的hex值 + * + * @param val 值 + * @param digits 位 + * @return 值 + */ + private static String digits(long val, int digits) + { + long hi = 1L << (digits * 4); + return Long.toHexString(hi | (val & (hi - 1))).substring(1); + } + + /** + * 检查是否为time-based版本UUID + */ + private void checkTimeBase() + { + if (version() != 1) + { + throw new UnsupportedOperationException("Not a time-based UUID"); + } + } + + /** + * 获取{@link SecureRandom},类提供加密的强随机数生成器 (RNG) + * + * @return {@link SecureRandom} + */ + public static SecureRandom getSecureRandom() + { + try + { + return SecureRandom.getInstance("SHA1PRNG"); + } + catch (NoSuchAlgorithmException e) + { + throw new UtilException(e); + } + } + + /** + * 获取随机数生成器对象
+ * ThreadLocalRandom是JDK 7之后提供并发产生随机数,能够解决多个线程发生的竞争争夺。 + * + * @return {@link ThreadLocalRandom} + */ + public static ThreadLocalRandom getRandom() + { + return ThreadLocalRandom.current(); + } +} diff --git a/bs-common/src/main/java/com/bs/common/xss/Xss.java b/bs-common/src/main/java/com/bs/common/xss/Xss.java new file mode 100644 index 0000000..f83b572 --- /dev/null +++ b/bs-common/src/main/java/com/bs/common/xss/Xss.java @@ -0,0 +1,27 @@ +package com.bs.common.xss; + +import javax.validation.Constraint; +import javax.validation.Payload; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 自定义xss校验注解 + * + * @author bs + */ +@Retention(RetentionPolicy.RUNTIME) +@Target(value = { ElementType.METHOD, ElementType.FIELD, ElementType.CONSTRUCTOR, ElementType.PARAMETER }) +@Constraint(validatedBy = { XssValidator.class }) +public @interface Xss +{ + String message() + + default "不允许任何脚本运行"; + + Class[] groups() default {}; + + Class[] payload() default {}; +} diff --git a/bs-common/src/main/java/com/bs/common/xss/XssValidator.java b/bs-common/src/main/java/com/bs/common/xss/XssValidator.java new file mode 100644 index 0000000..6fa03e8 --- /dev/null +++ b/bs-common/src/main/java/com/bs/common/xss/XssValidator.java @@ -0,0 +1,34 @@ +package com.bs.common.xss; + +import com.bs.common.utils.StringUtils; +import javax.validation.ConstraintValidator; +import javax.validation.ConstraintValidatorContext; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * 自定义xss校验注解实现 + * + * @author bs + */ +public class XssValidator implements ConstraintValidator +{ + private static final String HTML_PATTERN = "<(\\S*?)[^>]*>.*?|<.*? />"; + + @Override + public boolean isValid(String value, ConstraintValidatorContext constraintValidatorContext) + { + if (StringUtils.isBlank(value)) + { + return true; + } + return !containsHtml(value); + } + + public static boolean containsHtml(String value) + { + Pattern pattern = Pattern.compile(HTML_PATTERN); + Matcher matcher = pattern.matcher(value); + return matcher.matches(); + } +} diff --git a/bs-framework/pom.xml b/bs-framework/pom.xml new file mode 100644 index 0000000..9906a04 --- /dev/null +++ b/bs-framework/pom.xml @@ -0,0 +1,67 @@ + + + + my-base + com.bs + 3.8.6 + + 4.0.0 + + bs-framework + + + framework框架核心 + + + + + com.bs + bs-system + + + + org.springframework.boot + spring-boot-starter-web + + + + + org.springframework.boot + spring-boot-starter-aop + + + + + com.alibaba + druid-spring-boot-starter + + + + + pro.fessional + kaptcha + + + servlet-api + javax.servlet + + + + + + + com.github.oshi + oshi-core + + + + + com.bs + bs-system + + + + + diff --git a/bs-framework/src/main/java/com/bs/framework/aspectj/DataScopeAspect.java b/bs-framework/src/main/java/com/bs/framework/aspectj/DataScopeAspect.java new file mode 100644 index 0000000..54bb01c --- /dev/null +++ b/bs-framework/src/main/java/com/bs/framework/aspectj/DataScopeAspect.java @@ -0,0 +1,175 @@ +package com.bs.framework.aspectj; + +import com.bs.common.annotation.DataScope; +import com.bs.common.core.domain.BaseEntity; +import com.bs.common.core.domain.entity.SysRole; +import com.bs.common.core.domain.entity.SysUser; +import com.bs.common.core.domain.model.LoginUser; +import com.bs.common.core.text.Convert; +import com.bs.common.utils.SecurityUtils; +import com.bs.common.utils.StringUtils; +import com.bs.framework.security.context.PermissionContextHolder; +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Before; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.List; + +/** + * 数据过滤处理 + * + * @author bs + */ +@Aspect +@Component +public class DataScopeAspect +{ + /** + * 全部数据权限 + */ + public static final String DATA_SCOPE_ALL = "1"; + + /** + * 自定数据权限 + */ + public static final String DATA_SCOPE_CUSTOM = "2"; + + /** + * 部门数据权限 + */ + public static final String DATA_SCOPE_DEPT = "3"; + + /** + * 部门及以下数据权限 + */ + public static final String DATA_SCOPE_DEPT_AND_CHILD = "4"; + + /** + * 仅本人数据权限 + */ + public static final String DATA_SCOPE_SELF = "5"; + + /** + * 数据权限过滤关键字 + */ + public static final String DATA_SCOPE = "dataScope"; + + @Before("@annotation(controllerDataScope)") + public void doBefore(JoinPoint point, DataScope controllerDataScope) throws Throwable + { + clearDataScope(point); + handleDataScope(point, controllerDataScope); + } + + protected void handleDataScope(final JoinPoint joinPoint, DataScope controllerDataScope) + { + // 获取当前的用户 + LoginUser loginUser = SecurityUtils.getLoginUser(); + if (StringUtils.isNotNull(loginUser)) + { + SysUser currentUser = loginUser.getUser(); + // 如果是超级管理员,则不过滤数据 + if (StringUtils.isNotNull(currentUser) && !currentUser.isAdmin()) + { + String permission = StringUtils.defaultIfEmpty(controllerDataScope.permission(), PermissionContextHolder.getContext()); + dataScopeFilter(joinPoint, currentUser, controllerDataScope.deptAlias(), + controllerDataScope.userAlias(), permission); + } + } + } + + /** + * 数据范围过滤 + * + * @param joinPoint 切点 + * @param user 用户 + * @param deptAlias 部门别名 + * @param userAlias 用户别名 + * @param permission 权限字符 + */ + public static void dataScopeFilter(JoinPoint joinPoint, SysUser user, String deptAlias, String userAlias, String permission) + { + StringBuilder sqlString = new StringBuilder(); + List conditions = new ArrayList(); + + for (SysRole role : user.getRoles()) + { + String dataScope = role.getDataScope(); + if (!DATA_SCOPE_CUSTOM.equals(dataScope) && conditions.contains(dataScope)) + { + continue; + } + if (StringUtils.isNotEmpty(permission) && StringUtils.isNotEmpty(role.getPermissions()) + && !StringUtils.containsAny(role.getPermissions(), Convert.toStrArray(permission))) + { + continue; + } + if (DATA_SCOPE_ALL.equals(dataScope)) + { + sqlString = new StringBuilder(); + conditions.add(dataScope); + break; + } + else if (DATA_SCOPE_CUSTOM.equals(dataScope)) + { + sqlString.append(StringUtils.format( + " OR {}.dept_id IN ( SELECT dept_id FROM sys_role_dept WHERE role_id = {} ) ", deptAlias, + role.getRoleId())); + } + else if (DATA_SCOPE_DEPT.equals(dataScope)) + { + sqlString.append(StringUtils.format(" OR {}.dept_id = {} ", deptAlias, user.getDeptId())); + } + else if (DATA_SCOPE_DEPT_AND_CHILD.equals(dataScope)) + { + sqlString.append(StringUtils.format( + " OR {}.dept_id IN ( SELECT dept_id FROM sys_dept WHERE dept_id = {} or find_in_set( {} , ancestors ) )", + deptAlias, user.getDeptId(), user.getDeptId())); + } + else if (DATA_SCOPE_SELF.equals(dataScope)) + { + if (StringUtils.isNotBlank(userAlias)) + { + sqlString.append(StringUtils.format(" OR {}.user_id = {} ", userAlias, user.getUserId())); + } + else + { + // 数据权限为仅本人且没有userAlias别名不查询任何数据 + sqlString.append(StringUtils.format(" OR {}.dept_id = 0 ", deptAlias)); + } + } + conditions.add(dataScope); + } + + // 多角色情况下,所有角色都不包含传递过来的权限字符,这个时候sqlString也会为空,所以要限制一下,不查询任何数据 + if (StringUtils.isEmpty(conditions)) + { + sqlString.append(StringUtils.format(" OR {}.dept_id = 0 ", deptAlias)); + } + + if (StringUtils.isNotBlank(sqlString.toString())) + { + Object params = joinPoint.getArgs()[0]; + if (StringUtils.isNotNull(params) && params instanceof BaseEntity) + { + BaseEntity baseEntity = (BaseEntity) params; + baseEntity.getParams().put(DATA_SCOPE, " AND (" + sqlString.substring(4) + ")"); + } + } + } + + /** + * 拼接权限sql前先清空params.dataScope参数防止注入 + */ + private void clearDataScope(final JoinPoint joinPoint) + { + Object params = joinPoint.getArgs()[0]; + if (StringUtils.isNotNull(params) && params instanceof BaseEntity) + { + BaseEntity baseEntity = (BaseEntity) params; + baseEntity.getParams().put(DATA_SCOPE, ""); + } + } +} diff --git a/bs-framework/src/main/java/com/bs/framework/aspectj/DataSourceAspect.java b/bs-framework/src/main/java/com/bs/framework/aspectj/DataSourceAspect.java new file mode 100644 index 0000000..0938299 --- /dev/null +++ b/bs-framework/src/main/java/com/bs/framework/aspectj/DataSourceAspect.java @@ -0,0 +1,72 @@ +package com.bs.framework.aspectj; + +import java.util.Objects; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Pointcut; +import org.aspectj.lang.reflect.MethodSignature; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.core.annotation.AnnotationUtils; +import org.springframework.core.annotation.Order; +import org.springframework.stereotype.Component; +import com.bs.common.annotation.DataSource; +import com.bs.common.utils.StringUtils; +import com.bs.framework.datasource.DynamicDataSourceContextHolder; + +/** + * 多数据源处理 + * + * @author bs + */ +@Aspect +@Order(1) +@Component +public class DataSourceAspect +{ + protected Logger logger = LoggerFactory.getLogger(getClass()); + + @Pointcut("@annotation(com.bs.common.annotation.DataSource)" + + "|| @within(com.bs.common.annotation.DataSource)") + public void dsPointCut() + { + + } + + @Around("dsPointCut()") + public Object around(ProceedingJoinPoint point) throws Throwable + { + DataSource dataSource = getDataSource(point); + + if (StringUtils.isNotNull(dataSource)) + { + DynamicDataSourceContextHolder.setDataSourceType(dataSource.value().name()); + } + + try + { + return point.proceed(); + } + finally + { + // 销毁数据源 在执行方法之后 + DynamicDataSourceContextHolder.clearDataSourceType(); + } + } + + /** + * 获取需要切换的数据源 + */ + public DataSource getDataSource(ProceedingJoinPoint point) + { + MethodSignature signature = (MethodSignature) point.getSignature(); + DataSource dataSource = AnnotationUtils.findAnnotation(signature.getMethod(), DataSource.class); + if (Objects.nonNull(dataSource)) + { + return dataSource; + } + + return AnnotationUtils.findAnnotation(signature.getDeclaringType(), DataSource.class); + } +} diff --git a/bs-framework/src/main/java/com/bs/framework/aspectj/LogAspect.java b/bs-framework/src/main/java/com/bs/framework/aspectj/LogAspect.java new file mode 100644 index 0000000..2646401 --- /dev/null +++ b/bs-framework/src/main/java/com/bs/framework/aspectj/LogAspect.java @@ -0,0 +1,249 @@ +package com.bs.framework.aspectj; + +import java.util.Collection; +import java.util.Map; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import org.apache.commons.lang3.ArrayUtils; +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.annotation.AfterReturning; +import org.aspectj.lang.annotation.AfterThrowing; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Before; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.core.NamedThreadLocal; +import org.springframework.stereotype.Component; +import org.springframework.validation.BindingResult; +import org.springframework.web.multipart.MultipartFile; +import com.alibaba.fastjson2.JSON; +import com.bs.common.annotation.Log; +import com.bs.common.core.domain.model.LoginUser; +import com.bs.common.enums.BusinessStatus; +import com.bs.common.enums.HttpMethod; +import com.bs.common.filter.PropertyPreExcludeFilter; +import com.bs.common.utils.SecurityUtils; +import com.bs.common.utils.ServletUtils; +import com.bs.common.utils.StringUtils; +import com.bs.common.utils.ip.IpUtils; +import com.bs.framework.manager.AsyncManager; +import com.bs.framework.manager.factory.AsyncFactory; +import com.bs.system.domain.SysOperLog; + +/** + * 操作日志记录处理 + * + * @author bs + */ +@Aspect +@Component +public class LogAspect +{ + private static final Logger log = LoggerFactory.getLogger(LogAspect.class); + + /** 排除敏感属性字段 */ + public static final String[] EXCLUDE_PROPERTIES = { "password", "oldPassword", "newPassword", "confirmPassword" }; + + /** 计算操作消耗时间 */ + private static final ThreadLocal TIME_THREADLOCAL = new NamedThreadLocal("Cost Time"); + + /** + * 处理请求前执行 + */ + @Before(value = "@annotation(controllerLog)") + public void boBefore(JoinPoint joinPoint, Log controllerLog) + { + TIME_THREADLOCAL.set(System.currentTimeMillis()); + } + + /** + * 处理完请求后执行 + * + * @param joinPoint 切点 + */ + @AfterReturning(pointcut = "@annotation(controllerLog)", returning = "jsonResult") + public void doAfterReturning(JoinPoint joinPoint, Log controllerLog, Object jsonResult) + { + handleLog(joinPoint, controllerLog, null, jsonResult); + } + + /** + * 拦截异常操作 + * + * @param joinPoint 切点 + * @param e 异常 + */ + @AfterThrowing(value = "@annotation(controllerLog)", throwing = "e") + public void doAfterThrowing(JoinPoint joinPoint, Log controllerLog, Exception e) + { + handleLog(joinPoint, controllerLog, e, null); + } + + protected void handleLog(final JoinPoint joinPoint, Log controllerLog, final Exception e, Object jsonResult) + { + try + { + // 获取当前的用户 + LoginUser loginUser = SecurityUtils.getLoginUser(); + + // *========数据库日志=========*// + SysOperLog operLog = new SysOperLog(); + operLog.setStatus(BusinessStatus.SUCCESS.ordinal()); + // 请求的地址 + String ip = IpUtils.getIpAddr(); + operLog.setOperIp(ip); + operLog.setOperUrl(StringUtils.substring(ServletUtils.getRequest().getRequestURI(), 0, 255)); + if (loginUser != null) + { + operLog.setOperName(loginUser.getUsername()); + } + + if (e != null) + { + operLog.setStatus(BusinessStatus.FAIL.ordinal()); + operLog.setErrorMsg(StringUtils.substring(e.getMessage(), 0, 2000)); + } + // 设置方法名称 + String className = joinPoint.getTarget().getClass().getName(); + String methodName = joinPoint.getSignature().getName(); + operLog.setMethod(className + "." + methodName + "()"); + // 设置请求方式 + operLog.setRequestMethod(ServletUtils.getRequest().getMethod()); + // 处理设置注解上的参数 + getControllerMethodDescription(joinPoint, controllerLog, operLog, jsonResult); + // 设置消耗时间 + operLog.setCostTime(System.currentTimeMillis() - TIME_THREADLOCAL.get()); + // 保存数据库 + AsyncManager.me().execute(AsyncFactory.recordOper(operLog)); + } + catch (Exception exp) + { + // 记录本地异常日志 + log.error("异常信息:{}", exp.getMessage()); + exp.printStackTrace(); + } + finally + { + TIME_THREADLOCAL.remove(); + } + } + + /** + * 获取注解中对方法的描述信息 用于Controller层注解 + * + * @param log 日志 + * @param operLog 操作日志 + * @throws Exception + */ + public void getControllerMethodDescription(JoinPoint joinPoint, Log log, SysOperLog operLog, Object jsonResult) throws Exception + { + // 设置action动作 + operLog.setBusinessType(log.businessType().ordinal()); + // 设置标题 + operLog.setTitle(log.title()); + // 设置操作人类别 + operLog.setOperatorType(log.operatorType().ordinal()); + // 是否需要保存request,参数和值 + if (log.isSaveRequestData()) + { + // 获取参数的信息,传入到数据库中。 + setRequestValue(joinPoint, operLog, log.excludeParamNames()); + } + // 是否需要保存response,参数和值 + if (log.isSaveResponseData() && StringUtils.isNotNull(jsonResult)) + { + operLog.setJsonResult(StringUtils.substring(JSON.toJSONString(jsonResult), 0, 2000)); + } + } + + /** + * 获取请求的参数,放到log中 + * + * @param operLog 操作日志 + * @throws Exception 异常 + */ + private void setRequestValue(JoinPoint joinPoint, SysOperLog operLog, String[] excludeParamNames) throws Exception + { + Map paramsMap = ServletUtils.getParamMap(ServletUtils.getRequest()); + String requestMethod = operLog.getRequestMethod(); + if (StringUtils.isEmpty(paramsMap) + && (HttpMethod.PUT.name().equals(requestMethod) || HttpMethod.POST.name().equals(requestMethod))) + { + String params = argsArrayToString(joinPoint.getArgs(), excludeParamNames); + operLog.setOperParam(StringUtils.substring(params, 0, 2000)); + } + else + { + operLog.setOperParam(StringUtils.substring(JSON.toJSONString(paramsMap, excludePropertyPreFilter(excludeParamNames)), 0, 2000)); + } + } + + /** + * 参数拼装 + */ + private String argsArrayToString(Object[] paramsArray, String[] excludeParamNames) + { + String params = ""; + if (paramsArray != null && paramsArray.length > 0) + { + for (Object o : paramsArray) + { + if (StringUtils.isNotNull(o) && !isFilterObject(o)) + { + try + { + String jsonObj = JSON.toJSONString(o, excludePropertyPreFilter(excludeParamNames)); + params += jsonObj.toString() + " "; + } + catch (Exception e) + { + } + } + } + } + return params.trim(); + } + + /** + * 忽略敏感属性 + */ + public PropertyPreExcludeFilter excludePropertyPreFilter(String[] excludeParamNames) + { + return new PropertyPreExcludeFilter().addExcludes(ArrayUtils.addAll(EXCLUDE_PROPERTIES, excludeParamNames)); + } + + /** + * 判断是否需要过滤的对象。 + * + * @param o 对象信息。 + * @return 如果是需要过滤的对象,则返回true;否则返回false。 + */ + @SuppressWarnings("rawtypes") + public boolean isFilterObject(final Object o) + { + Class clazz = o.getClass(); + if (clazz.isArray()) + { + return clazz.getComponentType().isAssignableFrom(MultipartFile.class); + } + else if (Collection.class.isAssignableFrom(clazz)) + { + Collection collection = (Collection) o; + for (Object value : collection) + { + return value instanceof MultipartFile; + } + } + else if (Map.class.isAssignableFrom(clazz)) + { + Map map = (Map) o; + for (Object value : map.entrySet()) + { + Map.Entry entry = (Map.Entry) value; + return entry.getValue() instanceof MultipartFile; + } + } + return o instanceof MultipartFile || o instanceof HttpServletRequest || o instanceof HttpServletResponse + || o instanceof BindingResult; + } +} diff --git a/bs-framework/src/main/java/com/bs/framework/aspectj/RateLimiterAspect.java b/bs-framework/src/main/java/com/bs/framework/aspectj/RateLimiterAspect.java new file mode 100644 index 0000000..09a59e9 --- /dev/null +++ b/bs-framework/src/main/java/com/bs/framework/aspectj/RateLimiterAspect.java @@ -0,0 +1,89 @@ +package com.bs.framework.aspectj; + +import java.lang.reflect.Method; +import java.util.Collections; +import java.util.List; +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Before; +import org.aspectj.lang.reflect.MethodSignature; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.core.script.RedisScript; +import org.springframework.stereotype.Component; +import com.bs.common.annotation.RateLimiter; +import com.bs.common.enums.LimitType; +import com.bs.common.exception.ServiceException; +import com.bs.common.utils.StringUtils; +import com.bs.common.utils.ip.IpUtils; + +/** + * 限流处理 + * + * @author bs + */ +@Aspect +@Component +public class RateLimiterAspect +{ + private static final Logger log = LoggerFactory.getLogger(RateLimiterAspect.class); + + private RedisTemplate redisTemplate; + + private RedisScript limitScript; + + @Autowired + public void setRedisTemplate1(RedisTemplate redisTemplate) + { + this.redisTemplate = redisTemplate; + } + + @Autowired + public void setLimitScript(RedisScript limitScript) + { + this.limitScript = limitScript; + } + + @Before("@annotation(rateLimiter)") + public void doBefore(JoinPoint point, RateLimiter rateLimiter) throws Throwable + { + int time = rateLimiter.time(); + int count = rateLimiter.count(); + + String combineKey = getCombineKey(rateLimiter, point); + List keys = Collections.singletonList(combineKey); + try + { + Long number = redisTemplate.execute(limitScript, keys, count, time); + if (StringUtils.isNull(number) || number.intValue() > count) + { + throw new ServiceException("访问过于频繁,请稍候再试"); + } + log.info("限制请求'{}',当前请求'{}',缓存key'{}'", count, number.intValue(), combineKey); + } + catch (ServiceException e) + { + throw e; + } + catch (Exception e) + { + throw new RuntimeException("服务器限流异常,请稍候再试"); + } + } + + public String getCombineKey(RateLimiter rateLimiter, JoinPoint point) + { + StringBuffer stringBuffer = new StringBuffer(rateLimiter.key()); + if (rateLimiter.limitType() == LimitType.IP) + { + stringBuffer.append(IpUtils.getIpAddr()).append("-"); + } + MethodSignature signature = (MethodSignature) point.getSignature(); + Method method = signature.getMethod(); + Class targetClass = method.getDeclaringClass(); + stringBuffer.append(targetClass.getName()).append("-").append(method.getName()); + return stringBuffer.toString(); + } +} diff --git a/bs-framework/src/main/java/com/bs/framework/config/ApplicationConfig.java b/bs-framework/src/main/java/com/bs/framework/config/ApplicationConfig.java new file mode 100644 index 0000000..1f37eb1 --- /dev/null +++ b/bs-framework/src/main/java/com/bs/framework/config/ApplicationConfig.java @@ -0,0 +1,30 @@ +package com.bs.framework.config; + +import java.util.TimeZone; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.EnableAspectJAutoProxy; + +/** + * 程序注解配置 + * + * @author bs + */ +@Configuration +// 表示通过aop框架暴露该代理对象,AopContext能够访问 +@EnableAspectJAutoProxy(exposeProxy = true) +// 指定要扫描的Mapper类的包的路径 +@MapperScan("com.bs.**.mapper") +public class ApplicationConfig +{ + /** + * 时区配置 + */ + @Bean + public Jackson2ObjectMapperBuilderCustomizer jacksonObjectMapperCustomization() + { + return jacksonObjectMapperBuilder -> jacksonObjectMapperBuilder.timeZone(TimeZone.getDefault()); + } +} diff --git a/bs-framework/src/main/java/com/bs/framework/config/CaptchaConfig.java b/bs-framework/src/main/java/com/bs/framework/config/CaptchaConfig.java new file mode 100644 index 0000000..761f949 --- /dev/null +++ b/bs-framework/src/main/java/com/bs/framework/config/CaptchaConfig.java @@ -0,0 +1,88 @@ +package com.bs.framework.config; + +import java.util.Properties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import com.google.code.kaptcha.impl.DefaultKaptcha; +import com.google.code.kaptcha.util.Config; +import static com.google.code.kaptcha.Constants.*; + +/** + * 验证码配置 + * + * @author bs + */ +@Configuration +public class CaptchaConfig +{ + @Bean(name = "captchaProducer") + public DefaultKaptcha getKaptchaBean() + { + DefaultKaptcha defaultKaptcha = new DefaultKaptcha(); + Properties properties = new Properties(); + // 是否有边框 默认为true 我们可以自己设置yes,no + properties.setProperty(KAPTCHA_BORDER, "no"); + // 验证码文本字符颜色 默认为Color.BLACK + properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_COLOR, "blue"); + // 验证码图片宽度 默认为200 + properties.setProperty(KAPTCHA_IMAGE_WIDTH, "160"); + // 验证码图片高度 默认为50 + properties.setProperty(KAPTCHA_IMAGE_HEIGHT, "60"); + properties.setProperty(KAPTCHA_TEXTPRODUCER_CHAR_SPACE, "10"); + // 验证码文本字符大小 默认为40 + properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_SIZE, "38"); + // KAPTCHA_SESSION_KEY + properties.setProperty(KAPTCHA_SESSION_CONFIG_KEY, "kaptchaCode"); + // 验证码文本字符长度 默认为5 + properties.setProperty(KAPTCHA_TEXTPRODUCER_CHAR_LENGTH, "4"); + // 验证码文本字体样式 默认为new Font("Arial", 1, fontSize), new Font("Courier", 1, fontSize) + properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_NAMES, "Arial,Courier"); + // 图片样式 水纹com.google.code.kaptcha.impl.WaterRipple 鱼眼com.google.code.kaptcha.impl.FishEyeGimpy 阴影com.google.code.kaptcha.impl.ShadowGimpy + //properties.setProperty(KAPTCHA_OBSCURIFICATOR_IMPL, "com.google.code.kaptcha.impl.ShadowGimpy"); + properties.setProperty(KAPTCHA_NOISE_IMPL, "com.google.code.kaptcha.impl.NoNoise"); + properties.setProperty(KAPTCHA_BACKGROUND_CLR_FROM, "white"); + // + properties.setProperty(KAPTCHA_TEXTPRODUCER_CHAR_STRING,"0123456789"); + Config config = new Config(properties); + defaultKaptcha.setConfig(config); + return defaultKaptcha; + } + + @Bean(name = "captchaProducerMath") + public DefaultKaptcha getKaptchaBeanMath() + { + DefaultKaptcha defaultKaptcha = new DefaultKaptcha(); + Properties properties = new Properties(); + // 是否有边框 默认为true 我们可以自己设置yes,no + properties.setProperty(KAPTCHA_BORDER, "yes"); + // 边框颜色 默认为Color.BLACK + properties.setProperty(KAPTCHA_BORDER_COLOR, "105,179,90"); + // 验证码文本字符颜色 默认为Color.BLACK + properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_COLOR, "blue"); + // 验证码图片宽度 默认为200 + properties.setProperty(KAPTCHA_IMAGE_WIDTH, "160"); + // 验证码图片高度 默认为50 + properties.setProperty(KAPTCHA_IMAGE_HEIGHT, "60"); + // 验证码文本字符大小 默认为40 + properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_SIZE, "35"); + // KAPTCHA_SESSION_KEY + properties.setProperty(KAPTCHA_SESSION_CONFIG_KEY, "kaptchaCodeMath"); + // 验证码文本生成器 + properties.setProperty(KAPTCHA_TEXTPRODUCER_IMPL, "com.bs.framework.config.KaptchaTextCreator"); + // 验证码文本字符间距 默认为2 + properties.setProperty(KAPTCHA_TEXTPRODUCER_CHAR_SPACE, "3"); + // 验证码文本字符长度 默认为5 + properties.setProperty(KAPTCHA_TEXTPRODUCER_CHAR_LENGTH, "6"); + // 验证码文本字体样式 默认为new Font("Arial", 1, fontSize), new Font("Courier", 1, fontSize) + properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_NAMES, "Arial,Courier"); + // 验证码噪点颜色 默认为Color.BLACK + properties.setProperty(KAPTCHA_NOISE_COLOR, "white"); + // 干扰实现类 + properties.setProperty(KAPTCHA_NOISE_IMPL, "com.google.code.kaptcha.impl.NoNoise"); + // 图片样式 水纹com.google.code.kaptcha.impl.WaterRipple 鱼眼com.google.code.kaptcha.impl.FishEyeGimpy 阴影com.google.code.kaptcha.impl.ShadowGimpy + properties.setProperty(KAPTCHA_OBSCURIFICATOR_IMPL, "com.google.code.kaptcha.impl.ShadowGimpy"); + Config config = new Config(properties); + defaultKaptcha.setConfig(config); + return defaultKaptcha; + } +} diff --git a/bs-framework/src/main/java/com/bs/framework/config/DruidConfig.java b/bs-framework/src/main/java/com/bs/framework/config/DruidConfig.java new file mode 100644 index 0000000..c1b3d52 --- /dev/null +++ b/bs-framework/src/main/java/com/bs/framework/config/DruidConfig.java @@ -0,0 +1,126 @@ +package com.bs.framework.config; + +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; +import javax.servlet.Filter; +import javax.servlet.FilterChain; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.sql.DataSource; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.boot.web.servlet.FilterRegistrationBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Primary; +import com.alibaba.druid.pool.DruidDataSource; +import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceBuilder; +import com.alibaba.druid.spring.boot.autoconfigure.properties.DruidStatProperties; +import com.alibaba.druid.util.Utils; +import com.bs.common.enums.DataSourceType; +import com.bs.common.utils.spring.SpringUtils; +import com.bs.framework.config.properties.DruidProperties; +import com.bs.framework.datasource.DynamicDataSource; + +/** + * druid 配置多数据源 + * + * @author bs + */ +@Configuration +public class DruidConfig +{ + @Bean + @ConfigurationProperties("spring.datasource.druid.master") + public DataSource masterDataSource(DruidProperties druidProperties) + { + DruidDataSource dataSource = DruidDataSourceBuilder.create().build(); + return druidProperties.dataSource(dataSource); + } + + @Bean + @ConfigurationProperties("spring.datasource.druid.slave") + @ConditionalOnProperty(prefix = "spring.datasource.druid.slave", name = "enabled", havingValue = "true") + public DataSource slaveDataSource(DruidProperties druidProperties) + { + DruidDataSource dataSource = DruidDataSourceBuilder.create().build(); + return druidProperties.dataSource(dataSource); + } + + @Bean(name = "dynamicDataSource") + @Primary + public DynamicDataSource dataSource(DataSource masterDataSource) + { + Map targetDataSources = new HashMap<>(); + targetDataSources.put(DataSourceType.MASTER.name(), masterDataSource); + setDataSource(targetDataSources, DataSourceType.SLAVE.name(), "slaveDataSource"); + return new DynamicDataSource(masterDataSource, targetDataSources); + } + + /** + * 设置数据源 + * + * @param targetDataSources 备选数据源集合 + * @param sourceName 数据源名称 + * @param beanName bean名称 + */ + public void setDataSource(Map targetDataSources, String sourceName, String beanName) + { + try + { + DataSource dataSource = SpringUtils.getBean(beanName); + targetDataSources.put(sourceName, dataSource); + } + catch (Exception e) + { + } + } + + /** + * 去除监控页面底部的广告 + */ + @SuppressWarnings({ "rawtypes", "unchecked" }) + @Bean + @ConditionalOnProperty(name = "spring.datasource.druid.statViewServlet.enabled", havingValue = "true") + public FilterRegistrationBean removeDruidFilterRegistrationBean(DruidStatProperties properties) + { + // 获取web监控页面的参数 + DruidStatProperties.StatViewServlet config = properties.getStatViewServlet(); + // 提取common.js的配置路径 + String pattern = config.getUrlPattern() != null ? config.getUrlPattern() : "/druid/*"; + String commonJsPattern = pattern.replaceAll("\\*", "js/common.js"); + final String filePath = "support/http/resources/js/common.js"; + // 创建filter进行过滤 + Filter filter = new Filter() + { + @Override + public void init(javax.servlet.FilterConfig filterConfig) throws ServletException + { + } + @Override + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) + throws IOException, ServletException + { + chain.doFilter(request, response); + // 重置缓冲区,响应头不会被重置 + response.resetBuffer(); + // 获取common.js + String text = Utils.readFromResource(filePath); + // 正则替换banner, 除去底部的广告信息 + text = text.replaceAll("
", ""); + text = text.replaceAll("powered.*?shrek.wang", ""); + response.getWriter().write(text); + } + @Override + public void destroy() + { + } + }; + FilterRegistrationBean registrationBean = new FilterRegistrationBean(); + registrationBean.setFilter(filter); + registrationBean.addUrlPatterns(commonJsPattern); + return registrationBean; + } +} diff --git a/bs-framework/src/main/java/com/bs/framework/config/FastJson2JsonRedisSerializer.java b/bs-framework/src/main/java/com/bs/framework/config/FastJson2JsonRedisSerializer.java new file mode 100644 index 0000000..0220c47 --- /dev/null +++ b/bs-framework/src/main/java/com/bs/framework/config/FastJson2JsonRedisSerializer.java @@ -0,0 +1,48 @@ +package com.bs.framework.config; + +import java.nio.charset.Charset; +import org.springframework.data.redis.serializer.RedisSerializer; +import org.springframework.data.redis.serializer.SerializationException; +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONReader; +import com.alibaba.fastjson2.JSONWriter; + +/** + * Redis使用FastJson序列化 + * + * @author bs + */ +public class FastJson2JsonRedisSerializer implements RedisSerializer +{ + public static final Charset DEFAULT_CHARSET = Charset.forName("UTF-8"); + + private Class clazz; + + public FastJson2JsonRedisSerializer(Class clazz) + { + super(); + this.clazz = clazz; + } + + @Override + public byte[] serialize(T t) throws SerializationException + { + if (t == null) + { + return new byte[0]; + } + return JSON.toJSONString(t, JSONWriter.Feature.WriteClassName).getBytes(DEFAULT_CHARSET); + } + + @Override + public T deserialize(byte[] bytes) throws SerializationException + { + if (bytes == null || bytes.length <= 0) + { + return null; + } + String str = new String(bytes, DEFAULT_CHARSET); + + return JSON.parseObject(str, clazz, JSONReader.Feature.SupportAutoType); + } +} diff --git a/bs-framework/src/main/java/com/bs/framework/config/FilterConfig.java b/bs-framework/src/main/java/com/bs/framework/config/FilterConfig.java new file mode 100644 index 0000000..2a2625a --- /dev/null +++ b/bs-framework/src/main/java/com/bs/framework/config/FilterConfig.java @@ -0,0 +1,77 @@ +package com.bs.framework.config; + +import java.util.HashMap; +import java.util.Map; +import javax.servlet.DispatcherType; + +import com.bs.common.filter.PortFilter; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.boot.web.servlet.FilterRegistrationBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import com.bs.common.filter.RepeatableFilter; +import com.bs.common.filter.XssFilter; +import com.bs.common.utils.StringUtils; + +/** + * Filter配置 + * + * @author bs + */ +@Configuration +public class FilterConfig +{ + @Value("${xss.excludes}") + private String excludes; + + @Value("${xss.urlPatterns}") + private String urlPatterns; + + @SuppressWarnings({ "rawtypes", "unchecked" }) + @Bean + @ConditionalOnProperty(value = "xss.enabled", havingValue = "true") + public FilterRegistrationBean xssFilterRegistration() + { + FilterRegistrationBean registration = new FilterRegistrationBean(); + registration.setDispatcherTypes(DispatcherType.REQUEST); + registration.setFilter(new XssFilter()); + registration.addUrlPatterns(StringUtils.split(urlPatterns, ",")); + registration.setName("xssFilter"); + registration.setOrder(FilterRegistrationBean.HIGHEST_PRECEDENCE); + Map initParameters = new HashMap(); + initParameters.put("excludes", excludes); + registration.setInitParameters(initParameters); + return registration; + } + + @SuppressWarnings({ "rawtypes", "unchecked" }) + @Bean + public FilterRegistrationBean someFilterRegistration() + { + FilterRegistrationBean registration = new FilterRegistrationBean(); + registration.setFilter(new RepeatableFilter()); + registration.addUrlPatterns("/*"); + registration.setName("repeatableFilter"); + registration.setOrder(FilterRegistrationBean.LOWEST_PRECEDENCE); + return registration; + } + + + + /** + * 接口拦截器 + * @return + */ + @Bean + public FilterRegistrationBean portRegistration() + { + FilterRegistrationBean registration = new FilterRegistrationBean(); + registration.setFilter(new PortFilter()); + registration.addUrlPatterns("/*"); + registration.setName("portFilter"); + registration.setOrder(1); + return registration; + } + +} diff --git a/bs-framework/src/main/java/com/bs/framework/config/KaptchaTextCreator.java b/bs-framework/src/main/java/com/bs/framework/config/KaptchaTextCreator.java new file mode 100644 index 0000000..cc36897 --- /dev/null +++ b/bs-framework/src/main/java/com/bs/framework/config/KaptchaTextCreator.java @@ -0,0 +1,68 @@ +package com.bs.framework.config; + +import java.util.Random; +import com.google.code.kaptcha.text.impl.DefaultTextCreator; + +/** + * 验证码文本生成器 + * + * @author bs + */ +public class KaptchaTextCreator extends DefaultTextCreator +{ + private static final String[] CNUMBERS = "0,1,2,3,4,5,6,7,8,9,10".split(","); + + @Override + public String getText() + { + Integer result = 0; + Random random = new Random(); + int x = random.nextInt(10); + int y = random.nextInt(10); + StringBuilder suChinese = new StringBuilder(); + int randomoperands = random.nextInt(3); + if (randomoperands == 0) + { + result = x * y; + suChinese.append(CNUMBERS[x]); + suChinese.append("*"); + suChinese.append(CNUMBERS[y]); + } + else if (randomoperands == 1) + { + if ((x != 0) && y % x == 0) + { + result = y / x; + suChinese.append(CNUMBERS[y]); + suChinese.append("/"); + suChinese.append(CNUMBERS[x]); + } + else + { + result = x + y; + suChinese.append(CNUMBERS[x]); + suChinese.append("+"); + suChinese.append(CNUMBERS[y]); + } + } + else + { + if (x >= y) + { + result = x - y; + suChinese.append(CNUMBERS[x]); + suChinese.append("-"); + suChinese.append(CNUMBERS[y]); + } + else + { + result = y - x; + suChinese.append(CNUMBERS[y]); + suChinese.append("-"); + suChinese.append(CNUMBERS[x]); + } + } + suChinese.append("=?@" + result); + return suChinese.toString(); + } +} diff --git a/bs-framework/src/main/java/com/bs/framework/config/MyTenantLineHandlerImpl.java b/bs-framework/src/main/java/com/bs/framework/config/MyTenantLineHandlerImpl.java new file mode 100644 index 0000000..b7c5813 --- /dev/null +++ b/bs-framework/src/main/java/com/bs/framework/config/MyTenantLineHandlerImpl.java @@ -0,0 +1,81 @@ +package com.bs.framework.config; + +import com.baomidou.mybatisplus.extension.plugins.handler.TenantLineHandler; +import com.bs.common.config.TenantConfigProperties; +import com.bs.common.utils.SecurityUtils; +import lombok.extern.slf4j.Slf4j; +import net.sf.jsqlparser.expression.Expression; +import net.sf.jsqlparser.expression.LongValue; + +/** + * @author: gfk + * @create: 2023/3/3 + * @Description: + * @FileName: MyTenantLineHandlerImpl + * @History: + * @自定义内容: + */ + +/** + * 租户处理器 + * + * @author luohq + * @date 2022-08-07 12:31 + */ +@Slf4j +public class MyTenantLineHandlerImpl implements TenantLineHandler { + /** + * 租户ID请求头名称 + */ + public static final String TENANT_ID_HEADER = "X-TENANT-ID"; + /** + * 默认租户ID + */ + public static final Long DEFAULT_TENANT_ID = 1L; + + private final TenantConfigProperties tenantConfigProperties; + + public MyTenantLineHandlerImpl(TenantConfigProperties tenantConfigProperties) { + this.tenantConfigProperties = tenantConfigProperties; + } + @Override + public Expression getTenantId() { + Long tenantId = SecurityUtils.getTenantId(); +/* String tenantId = Optional.ofNullable(null) + .map(String::valueOf) + //.orElseThrow(() -> new RuntimeException("解析请求头中的X-TENANT-ID失败!")); + .orElseGet(() -> { + log.info("解析请求头中的X-TENANT-ID失败 - 使用默认租户ID: {}", DEFAULT_TENANT_ID); + return "1"; + });*/ + //return new LongValue(tenantId); + if(tenantId==null){ + return new LongValue(0); + } + return new LongValue(tenantId); + + } + + @Override + public String getTenantIdColumn() { + //默认tenant_id + return "tenant_id"; + } + + @Override + public boolean ignoreTable(String tableName) { + //是否忽略此table的租户处理逻辑 + if(SecurityUtils.getTenantId()==null){ + return true; + } + // 1.是否跳过租户对该表对操作 + if (tenantConfigProperties.getTenantSkip()) { + return true; + } + if(tenantConfigProperties.getOpenTenant()){ + return tenantConfigProperties.getNoIgnoreTables().contains(tableName); + } + return true; + + } +} diff --git a/bs-framework/src/main/java/com/bs/framework/config/MybatisPlusConfig.java b/bs-framework/src/main/java/com/bs/framework/config/MybatisPlusConfig.java new file mode 100644 index 0000000..fb2f075 --- /dev/null +++ b/bs-framework/src/main/java/com/bs/framework/config/MybatisPlusConfig.java @@ -0,0 +1,75 @@ +package com.bs.framework.config; + +import com.baomidou.mybatisplus.annotation.DbType; +import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; +import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; +import com.baomidou.mybatisplus.extension.plugins.inner.BlockAttackInnerInterceptor; +import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor; +import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; +import com.baomidou.mybatisplus.extension.plugins.inner.TenantLineInnerInterceptor; +import com.bs.common.config.TenantConfigProperties; +import com.bs.common.mybatis.handler.DefaultDBFieldHandler; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +/** + * Mybatis Plus 配置 + * + * @author ruoyi + */ +@EnableTransactionManagement(proxyTargetClass = true) +@Configuration +public class MybatisPlusConfig +{ + @Bean + public MybatisPlusInterceptor mybatisPlusInterceptor(TenantConfigProperties tenantConfigProperties) + { + MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); + //启用多租户插件 + interceptor.addInnerInterceptor(new TenantLineInnerInterceptor(new MyTenantLineHandlerImpl(tenantConfigProperties))); + // 分页插件 + interceptor.addInnerInterceptor(paginationInnerInterceptor()); + // 乐观锁插件 + interceptor.addInnerInterceptor(optimisticLockerInnerInterceptor()); + // 阻断插件 + interceptor.addInnerInterceptor(blockAttackInnerInterceptor()); + + return interceptor; + } + + /** + * 分页插件,自动识别数据库类型 https://baomidou.com/guide/interceptor-pagination.html + */ + public PaginationInnerInterceptor paginationInnerInterceptor() + { + PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor(); + // 设置数据库类型为mysql + paginationInnerInterceptor.setDbType(DbType.MYSQL); + // 设置最大单页限制数量,默认 500 条,-1 不受限制 + paginationInnerInterceptor.setMaxLimit(-1L); + return paginationInnerInterceptor; + } + + /** + * 乐观锁插件 https://baomidou.com/guide/interceptor-optimistic-locker.html + */ + public OptimisticLockerInnerInterceptor optimisticLockerInnerInterceptor() + { + return new OptimisticLockerInnerInterceptor(); + } + + /** + * 如果是对全表的删除或更新操作,就会终止该操作 https://baomidou.com/guide/interceptor-block-attack.html + */ + public BlockAttackInnerInterceptor blockAttackInnerInterceptor() + { + return new BlockAttackInnerInterceptor(); + } + + @Bean + public MetaObjectHandler defaultMetaObjectHandler(){ + // 自动填充参数类 + return new DefaultDBFieldHandler(); + } +} diff --git a/bs-framework/src/main/java/com/bs/framework/config/RedisConfig.java b/bs-framework/src/main/java/com/bs/framework/config/RedisConfig.java new file mode 100644 index 0000000..c8d6411 --- /dev/null +++ b/bs-framework/src/main/java/com/bs/framework/config/RedisConfig.java @@ -0,0 +1,69 @@ +package com.bs.framework.config; + +import org.springframework.cache.annotation.CachingConfigurerSupport; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.core.script.DefaultRedisScript; +import org.springframework.data.redis.serializer.StringRedisSerializer; + +/** + * redis配置 + * + * @author bs + */ +@Configuration +@EnableCaching +public class RedisConfig extends CachingConfigurerSupport +{ + @Bean + @SuppressWarnings(value = { "unchecked", "rawtypes" }) + public RedisTemplate redisTemplate(RedisConnectionFactory connectionFactory) + { + RedisTemplate template = new RedisTemplate<>(); + template.setConnectionFactory(connectionFactory); + + FastJson2JsonRedisSerializer serializer = new FastJson2JsonRedisSerializer(Object.class); + + // 使用StringRedisSerializer来序列化和反序列化redis的key值 + template.setKeySerializer(new StringRedisSerializer()); + template.setValueSerializer(serializer); + + // Hash的key也采用StringRedisSerializer的序列化方式 + template.setHashKeySerializer(new StringRedisSerializer()); + template.setHashValueSerializer(serializer); + + template.afterPropertiesSet(); + return template; + } + + @Bean + public DefaultRedisScript limitScript() + { + DefaultRedisScript redisScript = new DefaultRedisScript<>(); + redisScript.setScriptText(limitScriptText()); + redisScript.setResultType(Long.class); + return redisScript; + } + + /** + * 限流脚本 + */ + private String limitScriptText() + { + return "local key = KEYS[1]\n" + + "local count = tonumber(ARGV[1])\n" + + "local time = tonumber(ARGV[2])\n" + + "local current = redis.call('get', key);\n" + + "if current and tonumber(current) > count then\n" + + " return tonumber(current);\n" + + "end\n" + + "current = redis.call('incr', key)\n" + + "if tonumber(current) == 1 then\n" + + " redis.call('expire', key, time)\n" + + "end\n" + + "return tonumber(current);"; + } +} diff --git a/bs-framework/src/main/java/com/bs/framework/config/ResourcesConfig.java b/bs-framework/src/main/java/com/bs/framework/config/ResourcesConfig.java new file mode 100644 index 0000000..6162063 --- /dev/null +++ b/bs-framework/src/main/java/com/bs/framework/config/ResourcesConfig.java @@ -0,0 +1,73 @@ +package com.bs.framework.config; + +import java.util.concurrent.TimeUnit; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.http.CacheControl; +import org.springframework.web.cors.CorsConfiguration; +import org.springframework.web.cors.UrlBasedCorsConfigurationSource; +import org.springframework.web.filter.CorsFilter; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; +import com.bs.common.config.BsConfig; +import com.bs.common.constant.Constants; +import com.bs.framework.interceptor.RepeatSubmitInterceptor; + +/** + * 通用配置 + * + * @author bs + */ +@Configuration +public class ResourcesConfig implements WebMvcConfigurer +{ + @Autowired + private RepeatSubmitInterceptor repeatSubmitInterceptor; + + @Override + public void addResourceHandlers(ResourceHandlerRegistry registry) + { + /** 本地文件上传路径 */ + registry.addResourceHandler(Constants.RESOURCE_PREFIX + "/**") + .addResourceLocations("file:" + BsConfig.getProfile() + "/"); + + /** swagger配置 */ + registry.addResourceHandler("/swagger-ui/**") + .addResourceLocations("classpath:/META-INF/resources/webjars/springfox-swagger-ui/") + .setCacheControl(CacheControl.maxAge(5, TimeUnit.HOURS).cachePublic());; + } + + /** + * 自定义拦截规则 + */ + @Override + public void addInterceptors(InterceptorRegistry registry) + { + registry.addInterceptor(repeatSubmitInterceptor).addPathPatterns("/**"); + } + + /** + * 跨域配置 + */ + @Bean + public CorsFilter corsFilter() + { + CorsConfiguration config = new CorsConfiguration(); + config.setAllowCredentials(true); + // 设置访问源地址 + config.addAllowedOriginPattern("*"); + // 设置访问源请求头 + config.addAllowedHeader("*"); + // 设置访问源请求方法 + config.addAllowedMethod("*"); + // 有效期 1800秒 + config.setMaxAge(1800L); + // 添加映射路径,拦截一切请求 + UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); + source.registerCorsConfiguration("/**", config); + // 返回新的CorsFilter + return new CorsFilter(source); + } +} diff --git a/bs-framework/src/main/java/com/bs/framework/config/SecurityConfig.java b/bs-framework/src/main/java/com/bs/framework/config/SecurityConfig.java new file mode 100644 index 0000000..ec2d070 --- /dev/null +++ b/bs-framework/src/main/java/com/bs/framework/config/SecurityConfig.java @@ -0,0 +1,148 @@ +package com.bs.framework.config; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.http.HttpMethod; +import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; +import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.security.config.annotation.web.configurers.ExpressionUrlAuthorizationConfigurer; +import org.springframework.security.config.http.SessionCreationPolicy; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; +import org.springframework.security.web.authentication.logout.LogoutFilter; +import org.springframework.web.filter.CorsFilter; +import com.bs.framework.config.properties.PermitAllUrlProperties; +import com.bs.framework.security.filter.JwtAuthenticationTokenFilter; +import com.bs.framework.security.handle.AuthenticationEntryPointImpl; +import com.bs.framework.security.handle.LogoutSuccessHandlerImpl; + +/** + * spring security配置 + * + * @author bs + */ +@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true) +public class SecurityConfig extends WebSecurityConfigurerAdapter +{ + /** + * 自定义用户认证逻辑 + */ + @Autowired + private UserDetailsService userDetailsService; + + /** + * 认证失败处理类 + */ + @Autowired + private AuthenticationEntryPointImpl unauthorizedHandler; + + /** + * 退出处理类 + */ + @Autowired + private LogoutSuccessHandlerImpl logoutSuccessHandler; + + /** + * token认证过滤器 + */ + @Autowired + private JwtAuthenticationTokenFilter authenticationTokenFilter; + + /** + * 跨域过滤器 + */ + @Autowired + private CorsFilter corsFilter; + + /** + * 允许匿名访问的地址 + */ + @Autowired + private PermitAllUrlProperties permitAllUrl; + + /** + * 解决 无法直接注入 AuthenticationManager + * + * @return + * @throws Exception + */ + @Bean + @Override + public AuthenticationManager authenticationManagerBean() throws Exception + { + return super.authenticationManagerBean(); + } + + /** + * anyRequest | 匹配所有请求路径 + * access | SpringEl表达式结果为true时可以访问 + * anonymous | 匿名可以访问 + * denyAll | 用户不能访问 + * fullyAuthenticated | 用户完全认证可以访问(非remember-me下自动登录) + * hasAnyAuthority | 如果有参数,参数表示权限,则其中任何一个权限可以访问 + * hasAnyRole | 如果有参数,参数表示角色,则其中任何一个角色可以访问 + * hasAuthority | 如果有参数,参数表示权限,则其权限可以访问 + * hasIpAddress | 如果有参数,参数表示IP地址,如果用户IP和参数匹配,则可以访问 + * hasRole | 如果有参数,参数表示角色,则其角色可以访问 + * permitAll | 用户可以任意访问 + * rememberMe | 允许通过remember-me登录的用户访问 + * authenticated | 用户登录后可访问 + */ + @Override + protected void configure(HttpSecurity httpSecurity) throws Exception + { + // 注解标记允许匿名访问的url + ExpressionUrlAuthorizationConfigurer.ExpressionInterceptUrlRegistry registry = httpSecurity.authorizeRequests(); + permitAllUrl.getUrls().forEach(url -> registry.antMatchers(url).permitAll()); + + httpSecurity + // CSRF禁用,因为不使用session + .csrf().disable() + // 禁用HTTP响应标头 + .headers().cacheControl().disable().and() + // 认证失败处理类 + .exceptionHandling().authenticationEntryPoint(unauthorizedHandler).and() + // 基于token,所以不需要session + .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and() + // 过滤请求 + .authorizeRequests() + // 对于登录login 注册register 验证码captchaImage 允许匿名访问 + .antMatchers("/login", "/register", "/captchaImage").permitAll() + // 静态资源,可匿名访问 + .antMatchers(HttpMethod.GET, "/", "/*.html", "/**/*.html", "/**/*.css", "/**/*.js", "/profile/**").permitAll() + .antMatchers("/swagger-ui.html", "/swagger-resources/**", "/webjars/**", "/*/api-docs", "/druid/**").permitAll() + // 除上面外的所有请求全部需要鉴权认证 + .anyRequest().authenticated() + .and() + .headers().frameOptions().disable(); + // 添加Logout filter + httpSecurity.logout().logoutUrl("/logout").logoutSuccessHandler(logoutSuccessHandler); + // 添加JWT filter + httpSecurity.addFilterBefore(authenticationTokenFilter, UsernamePasswordAuthenticationFilter.class); + // 添加CORS filter + httpSecurity.addFilterBefore(corsFilter, JwtAuthenticationTokenFilter.class); + httpSecurity.addFilterBefore(corsFilter, LogoutFilter.class); + } + + /** + * 强散列哈希加密实现 + */ + @Bean + public BCryptPasswordEncoder bCryptPasswordEncoder() + { + return new BCryptPasswordEncoder(); + } + + /** + * 身份认证接口 + */ + @Override + protected void configure(AuthenticationManagerBuilder auth) throws Exception + { + auth.userDetailsService(userDetailsService).passwordEncoder(bCryptPasswordEncoder()); + } +} diff --git a/bs-framework/src/main/java/com/bs/framework/config/ServerConfig.java b/bs-framework/src/main/java/com/bs/framework/config/ServerConfig.java new file mode 100644 index 0000000..c2e96b4 --- /dev/null +++ b/bs-framework/src/main/java/com/bs/framework/config/ServerConfig.java @@ -0,0 +1,32 @@ +package com.bs.framework.config; + +import javax.servlet.http.HttpServletRequest; +import org.springframework.stereotype.Component; +import com.bs.common.utils.ServletUtils; + +/** + * 服务相关配置 + * + * @author bs + */ +@Component +public class ServerConfig +{ + /** + * 获取完整的请求路径,包括:域名,端口,上下文访问路径 + * + * @return 服务地址 + */ + public String getUrl() + { + HttpServletRequest request = ServletUtils.getRequest(); + return getDomain(request); + } + + public static String getDomain(HttpServletRequest request) + { + StringBuffer url = request.getRequestURL(); + String contextPath = request.getServletContext().getContextPath(); + return url.delete(url.length() - request.getRequestURI().length(), url.length()).append(contextPath).toString(); + } +} diff --git a/bs-framework/src/main/java/com/bs/framework/config/ThreadPoolConfig.java b/bs-framework/src/main/java/com/bs/framework/config/ThreadPoolConfig.java new file mode 100644 index 0000000..cec793c --- /dev/null +++ b/bs-framework/src/main/java/com/bs/framework/config/ThreadPoolConfig.java @@ -0,0 +1,63 @@ +package com.bs.framework.config; + +import com.bs.common.utils.Threads; +import org.apache.commons.lang3.concurrent.BasicThreadFactory; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.ScheduledThreadPoolExecutor; +import java.util.concurrent.ThreadPoolExecutor; + +/** + * 线程池配置 + * + * @author bs + **/ +@Configuration +public class ThreadPoolConfig +{ + // 核心线程池大小 + private int corePoolSize = 50; + + // 最大可创建的线程数 + private int maxPoolSize = 200; + + // 队列最大长度 + private int queueCapacity = 1000; + + // 线程池维护线程所允许的空闲时间 + private int keepAliveSeconds = 300; + + @Bean(name = "threadPoolTaskExecutor") + public ThreadPoolTaskExecutor threadPoolTaskExecutor() + { + ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); + executor.setMaxPoolSize(maxPoolSize); + executor.setCorePoolSize(corePoolSize); + executor.setQueueCapacity(queueCapacity); + executor.setKeepAliveSeconds(keepAliveSeconds); + // 线程池对拒绝任务(无线程可用)的处理策略 + executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); + return executor; + } + + /** + * 执行周期性或定时任务 + */ + @Bean(name = "scheduledExecutorService") + protected ScheduledExecutorService scheduledExecutorService() + { + return new ScheduledThreadPoolExecutor(corePoolSize, + new BasicThreadFactory.Builder().namingPattern("schedule-pool-%d").daemon(true).build(), + new ThreadPoolExecutor.CallerRunsPolicy()) + { + @Override + protected void afterExecute(Runnable r, Throwable t) + { + super.afterExecute(r, t); + Threads.printException(r, t); + } + }; + } +} diff --git a/bs-framework/src/main/java/com/bs/framework/config/properties/DruidProperties.java b/bs-framework/src/main/java/com/bs/framework/config/properties/DruidProperties.java new file mode 100644 index 0000000..d6348e7 --- /dev/null +++ b/bs-framework/src/main/java/com/bs/framework/config/properties/DruidProperties.java @@ -0,0 +1,89 @@ +package com.bs.framework.config.properties; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Configuration; +import com.alibaba.druid.pool.DruidDataSource; + +/** + * druid 配置属性 + * + * @author bs + */ +@Configuration +public class DruidProperties +{ + @Value("${spring.datasource.druid.initialSize}") + private int initialSize; + + @Value("${spring.datasource.druid.minIdle}") + private int minIdle; + + @Value("${spring.datasource.druid.maxActive}") + private int maxActive; + + @Value("${spring.datasource.druid.maxWait}") + private int maxWait; + + @Value("${spring.datasource.druid.connectTimeout}") + private int connectTimeout; + + @Value("${spring.datasource.druid.socketTimeout}") + private int socketTimeout; + + @Value("${spring.datasource.druid.timeBetweenEvictionRunsMillis}") + private int timeBetweenEvictionRunsMillis; + + @Value("${spring.datasource.druid.minEvictableIdleTimeMillis}") + private int minEvictableIdleTimeMillis; + + @Value("${spring.datasource.druid.maxEvictableIdleTimeMillis}") + private int maxEvictableIdleTimeMillis; + + @Value("${spring.datasource.druid.validationQuery}") + private String validationQuery; + + @Value("${spring.datasource.druid.testWhileIdle}") + private boolean testWhileIdle; + + @Value("${spring.datasource.druid.testOnBorrow}") + private boolean testOnBorrow; + + @Value("${spring.datasource.druid.testOnReturn}") + private boolean testOnReturn; + + public DruidDataSource dataSource(DruidDataSource datasource) + { + /** 配置初始化大小、最小、最大 */ + datasource.setInitialSize(initialSize); + datasource.setMaxActive(maxActive); + datasource.setMinIdle(minIdle); + + /** 配置获取连接等待超时的时间 */ + datasource.setMaxWait(maxWait); + + /** 配置驱动连接超时时间,检测数据库建立连接的超时时间,单位是毫秒 */ + datasource.setConnectTimeout(connectTimeout); + + /** 配置网络超时时间,等待数据库操作完成的网络超时时间,单位是毫秒 */ + datasource.setSocketTimeout(socketTimeout); + + /** 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 */ + datasource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis); + + /** 配置一个连接在池中最小、最大生存的时间,单位是毫秒 */ + datasource.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis); + datasource.setMaxEvictableIdleTimeMillis(maxEvictableIdleTimeMillis); + + /** + * 用来检测连接是否有效的sql,要求是一个查询语句,常用select 'x'。如果validationQuery为null,testOnBorrow、testOnReturn、testWhileIdle都不会起作用。 + */ + datasource.setValidationQuery(validationQuery); + /** 建议配置为true,不影响性能,并且保证安全性。申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效。 */ + datasource.setTestWhileIdle(testWhileIdle); + /** 申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。 */ + datasource.setTestOnBorrow(testOnBorrow); + /** 归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。 */ + datasource.setTestOnReturn(testOnReturn); + return datasource; + } +} diff --git a/bs-framework/src/main/java/com/bs/framework/config/properties/PermitAllUrlProperties.java b/bs-framework/src/main/java/com/bs/framework/config/properties/PermitAllUrlProperties.java new file mode 100644 index 0000000..0e46287 --- /dev/null +++ b/bs-framework/src/main/java/com/bs/framework/config/properties/PermitAllUrlProperties.java @@ -0,0 +1,73 @@ +package com.bs.framework.config.properties; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; +import java.util.regex.Pattern; +import org.apache.commons.lang3.RegExUtils; +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.annotation.AnnotationUtils; +import org.springframework.web.method.HandlerMethod; +import org.springframework.web.servlet.mvc.method.RequestMappingInfo; +import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping; +import com.bs.common.annotation.Anonymous; + +/** + * 设置Anonymous注解允许匿名访问的url + * + * @author bs + */ +@Configuration +public class PermitAllUrlProperties implements InitializingBean, ApplicationContextAware +{ + private static final Pattern PATTERN = Pattern.compile("\\{(.*?)\\}"); + + private ApplicationContext applicationContext; + + private List urls = new ArrayList<>(); + + public String ASTERISK = "*"; + + @Override + public void afterPropertiesSet() + { + RequestMappingHandlerMapping mapping = applicationContext.getBean(RequestMappingHandlerMapping.class); + Map map = mapping.getHandlerMethods(); + + map.keySet().forEach(info -> { + HandlerMethod handlerMethod = map.get(info); + + // 获取方法上边的注解 替代path variable 为 * + Anonymous method = AnnotationUtils.findAnnotation(handlerMethod.getMethod(), Anonymous.class); + Optional.ofNullable(method).ifPresent(anonymous -> Objects.requireNonNull(info.getPatternsCondition().getPatterns()) + .forEach(url -> urls.add(RegExUtils.replaceAll(url, PATTERN, ASTERISK)))); + + // 获取类上边的注解, 替代path variable 为 * + Anonymous controller = AnnotationUtils.findAnnotation(handlerMethod.getBeanType(), Anonymous.class); + Optional.ofNullable(controller).ifPresent(anonymous -> Objects.requireNonNull(info.getPatternsCondition().getPatterns()) + .forEach(url -> urls.add(RegExUtils.replaceAll(url, PATTERN, ASTERISK)))); + }); + } + + @Override + public void setApplicationContext(ApplicationContext context) throws BeansException + { + this.applicationContext = context; + } + + public List getUrls() + { + return urls; + } + + public void setUrls(List urls) + { + this.urls = urls; + } +} diff --git a/bs-framework/src/main/java/com/bs/framework/datasource/DynamicDataSource.java b/bs-framework/src/main/java/com/bs/framework/datasource/DynamicDataSource.java new file mode 100644 index 0000000..8c8e330 --- /dev/null +++ b/bs-framework/src/main/java/com/bs/framework/datasource/DynamicDataSource.java @@ -0,0 +1,26 @@ +package com.bs.framework.datasource; + +import java.util.Map; +import javax.sql.DataSource; +import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource; + +/** + * 动态数据源 + * + * @author bs + */ +public class DynamicDataSource extends AbstractRoutingDataSource +{ + public DynamicDataSource(DataSource defaultTargetDataSource, Map targetDataSources) + { + super.setDefaultTargetDataSource(defaultTargetDataSource); + super.setTargetDataSources(targetDataSources); + super.afterPropertiesSet(); + } + + @Override + protected Object determineCurrentLookupKey() + { + return DynamicDataSourceContextHolder.getDataSourceType(); + } +} diff --git a/bs-framework/src/main/java/com/bs/framework/datasource/DynamicDataSourceContextHolder.java b/bs-framework/src/main/java/com/bs/framework/datasource/DynamicDataSourceContextHolder.java new file mode 100644 index 0000000..bf17e69 --- /dev/null +++ b/bs-framework/src/main/java/com/bs/framework/datasource/DynamicDataSourceContextHolder.java @@ -0,0 +1,45 @@ +package com.bs.framework.datasource; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * 数据源切换处理 + * + * @author bs + */ +public class DynamicDataSourceContextHolder +{ + public static final Logger log = LoggerFactory.getLogger(DynamicDataSourceContextHolder.class); + + /** + * 使用ThreadLocal维护变量,ThreadLocal为每个使用该变量的线程提供独立的变量副本, + * 所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本。 + */ + private static final ThreadLocal CONTEXT_HOLDER = new ThreadLocal<>(); + + /** + * 设置数据源的变量 + */ + public static void setDataSourceType(String dsType) + { + log.info("切换到{}数据源", dsType); + CONTEXT_HOLDER.set(dsType); + } + + /** + * 获得数据源的变量 + */ + public static String getDataSourceType() + { + return CONTEXT_HOLDER.get(); + } + + /** + * 清空数据源变量 + */ + public static void clearDataSourceType() + { + CONTEXT_HOLDER.remove(); + } +} diff --git a/bs-framework/src/main/java/com/bs/framework/interceptor/RepeatSubmitInterceptor.java b/bs-framework/src/main/java/com/bs/framework/interceptor/RepeatSubmitInterceptor.java new file mode 100644 index 0000000..53e3f8b --- /dev/null +++ b/bs-framework/src/main/java/com/bs/framework/interceptor/RepeatSubmitInterceptor.java @@ -0,0 +1,55 @@ +package com.bs.framework.interceptor; + +import java.lang.reflect.Method; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import org.springframework.stereotype.Component; +import org.springframework.web.method.HandlerMethod; +import org.springframework.web.servlet.HandlerInterceptor; +import com.alibaba.fastjson2.JSON; +import com.bs.common.annotation.RepeatSubmit; +import com.bs.common.core.domain.AjaxResult; +import com.bs.common.utils.ServletUtils; + +/** + * 防止重复提交拦截器 + * + * @author bs + */ +@Component +public abstract class RepeatSubmitInterceptor implements HandlerInterceptor +{ + @Override + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception + { + if (handler instanceof HandlerMethod) + { + HandlerMethod handlerMethod = (HandlerMethod) handler; + Method method = handlerMethod.getMethod(); + RepeatSubmit annotation = method.getAnnotation(RepeatSubmit.class); + if (annotation != null) + { + if (this.isRepeatSubmit(request, annotation)) + { + AjaxResult ajaxResult = AjaxResult.error(annotation.message()); + ServletUtils.renderString(response, JSON.toJSONString(ajaxResult)); + return false; + } + } + return true; + } + else + { + return true; + } + } + + /** + * 验证是否重复提交由子类实现具体的防重复提交的规则 + * + * @param request + * @return + * @throws Exception + */ + public abstract boolean isRepeatSubmit(HttpServletRequest request, RepeatSubmit annotation); +} diff --git a/bs-framework/src/main/java/com/bs/framework/interceptor/impl/SameUrlDataInterceptor.java b/bs-framework/src/main/java/com/bs/framework/interceptor/impl/SameUrlDataInterceptor.java new file mode 100644 index 0000000..e95f62e --- /dev/null +++ b/bs-framework/src/main/java/com/bs/framework/interceptor/impl/SameUrlDataInterceptor.java @@ -0,0 +1,110 @@ +package com.bs.framework.interceptor.impl; + +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.TimeUnit; +import javax.servlet.http.HttpServletRequest; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; +import com.alibaba.fastjson2.JSON; +import com.bs.common.annotation.RepeatSubmit; +import com.bs.common.constant.CacheConstants; +import com.bs.common.core.redis.RedisCache; +import com.bs.common.filter.RepeatedlyRequestWrapper; +import com.bs.common.utils.StringUtils; +import com.bs.common.utils.http.HttpHelper; +import com.bs.framework.interceptor.RepeatSubmitInterceptor; + +/** + * 判断请求url和数据是否和上一次相同, + * 如果和上次相同,则是重复提交表单。 有效时间为10秒内。 + * + * @author bs + */ +@Component +public class SameUrlDataInterceptor extends RepeatSubmitInterceptor +{ + public final String REPEAT_PARAMS = "repeatParams"; + + public final String REPEAT_TIME = "repeatTime"; + + // 令牌自定义标识 + @Value("${token.header}") + private String header; + + @Autowired + private RedisCache redisCache; + + @SuppressWarnings("unchecked") + @Override + public boolean isRepeatSubmit(HttpServletRequest request, RepeatSubmit annotation) + { + String nowParams = ""; + if (request instanceof RepeatedlyRequestWrapper) + { + RepeatedlyRequestWrapper repeatedlyRequest = (RepeatedlyRequestWrapper) request; + nowParams = HttpHelper.getBodyString(repeatedlyRequest); + } + + // body参数为空,获取Parameter的数据 + if (StringUtils.isEmpty(nowParams)) + { + nowParams = JSON.toJSONString(request.getParameterMap()); + } + Map nowDataMap = new HashMap(); + nowDataMap.put(REPEAT_PARAMS, nowParams); + nowDataMap.put(REPEAT_TIME, System.currentTimeMillis()); + + // 请求地址(作为存放cache的key值) + String url = request.getRequestURI(); + + // 唯一值(没有消息头则使用请求地址) + String submitKey = StringUtils.trimToEmpty(request.getHeader(header)); + + // 唯一标识(指定key + url + 消息头) + String cacheRepeatKey = CacheConstants.REPEAT_SUBMIT_KEY + url + submitKey; + + Object sessionObj = redisCache.getCacheObject(cacheRepeatKey); + if (sessionObj != null) + { + Map sessionMap = (Map) sessionObj; + if (sessionMap.containsKey(url)) + { + Map preDataMap = (Map) sessionMap.get(url); + if (compareParams(nowDataMap, preDataMap) && compareTime(nowDataMap, preDataMap, annotation.interval())) + { + return true; + } + } + } + Map cacheMap = new HashMap(); + cacheMap.put(url, nowDataMap); + redisCache.setCacheObject(cacheRepeatKey, cacheMap, annotation.interval(), TimeUnit.MILLISECONDS); + return false; + } + + /** + * 判断参数是否相同 + */ + private boolean compareParams(Map nowMap, Map preMap) + { + String nowParams = (String) nowMap.get(REPEAT_PARAMS); + String preParams = (String) preMap.get(REPEAT_PARAMS); + return nowParams.equals(preParams); + } + + /** + * 判断两次间隔时间 + */ + private boolean compareTime(Map nowMap, Map preMap, int interval) + { + long time1 = (Long) nowMap.get(REPEAT_TIME); + long time2 = (Long) preMap.get(REPEAT_TIME); + if ((time1 - time2) < interval) + { + return true; + } + return false; + } +} diff --git a/bs-framework/src/main/java/com/bs/framework/manager/AsyncManager.java b/bs-framework/src/main/java/com/bs/framework/manager/AsyncManager.java new file mode 100644 index 0000000..c11f9ad --- /dev/null +++ b/bs-framework/src/main/java/com/bs/framework/manager/AsyncManager.java @@ -0,0 +1,55 @@ +package com.bs.framework.manager; + +import java.util.TimerTask; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; +import com.bs.common.utils.Threads; +import com.bs.common.utils.spring.SpringUtils; + +/** + * 异步任务管理器 + * + * @author bs + */ +public class AsyncManager +{ + /** + * 操作延迟10毫秒 + */ + private final int OPERATE_DELAY_TIME = 10; + + /** + * 异步操作任务调度线程池 + */ + private ScheduledExecutorService executor = SpringUtils.getBean("scheduledExecutorService"); + + /** + * 单例模式 + */ + private AsyncManager(){} + + private static AsyncManager me = new AsyncManager(); + + public static AsyncManager me() + { + return me; + } + + /** + * 执行任务 + * + * @param task 任务 + */ + public void execute(TimerTask task) + { + executor.schedule(task, OPERATE_DELAY_TIME, TimeUnit.MILLISECONDS); + } + + /** + * 停止任务线程池 + */ + public void shutdown() + { + Threads.shutdownAndAwaitTermination(executor); + } +} diff --git a/bs-framework/src/main/java/com/bs/framework/manager/ShutdownManager.java b/bs-framework/src/main/java/com/bs/framework/manager/ShutdownManager.java new file mode 100644 index 0000000..6f9a826 --- /dev/null +++ b/bs-framework/src/main/java/com/bs/framework/manager/ShutdownManager.java @@ -0,0 +1,39 @@ +package com.bs.framework.manager; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; +import javax.annotation.PreDestroy; + +/** + * 确保应用退出时能关闭后台线程 + * + * @author bs + */ +@Component +public class ShutdownManager +{ + private static final Logger logger = LoggerFactory.getLogger("sys-user"); + + @PreDestroy + public void destroy() + { + shutdownAsyncManager(); + } + + /** + * 停止异步执行任务 + */ + private void shutdownAsyncManager() + { + try + { + logger.info("====关闭后台任务任务线程池===="); + AsyncManager.me().shutdown(); + } + catch (Exception e) + { + logger.error(e.getMessage(), e); + } + } +} diff --git a/bs-framework/src/main/java/com/bs/framework/manager/factory/AsyncFactory.java b/bs-framework/src/main/java/com/bs/framework/manager/factory/AsyncFactory.java new file mode 100644 index 0000000..37b9569 --- /dev/null +++ b/bs-framework/src/main/java/com/bs/framework/manager/factory/AsyncFactory.java @@ -0,0 +1,102 @@ +package com.bs.framework.manager.factory; + +import java.util.TimerTask; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import com.bs.common.constant.Constants; +import com.bs.common.utils.LogUtils; +import com.bs.common.utils.ServletUtils; +import com.bs.common.utils.StringUtils; +import com.bs.common.utils.ip.AddressUtils; +import com.bs.common.utils.ip.IpUtils; +import com.bs.common.utils.spring.SpringUtils; +import com.bs.system.domain.SysLogininfor; +import com.bs.system.domain.SysOperLog; +import com.bs.system.service.ISysLogininforService; +import com.bs.system.service.ISysOperLogService; +import eu.bitwalker.useragentutils.UserAgent; + +/** + * 异步工厂(产生任务用) + * + * @author bs + */ +public class AsyncFactory +{ + private static final Logger sys_user_logger = LoggerFactory.getLogger("sys-user"); + + /** + * 记录登录信息 + * + * @param username 用户名 + * @param status 状态 + * @param message 消息 + * @param args 列表 + * @return 任务task + */ + public static TimerTask recordLogininfor(final String username, final String status, final String message, + final Object... args) + { + final UserAgent userAgent = UserAgent.parseUserAgentString(ServletUtils.getRequest().getHeader("User-Agent")); + final String ip = IpUtils.getIpAddr(); + return new TimerTask() + { + @Override + public void run() + { + String address = AddressUtils.getRealAddressByIP(ip); + StringBuilder s = new StringBuilder(); + s.append(LogUtils.getBlock(ip)); + s.append(address); + s.append(LogUtils.getBlock(username)); + s.append(LogUtils.getBlock(status)); + s.append(LogUtils.getBlock(message)); + // 打印信息到日志 + sys_user_logger.info(s.toString(), args); + // 获取客户端操作系统 + String os = userAgent.getOperatingSystem().getName(); + // 获取客户端浏览器 + String browser = userAgent.getBrowser().getName(); + // 封装对象 + SysLogininfor logininfor = new SysLogininfor(); + logininfor.setUserName(username); + logininfor.setIpaddr(ip); + logininfor.setLoginLocation(address); + logininfor.setBrowser(browser); + logininfor.setOs(os); + logininfor.setMsg(message); + // 日志状态 + if (StringUtils.equalsAny(status, Constants.LOGIN_SUCCESS, Constants.LOGOUT, Constants.REGISTER)) + { + logininfor.setStatus(Constants.SUCCESS); + } + else if (Constants.LOGIN_FAIL.equals(status)) + { + logininfor.setStatus(Constants.FAIL); + } + // 插入数据 + SpringUtils.getBean(ISysLogininforService.class).insertLogininfor(logininfor); + } + }; + } + + /** + * 操作日志记录 + * + * @param operLog 操作日志信息 + * @return 任务task + */ + public static TimerTask recordOper(final SysOperLog operLog) + { + return new TimerTask() + { + @Override + public void run() + { + // 远程查询操作地点 + operLog.setOperLocation(AddressUtils.getRealAddressByIP(operLog.getOperIp())); + SpringUtils.getBean(ISysOperLogService.class).insertOperlog(operLog); + } + }; + } +} diff --git a/bs-framework/src/main/java/com/bs/framework/security/context/AuthenticationContextHolder.java b/bs-framework/src/main/java/com/bs/framework/security/context/AuthenticationContextHolder.java new file mode 100644 index 0000000..0079116 --- /dev/null +++ b/bs-framework/src/main/java/com/bs/framework/security/context/AuthenticationContextHolder.java @@ -0,0 +1,28 @@ +package com.bs.framework.security.context; + +import org.springframework.security.core.Authentication; + +/** + * 身份验证信息 + * + * @author bs + */ +public class AuthenticationContextHolder +{ + private static final ThreadLocal contextHolder = new ThreadLocal<>(); + + public static Authentication getContext() + { + return contextHolder.get(); + } + + public static void setContext(Authentication context) + { + contextHolder.set(context); + } + + public static void clearContext() + { + contextHolder.remove(); + } +} diff --git a/bs-framework/src/main/java/com/bs/framework/security/context/PermissionContextHolder.java b/bs-framework/src/main/java/com/bs/framework/security/context/PermissionContextHolder.java new file mode 100644 index 0000000..782cb4b --- /dev/null +++ b/bs-framework/src/main/java/com/bs/framework/security/context/PermissionContextHolder.java @@ -0,0 +1,27 @@ +package com.bs.framework.security.context; + +import org.springframework.web.context.request.RequestAttributes; +import org.springframework.web.context.request.RequestContextHolder; +import com.bs.common.core.text.Convert; + +/** + * 权限信息 + * + * @author bs + */ +public class PermissionContextHolder +{ + private static final String PERMISSION_CONTEXT_ATTRIBUTES = "PERMISSION_CONTEXT"; + + public static void setContext(String permission) + { + RequestContextHolder.currentRequestAttributes().setAttribute(PERMISSION_CONTEXT_ATTRIBUTES, permission, + RequestAttributes.SCOPE_REQUEST); + } + + public static String getContext() + { + return Convert.toStr(RequestContextHolder.currentRequestAttributes().getAttribute(PERMISSION_CONTEXT_ATTRIBUTES, + RequestAttributes.SCOPE_REQUEST)); + } +} diff --git a/bs-framework/src/main/java/com/bs/framework/security/filter/JwtAuthenticationTokenFilter.java b/bs-framework/src/main/java/com/bs/framework/security/filter/JwtAuthenticationTokenFilter.java new file mode 100644 index 0000000..80c8468 --- /dev/null +++ b/bs-framework/src/main/java/com/bs/framework/security/filter/JwtAuthenticationTokenFilter.java @@ -0,0 +1,44 @@ +package com.bs.framework.security.filter; + +import java.io.IOException; +import javax.servlet.FilterChain; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.web.authentication.WebAuthenticationDetailsSource; +import org.springframework.stereotype.Component; +import org.springframework.web.filter.OncePerRequestFilter; +import com.bs.common.core.domain.model.LoginUser; +import com.bs.common.utils.SecurityUtils; +import com.bs.common.utils.StringUtils; +import com.bs.framework.web.service.TokenService; + +/** + * token过滤器 验证token有效性 + * + * @author bs + */ +@Component +public class JwtAuthenticationTokenFilter extends OncePerRequestFilter +{ + @Autowired + private TokenService tokenService; + + @Override + protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) + throws ServletException, IOException + { + LoginUser loginUser = tokenService.getLoginUser(request); + if (StringUtils.isNotNull(loginUser) && StringUtils.isNull(SecurityUtils.getAuthentication())) + { + tokenService.verifyToken(loginUser); + UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(loginUser, null, loginUser.getAuthorities()); + authenticationToken.setDetails(new WebAuthenticationDetailsSource().buildDetails(request)); + SecurityContextHolder.getContext().setAuthentication(authenticationToken); + } + chain.doFilter(request, response); + } +} diff --git a/bs-framework/src/main/java/com/bs/framework/security/handle/AuthenticationEntryPointImpl.java b/bs-framework/src/main/java/com/bs/framework/security/handle/AuthenticationEntryPointImpl.java new file mode 100644 index 0000000..3655eb7 --- /dev/null +++ b/bs-framework/src/main/java/com/bs/framework/security/handle/AuthenticationEntryPointImpl.java @@ -0,0 +1,34 @@ +package com.bs.framework.security.handle; + +import java.io.IOException; +import java.io.Serializable; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import org.springframework.security.core.AuthenticationException; +import org.springframework.security.web.AuthenticationEntryPoint; +import org.springframework.stereotype.Component; +import com.alibaba.fastjson2.JSON; +import com.bs.common.constant.HttpStatus; +import com.bs.common.core.domain.AjaxResult; +import com.bs.common.utils.ServletUtils; +import com.bs.common.utils.StringUtils; + +/** + * 认证失败处理类 返回未授权 + * + * @author bs + */ +@Component +public class AuthenticationEntryPointImpl implements AuthenticationEntryPoint, Serializable +{ + private static final long serialVersionUID = -8970718410437077606L; + + @Override + public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException e) + throws IOException + { + int code = HttpStatus.UNAUTHORIZED; + String msg = StringUtils.format("请求访问:{},认证失败,无法访问系统资源", request.getRequestURI()); + ServletUtils.renderString(response, JSON.toJSONString(AjaxResult.error(code, msg))); + } +} diff --git a/bs-framework/src/main/java/com/bs/framework/security/handle/LogoutSuccessHandlerImpl.java b/bs-framework/src/main/java/com/bs/framework/security/handle/LogoutSuccessHandlerImpl.java new file mode 100644 index 0000000..7a678c0 --- /dev/null +++ b/bs-framework/src/main/java/com/bs/framework/security/handle/LogoutSuccessHandlerImpl.java @@ -0,0 +1,52 @@ +package com.bs.framework.security.handle; + +import java.io.IOException; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.core.Authentication; +import org.springframework.security.web.authentication.logout.LogoutSuccessHandler; +import com.alibaba.fastjson2.JSON; +import com.bs.common.constant.Constants; +import com.bs.common.core.domain.AjaxResult; +import com.bs.common.core.domain.model.LoginUser; +import com.bs.common.utils.ServletUtils; +import com.bs.common.utils.StringUtils; +import com.bs.framework.manager.AsyncManager; +import com.bs.framework.manager.factory.AsyncFactory; +import com.bs.framework.web.service.TokenService; + +/** + * 自定义退出处理类 返回成功 + * + * @author bs + */ +@Configuration +public class LogoutSuccessHandlerImpl implements LogoutSuccessHandler +{ + @Autowired + private TokenService tokenService; + + /** + * 退出处理 + * + * @return + */ + @Override + public void onLogoutSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) + throws IOException, ServletException + { + LoginUser loginUser = tokenService.getLoginUser(request); + if (StringUtils.isNotNull(loginUser)) + { + String userName = loginUser.getUsername(); + // 删除用户缓存记录 + tokenService.delLoginUser(loginUser.getToken()); + // 记录用户退出日志 + AsyncManager.me().execute(AsyncFactory.recordLogininfor(userName, Constants.LOGOUT, "退出成功")); + } + ServletUtils.renderString(response, JSON.toJSONString(AjaxResult.success("退出成功"))); + } +} diff --git a/bs-framework/src/main/java/com/bs/framework/web/domain/Server.java b/bs-framework/src/main/java/com/bs/framework/web/domain/Server.java new file mode 100644 index 0000000..8729a9d --- /dev/null +++ b/bs-framework/src/main/java/com/bs/framework/web/domain/Server.java @@ -0,0 +1,240 @@ +package com.bs.framework.web.domain; + +import java.net.UnknownHostException; +import java.util.LinkedList; +import java.util.List; +import java.util.Properties; +import com.bs.common.utils.Arith; +import com.bs.common.utils.ip.IpUtils; +import com.bs.framework.web.domain.server.Cpu; +import com.bs.framework.web.domain.server.Jvm; +import com.bs.framework.web.domain.server.Mem; +import com.bs.framework.web.domain.server.Sys; +import com.bs.framework.web.domain.server.SysFile; +import oshi.SystemInfo; +import oshi.hardware.CentralProcessor; +import oshi.hardware.CentralProcessor.TickType; +import oshi.hardware.GlobalMemory; +import oshi.hardware.HardwareAbstractionLayer; +import oshi.software.os.FileSystem; +import oshi.software.os.OSFileStore; +import oshi.software.os.OperatingSystem; +import oshi.util.Util; + +/** + * 服务器相关信息 + * + * @author bs + */ +public class Server +{ + private static final int OSHI_WAIT_SECOND = 1000; + + /** + * CPU相关信息 + */ + private Cpu cpu = new Cpu(); + + /** + * 內存相关信息 + */ + private Mem mem = new Mem(); + + /** + * JVM相关信息 + */ + private Jvm jvm = new Jvm(); + + /** + * 服务器相关信息 + */ + private Sys sys = new Sys(); + + /** + * 磁盘相关信息 + */ + private List sysFiles = new LinkedList(); + + public Cpu getCpu() + { + return cpu; + } + + public void setCpu(Cpu cpu) + { + this.cpu = cpu; + } + + public Mem getMem() + { + return mem; + } + + public void setMem(Mem mem) + { + this.mem = mem; + } + + public Jvm getJvm() + { + return jvm; + } + + public void setJvm(Jvm jvm) + { + this.jvm = jvm; + } + + public Sys getSys() + { + return sys; + } + + public void setSys(Sys sys) + { + this.sys = sys; + } + + public List getSysFiles() + { + return sysFiles; + } + + public void setSysFiles(List sysFiles) + { + this.sysFiles = sysFiles; + } + + public void copyTo() throws Exception + { + SystemInfo si = new SystemInfo(); + HardwareAbstractionLayer hal = si.getHardware(); + + setCpuInfo(hal.getProcessor()); + + setMemInfo(hal.getMemory()); + + setSysInfo(); + + setJvmInfo(); + + setSysFiles(si.getOperatingSystem()); + } + + /** + * 设置CPU信息 + */ + private void setCpuInfo(CentralProcessor processor) + { + // CPU信息 + long[] prevTicks = processor.getSystemCpuLoadTicks(); + Util.sleep(OSHI_WAIT_SECOND); + long[] ticks = processor.getSystemCpuLoadTicks(); + long nice = ticks[TickType.NICE.getIndex()] - prevTicks[TickType.NICE.getIndex()]; + long irq = ticks[TickType.IRQ.getIndex()] - prevTicks[TickType.IRQ.getIndex()]; + long softirq = ticks[TickType.SOFTIRQ.getIndex()] - prevTicks[TickType.SOFTIRQ.getIndex()]; + long steal = ticks[TickType.STEAL.getIndex()] - prevTicks[TickType.STEAL.getIndex()]; + long cSys = ticks[TickType.SYSTEM.getIndex()] - prevTicks[TickType.SYSTEM.getIndex()]; + long user = ticks[TickType.USER.getIndex()] - prevTicks[TickType.USER.getIndex()]; + long iowait = ticks[TickType.IOWAIT.getIndex()] - prevTicks[TickType.IOWAIT.getIndex()]; + long idle = ticks[TickType.IDLE.getIndex()] - prevTicks[TickType.IDLE.getIndex()]; + long totalCpu = user + nice + cSys + idle + iowait + irq + softirq + steal; + cpu.setCpuNum(processor.getLogicalProcessorCount()); + cpu.setTotal(totalCpu); + cpu.setSys(cSys); + cpu.setUsed(user); + cpu.setWait(iowait); + cpu.setFree(idle); + } + + /** + * 设置内存信息 + */ + private void setMemInfo(GlobalMemory memory) + { + mem.setTotal(memory.getTotal()); + mem.setUsed(memory.getTotal() - memory.getAvailable()); + mem.setFree(memory.getAvailable()); + } + + /** + * 设置服务器信息 + */ + private void setSysInfo() + { + Properties props = System.getProperties(); + sys.setComputerName(IpUtils.getHostName()); + sys.setComputerIp(IpUtils.getHostIp()); + sys.setOsName(props.getProperty("os.name")); + sys.setOsArch(props.getProperty("os.arch")); + sys.setUserDir(props.getProperty("user.dir")); + } + + /** + * 设置Java虚拟机 + */ + private void setJvmInfo() throws UnknownHostException + { + Properties props = System.getProperties(); + jvm.setTotal(Runtime.getRuntime().totalMemory()); + jvm.setMax(Runtime.getRuntime().maxMemory()); + jvm.setFree(Runtime.getRuntime().freeMemory()); + jvm.setVersion(props.getProperty("java.version")); + jvm.setHome(props.getProperty("java.home")); + } + + /** + * 设置磁盘信息 + */ + private void setSysFiles(OperatingSystem os) + { + FileSystem fileSystem = os.getFileSystem(); + List fsArray = fileSystem.getFileStores(); + for (OSFileStore fs : fsArray) + { + long free = fs.getUsableSpace(); + long total = fs.getTotalSpace(); + long used = total - free; + SysFile sysFile = new SysFile(); + sysFile.setDirName(fs.getMount()); + sysFile.setSysTypeName(fs.getType()); + sysFile.setTypeName(fs.getName()); + sysFile.setTotal(convertFileSize(total)); + sysFile.setFree(convertFileSize(free)); + sysFile.setUsed(convertFileSize(used)); + sysFile.setUsage(Arith.mul(Arith.div(used, total, 4), 100)); + sysFiles.add(sysFile); + } + } + + /** + * 字节转换 + * + * @param size 字节大小 + * @return 转换后值 + */ + public String convertFileSize(long size) + { + long kb = 1024; + long mb = kb * 1024; + long gb = mb * 1024; + if (size >= gb) + { + return String.format("%.1f GB", (float) size / gb); + } + else if (size >= mb) + { + float f = (float) size / mb; + return String.format(f > 100 ? "%.0f MB" : "%.1f MB", f); + } + else if (size >= kb) + { + float f = (float) size / kb; + return String.format(f > 100 ? "%.0f KB" : "%.1f KB", f); + } + else + { + return String.format("%d B", size); + } + } +} diff --git a/bs-framework/src/main/java/com/bs/framework/web/domain/server/Cpu.java b/bs-framework/src/main/java/com/bs/framework/web/domain/server/Cpu.java new file mode 100644 index 0000000..160a599 --- /dev/null +++ b/bs-framework/src/main/java/com/bs/framework/web/domain/server/Cpu.java @@ -0,0 +1,101 @@ +package com.bs.framework.web.domain.server; + +import com.bs.common.utils.Arith; + +/** + * CPU相关信息 + * + * @author bs + */ +public class Cpu +{ + /** + * 核心数 + */ + private int cpuNum; + + /** + * CPU总的使用率 + */ + private double total; + + /** + * CPU系统使用率 + */ + private double sys; + + /** + * CPU用户使用率 + */ + private double used; + + /** + * CPU当前等待率 + */ + private double wait; + + /** + * CPU当前空闲率 + */ + private double free; + + public int getCpuNum() + { + return cpuNum; + } + + public void setCpuNum(int cpuNum) + { + this.cpuNum = cpuNum; + } + + public double getTotal() + { + return Arith.round(Arith.mul(total, 100), 2); + } + + public void setTotal(double total) + { + this.total = total; + } + + public double getSys() + { + return Arith.round(Arith.mul(sys / total, 100), 2); + } + + public void setSys(double sys) + { + this.sys = sys; + } + + public double getUsed() + { + return Arith.round(Arith.mul(used / total, 100), 2); + } + + public void setUsed(double used) + { + this.used = used; + } + + public double getWait() + { + return Arith.round(Arith.mul(wait / total, 100), 2); + } + + public void setWait(double wait) + { + this.wait = wait; + } + + public double getFree() + { + return Arith.round(Arith.mul(free / total, 100), 2); + } + + public void setFree(double free) + { + this.free = free; + } +} diff --git a/bs-framework/src/main/java/com/bs/framework/web/domain/server/Jvm.java b/bs-framework/src/main/java/com/bs/framework/web/domain/server/Jvm.java new file mode 100644 index 0000000..9c03baf --- /dev/null +++ b/bs-framework/src/main/java/com/bs/framework/web/domain/server/Jvm.java @@ -0,0 +1,130 @@ +package com.bs.framework.web.domain.server; + +import java.lang.management.ManagementFactory; +import com.bs.common.utils.Arith; +import com.bs.common.utils.DateUtils; + +/** + * JVM相关信息 + * + * @author bs + */ +public class Jvm +{ + /** + * 当前JVM占用的内存总数(M) + */ + private double total; + + /** + * JVM最大可用内存总数(M) + */ + private double max; + + /** + * JVM空闲内存(M) + */ + private double free; + + /** + * JDK版本 + */ + private String version; + + /** + * JDK路径 + */ + private String home; + + public double getTotal() + { + return Arith.div(total, (1024 * 1024), 2); + } + + public void setTotal(double total) + { + this.total = total; + } + + public double getMax() + { + return Arith.div(max, (1024 * 1024), 2); + } + + public void setMax(double max) + { + this.max = max; + } + + public double getFree() + { + return Arith.div(free, (1024 * 1024), 2); + } + + public void setFree(double free) + { + this.free = free; + } + + public double getUsed() + { + return Arith.div(total - free, (1024 * 1024), 2); + } + + public double getUsage() + { + return Arith.mul(Arith.div(total - free, total, 4), 100); + } + + /** + * 获取JDK名称 + */ + public String getName() + { + return ManagementFactory.getRuntimeMXBean().getVmName(); + } + + public String getVersion() + { + return version; + } + + public void setVersion(String version) + { + this.version = version; + } + + public String getHome() + { + return home; + } + + public void setHome(String home) + { + this.home = home; + } + + /** + * JDK启动时间 + */ + public String getStartTime() + { + return DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS, DateUtils.getServerStartDate()); + } + + /** + * JDK运行时间 + */ + public String getRunTime() + { + return DateUtils.timeDistance(DateUtils.getNowDate(), DateUtils.getServerStartDate()); + } + + /** + * 运行参数 + */ + public String getInputArgs() + { + return ManagementFactory.getRuntimeMXBean().getInputArguments().toString(); + } +} diff --git a/bs-framework/src/main/java/com/bs/framework/web/domain/server/Mem.java b/bs-framework/src/main/java/com/bs/framework/web/domain/server/Mem.java new file mode 100644 index 0000000..5cea81f --- /dev/null +++ b/bs-framework/src/main/java/com/bs/framework/web/domain/server/Mem.java @@ -0,0 +1,61 @@ +package com.bs.framework.web.domain.server; + +import com.bs.common.utils.Arith; + +/** + * 內存相关信息 + * + * @author bs + */ +public class Mem +{ + /** + * 内存总量 + */ + private double total; + + /** + * 已用内存 + */ + private double used; + + /** + * 剩余内存 + */ + private double free; + + public double getTotal() + { + return Arith.div(total, (1024 * 1024 * 1024), 2); + } + + public void setTotal(long total) + { + this.total = total; + } + + public double getUsed() + { + return Arith.div(used, (1024 * 1024 * 1024), 2); + } + + public void setUsed(long used) + { + this.used = used; + } + + public double getFree() + { + return Arith.div(free, (1024 * 1024 * 1024), 2); + } + + public void setFree(long free) + { + this.free = free; + } + + public double getUsage() + { + return Arith.mul(Arith.div(used, total, 4), 100); + } +} diff --git a/bs-framework/src/main/java/com/bs/framework/web/domain/server/Sys.java b/bs-framework/src/main/java/com/bs/framework/web/domain/server/Sys.java new file mode 100644 index 0000000..41372fd --- /dev/null +++ b/bs-framework/src/main/java/com/bs/framework/web/domain/server/Sys.java @@ -0,0 +1,84 @@ +package com.bs.framework.web.domain.server; + +/** + * 系统相关信息 + * + * @author bs + */ +public class Sys +{ + /** + * 服务器名称 + */ + private String computerName; + + /** + * 服务器Ip + */ + private String computerIp; + + /** + * 项目路径 + */ + private String userDir; + + /** + * 操作系统 + */ + private String osName; + + /** + * 系统架构 + */ + private String osArch; + + public String getComputerName() + { + return computerName; + } + + public void setComputerName(String computerName) + { + this.computerName = computerName; + } + + public String getComputerIp() + { + return computerIp; + } + + public void setComputerIp(String computerIp) + { + this.computerIp = computerIp; + } + + public String getUserDir() + { + return userDir; + } + + public void setUserDir(String userDir) + { + this.userDir = userDir; + } + + public String getOsName() + { + return osName; + } + + public void setOsName(String osName) + { + this.osName = osName; + } + + public String getOsArch() + { + return osArch; + } + + public void setOsArch(String osArch) + { + this.osArch = osArch; + } +} diff --git a/bs-framework/src/main/java/com/bs/framework/web/domain/server/SysFile.java b/bs-framework/src/main/java/com/bs/framework/web/domain/server/SysFile.java new file mode 100644 index 0000000..bf802df --- /dev/null +++ b/bs-framework/src/main/java/com/bs/framework/web/domain/server/SysFile.java @@ -0,0 +1,114 @@ +package com.bs.framework.web.domain.server; + +/** + * 系统文件相关信息 + * + * @author bs + */ +public class SysFile +{ + /** + * 盘符路径 + */ + private String dirName; + + /** + * 盘符类型 + */ + private String sysTypeName; + + /** + * 文件类型 + */ + private String typeName; + + /** + * 总大小 + */ + private String total; + + /** + * 剩余大小 + */ + private String free; + + /** + * 已经使用量 + */ + private String used; + + /** + * 资源的使用率 + */ + private double usage; + + public String getDirName() + { + return dirName; + } + + public void setDirName(String dirName) + { + this.dirName = dirName; + } + + public String getSysTypeName() + { + return sysTypeName; + } + + public void setSysTypeName(String sysTypeName) + { + this.sysTypeName = sysTypeName; + } + + public String getTypeName() + { + return typeName; + } + + public void setTypeName(String typeName) + { + this.typeName = typeName; + } + + public String getTotal() + { + return total; + } + + public void setTotal(String total) + { + this.total = total; + } + + public String getFree() + { + return free; + } + + public void setFree(String free) + { + this.free = free; + } + + public String getUsed() + { + return used; + } + + public void setUsed(String used) + { + this.used = used; + } + + public double getUsage() + { + return usage; + } + + public void setUsage(double usage) + { + this.usage = usage; + } +} diff --git a/bs-framework/src/main/java/com/bs/framework/web/exception/GlobalExceptionHandler.java b/bs-framework/src/main/java/com/bs/framework/web/exception/GlobalExceptionHandler.java new file mode 100644 index 0000000..410a80d --- /dev/null +++ b/bs-framework/src/main/java/com/bs/framework/web/exception/GlobalExceptionHandler.java @@ -0,0 +1,138 @@ +package com.bs.framework.web.exception; + +import javax.servlet.http.HttpServletRequest; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.security.access.AccessDeniedException; +import org.springframework.validation.BindException; +import org.springframework.web.HttpRequestMethodNotSupportedException; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.MissingPathVariableException; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.RestControllerAdvice; +import org.springframework.web.method.annotation.MethodArgumentTypeMismatchException; +import com.bs.common.constant.HttpStatus; +import com.bs.common.core.domain.AjaxResult; +import com.bs.common.exception.DemoModeException; +import com.bs.common.exception.ServiceException; +import com.bs.common.utils.StringUtils; + +/** + * 全局异常处理器 + * + * @author bs + */ +@RestControllerAdvice +public class GlobalExceptionHandler +{ + private static final Logger log = LoggerFactory.getLogger(GlobalExceptionHandler.class); + + /** + * 权限校验异常 + */ + @ExceptionHandler(AccessDeniedException.class) + public AjaxResult handleAccessDeniedException(AccessDeniedException e, HttpServletRequest request) + { + String requestURI = request.getRequestURI(); + log.error("请求地址'{}',权限校验失败'{}'", requestURI, e.getMessage()); + return AjaxResult.error(HttpStatus.FORBIDDEN, "没有权限,请联系管理员授权"); + } + + /** + * 请求方式不支持 + */ + @ExceptionHandler(HttpRequestMethodNotSupportedException.class) + public AjaxResult handleHttpRequestMethodNotSupported(HttpRequestMethodNotSupportedException e, + HttpServletRequest request) + { + String requestURI = request.getRequestURI(); + log.error("请求地址'{}',不支持'{}'请求", requestURI, e.getMethod()); + return AjaxResult.error(e.getMessage()); + } + + /** + * 业务异常 + */ + @ExceptionHandler(ServiceException.class) + public AjaxResult handleServiceException(ServiceException e, HttpServletRequest request) + { + log.error(e.getMessage(), e); + Integer code = e.getCode(); + return StringUtils.isNotNull(code) ? AjaxResult.error(code, e.getMessage()) : AjaxResult.error(e.getMessage()); + } + + /** + * 请求路径中缺少必需的路径变量 + */ + @ExceptionHandler(MissingPathVariableException.class) + public AjaxResult handleMissingPathVariableException(MissingPathVariableException e, HttpServletRequest request) + { + String requestURI = request.getRequestURI(); + log.error("请求路径中缺少必需的路径变量'{}',发生系统异常.", requestURI, e); + return AjaxResult.error(String.format("请求路径中缺少必需的路径变量[%s]", e.getVariableName())); + } + + /** + * 请求参数类型不匹配 + */ + @ExceptionHandler(MethodArgumentTypeMismatchException.class) + public AjaxResult handleMethodArgumentTypeMismatchException(MethodArgumentTypeMismatchException e, HttpServletRequest request) + { + String requestURI = request.getRequestURI(); + log.error("请求参数类型不匹配'{}',发生系统异常.", requestURI, e); + return AjaxResult.error(String.format("请求参数类型不匹配,参数[%s]要求类型为:'%s',但输入值为:'%s'", e.getName(), e.getRequiredType().getName(), e.getValue())); + } + + /** + * 拦截未知的运行时异常 + */ + @ExceptionHandler(RuntimeException.class) + public AjaxResult handleRuntimeException(RuntimeException e, HttpServletRequest request) + { + String requestURI = request.getRequestURI(); + log.error("请求地址'{}',发生未知异常.", requestURI, e); + return AjaxResult.error(e.getMessage()); + } + + /** + * 系统异常 + */ + @ExceptionHandler(Exception.class) + public AjaxResult handleException(Exception e, HttpServletRequest request) + { + String requestURI = request.getRequestURI(); + log.error("请求地址'{}',发生系统异常.", requestURI, e); + return AjaxResult.error(e.getMessage()); + } + + /** + * 自定义验证异常 + */ + @ExceptionHandler(BindException.class) + public AjaxResult handleBindException(BindException e) + { + log.error(e.getMessage(), e); + String message = e.getAllErrors().get(0).getDefaultMessage(); + return AjaxResult.error(message); + } + + /** + * 自定义验证异常 + */ + @ExceptionHandler(MethodArgumentNotValidException.class) + public Object handleMethodArgumentNotValidException(MethodArgumentNotValidException e) + { + log.error(e.getMessage(), e); + String message = e.getBindingResult().getFieldError().getDefaultMessage(); + return AjaxResult.error(message); + } + + /** + * 演示模式异常 + */ + @ExceptionHandler(DemoModeException.class) + public AjaxResult handleDemoModeException(DemoModeException e) + { + return AjaxResult.error("演示模式,不允许操作"); + } +} diff --git a/bs-framework/src/main/java/com/bs/framework/web/service/PermissionService.java b/bs-framework/src/main/java/com/bs/framework/web/service/PermissionService.java new file mode 100644 index 0000000..95716d4 --- /dev/null +++ b/bs-framework/src/main/java/com/bs/framework/web/service/PermissionService.java @@ -0,0 +1,168 @@ +package com.bs.framework.web.service; + +import java.util.Set; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; +import com.bs.common.core.domain.entity.SysRole; +import com.bs.common.core.domain.model.LoginUser; +import com.bs.common.utils.SecurityUtils; +import com.bs.common.utils.StringUtils; +import com.bs.framework.security.context.PermissionContextHolder; + +/** + * bs首创 自定义权限实现,ss取自SpringSecurity首字母 + * + * @author bs + */ +@Service("ss") +public class PermissionService +{ + /** 所有权限标识 */ + private static final String ALL_PERMISSION = "*:*:*"; + + /** 管理员角色权限标识 */ + private static final String SUPER_ADMIN = "admin"; + + private static final String ROLE_DELIMETER = ","; + + private static final String PERMISSION_DELIMETER = ","; + + /** + * 验证用户是否具备某权限 + * + * @param permission 权限字符串 + * @return 用户是否具备某权限 + */ + public boolean hasPermi(String permission) + { + if (StringUtils.isEmpty(permission)) + { + return false; + } + LoginUser loginUser = SecurityUtils.getLoginUser(); + if (StringUtils.isNull(loginUser) || CollectionUtils.isEmpty(loginUser.getPermissions())) + { + return false; + } + PermissionContextHolder.setContext(permission); + return hasPermissions(loginUser.getPermissions(), permission); + } + + /** + * 验证用户是否不具备某权限,与 hasPermi逻辑相反 + * + * @param permission 权限字符串 + * @return 用户是否不具备某权限 + */ + public boolean lacksPermi(String permission) + { + return hasPermi(permission) != true; + } + + /** + * 验证用户是否具有以下任意一个权限 + * + * @param permissions 以 PERMISSION_DELIMETER 为分隔符的权限列表 + * @return 用户是否具有以下任意一个权限 + */ + public boolean hasAnyPermi(String permissions) + { + if (StringUtils.isEmpty(permissions)) + { + return false; + } + LoginUser loginUser = SecurityUtils.getLoginUser(); + if (StringUtils.isNull(loginUser) || CollectionUtils.isEmpty(loginUser.getPermissions())) + { + return false; + } + PermissionContextHolder.setContext(permissions); + Set authorities = loginUser.getPermissions(); + for (String permission : permissions.split(PERMISSION_DELIMETER)) + { + if (permission != null && hasPermissions(authorities, permission)) + { + return true; + } + } + return false; + } + + /** + * 判断用户是否拥有某个角色 + * + * @param role 角色字符串 + * @return 用户是否具备某角色 + */ + public boolean hasRole(String role) + { + if (StringUtils.isEmpty(role)) + { + return false; + } + LoginUser loginUser = SecurityUtils.getLoginUser(); + if (StringUtils.isNull(loginUser) || CollectionUtils.isEmpty(loginUser.getUser().getRoles())) + { + return false; + } + for (SysRole sysRole : loginUser.getUser().getRoles()) + { + String roleKey = sysRole.getRoleKey(); + if (SUPER_ADMIN.equals(roleKey) || roleKey.equals(StringUtils.trim(role))) + { + return true; + } + } + return false; + } + + /** + * 验证用户是否不具备某角色,与 isRole逻辑相反。 + * + * @param role 角色名称 + * @return 用户是否不具备某角色 + */ + public boolean lacksRole(String role) + { + return hasRole(role) != true; + } + + /** + * 验证用户是否具有以下任意一个角色 + * + * @param roles 以 ROLE_NAMES_DELIMETER 为分隔符的角色列表 + * @return 用户是否具有以下任意一个角色 + */ + public boolean hasAnyRoles(String roles) + { + if (StringUtils.isEmpty(roles)) + { + return false; + } + LoginUser loginUser = SecurityUtils.getLoginUser(); + if (StringUtils.isNull(loginUser) || CollectionUtils.isEmpty(loginUser.getUser().getRoles())) + { + return false; + } + for (String role : roles.split(ROLE_DELIMETER)) + { + if (hasRole(role)) + { + return true; + } + } + return false; + } + + /** + * 判断是否包含权限 + * + * @param permissions 权限列表 + * @param permission 权限字符串 + * @return 用户是否具备某权限 + */ + private boolean hasPermissions(Set permissions, String permission) + { + return permissions.contains(ALL_PERMISSION) || permissions.contains(StringUtils.trim(permission)); + } +} diff --git a/bs-framework/src/main/java/com/bs/framework/web/service/SysLoginService.java b/bs-framework/src/main/java/com/bs/framework/web/service/SysLoginService.java new file mode 100644 index 0000000..554287f --- /dev/null +++ b/bs-framework/src/main/java/com/bs/framework/web/service/SysLoginService.java @@ -0,0 +1,181 @@ +package com.bs.framework.web.service; + +import javax.annotation.Resource; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.security.authentication.BadCredentialsException; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.Authentication; +import org.springframework.stereotype.Component; +import com.bs.common.constant.CacheConstants; +import com.bs.common.constant.Constants; +import com.bs.common.constant.UserConstants; +import com.bs.common.core.domain.entity.SysUser; +import com.bs.common.core.domain.model.LoginUser; +import com.bs.common.core.redis.RedisCache; +import com.bs.common.exception.ServiceException; +import com.bs.common.exception.user.BlackListException; +import com.bs.common.exception.user.CaptchaException; +import com.bs.common.exception.user.CaptchaExpireException; +import com.bs.common.exception.user.UserNotExistsException; +import com.bs.common.exception.user.UserPasswordNotMatchException; +import com.bs.common.utils.DateUtils; +import com.bs.common.utils.MessageUtils; +import com.bs.common.utils.StringUtils; +import com.bs.common.utils.ip.IpUtils; +import com.bs.framework.manager.AsyncManager; +import com.bs.framework.manager.factory.AsyncFactory; +import com.bs.framework.security.context.AuthenticationContextHolder; +import com.bs.system.service.ISysConfigService; +import com.bs.system.service.ISysUserService; + +/** + * 登录校验方法 + * + * @author bs + */ +@Component +public class SysLoginService +{ + @Autowired + private TokenService tokenService; + + @Resource + private AuthenticationManager authenticationManager; + + @Autowired + private RedisCache redisCache; + + @Autowired + private ISysUserService userService; + + @Autowired + private ISysConfigService configService; + + /** + * 登录验证 + * + * @param username 用户名 + * @param password 密码 + * @param code 验证码 + * @param uuid 唯一标识 + * @return 结果 + */ + public String login(String username, String password, String code, String uuid) + { + // 验证码校验 + validateCaptcha(username, code, uuid); + // 登录前置校验 + loginPreCheck(username, password); + // 用户验证 + Authentication authentication = null; + try + { + UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(username, password); + AuthenticationContextHolder.setContext(authenticationToken); + // 该方法会去调用UserDetailsServiceImpl.loadUserByUsername + authentication = authenticationManager.authenticate(authenticationToken); + } + catch (Exception e) + { + if (e instanceof BadCredentialsException) + { + AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.password.not.match"))); + throw new UserPasswordNotMatchException(); + } + else + { + AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, e.getMessage())); + throw new ServiceException(e.getMessage()); + } + } + finally + { + AuthenticationContextHolder.clearContext(); + } + AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success"))); + LoginUser loginUser = (LoginUser) authentication.getPrincipal(); + recordLoginInfo(loginUser.getUserId()); + // 生成token + return tokenService.createToken(loginUser); + } + + /** + * 校验验证码 + * + * @param username 用户名 + * @param code 验证码 + * @param uuid 唯一标识 + * @return 结果 + */ + public void validateCaptcha(String username, String code, String uuid) + { + boolean captchaEnabled = configService.selectCaptchaEnabled(); + if (captchaEnabled) + { + String verifyKey = CacheConstants.CAPTCHA_CODE_KEY + StringUtils.nvl(uuid, ""); + String captcha = redisCache.getCacheObject(verifyKey); + redisCache.deleteObject(verifyKey); + if (captcha == null) + { + AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.expire"))); + throw new CaptchaExpireException(); + } + if (!code.equalsIgnoreCase(captcha)) + { + AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.error"))); + throw new CaptchaException(); + } + } + } + + /** + * 登录前置校验 + * @param username 用户名 + * @param password 用户密码 + */ + public void loginPreCheck(String username, String password) + { + // 用户名或密码为空 错误 + if (StringUtils.isEmpty(username) || StringUtils.isEmpty(password)) + { + AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("not.null"))); + throw new UserNotExistsException(); + } + // 密码如果不在指定范围内 错误 + if (password.length() < UserConstants.PASSWORD_MIN_LENGTH + || password.length() > UserConstants.PASSWORD_MAX_LENGTH) + { + AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.password.not.match"))); + throw new UserPasswordNotMatchException(); + } + // 用户名不在指定范围内 错误 + if (username.length() < UserConstants.USERNAME_MIN_LENGTH + || username.length() > UserConstants.USERNAME_MAX_LENGTH) + { + AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.password.not.match"))); + throw new UserPasswordNotMatchException(); + } + // IP黑名单校验 + String blackStr = configService.selectConfigByKey("sys.login.blackIPList"); + if (IpUtils.isMatchedIp(blackStr, IpUtils.getIpAddr())) + { + AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("login.blocked"))); + throw new BlackListException(); + } + } + + /** + * 记录登录信息 + * + * @param userId 用户ID + */ + public void recordLoginInfo(Long userId) + { + SysUser sysUser = new SysUser(); + sysUser.setUserId(userId); + sysUser.setLoginIp(IpUtils.getIpAddr()); + sysUser.setLoginDate(DateUtils.getNowDate()); + userService.updateUserProfile(sysUser); + } +} diff --git a/bs-framework/src/main/java/com/bs/framework/web/service/SysPasswordService.java b/bs-framework/src/main/java/com/bs/framework/web/service/SysPasswordService.java new file mode 100644 index 0000000..c10e91a --- /dev/null +++ b/bs-framework/src/main/java/com/bs/framework/web/service/SysPasswordService.java @@ -0,0 +1,94 @@ +package com.bs.framework.web.service; + +import java.util.concurrent.TimeUnit; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.security.core.Authentication; +import org.springframework.stereotype.Component; +import com.bs.common.constant.CacheConstants; +import com.bs.common.constant.Constants; +import com.bs.common.core.domain.entity.SysUser; +import com.bs.common.core.redis.RedisCache; +import com.bs.common.exception.user.UserPasswordNotMatchException; +import com.bs.common.exception.user.UserPasswordRetryLimitExceedException; +import com.bs.common.utils.MessageUtils; +import com.bs.common.utils.SecurityUtils; +import com.bs.framework.manager.AsyncManager; +import com.bs.framework.manager.factory.AsyncFactory; +import com.bs.framework.security.context.AuthenticationContextHolder; + +/** + * 登录密码方法 + * + * @author bs + */ +@Component +public class SysPasswordService +{ + @Autowired + private RedisCache redisCache; + + @Value(value = "${user.password.maxRetryCount}") + private int maxRetryCount; + + @Value(value = "${user.password.lockTime}") + private int lockTime; + + /** + * 登录账户密码错误次数缓存键名 + * + * @param username 用户名 + * @return 缓存键key + */ + private String getCacheKey(String username) + { + return CacheConstants.PWD_ERR_CNT_KEY + username; + } + + public void validate(SysUser user) + { + Authentication usernamePasswordAuthenticationToken = AuthenticationContextHolder.getContext(); + String username = usernamePasswordAuthenticationToken.getName(); + String password = usernamePasswordAuthenticationToken.getCredentials().toString(); + + Integer retryCount = redisCache.getCacheObject(getCacheKey(username)); + + if (retryCount == null) + { + retryCount = 0; + } + + if (retryCount >= Integer.valueOf(maxRetryCount).intValue()) + { + AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, + MessageUtils.message("user.password.retry.limit.exceed", maxRetryCount, lockTime))); + throw new UserPasswordRetryLimitExceedException(maxRetryCount, lockTime); + } + + if (!matches(user, password)) + { + retryCount = retryCount + 1; + AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, + MessageUtils.message("user.password.retry.limit.count", retryCount))); + redisCache.setCacheObject(getCacheKey(username), retryCount, lockTime, TimeUnit.MINUTES); + throw new UserPasswordNotMatchException(); + } + else + { + clearLoginRecordCache(username); + } + } + + public boolean matches(SysUser user, String rawPassword) + { + return SecurityUtils.matchesPassword(rawPassword, user.getPassword()); + } + + public void clearLoginRecordCache(String loginName) + { + if (redisCache.hasKey(getCacheKey(loginName))) + { + redisCache.deleteObject(getCacheKey(loginName)); + } + } +} diff --git a/bs-framework/src/main/java/com/bs/framework/web/service/SysPermissionService.java b/bs-framework/src/main/java/com/bs/framework/web/service/SysPermissionService.java new file mode 100644 index 0000000..10bbf55 --- /dev/null +++ b/bs-framework/src/main/java/com/bs/framework/web/service/SysPermissionService.java @@ -0,0 +1,71 @@ +package com.bs.framework.web.service; + +import com.bs.common.core.domain.entity.SysRole; +import com.bs.common.core.domain.entity.SysUser; +import com.bs.system.service.ISysMenuService; +import com.bs.system.service.ISysRoleService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +/** + * 用户权限处理 + * + * @author bs + */ +@Component +public class SysPermissionService { + @Autowired + private ISysRoleService roleService; + + @Autowired + private ISysMenuService menuService; + + /** + * 获取角色数据权限 + * + * @param user 用户信息 + * @return 角色权限信息 + */ + public Set getRolePermission(SysUser user) { + Set roles = new HashSet(); + // 管理员拥有所有权限 + if (user.isAdmin()) { + roles.add("admin"); + } else { + roles.addAll(roleService.selectRolePermissionByUserId(user.getUserId())); + } + return roles; + } + + /** + * 获取菜单数据权限 + * + * @param user 用户信息 + * @return 菜单权限信息 + */ + public Set getMenuPermission(SysUser user) { + Set perms = new HashSet(); + // 管理员拥有所有权限 + if (user.isAdmin()) { + perms.add("*:*:*"); + } else { + List roles = user.getRoles(); + if (!CollectionUtils.isEmpty(roles)) { + // 多角色设置permissions属性,以便数据权限匹配权限 + for (SysRole role : roles) { + Set rolePerms = menuService.selectMenuPermsByRoleId(role.getRoleId()); + role.setPermissions(rolePerms); + perms.addAll(rolePerms); + } + } else { + perms.addAll(menuService.selectMenuPermsByUserId(user.getUserId())); + } + } + return perms; + } +} diff --git a/bs-framework/src/main/java/com/bs/framework/web/service/SysRegisterService.java b/bs-framework/src/main/java/com/bs/framework/web/service/SysRegisterService.java new file mode 100644 index 0000000..1d4aa3b --- /dev/null +++ b/bs-framework/src/main/java/com/bs/framework/web/service/SysRegisterService.java @@ -0,0 +1,115 @@ +package com.bs.framework.web.service; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import com.bs.common.constant.CacheConstants; +import com.bs.common.constant.Constants; +import com.bs.common.constant.UserConstants; +import com.bs.common.core.domain.entity.SysUser; +import com.bs.common.core.domain.model.RegisterBody; +import com.bs.common.core.redis.RedisCache; +import com.bs.common.exception.user.CaptchaException; +import com.bs.common.exception.user.CaptchaExpireException; +import com.bs.common.utils.MessageUtils; +import com.bs.common.utils.SecurityUtils; +import com.bs.common.utils.StringUtils; +import com.bs.framework.manager.AsyncManager; +import com.bs.framework.manager.factory.AsyncFactory; +import com.bs.system.service.ISysConfigService; +import com.bs.system.service.ISysUserService; + +/** + * 注册校验方法 + * + * @author bs + */ +@Component +public class SysRegisterService +{ + @Autowired + private ISysUserService userService; + + @Autowired + private ISysConfigService configService; + + @Autowired + private RedisCache redisCache; + + /** + * 注册 + */ + public String register(RegisterBody registerBody) + { + String msg = "", username = registerBody.getUsername(), password = registerBody.getPassword(); + SysUser sysUser = new SysUser(); + sysUser.setUserName(username); + + // 验证码开关 + boolean captchaEnabled = configService.selectCaptchaEnabled(); + if (captchaEnabled) + { + validateCaptcha(username, registerBody.getCode(), registerBody.getUuid()); + } + + if (StringUtils.isEmpty(username)) + { + msg = "用户名不能为空"; + } + else if (StringUtils.isEmpty(password)) + { + msg = "用户密码不能为空"; + } + else if (username.length() < UserConstants.USERNAME_MIN_LENGTH + || username.length() > UserConstants.USERNAME_MAX_LENGTH) + { + msg = "账户长度必须在2到20个字符之间"; + } + else if (password.length() < UserConstants.PASSWORD_MIN_LENGTH + || password.length() > UserConstants.PASSWORD_MAX_LENGTH) + { + msg = "密码长度必须在5到20个字符之间"; + } + else if (!userService.checkUserNameUnique(sysUser)) + { + msg = "保存用户'" + username + "'失败,注册账号已存在"; + } + else + { + sysUser.setNickName(username); + sysUser.setPassword(SecurityUtils.encryptPassword(password)); + boolean regFlag = userService.registerUser(sysUser); + if (!regFlag) + { + msg = "注册失败,请联系系统管理人员"; + } + else + { + AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.REGISTER, MessageUtils.message("user.register.success"))); + } + } + return msg; + } + + /** + * 校验验证码 + * + * @param username 用户名 + * @param code 验证码 + * @param uuid 唯一标识 + * @return 结果 + */ + public void validateCaptcha(String username, String code, String uuid) + { + String verifyKey = CacheConstants.CAPTCHA_CODE_KEY + StringUtils.nvl(uuid, ""); + String captcha = redisCache.getCacheObject(verifyKey); + redisCache.deleteObject(verifyKey); + if (captcha == null) + { + throw new CaptchaExpireException(); + } + if (!code.equalsIgnoreCase(captcha)) + { + throw new CaptchaException(); + } + } +} diff --git a/bs-framework/src/main/java/com/bs/framework/web/service/TokenService.java b/bs-framework/src/main/java/com/bs/framework/web/service/TokenService.java new file mode 100644 index 0000000..9404668 --- /dev/null +++ b/bs-framework/src/main/java/com/bs/framework/web/service/TokenService.java @@ -0,0 +1,227 @@ +package com.bs.framework.web.service; + +import com.bs.common.constant.CacheConstants; +import com.bs.common.constant.Constants; +import com.bs.common.core.domain.model.LoginUser; +import com.bs.common.core.redis.RedisCache; +import com.bs.common.utils.ServletUtils; +import com.bs.common.utils.StringUtils; +import com.bs.common.utils.ip.AddressUtils; +import com.bs.common.utils.ip.IpUtils; +import com.bs.common.utils.uuid.IdUtils; +import eu.bitwalker.useragentutils.UserAgent; +import io.jsonwebtoken.Claims; +import io.jsonwebtoken.Jwts; +import io.jsonwebtoken.SignatureAlgorithm; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +import javax.servlet.http.HttpServletRequest; +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * token验证处理 + * + * @author bs + */ +@Component +public class TokenService +{ + // 令牌自定义标识 + @Value("${token.header}") + private String header; + + // 令牌秘钥 + @Value("${token.secret}") + private String secret; + + // 令牌有效期(默认30分钟) + @Value("${token.expireTime}") + private int expireTime; + + protected static final long MILLIS_SECOND = 1000; + + protected static final long MILLIS_MINUTE = 60 * MILLIS_SECOND; + + private static final Long MILLIS_MINUTE_TEN = 20 * 60 * 1000L; + + @Autowired + private RedisCache redisCache; + + /** + * 获取用户身份信息 + * + * @return 用户信息 + */ + public LoginUser getLoginUser(HttpServletRequest request) + { + // 获取请求携带的令牌 + String token = getToken(request); + if (StringUtils.isNotEmpty(token)) + { + try + { + Claims claims = parseToken(token); + // 解析对应的权限以及用户信息 + String uuid = (String) claims.get(Constants.LOGIN_USER_KEY); + String userKey = getTokenKey(uuid); + LoginUser user = redisCache.getCacheObject(userKey); + return user; + } + catch (Exception e) + { + } + } + return null; + } + + /** + * 设置用户身份信息 + */ + public void setLoginUser(LoginUser loginUser) + { + if (StringUtils.isNotNull(loginUser) && StringUtils.isNotEmpty(loginUser.getToken())) + { + refreshToken(loginUser); + } + } + + /** + * 删除用户身份信息 + */ + public void delLoginUser(String token) + { + if (StringUtils.isNotEmpty(token)) + { + String userKey = getTokenKey(token); + redisCache.deleteObject(userKey); + } + } + + /** + * 创建令牌 + * + * @param loginUser 用户信息 + * @return 令牌 + */ + public String createToken(LoginUser loginUser) + { + String token = IdUtils.fastUUID(); + loginUser.setToken(token); + setUserAgent(loginUser); + refreshToken(loginUser); + + Map claims = new HashMap<>(); + claims.put(Constants.LOGIN_USER_KEY, token); + return createToken(claims); + } + + /** + * 验证令牌有效期,相差不足20分钟,自动刷新缓存 + * + * @param loginUser + * @return 令牌 + */ + public void verifyToken(LoginUser loginUser) + { + long expireTime = loginUser.getExpireTime(); + long currentTime = System.currentTimeMillis(); + if (expireTime - currentTime <= MILLIS_MINUTE_TEN) + { + refreshToken(loginUser); + } + } + + /** + * 刷新令牌有效期 + * + * @param loginUser 登录信息 + */ + public void refreshToken(LoginUser loginUser) + { + loginUser.setLoginTime(System.currentTimeMillis()); + loginUser.setExpireTime(loginUser.getLoginTime() + expireTime * MILLIS_MINUTE); + // 根据uuid将loginUser缓存 + String userKey = getTokenKey(loginUser.getToken()); + redisCache.setCacheObject(userKey, loginUser, expireTime, TimeUnit.MINUTES); + } + + /** + * 设置用户代理信息 + * + * @param loginUser 登录信息 + */ + public void setUserAgent(LoginUser loginUser) + { + UserAgent userAgent = UserAgent.parseUserAgentString(ServletUtils.getRequest().getHeader("User-Agent")); + String ip = IpUtils.getIpAddr(); + loginUser.setIpaddr(ip); + loginUser.setLoginLocation(AddressUtils.getRealAddressByIP(ip)); + loginUser.setBrowser(userAgent.getBrowser().getName()); + loginUser.setOs(userAgent.getOperatingSystem().getName()); + } + + /** + * 从数据声明生成令牌 + * + * @param claims 数据声明 + * @return 令牌 + */ + private String createToken(Map claims) + { + String token = Jwts.builder() + .setClaims(claims) + .signWith(SignatureAlgorithm.HS512, secret).compact(); + return token; + } + + /** + * 从令牌中获取数据声明 + * + * @param token 令牌 + * @return 数据声明 + */ + private Claims parseToken(String token) + { + return Jwts.parser() + .setSigningKey(secret) + .parseClaimsJws(token) + .getBody(); + } + + /** + * 从令牌中获取用户名 + * + * @param token 令牌 + * @return 用户名 + */ + public String getUsernameFromToken(String token) + { + Claims claims = parseToken(token); + return claims.getSubject(); + } + + /** + * 获取请求token + * + * @param request + * @return token + */ + private String getToken(HttpServletRequest request) + { + String token = request.getHeader(header); + if (StringUtils.isNotEmpty(token) && token.startsWith(Constants.TOKEN_PREFIX)) + { + token = token.replace(Constants.TOKEN_PREFIX, ""); + } + return token; + } + + private String getTokenKey(String uuid) + { + return CacheConstants.LOGIN_TOKEN_KEY + uuid; + } +} diff --git a/bs-framework/src/main/java/com/bs/framework/web/service/UserDetailsServiceImpl.java b/bs-framework/src/main/java/com/bs/framework/web/service/UserDetailsServiceImpl.java new file mode 100644 index 0000000..8995872 --- /dev/null +++ b/bs-framework/src/main/java/com/bs/framework/web/service/UserDetailsServiceImpl.java @@ -0,0 +1,65 @@ +package com.bs.framework.web.service; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.security.core.userdetails.UsernameNotFoundException; +import org.springframework.stereotype.Service; +import com.bs.common.core.domain.entity.SysUser; +import com.bs.common.core.domain.model.LoginUser; +import com.bs.common.enums.UserStatus; +import com.bs.common.exception.ServiceException; +import com.bs.common.utils.StringUtils; +import com.bs.system.service.ISysUserService; + +/** + * 用户验证处理 + * + * @author bs + */ +@Service +public class UserDetailsServiceImpl implements UserDetailsService +{ + private static final Logger log = LoggerFactory.getLogger(UserDetailsServiceImpl.class); + + @Autowired + private ISysUserService userService; + + @Autowired + private SysPasswordService passwordService; + + @Autowired + private SysPermissionService permissionService; + + @Override + public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException + { + SysUser user = userService.selectUserByUserName(username); + if (StringUtils.isNull(user)) + { + log.info("登录用户:{} 不存在.", username); + throw new ServiceException("登录用户:" + username + " 不存在"); + } + else if (UserStatus.DELETED.getCode().equals(user.getDelFlag())) + { + log.info("登录用户:{} 已被删除.", username); + throw new ServiceException("对不起,您的账号:" + username + " 已被删除"); + } + else if (UserStatus.DISABLE.getCode().equals(user.getStatus())) + { + log.info("登录用户:{} 已被停用.", username); + throw new ServiceException("对不起,您的账号:" + username + " 已停用"); + } + + passwordService.validate(user); + + return createLoginUser(user); + } + + public UserDetails createLoginUser(SysUser user) + { + return new LoginUser(user.getUserId(), user.getDeptId(), user, permissionService.getMenuPermission(user)); + } +} diff --git a/bs-generator/pom.xml b/bs-generator/pom.xml new file mode 100644 index 0000000..0704787 --- /dev/null +++ b/bs-generator/pom.xml @@ -0,0 +1,44 @@ + + + + my-base + com.bs + 3.8.6 + + 4.0.0 + + bs-generator + + + generator代码生成 + + + + + + + org.apache.velocity + velocity-engine-core + + + + + commons-collections + commons-collections + + + + + com.bs + bs-common + + + + com.baomidou + mybatis-plus-generator + + + + diff --git a/bs-generator/src/main/java/com/bs/generator/config/GenConfig.java b/bs-generator/src/main/java/com/bs/generator/config/GenConfig.java new file mode 100644 index 0000000..77933bf --- /dev/null +++ b/bs-generator/src/main/java/com/bs/generator/config/GenConfig.java @@ -0,0 +1,73 @@ +package com.bs.generator.config; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.PropertySource; +import org.springframework.stereotype.Component; + +/** + * 读取代码生成相关配置 + * + * @author bs + */ +@Component +@ConfigurationProperties(prefix = "gen") +@PropertySource(value = { "classpath:generator.yml" }) +public class GenConfig +{ + /** 作者 */ + public static String author; + + /** 生成包路径 */ + public static String packageName; + + /** 自动去除表前缀,默认是false */ + public static boolean autoRemovePre; + + /** 表前缀(类名不会包含表前缀) */ + public static String tablePrefix; + + public static String getAuthor() + { + return author; + } + + @Value("${author}") + public void setAuthor(String author) + { + GenConfig.author = author; + } + + public static String getPackageName() + { + return packageName; + } + + @Value("${packageName}") + public void setPackageName(String packageName) + { + GenConfig.packageName = packageName; + } + + public static boolean getAutoRemovePre() + { + return autoRemovePre; + } + + @Value("${autoRemovePre}") + public void setAutoRemovePre(boolean autoRemovePre) + { + GenConfig.autoRemovePre = autoRemovePre; + } + + public static String getTablePrefix() + { + return tablePrefix; + } + + @Value("${tablePrefix}") + public void setTablePrefix(String tablePrefix) + { + GenConfig.tablePrefix = tablePrefix; + } +} diff --git a/bs-generator/src/main/java/com/bs/generator/controller/GenController.java b/bs-generator/src/main/java/com/bs/generator/controller/GenController.java new file mode 100644 index 0000000..c8bd21d --- /dev/null +++ b/bs-generator/src/main/java/com/bs/generator/controller/GenController.java @@ -0,0 +1,214 @@ +package com.bs.generator.controller; + +import java.io.IOException; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import javax.servlet.http.HttpServletResponse; +import org.apache.commons.io.IOUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.bs.common.annotation.Log; +import com.bs.common.core.controller.BaseController; +import com.bs.common.core.domain.AjaxResult; +import com.bs.common.core.page.TableDataInfo; +import com.bs.common.core.text.Convert; +import com.bs.common.enums.BusinessType; +import com.bs.generator.domain.GenTable; +import com.bs.generator.domain.GenTableColumn; +import com.bs.generator.service.IGenTableColumnService; +import com.bs.generator.service.IGenTableService; + +/** + * 代码生成 操作处理 + * + * @author bs + */ +@RestController +@RequestMapping("/tool/gen") +public class GenController extends BaseController +{ + @Autowired + private IGenTableService genTableService; + + @Autowired + private IGenTableColumnService genTableColumnService; + + /** + * 查询代码生成列表 + */ + @PreAuthorize("@ss.hasPermi('tool:gen:list')") + @GetMapping("/list") + public TableDataInfo genList(GenTable genTable) + { + startPage(); + List list = genTableService.selectGenTableList(genTable); + return getDataTable(list); + } + + /** + * 修改代码生成业务 + */ + @PreAuthorize("@ss.hasPermi('tool:gen:query')") + @GetMapping(value = "/{tableId}") + public AjaxResult getInfo(@PathVariable Long tableId) + { + GenTable table = genTableService.selectGenTableById(tableId); + List tables = genTableService.selectGenTableAll(); + List list = genTableColumnService.selectGenTableColumnListByTableId(tableId); + Map map = new HashMap(); + map.put("info", table); + map.put("rows", list); + map.put("tables", tables); + return success(map); + } + + /** + * 查询数据库列表 + */ + @PreAuthorize("@ss.hasPermi('tool:gen:list')") + @GetMapping("/db/list") + public TableDataInfo dataList(GenTable genTable) + { + startPage(); + List list = genTableService.selectDbTableList(genTable); + return getDataTable(list); + } + + /** + * 查询数据表字段列表 + */ + @PreAuthorize("@ss.hasPermi('tool:gen:list')") + @GetMapping(value = "/column/{tableId}") + public TableDataInfo columnList(Long tableId) + { + TableDataInfo dataInfo = new TableDataInfo(); + List list = genTableColumnService.selectGenTableColumnListByTableId(tableId); + dataInfo.setRows(list); + dataInfo.setTotal(list.size()); + return dataInfo; + } + + /** + * 导入表结构(保存) + */ + @PreAuthorize("@ss.hasPermi('tool:gen:import')") + @Log(title = "代码生成", businessType = BusinessType.IMPORT) + @PostMapping("/importTable") + public AjaxResult importTableSave(String tables) + { + String[] tableNames = Convert.toStrArray(tables); + // 查询表信息 + List tableList = genTableService.selectDbTableListByNames(tableNames); + genTableService.importGenTable(tableList); + return success(); + } + + /** + * 修改保存代码生成业务 + */ + @PreAuthorize("@ss.hasPermi('tool:gen:edit')") + @Log(title = "代码生成", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult editSave(@Validated @RequestBody GenTable genTable) + { + genTableService.validateEdit(genTable); + genTableService.updateGenTable(genTable); + return success(); + } + + /** + * 删除代码生成 + */ + @PreAuthorize("@ss.hasPermi('tool:gen:remove')") + @Log(title = "代码生成", businessType = BusinessType.DELETE) + @DeleteMapping("/{tableIds}") + public AjaxResult remove(@PathVariable Long[] tableIds) + { + genTableService.deleteGenTableByIds(tableIds); + return success(); + } + + /** + * 预览代码 + */ + @PreAuthorize("@ss.hasPermi('tool:gen:preview')") + @GetMapping("/preview/{tableId}") + public AjaxResult preview(@PathVariable("tableId") Long tableId) throws IOException + { + Map dataMap = genTableService.previewCode(tableId); + return success(dataMap); + } + + /** + * 生成代码(下载方式) + */ + @PreAuthorize("@ss.hasPermi('tool:gen:code')") + @Log(title = "代码生成", businessType = BusinessType.GENCODE) + @GetMapping("/download/{tableName}") + public void download(HttpServletResponse response, @PathVariable("tableName") String tableName) throws IOException + { + byte[] data = genTableService.downloadCode(tableName); + genCode(response, data); + } + + /** + * 生成代码(自定义路径) + */ + @PreAuthorize("@ss.hasPermi('tool:gen:code')") + @Log(title = "代码生成", businessType = BusinessType.GENCODE) + @GetMapping("/genCode/{tableName}") + public AjaxResult genCode(@PathVariable("tableName") String tableName) + { + genTableService.generatorCode(tableName); + return success(); + } + + /** + * 同步数据库 + */ + @PreAuthorize("@ss.hasPermi('tool:gen:edit')") + @Log(title = "代码生成", businessType = BusinessType.UPDATE) + @GetMapping("/synchDb/{tableName}") + public AjaxResult synchDb(@PathVariable("tableName") String tableName) + { + genTableService.synchDb(tableName); + return success(); + } + + /** + * 批量生成代码 + */ + @PreAuthorize("@ss.hasPermi('tool:gen:code')") + @Log(title = "代码生成", businessType = BusinessType.GENCODE) + @GetMapping("/batchGenCode") + public void batchGenCode(HttpServletResponse response, String tables) throws IOException + { + String[] tableNames = Convert.toStrArray(tables); + byte[] data = genTableService.downloadCode(tableNames); + genCode(response, data); + } + + /** + * 生成zip文件 + */ + private void genCode(HttpServletResponse response, byte[] data) throws IOException + { + response.reset(); + response.addHeader("Access-Control-Allow-Origin", "*"); + response.addHeader("Access-Control-Expose-Headers", "Content-Disposition"); + response.setHeader("Content-Disposition", "attachment; filename=\"bs.zip\""); + response.addHeader("Content-Length", "" + data.length); + response.setContentType("application/octet-stream; charset=UTF-8"); + IOUtils.write(data, response.getOutputStream()); + } +} diff --git a/bs-generator/src/main/java/com/bs/generator/domain/GenTable.java b/bs-generator/src/main/java/com/bs/generator/domain/GenTable.java new file mode 100644 index 0000000..02d7316 --- /dev/null +++ b/bs-generator/src/main/java/com/bs/generator/domain/GenTable.java @@ -0,0 +1,147 @@ +package com.bs.generator.domain; + +import java.util.List; +import javax.validation.Valid; +import javax.validation.constraints.NotBlank; + +import lombok.Data; +import org.apache.commons.lang3.ArrayUtils; +import com.bs.common.constant.GenConstants; +import com.bs.common.core.domain.BaseEntity; +import com.bs.common.utils.StringUtils; + +/** + * 业务表 gen_table + * + * @author bs + */ +@Data +public class GenTable extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 编号 */ + private Long tableId; + + /** 表名称 */ + @NotBlank(message = "表名称不能为空") + private String tableName; + + /** 表描述 */ + @NotBlank(message = "表描述不能为空") + private String tableComment; + + /** 关联父表的表名 */ + private String subTableName; + + /** 本表关联父表的外键名 */ + private String subTableFkName; + + /** 实体类名称(首字母大写) */ + @NotBlank(message = "实体类名称不能为空") + private String className; + + /** 使用的模板(crud单表操作 tree树表操作 sub主子表操作) */ + private String tplCategory; + + /** 生成包路径 */ + @NotBlank(message = "生成包路径不能为空") + private String packageName; + + /** 生成模块名 */ + @NotBlank(message = "生成模块名不能为空") + private String moduleName; + + /** 生成业务名 */ + @NotBlank(message = "生成业务名不能为空") + private String businessName; + + /** 生成功能名 */ + @NotBlank(message = "生成功能名不能为空") + private String functionName; + + /** 生成作者 */ + @NotBlank(message = "作者不能为空") + private String functionAuthor; + + /** 生成代码方式(0zip压缩包 1自定义路径) */ + private String genType; + + /** 生成路径(不填默认项目路径) */ + private String genPath; + + /** 主键信息 */ + private GenTableColumn pkColumn; + + /** 子表信息 */ + private GenTable subTable; + + /** 表列信息 */ + @Valid + private List columns; + + /** 其它生成选项 */ + private String options; + + /** 树编码字段 */ + private String treeCode; + + /** 树父编码字段 */ + private String treeParentCode; + + /** 树名称字段 */ + private String treeName; + + /** 上级菜单ID字段 */ + private String parentMenuId; + + /** 上级菜单名称字段 */ + private String parentMenuName; + private String remark; + + + public boolean isSub() + { + return isSub(this.tplCategory); + } + + public static boolean isSub(String tplCategory) + { + return tplCategory != null && StringUtils.equals(GenConstants.TPL_SUB, tplCategory); + } + + public boolean isTree() + { + return isTree(this.tplCategory); + } + + public static boolean isTree(String tplCategory) + { + return tplCategory != null && StringUtils.equals(GenConstants.TPL_TREE, tplCategory); + } + + public boolean isCrud() + { + return isCrud(this.tplCategory); + } + + public static boolean isCrud(String tplCategory) + { + return tplCategory != null && StringUtils.equals(GenConstants.TPL_CRUD, tplCategory); + } + + public boolean isSuperColumn(String javaField) + { + return isSuperColumn(this.tplCategory, javaField); + } + + public static boolean isSuperColumn(String tplCategory, String javaField) + { + if (isTree(tplCategory)) + { + return StringUtils.equalsAnyIgnoreCase(javaField, + ArrayUtils.addAll(GenConstants.TREE_ENTITY, GenConstants.BASE_ENTITY)); + } + return StringUtils.equalsAnyIgnoreCase(javaField, GenConstants.BASE_ENTITY); + } +} diff --git a/bs-generator/src/main/java/com/bs/generator/domain/GenTableColumn.java b/bs-generator/src/main/java/com/bs/generator/domain/GenTableColumn.java new file mode 100644 index 0000000..23a4a1f --- /dev/null +++ b/bs-generator/src/main/java/com/bs/generator/domain/GenTableColumn.java @@ -0,0 +1,373 @@ +package com.bs.generator.domain; + +import javax.validation.constraints.NotBlank; +import com.bs.common.core.domain.BaseEntity; +import com.bs.common.utils.StringUtils; + +/** + * 代码生成业务字段表 gen_table_column + * + * @author bs + */ +public class GenTableColumn extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 编号 */ + private Long columnId; + + /** 归属表编号 */ + private Long tableId; + + /** 列名称 */ + private String columnName; + + /** 列描述 */ + private String columnComment; + + /** 列类型 */ + private String columnType; + + /** JAVA类型 */ + private String javaType; + + /** JAVA字段名 */ + @NotBlank(message = "Java属性不能为空") + private String javaField; + + /** 是否主键(1是) */ + private String isPk; + + /** 是否自增(1是) */ + private String isIncrement; + + /** 是否必填(1是) */ + private String isRequired; + + /** 是否为插入字段(1是) */ + private String isInsert; + + /** 是否编辑字段(1是) */ + private String isEdit; + + /** 是否列表字段(1是) */ + private String isList; + + /** 是否查询字段(1是) */ + private String isQuery; + + /** 查询方式(EQ等于、NE不等于、GT大于、LT小于、LIKE模糊、BETWEEN范围) */ + private String queryType; + + /** 显示类型(input文本框、textarea文本域、select下拉框、checkbox复选框、radio单选框、datetime日期控件、image图片上传控件、upload文件上传控件、editor富文本控件) */ + private String htmlType; + + /** 字典类型 */ + private String dictType; + + /** 排序 */ + private Integer sort; + + public void setColumnId(Long columnId) + { + this.columnId = columnId; + } + + public Long getColumnId() + { + return columnId; + } + + public void setTableId(Long tableId) + { + this.tableId = tableId; + } + + public Long getTableId() + { + return tableId; + } + + public void setColumnName(String columnName) + { + this.columnName = columnName; + } + + public String getColumnName() + { + return columnName; + } + + public void setColumnComment(String columnComment) + { + this.columnComment = columnComment; + } + + public String getColumnComment() + { + return columnComment; + } + + public void setColumnType(String columnType) + { + this.columnType = columnType; + } + + public String getColumnType() + { + return columnType; + } + + public void setJavaType(String javaType) + { + this.javaType = javaType; + } + + public String getJavaType() + { + return javaType; + } + + public void setJavaField(String javaField) + { + this.javaField = javaField; + } + + public String getJavaField() + { + return javaField; + } + + public String getCapJavaField() + { + return StringUtils.capitalize(javaField); + } + + public void setIsPk(String isPk) + { + this.isPk = isPk; + } + + public String getIsPk() + { + return isPk; + } + + public boolean isPk() + { + return isPk(this.isPk); + } + + public boolean isPk(String isPk) + { + return isPk != null && StringUtils.equals("1", isPk); + } + + public String getIsIncrement() + { + return isIncrement; + } + + public void setIsIncrement(String isIncrement) + { + this.isIncrement = isIncrement; + } + + public boolean isIncrement() + { + return isIncrement(this.isIncrement); + } + + public boolean isIncrement(String isIncrement) + { + return isIncrement != null && StringUtils.equals("1", isIncrement); + } + + public void setIsRequired(String isRequired) + { + this.isRequired = isRequired; + } + + public String getIsRequired() + { + return isRequired; + } + + public boolean isRequired() + { + return isRequired(this.isRequired); + } + + public boolean isRequired(String isRequired) + { + return isRequired != null && StringUtils.equals("1", isRequired); + } + + public void setIsInsert(String isInsert) + { + this.isInsert = isInsert; + } + + public String getIsInsert() + { + return isInsert; + } + + public boolean isInsert() + { + return isInsert(this.isInsert); + } + + public boolean isInsert(String isInsert) + { + return isInsert != null && StringUtils.equals("1", isInsert); + } + + public void setIsEdit(String isEdit) + { + this.isEdit = isEdit; + } + + public String getIsEdit() + { + return isEdit; + } + + public boolean isEdit() + { + return isInsert(this.isEdit); + } + + public boolean isEdit(String isEdit) + { + return isEdit != null && StringUtils.equals("1", isEdit); + } + + public void setIsList(String isList) + { + this.isList = isList; + } + + public String getIsList() + { + return isList; + } + + public boolean isList() + { + return isList(this.isList); + } + + public boolean isList(String isList) + { + return isList != null && StringUtils.equals("1", isList); + } + + public void setIsQuery(String isQuery) + { + this.isQuery = isQuery; + } + + public String getIsQuery() + { + return isQuery; + } + + public boolean isQuery() + { + return isQuery(this.isQuery); + } + + public boolean isQuery(String isQuery) + { + return isQuery != null && StringUtils.equals("1", isQuery); + } + + public void setQueryType(String queryType) + { + this.queryType = queryType; + } + + public String getQueryType() + { + return queryType; + } + + public String getHtmlType() + { + return htmlType; + } + + public void setHtmlType(String htmlType) + { + this.htmlType = htmlType; + } + + public void setDictType(String dictType) + { + this.dictType = dictType; + } + + public String getDictType() + { + return dictType; + } + + public void setSort(Integer sort) + { + this.sort = sort; + } + + public Integer getSort() + { + return sort; + } + + public boolean isSuperColumn() + { + return isSuperColumn(this.javaField); + } + + public static boolean isSuperColumn(String javaField) + { + return StringUtils.equalsAnyIgnoreCase(javaField, + // BaseEntity + "createBy", "createTime", "updateBy", "updateTime", + // TreeEntity + "parentName", "parentId", "orderNum", "ancestors"); + } + + public boolean isUsableColumn() + { + return isUsableColumn(javaField); + } + + public static boolean isUsableColumn(String javaField) + { + // isSuperColumn()中的名单用于避免生成多余Domain属性,若某些属性在生成页面时需要用到不能忽略,则放在此处白名单 + return StringUtils.equalsAnyIgnoreCase(javaField, "parentId", "orderNum"); + } + + public String readConverterExp() + { + String remarks = StringUtils.substringBetween(this.columnComment, "(", ")"); + StringBuffer sb = new StringBuffer(); + if (StringUtils.isNotEmpty(remarks)) + { + for (String value : remarks.split(" ")) + { + if (StringUtils.isNotEmpty(value)) + { + Object startStr = value.subSequence(0, 1); + String endStr = value.substring(1); + sb.append("").append(startStr).append("=").append(endStr).append(","); + } + } + return sb.deleteCharAt(sb.length() - 1).toString(); + } + else + { + return this.columnComment; + } + } +} diff --git a/bs-generator/src/main/java/com/bs/generator/mapper/GenTableColumnMapper.java b/bs-generator/src/main/java/com/bs/generator/mapper/GenTableColumnMapper.java new file mode 100644 index 0000000..b5d076b --- /dev/null +++ b/bs-generator/src/main/java/com/bs/generator/mapper/GenTableColumnMapper.java @@ -0,0 +1,60 @@ +package com.bs.generator.mapper; + +import java.util.List; +import com.bs.generator.domain.GenTableColumn; + +/** + * 业务字段 数据层 + * + * @author bs + */ +public interface GenTableColumnMapper +{ + /** + * 根据表名称查询列信息 + * + * @param tableName 表名称 + * @return 列信息 + */ + public List selectDbTableColumnsByName(String tableName); + + /** + * 查询业务字段列表 + * + * @param tableId 业务字段编号 + * @return 业务字段集合 + */ + public List selectGenTableColumnListByTableId(Long tableId); + + /** + * 新增业务字段 + * + * @param genTableColumn 业务字段信息 + * @return 结果 + */ + public int insertGenTableColumn(GenTableColumn genTableColumn); + + /** + * 修改业务字段 + * + * @param genTableColumn 业务字段信息 + * @return 结果 + */ + public int updateGenTableColumn(GenTableColumn genTableColumn); + + /** + * 删除业务字段 + * + * @param genTableColumns 列数据 + * @return 结果 + */ + public int deleteGenTableColumns(List genTableColumns); + + /** + * 批量删除业务字段 + * + * @param ids 需要删除的数据ID + * @return 结果 + */ + public int deleteGenTableColumnByIds(Long[] ids); +} diff --git a/bs-generator/src/main/java/com/bs/generator/mapper/GenTableMapper.java b/bs-generator/src/main/java/com/bs/generator/mapper/GenTableMapper.java new file mode 100644 index 0000000..3ff8656 --- /dev/null +++ b/bs-generator/src/main/java/com/bs/generator/mapper/GenTableMapper.java @@ -0,0 +1,83 @@ +package com.bs.generator.mapper; + +import java.util.List; +import com.bs.generator.domain.GenTable; + +/** + * 业务 数据层 + * + * @author bs + */ +public interface GenTableMapper +{ + /** + * 查询业务列表 + * + * @param genTable 业务信息 + * @return 业务集合 + */ + public List selectGenTableList(GenTable genTable); + + /** + * 查询据库列表 + * + * @param genTable 业务信息 + * @return 数据库表集合 + */ + public List selectDbTableList(GenTable genTable); + + /** + * 查询据库列表 + * + * @param tableNames 表名称组 + * @return 数据库表集合 + */ + public List selectDbTableListByNames(String[] tableNames); + + /** + * 查询所有表信息 + * + * @return 表信息集合 + */ + public List selectGenTableAll(); + + /** + * 查询表ID业务信息 + * + * @param id 业务ID + * @return 业务信息 + */ + public GenTable selectGenTableById(Long id); + + /** + * 查询表名称业务信息 + * + * @param tableName 表名称 + * @return 业务信息 + */ + public GenTable selectGenTableByName(String tableName); + + /** + * 新增业务 + * + * @param genTable 业务信息 + * @return 结果 + */ + public int insertGenTable(GenTable genTable); + + /** + * 修改业务 + * + * @param genTable 业务信息 + * @return 结果 + */ + public int updateGenTable(GenTable genTable); + + /** + * 批量删除业务 + * + * @param ids 需要删除的数据ID + * @return 结果 + */ + public int deleteGenTableByIds(Long[] ids); +} diff --git a/bs-generator/src/main/java/com/bs/generator/service/GenTableColumnServiceImpl.java b/bs-generator/src/main/java/com/bs/generator/service/GenTableColumnServiceImpl.java new file mode 100644 index 0000000..f67fc04 --- /dev/null +++ b/bs-generator/src/main/java/com/bs/generator/service/GenTableColumnServiceImpl.java @@ -0,0 +1,68 @@ +package com.bs.generator.service; + +import java.util.List; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.bs.common.core.text.Convert; +import com.bs.generator.domain.GenTableColumn; +import com.bs.generator.mapper.GenTableColumnMapper; + +/** + * 业务字段 服务层实现 + * + * @author bs + */ +@Service +public class GenTableColumnServiceImpl implements IGenTableColumnService +{ + @Autowired + private GenTableColumnMapper genTableColumnMapper; + + /** + * 查询业务字段列表 + * + * @param tableId 业务字段编号 + * @return 业务字段集合 + */ + @Override + public List selectGenTableColumnListByTableId(Long tableId) + { + return genTableColumnMapper.selectGenTableColumnListByTableId(tableId); + } + + /** + * 新增业务字段 + * + * @param genTableColumn 业务字段信息 + * @return 结果 + */ + @Override + public int insertGenTableColumn(GenTableColumn genTableColumn) + { + return genTableColumnMapper.insertGenTableColumn(genTableColumn); + } + + /** + * 修改业务字段 + * + * @param genTableColumn 业务字段信息 + * @return 结果 + */ + @Override + public int updateGenTableColumn(GenTableColumn genTableColumn) + { + return genTableColumnMapper.updateGenTableColumn(genTableColumn); + } + + /** + * 删除业务字段对象 + * + * @param ids 需要删除的数据ID + * @return 结果 + */ + @Override + public int deleteGenTableColumnByIds(String ids) + { + return genTableColumnMapper.deleteGenTableColumnByIds(Convert.toLongArray(ids)); + } +} diff --git a/bs-generator/src/main/java/com/bs/generator/service/GenTableServiceImpl.java b/bs-generator/src/main/java/com/bs/generator/service/GenTableServiceImpl.java new file mode 100644 index 0000000..a7c7d56 --- /dev/null +++ b/bs-generator/src/main/java/com/bs/generator/service/GenTableServiceImpl.java @@ -0,0 +1,557 @@ +package com.bs.generator.service; + +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONObject; +import com.baomidou.mybatisplus.generator.config.po.TableField; +import com.baomidou.mybatisplus.generator.config.po.TableInfo; +import com.bs.common.constant.Constants; +import com.bs.common.constant.GenConstants; +import com.bs.common.core.text.CharsetKit; +import com.bs.common.exception.ServiceException; +import com.bs.common.utils.SecurityUtils; +import com.bs.common.utils.StringUtils; +import com.bs.common.utils.collection.CollectionUtils; +import com.bs.generator.domain.GenTable; +import com.bs.generator.domain.GenTableColumn; +import com.bs.generator.mapper.GenTableColumnMapper; +import com.bs.generator.mapper.GenTableMapper; +import com.bs.generator.util.GenTableUtils; +import com.bs.generator.util.GenUtils; +import com.bs.generator.util.VelocityInitializer; +import com.bs.generator.util.VelocityUtils; +import org.apache.commons.io.FileUtils; +import org.apache.commons.io.IOUtils; +import org.apache.velocity.Template; +import org.apache.velocity.VelocityContext; +import org.apache.velocity.app.Velocity; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.IOException; +import java.io.StringWriter; +import java.util.*; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.function.Function; +import java.util.stream.Collectors; +import java.util.zip.ZipEntry; +import java.util.zip.ZipOutputStream; + +/** + * 业务 服务层实现 + * + * @author bs + */ +@Service +public class GenTableServiceImpl implements IGenTableService +{ + private static final Logger log = LoggerFactory.getLogger(GenTableServiceImpl.class); + + @Autowired + private GenTableMapper genTableMapper; + + @Autowired + private GenTableColumnMapper genTableColumnMapper; + + /** + * 查询业务信息 + * + * @param id 业务ID + * @return 业务信息 + */ + @Override + public GenTable selectGenTableById(Long id) + { + GenTable genTable = genTableMapper.selectGenTableById(id); + setTableFromOptions(genTable); + return genTable; + } + + /** + * 查询业务列表 + * + * @param genTable 业务信息 + * @return 业务集合 + */ + @Override + public List selectGenTableList(GenTable genTable) + { + return genTableMapper.selectGenTableList(genTable); + } + + /** + * 查询据库列表 + * + * @param genTable 业务信息 + * @return 数据库表集合 + */ + @Override + public List selectDbTableList(GenTable genTable) + { + List tableList = GenTableUtils.getTableList(genTable.getTableName(), genTable.getTableComment()); + // 移除置顶前缀的表名 + tableList.removeIf(table -> table.getName().toUpperCase().startsWith("QRTZ_")); + tableList.removeIf(table -> table.getName().toUpperCase().startsWith("ACT_")); + tableList.removeIf(table -> table.getName().toUpperCase().startsWith("FLW_")); + // 移除已经生成的表 + // 移除在 Codegen 中,已经存在的 + List genTables = genTableMapper.selectGenTableList(new GenTable()); + Set existsTables = CollectionUtils.convertSet(genTables, GenTable::getTableName); + tableList.removeIf(table -> existsTables.contains(table.getName())); + List result = tableList.stream().map(tmp -> { + GenTable data = new GenTable(); + data.setTableName(tmp.getName()); + data.setTableComment(tmp.getComment()); + return data; + }).collect(Collectors.toList()); + return result; + } + + /** + * 查询据库列表 + * + * @param tableNames 表名称组 + * @return 数据库表集合 + */ + @Override + public List selectDbTableListByNames(String[] tableNames) + { + List result = new ArrayList<>(tableNames.length); + for (String tableName : tableNames) { + TableInfo table = GenTableUtils.getTable(tableName); + GenTable data = new GenTable(); + data.setTableName(table.getName()); + data.setTableComment(table.getComment()); + result.add(data); + } + return result; + } + + /** + * 查询所有表信息 + * + * @return 表信息集合 + */ + @Override + public List selectGenTableAll() + { + return genTableMapper.selectGenTableAll(); + } + + /** + * 修改业务 + * + * @param genTable 业务信息 + * @return 结果 + */ + @Override + @Transactional + public void updateGenTable(GenTable genTable) + { + String options = JSON.toJSONString(genTable.getParams()); + genTable.setOptions(options); + int row = genTableMapper.updateGenTable(genTable); + if (row > 0) + { + for (GenTableColumn cenTableColumn : genTable.getColumns()) + { + genTableColumnMapper.updateGenTableColumn(cenTableColumn); + } + } + } + + /** + * 删除业务对象 + * + * @param tableIds 需要删除的数据ID + * @return 结果 + */ + @Override + @Transactional + public void deleteGenTableByIds(Long[] tableIds) + { + genTableMapper.deleteGenTableByIds(tableIds); + genTableColumnMapper.deleteGenTableColumnByIds(tableIds); + } + + /** + * 导入表结构 + * + * @param tableList 导入表列表 + */ + @Override + @Transactional + public void importGenTable(List tableList) + { + Long operName = SecurityUtils.getUsername(); + try { + for (GenTable table : tableList) { + String tableName = table.getTableName(); + GenUtils.initTable(table, operName); + int row = genTableMapper.insertGenTable(table); + if (row > 0) { + // 保存列信息 + TableInfo tableInfo = GenTableUtils.getTable(tableName); + List fields = tableInfo.getFields(); + AtomicInteger index = new AtomicInteger(1); + List genTableColumns = fields.stream().map(tmp -> { + GenTableColumn data = new GenTableColumn(); + data.setColumnName(tmp.getColumnName()); + data.setColumnComment(tmp.getComment()); + data.setIsRequired(tmp.getMetaInfo().isNullable() ? "1" : "0"); + data.setIsPk(tmp.isKeyFlag() ? "1" : "0"); + data.setSort(index.getAndIncrement()); + data.setIsIncrement(tmp.isKeyIdentityFlag() ? "1" : "0"); + data.setColumnType(tmp.getType()); + return data; + }).collect(Collectors.toList()); + //List genTableColumns = genTableColumnMapper.selectDbTableColumnsByName(tableName); + for (GenTableColumn column : genTableColumns) { + GenUtils.initColumnField(column, table); + genTableColumnMapper.insertGenTableColumn(column); + } + } + } + } catch (Exception e) { + throw new ServiceException("导入失败:" + e.getMessage()); + } + } + + /** + * 预览代码 + * + * @param tableId 表编号 + * @return 预览数据列表 + */ + @Override + public Map previewCode(Long tableId) + { + Map dataMap = new LinkedHashMap<>(); + // 查询表信息 + GenTable table = genTableMapper.selectGenTableById(tableId); + // 设置主子表信息 + setSubTable(table); + // 设置主键列信息 + setPkColumn(table); + VelocityInitializer.initVelocity(); + + VelocityContext context = VelocityUtils.prepareContext(table); + + // 获取模板列表 + List templates = VelocityUtils.getTemplateList(table.getTplCategory()); + for (String template : templates) + { + // 渲染模板 + StringWriter sw = new StringWriter(); + Template tpl = Velocity.getTemplate(template, Constants.UTF8); + tpl.merge(context, sw); + dataMap.put(template, sw.toString()); + } + return dataMap; + } + + /** + * 生成代码(下载方式) + * + * @param tableName 表名称 + * @return 数据 + */ + @Override + public byte[] downloadCode(String tableName) + { + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + ZipOutputStream zip = new ZipOutputStream(outputStream); + generatorCode(tableName, zip); + IOUtils.closeQuietly(zip); + return outputStream.toByteArray(); + } + + /** + * 生成代码(自定义路径) + * + * @param tableName 表名称 + */ + @Override + public void generatorCode(String tableName) + { + // 查询表信息 + GenTable table = genTableMapper.selectGenTableByName(tableName); + // 设置主子表信息 + setSubTable(table); + // 设置主键列信息 + setPkColumn(table); + + VelocityInitializer.initVelocity(); + + VelocityContext context = VelocityUtils.prepareContext(table); + + // 获取模板列表 + List templates = VelocityUtils.getTemplateList(table.getTplCategory()); + for (String template : templates) + { + if (!StringUtils.containsAny(template, "sql.vm", "api.js.vm", "index.vue.vm", "index-tree.vue.vm")) + { + // 渲染模板 + StringWriter sw = new StringWriter(); + Template tpl = Velocity.getTemplate(template, Constants.UTF8); + tpl.merge(context, sw); + try + { + String path = getGenPath(table, template); + FileUtils.writeStringToFile(new File(path), sw.toString(), CharsetKit.UTF_8); + } + catch (IOException e) + { + throw new ServiceException("渲染模板失败,表名:" + table.getTableName()); + } + } + } + } + + /** + * 同步数据库 + * + * @param tableName 表名称 + */ + @Override + @Transactional + public void synchDb(String tableName) + { + GenTable table = genTableMapper.selectGenTableByName(tableName); + List tableColumns = table.getColumns(); + Map tableColumnMap = tableColumns.stream().collect(Collectors.toMap(GenTableColumn::getColumnName, Function.identity())); + + List dbTableColumns = genTableColumnMapper.selectDbTableColumnsByName(tableName); + if (StringUtils.isEmpty(dbTableColumns)) + { + throw new ServiceException("同步数据失败,原表结构不存在"); + } + List dbTableColumnNames = dbTableColumns.stream().map(GenTableColumn::getColumnName).collect(Collectors.toList()); + + dbTableColumns.forEach(column -> { + GenUtils.initColumnField(column, table); + if (tableColumnMap.containsKey(column.getColumnName())) + { + GenTableColumn prevColumn = tableColumnMap.get(column.getColumnName()); + column.setColumnId(prevColumn.getColumnId()); + if (column.isList()) + { + // 如果是列表,继续保留查询方式/字典类型选项 + column.setDictType(prevColumn.getDictType()); + column.setQueryType(prevColumn.getQueryType()); + } + if (StringUtils.isNotEmpty(prevColumn.getIsRequired()) && !column.isPk() + && (column.isInsert() || column.isEdit()) + && ((column.isUsableColumn()) || (!column.isSuperColumn()))) + { + // 如果是(新增/修改&非主键/非忽略及父属性),继续保留必填/显示类型选项 + column.setIsRequired(prevColumn.getIsRequired()); + column.setHtmlType(prevColumn.getHtmlType()); + } + genTableColumnMapper.updateGenTableColumn(column); + } + else + { + genTableColumnMapper.insertGenTableColumn(column); + } + }); + + List delColumns = tableColumns.stream().filter(column -> !dbTableColumnNames.contains(column.getColumnName())).collect(Collectors.toList()); + if (StringUtils.isNotEmpty(delColumns)) + { + genTableColumnMapper.deleteGenTableColumns(delColumns); + } + } + + /** + * 批量生成代码(下载方式) + * + * @param tableNames 表数组 + * @return 数据 + */ + @Override + public byte[] downloadCode(String[] tableNames) + { + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + ZipOutputStream zip = new ZipOutputStream(outputStream); + for (String tableName : tableNames) + { + generatorCode(tableName, zip); + } + IOUtils.closeQuietly(zip); + return outputStream.toByteArray(); + } + + /** + * 查询表信息并生成代码 + */ + private void generatorCode(String tableName, ZipOutputStream zip) + { + // 查询表信息 + GenTable table = genTableMapper.selectGenTableByName(tableName); + // 设置主子表信息 + setSubTable(table); + // 设置主键列信息 + setPkColumn(table); + + VelocityInitializer.initVelocity(); + + VelocityContext context = VelocityUtils.prepareContext(table); + + // 获取模板列表 + List templates = VelocityUtils.getTemplateList(table.getTplCategory()); + for (String template : templates) + { + // 渲染模板 + StringWriter sw = new StringWriter(); + Template tpl = Velocity.getTemplate(template, Constants.UTF8); + tpl.merge(context, sw); + try + { + // 添加到zip + zip.putNextEntry(new ZipEntry(VelocityUtils.getFileName(template, table))); + IOUtils.write(sw.toString(), zip, Constants.UTF8); + IOUtils.closeQuietly(sw); + zip.flush(); + zip.closeEntry(); + } + catch (IOException e) + { + log.error("渲染模板失败,表名:" + table.getTableName(), e); + } + } + } + + /** + * 修改保存参数校验 + * + * @param genTable 业务信息 + */ + @Override + public void validateEdit(GenTable genTable) + { + if (GenConstants.TPL_TREE.equals(genTable.getTplCategory())) + { + String options = JSON.toJSONString(genTable.getParams()); + JSONObject paramsObj = JSON.parseObject(options); + if (StringUtils.isEmpty(paramsObj.getString(GenConstants.TREE_CODE))) + { + throw new ServiceException("树编码字段不能为空"); + } + else if (StringUtils.isEmpty(paramsObj.getString(GenConstants.TREE_PARENT_CODE))) + { + throw new ServiceException("树父编码字段不能为空"); + } + else if (StringUtils.isEmpty(paramsObj.getString(GenConstants.TREE_NAME))) + { + throw new ServiceException("树名称字段不能为空"); + } + else if (GenConstants.TPL_SUB.equals(genTable.getTplCategory())) + { + if (StringUtils.isEmpty(genTable.getSubTableName())) + { + throw new ServiceException("关联子表的表名不能为空"); + } + else if (StringUtils.isEmpty(genTable.getSubTableFkName())) + { + throw new ServiceException("子表关联的外键名不能为空"); + } + } + } + } + + /** + * 设置主键列信息 + * + * @param table 业务表信息 + */ + public void setPkColumn(GenTable table) + { + for (GenTableColumn column : table.getColumns()) + { + if (column.isPk()) + { + table.setPkColumn(column); + break; + } + } + if (StringUtils.isNull(table.getPkColumn())) + { + table.setPkColumn(table.getColumns().get(0)); + } + if (GenConstants.TPL_SUB.equals(table.getTplCategory())) + { + for (GenTableColumn column : table.getSubTable().getColumns()) + { + if (column.isPk()) + { + table.getSubTable().setPkColumn(column); + break; + } + } + if (StringUtils.isNull(table.getSubTable().getPkColumn())) + { + table.getSubTable().setPkColumn(table.getSubTable().getColumns().get(0)); + } + } + } + + /** + * 设置主子表信息 + * + * @param table 业务表信息 + */ + public void setSubTable(GenTable table) + { + String subTableName = table.getSubTableName(); + if (StringUtils.isNotEmpty(subTableName)) + { + table.setSubTable(genTableMapper.selectGenTableByName(subTableName)); + } + } + + /** + * 设置代码生成其他选项值 + * + * @param genTable 设置后的生成对象 + */ + public void setTableFromOptions(GenTable genTable) + { + JSONObject paramsObj = JSON.parseObject(genTable.getOptions()); + if (StringUtils.isNotNull(paramsObj)) + { + String treeCode = paramsObj.getString(GenConstants.TREE_CODE); + String treeParentCode = paramsObj.getString(GenConstants.TREE_PARENT_CODE); + String treeName = paramsObj.getString(GenConstants.TREE_NAME); + String parentMenuId = paramsObj.getString(GenConstants.PARENT_MENU_ID); + String parentMenuName = paramsObj.getString(GenConstants.PARENT_MENU_NAME); + + genTable.setTreeCode(treeCode); + genTable.setTreeParentCode(treeParentCode); + genTable.setTreeName(treeName); + genTable.setParentMenuId(parentMenuId); + genTable.setParentMenuName(parentMenuName); + } + } + + /** + * 获取代码生成地址 + * + * @param table 业务表信息 + * @param template 模板文件路径 + * @return 生成地址 + */ + public static String getGenPath(GenTable table, String template) + { + String genPath = table.getGenPath(); + if (StringUtils.equals(genPath, "/")) + { + return System.getProperty("user.dir") + File.separator + "src" + File.separator + VelocityUtils.getFileName(template, table); + } + return genPath + File.separator + VelocityUtils.getFileName(template, table); + } +} diff --git a/bs-generator/src/main/java/com/bs/generator/service/IGenTableColumnService.java b/bs-generator/src/main/java/com/bs/generator/service/IGenTableColumnService.java new file mode 100644 index 0000000..11c43eb --- /dev/null +++ b/bs-generator/src/main/java/com/bs/generator/service/IGenTableColumnService.java @@ -0,0 +1,44 @@ +package com.bs.generator.service; + +import java.util.List; +import com.bs.generator.domain.GenTableColumn; + +/** + * 业务字段 服务层 + * + * @author bs + */ +public interface IGenTableColumnService +{ + /** + * 查询业务字段列表 + * + * @param tableId 业务字段编号 + * @return 业务字段集合 + */ + public List selectGenTableColumnListByTableId(Long tableId); + + /** + * 新增业务字段 + * + * @param genTableColumn 业务字段信息 + * @return 结果 + */ + public int insertGenTableColumn(GenTableColumn genTableColumn); + + /** + * 修改业务字段 + * + * @param genTableColumn 业务字段信息 + * @return 结果 + */ + public int updateGenTableColumn(GenTableColumn genTableColumn); + + /** + * 删除业务字段信息 + * + * @param ids 需要删除的数据ID + * @return 结果 + */ + public int deleteGenTableColumnByIds(String ids); +} diff --git a/bs-generator/src/main/java/com/bs/generator/service/IGenTableService.java b/bs-generator/src/main/java/com/bs/generator/service/IGenTableService.java new file mode 100644 index 0000000..ce320fa --- /dev/null +++ b/bs-generator/src/main/java/com/bs/generator/service/IGenTableService.java @@ -0,0 +1,121 @@ +package com.bs.generator.service; + +import java.util.List; +import java.util.Map; +import com.bs.generator.domain.GenTable; + +/** + * 业务 服务层 + * + * @author bs + */ +public interface IGenTableService +{ + /** + * 查询业务列表 + * + * @param genTable 业务信息 + * @return 业务集合 + */ + public List selectGenTableList(GenTable genTable); + + /** + * 查询据库列表 + * + * @param genTable 业务信息 + * @return 数据库表集合 + */ + public List selectDbTableList(GenTable genTable); + + /** + * 查询据库列表 + * + * @param tableNames 表名称组 + * @return 数据库表集合 + */ + public List selectDbTableListByNames(String[] tableNames); + + /** + * 查询所有表信息 + * + * @return 表信息集合 + */ + public List selectGenTableAll(); + + /** + * 查询业务信息 + * + * @param id 业务ID + * @return 业务信息 + */ + public GenTable selectGenTableById(Long id); + + /** + * 修改业务 + * + * @param genTable 业务信息 + * @return 结果 + */ + public void updateGenTable(GenTable genTable); + + /** + * 删除业务信息 + * + * @param tableIds 需要删除的表数据ID + * @return 结果 + */ + public void deleteGenTableByIds(Long[] tableIds); + + /** + * 导入表结构 + * + * @param tableList 导入表列表 + */ + public void importGenTable(List tableList); + + /** + * 预览代码 + * + * @param tableId 表编号 + * @return 预览数据列表 + */ + public Map previewCode(Long tableId); + + /** + * 生成代码(下载方式) + * + * @param tableName 表名称 + * @return 数据 + */ + public byte[] downloadCode(String tableName); + + /** + * 生成代码(自定义路径) + * + * @param tableName 表名称 + * @return 数据 + */ + public void generatorCode(String tableName); + + /** + * 同步数据库 + * + * @param tableName 表名称 + */ + public void synchDb(String tableName); + + /** + * 批量生成代码(下载方式) + * + * @param tableNames 表数组 + * @return 数据 + */ + public byte[] downloadCode(String[] tableNames); + + /** + * 修改保存参数校验 + * + * @param genTable 业务信息 + */ + public void validateEdit(GenTable genTable); +} diff --git a/bs-generator/src/main/java/com/bs/generator/util/GenTableUtils.java b/bs-generator/src/main/java/com/bs/generator/util/GenTableUtils.java new file mode 100644 index 0000000..3581cb9 --- /dev/null +++ b/bs-generator/src/main/java/com/bs/generator/util/GenTableUtils.java @@ -0,0 +1,56 @@ +package com.bs.generator.util; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.generator.config.DataSourceConfig; +import com.baomidou.mybatisplus.generator.config.GlobalConfig; +import com.baomidou.mybatisplus.generator.config.StrategyConfig; +import com.baomidou.mybatisplus.generator.config.builder.ConfigBuilder; +import com.baomidou.mybatisplus.generator.config.po.TableInfo; +import com.baomidou.mybatisplus.generator.config.rules.DateType; +import com.bs.common.utils.spring.SpringUtils; +import org.springframework.core.env.Environment; + +import java.util.Comparator; +import java.util.List; +import java.util.stream.Collectors; + +public class GenTableUtils { + + private static final String DATASOURCE_DYNAMIC_KEY = "spring.datasource.druid.master"; + + public static Environment environment = SpringUtils.getBean(Environment.class); + + public static List getTableList(String nameLike, String commentLike) { + List tables = getTableList0(null); + return tables.stream().filter(tableInfo -> (StrUtil.isEmpty(nameLike) || tableInfo.getName().contains(nameLike)) + && (StrUtil.isEmpty(commentLike) || tableInfo.getComment().contains(commentLike))) + .collect(Collectors.toList()); + } + + public static TableInfo getTable(String name) { + return CollUtil.getFirst(getTableList0(name)); + } + + public static List getTableList0(String name) { + String url = environment.getProperty(DATASOURCE_DYNAMIC_KEY + ".url"); + String username = environment.getProperty(DATASOURCE_DYNAMIC_KEY + ".username"); + String password = environment.getProperty(DATASOURCE_DYNAMIC_KEY + ".password"); + // 使用 MyBatis Plus Generator 解析表结构 + DataSourceConfig dataSourceConfig = new DataSourceConfig.Builder(url, username, + password).build(); + StrategyConfig.Builder strategyConfig = new StrategyConfig.Builder(); + if (StrUtil.isNotEmpty(name)) { + strategyConfig.addInclude(name); + } + // 只使用 Date 类型,不使用 LocalDate + GlobalConfig globalConfig = new GlobalConfig.Builder().dateType(DateType.ONLY_DATE).build(); + ConfigBuilder builder = new ConfigBuilder(null, dataSourceConfig, strategyConfig.build(), + null, globalConfig, null); + // 按照名字排序 + List tables = builder.getTableInfoList(); + tables.sort(Comparator.comparing(TableInfo::getName)); + return tables; + } + +} diff --git a/bs-generator/src/main/java/com/bs/generator/util/GenUtils.java b/bs-generator/src/main/java/com/bs/generator/util/GenUtils.java new file mode 100644 index 0000000..b307735 --- /dev/null +++ b/bs-generator/src/main/java/com/bs/generator/util/GenUtils.java @@ -0,0 +1,258 @@ +package com.bs.generator.util; + +import com.bs.common.constant.GenConstants; +import com.bs.common.utils.StringUtils; +import com.bs.generator.config.GenConfig; +import com.bs.generator.domain.GenTable; +import com.bs.generator.domain.GenTableColumn; +import org.apache.commons.lang3.RegExUtils; + +import java.util.Arrays; + +/** + * 代码生成器 工具类 + * + * @author bs + */ +public class GenUtils +{ + /** + * 初始化表信息 + */ + public static void initTable(GenTable genTable, Long operName) + { + genTable.setClassName(convertClassName(genTable.getTableName())); + genTable.setPackageName(GenConfig.getPackageName()); + genTable.setModuleName(getModuleName(GenConfig.getPackageName())); + genTable.setBusinessName(getBusinessName(genTable.getTableName())); + genTable.setFunctionName(replaceText(genTable.getTableComment())); + genTable.setFunctionAuthor(GenConfig.getAuthor()); + genTable.setCreateBy(operName); + } + + /** + * 初始化列属性字段 + */ + public static void initColumnField(GenTableColumn column, GenTable table) + { + String dataType = getDbType(column.getColumnType()); + String columnName = column.getColumnName(); + column.setTableId(table.getTableId()); + column.setCreateBy(table.getCreateBy()); + // 设置java字段名 + column.setJavaField(StringUtils.toCamelCase(columnName)); + // 设置默认类型 + column.setJavaType(GenConstants.TYPE_STRING); + column.setQueryType(GenConstants.QUERY_EQ); + + if (arraysContains(GenConstants.COLUMNTYPE_STR, dataType) || arraysContains(GenConstants.COLUMNTYPE_TEXT, dataType)) + { + // 字符串长度超过500设置为文本域 + Integer columnLength = getColumnLength(column.getColumnType()); + String htmlType = columnLength >= 500 || arraysContains(GenConstants.COLUMNTYPE_TEXT, dataType) ? GenConstants.HTML_TEXTAREA : GenConstants.HTML_INPUT; + column.setHtmlType(htmlType); + } + else if (arraysContains(GenConstants.COLUMNTYPE_TIME, dataType)) + { + column.setJavaType(GenConstants.TYPE_DATE); + column.setHtmlType(GenConstants.HTML_DATETIME); + } + else if (arraysContains(GenConstants.COLUMNTYPE_NUMBER, dataType)) + { + column.setHtmlType(GenConstants.HTML_INPUT); + + // 如果是浮点型 统一用BigDecimal + String[] str = StringUtils.split(StringUtils.substringBetween(column.getColumnType(), "(", ")"), ","); + if (str != null && str.length == 2 && Integer.parseInt(str[1]) > 0) + { + column.setJavaType(GenConstants.TYPE_BIGDECIMAL); + } + // 如果是整形 + else if (str != null && str.length == 1 && Integer.parseInt(str[0]) <= 10) + { + column.setJavaType(GenConstants.TYPE_INTEGER); + } + // 长整形 + else + { + column.setJavaType(GenConstants.TYPE_LONG); + } + } + + // 插入字段(默认所有字段都需要插入) + column.setIsInsert(GenConstants.REQUIRE); + + // 编辑字段 + if (!arraysContains(GenConstants.COLUMNNAME_NOT_EDIT, columnName) && !column.isPk()) + { + column.setIsEdit(GenConstants.REQUIRE); + } + // 列表字段 + if (!arraysContains(GenConstants.COLUMNNAME_NOT_LIST, columnName) && !column.isPk()) + { + column.setIsList(GenConstants.REQUIRE); + } + // 查询字段 + if (!arraysContains(GenConstants.COLUMNNAME_NOT_QUERY, columnName) && !column.isPk()) + { + column.setIsQuery(GenConstants.REQUIRE); + } + + // 查询字段类型 + if (StringUtils.endsWithIgnoreCase(columnName, "name")) + { + column.setQueryType(GenConstants.QUERY_LIKE); + } + // 状态字段设置单选框 + if (StringUtils.endsWithIgnoreCase(columnName, "status")) + { + column.setHtmlType(GenConstants.HTML_RADIO); + } + // 类型&性别字段设置下拉框 + else if (StringUtils.endsWithIgnoreCase(columnName, "type") + || StringUtils.endsWithIgnoreCase(columnName, "sex")) + { + column.setHtmlType(GenConstants.HTML_SELECT); + } + // 图片字段设置图片上传控件 + else if (StringUtils.endsWithIgnoreCase(columnName, "image")) + { + column.setHtmlType(GenConstants.HTML_IMAGE_UPLOAD); + } + // 文件字段设置文件上传控件 + else if (StringUtils.endsWithIgnoreCase(columnName, "file")) + { + column.setHtmlType(GenConstants.HTML_FILE_UPLOAD); + } + // 内容字段设置富文本控件 + else if (StringUtils.endsWithIgnoreCase(columnName, "content")) + { + column.setHtmlType(GenConstants.HTML_EDITOR); + } + } + + /** + * 校验数组是否包含指定值 + * + * @param arr 数组 + * @param targetValue 值 + * @return 是否包含 + */ + public static boolean arraysContains(String[] arr, String targetValue) + { + return Arrays.asList(arr).contains(targetValue); + } + + /** + * 获取模块名 + * + * @param packageName 包名 + * @return 模块名 + */ + public static String getModuleName(String packageName) + { + int lastIndex = packageName.lastIndexOf("."); + int nameLength = packageName.length(); + return StringUtils.substring(packageName, lastIndex + 1, nameLength); + } + + /** + * 获取业务名 + * + * @param tableName 表名 + * @return 业务名 + */ + public static String getBusinessName(String tableName) + { + int lastIndex = tableName.lastIndexOf("_"); + int nameLength = tableName.length(); + return StringUtils.substring(tableName, lastIndex + 1, nameLength); + } + + /** + * 表名转换成Java类名 + * + * @param tableName 表名称 + * @return 类名 + */ + public static String convertClassName(String tableName) + { + boolean autoRemovePre = GenConfig.getAutoRemovePre(); + String tablePrefix = GenConfig.getTablePrefix(); + if (autoRemovePre && StringUtils.isNotEmpty(tablePrefix)) + { + String[] searchList = StringUtils.split(tablePrefix, ","); + tableName = replaceFirst(tableName, searchList); + } + return StringUtils.convertToCamelCase(tableName); + } + + /** + * 批量替换前缀 + * + * @param replacementm 替换值 + * @param searchList 替换列表 + * @return + */ + public static String replaceFirst(String replacementm, String[] searchList) + { + String text = replacementm; + for (String searchString : searchList) + { + if (replacementm.startsWith(searchString)) + { + text = replacementm.replaceFirst(searchString, ""); + break; + } + } + return text; + } + + /** + * 关键字替换 + * + * @param text 需要被替换的名字 + * @return 替换后的名字 + */ + public static String replaceText(String text) + { + return RegExUtils.replaceAll(text, "(?:表|若依)", ""); + } + + /** + * 获取数据库类型字段 + * + * @param columnType 列类型 + * @return 截取后的列类型 + */ + public static String getDbType(String columnType) + { + if (StringUtils.indexOf(columnType, "(") > 0) + { + return StringUtils.substringBefore(columnType, "("); + } + else + { + return columnType; + } + } + + /** + * 获取字段长度 + * + * @param columnType 列类型 + * @return 截取后的列类型 + */ + public static Integer getColumnLength(String columnType) + { + if (StringUtils.indexOf(columnType, "(") > 0) + { + String length = StringUtils.substringBetween(columnType, "(", ")"); + return Integer.valueOf(length); + } + else + { + return 0; + } + } +} diff --git a/bs-generator/src/main/java/com/bs/generator/util/VelocityInitializer.java b/bs-generator/src/main/java/com/bs/generator/util/VelocityInitializer.java new file mode 100644 index 0000000..145a11b --- /dev/null +++ b/bs-generator/src/main/java/com/bs/generator/util/VelocityInitializer.java @@ -0,0 +1,34 @@ +package com.bs.generator.util; + +import java.util.Properties; +import org.apache.velocity.app.Velocity; +import com.bs.common.constant.Constants; + +/** + * VelocityEngine工厂 + * + * @author bs + */ +public class VelocityInitializer +{ + /** + * 初始化vm方法 + */ + public static void initVelocity() + { + Properties p = new Properties(); + try + { + // 加载classpath目录下的vm文件 + p.setProperty("resource.loader.file.class", "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader"); + // 定义字符集 + p.setProperty(Velocity.INPUT_ENCODING, Constants.UTF8); + // 初始化Velocity引擎,指定配置Properties + Velocity.init(p); + } + catch (Exception e) + { + throw new RuntimeException(e); + } + } +} diff --git a/bs-generator/src/main/java/com/bs/generator/util/VelocityUtils.java b/bs-generator/src/main/java/com/bs/generator/util/VelocityUtils.java new file mode 100644 index 0000000..0939777 --- /dev/null +++ b/bs-generator/src/main/java/com/bs/generator/util/VelocityUtils.java @@ -0,0 +1,405 @@ +package com.bs.generator.util; + +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONObject; +import com.bs.common.constant.GenConstants; +import com.bs.common.utils.DateUtils; +import com.bs.common.utils.StringUtils; +import com.bs.generator.domain.GenTable; +import com.bs.generator.domain.GenTableColumn; +import org.apache.velocity.VelocityContext; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +/** + * 模板处理工具类 + * + * @author bs + */ +public class VelocityUtils +{ + /** 项目空间路径 */ + private static final String PROJECT_PATH = "main/java"; + + /** mybatis空间路径 */ + private static final String MYBATIS_PATH = "main/resources/mapper"; + + /** 默认上级菜单,系统工具 */ + private static final String DEFAULT_PARENT_MENU_ID = "3"; + + private static final String VM_PATH = "shiptemplates"; + + /** + * 设置模板变量信息 + * + * @return 模板列表 + */ + public static VelocityContext prepareContext(GenTable genTable) + { + String moduleName = genTable.getModuleName(); + String businessName = genTable.getBusinessName(); + String packageName = genTable.getPackageName(); + String tplCategory = genTable.getTplCategory(); + String functionName = genTable.getFunctionName(); + + VelocityContext velocityContext = new VelocityContext(); + velocityContext.put("tplCategory", genTable.getTplCategory()); + velocityContext.put("tableName", genTable.getTableName()); + velocityContext.put("functionName", StringUtils.isNotEmpty(functionName) ? functionName : "【请填写功能名称】"); + velocityContext.put("ClassName", genTable.getClassName()); + velocityContext.put("className", StringUtils.uncapitalize(genTable.getClassName())); + velocityContext.put("moduleName", genTable.getModuleName()); + velocityContext.put("BusinessName", StringUtils.capitalize(genTable.getBusinessName())); + velocityContext.put("businessName", genTable.getBusinessName()); + velocityContext.put("basePackage", getPackagePrefix(packageName)); + velocityContext.put("packageName", packageName); + velocityContext.put("author", genTable.getFunctionAuthor()); + velocityContext.put("datetime", DateUtils.getDate()); + velocityContext.put("pkColumn", genTable.getPkColumn()); + velocityContext.put("importList", getImportList(genTable)); + velocityContext.put("permissionPrefix", getPermissionPrefix(moduleName, businessName)); + velocityContext.put("columns", genTable.getColumns()); + velocityContext.put("table", genTable); + velocityContext.put("dicts", getDicts(genTable)); + setMenuVelocityContext(velocityContext, genTable); + if (GenConstants.TPL_TREE.equals(tplCategory)) + { + setTreeVelocityContext(velocityContext, genTable); + } + if (GenConstants.TPL_SUB.equals(tplCategory)) + { + setSubVelocityContext(velocityContext, genTable); + } + return velocityContext; + } + + public static void setMenuVelocityContext(VelocityContext context, GenTable genTable) + { + String options = genTable.getOptions(); + JSONObject paramsObj = JSON.parseObject(options); + String parentMenuId = getParentMenuId(paramsObj); + context.put("parentMenuId", parentMenuId); + } + + public static void setTreeVelocityContext(VelocityContext context, GenTable genTable) + { + String options = genTable.getOptions(); + JSONObject paramsObj = JSON.parseObject(options); + String treeCode = getTreecode(paramsObj); + String treeParentCode = getTreeParentCode(paramsObj); + String treeName = getTreeName(paramsObj); + + context.put("treeCode", treeCode); + context.put("treeParentCode", treeParentCode); + context.put("treeName", treeName); + context.put("expandColumn", getExpandColumn(genTable)); + if (paramsObj.containsKey(GenConstants.TREE_PARENT_CODE)) + { + context.put("tree_parent_code", paramsObj.getString(GenConstants.TREE_PARENT_CODE)); + } + if (paramsObj.containsKey(GenConstants.TREE_NAME)) + { + context.put("tree_name", paramsObj.getString(GenConstants.TREE_NAME)); + } + } + + public static void setSubVelocityContext(VelocityContext context, GenTable genTable) + { + GenTable subTable = genTable.getSubTable(); + String subTableName = genTable.getSubTableName(); + String subTableFkName = genTable.getSubTableFkName(); + String subClassName = genTable.getSubTable().getClassName(); + String subTableFkClassName = StringUtils.convertToCamelCase(subTableFkName); + + context.put("subTable", subTable); + context.put("subTableName", subTableName); + context.put("subTableFkName", subTableFkName); + context.put("subTableFkClassName", subTableFkClassName); + context.put("subTableFkclassName", StringUtils.uncapitalize(subTableFkClassName)); + context.put("subClassName", subClassName); + context.put("subclassName", StringUtils.uncapitalize(subClassName)); + context.put("subImportList", getImportList(genTable.getSubTable())); + } + + /** + * 获取模板信息 + * + * @return 模板列表 + */ + public static List getTemplateList(String tplCategory) + { + List templates = new ArrayList(); + templates.add(VM_PATH+"/java/domain.java.vm"); + templates.add(VM_PATH+"/java/mapper.java.vm"); + templates.add(VM_PATH+"/java/service.java.vm"); + templates.add(VM_PATH+"/java/serviceImpl.java.vm"); + templates.add(VM_PATH+"/java/controller.java.vm"); + templates.add(VM_PATH+"/xml/mapper.xml.vm"); + templates.add(VM_PATH+"/sql/sql.vm"); + templates.add(VM_PATH+"/js/api.js.vm"); + if (GenConstants.TPL_CRUD.equals(tplCategory)) + { + templates.add(VM_PATH+"/vue/index.vue.vm"); + } + else if (GenConstants.TPL_TREE.equals(tplCategory)) + { + templates.add(VM_PATH+"/vue/index-tree.vue.vm"); + } + else if (GenConstants.TPL_SUB.equals(tplCategory)) + { + templates.add(VM_PATH+"/vue/index.vue.vm"); + templates.add(VM_PATH+"/java/sub-domain.java.vm"); + } + return templates; + } + + /** + * 获取文件名 + */ + public static String getFileName(String template, GenTable genTable) + { + // 文件名称 + String fileName = ""; + // 包路径 + String packageName = genTable.getPackageName(); + // 模块名 + String moduleName = genTable.getModuleName(); + // 大写类名 + String className = genTable.getClassName(); + // 业务名称 + String businessName = genTable.getBusinessName(); + + String javaPath = PROJECT_PATH + "/" + StringUtils.replace(packageName, ".", "/"); + String mybatisPath = MYBATIS_PATH + "/" + moduleName; + String vuePath = "vue"; + + if (template.contains("domain.java.vm")) + { + fileName = StringUtils.format("{}/domain/{}.java", javaPath, className); + } + if (template.contains("sub-domain.java.vm") && StringUtils.equals(GenConstants.TPL_SUB, genTable.getTplCategory())) + { + fileName = StringUtils.format("{}/domain/{}.java", javaPath, genTable.getSubTable().getClassName()); + } + else if (template.contains("mapper.java.vm")) + { + fileName = StringUtils.format("{}/mapper/{}Mapper.java", javaPath, className); + } + else if (template.contains("service.java.vm")) + { + fileName = StringUtils.format("{}/service/I{}Service.java", javaPath, className); + } + else if (template.contains("serviceImpl.java.vm")) + { + fileName = StringUtils.format("{}/service/impl/{}ServiceImpl.java", javaPath, className); + } + else if (template.contains("controller.java.vm")) + { + fileName = StringUtils.format("{}/controller/{}Controller.java", javaPath, className); + } + else if (template.contains("mapper.xml.vm")) + { + fileName = StringUtils.format("{}/{}Mapper.xml", mybatisPath, className); + } + else if (template.contains("sql.vm")) + { + fileName = businessName + "Menu.sql"; + } + else if (template.contains("api.js.vm")) + { + fileName = StringUtils.format("{}/api/{}/{}.js", vuePath, moduleName, businessName); + } + else if (template.contains("index.vue.vm")) + { + fileName = StringUtils.format("{}/views/{}/{}/index.vue", vuePath, moduleName, businessName); + } + else if (template.contains("index-tree.vue.vm")) + { + fileName = StringUtils.format("{}/views/{}/{}/index.vue", vuePath, moduleName, businessName); + } + return fileName; + } + + /** + * 获取包前缀 + * + * @param packageName 包名称 + * @return 包前缀名称 + */ + public static String getPackagePrefix(String packageName) + { + int lastIndex = packageName.lastIndexOf("."); + return StringUtils.substring(packageName, 0, lastIndex); + } + + /** + * 根据列类型获取导入包 + * + * @param genTable 业务表对象 + * @return 返回需要导入的包列表 + */ + public static HashSet getImportList(GenTable genTable) + { + List columns = genTable.getColumns(); + GenTable subGenTable = genTable.getSubTable(); + HashSet importList = new HashSet(); + if (StringUtils.isNotNull(subGenTable)) + { + importList.add("java.util.List"); + } + for (GenTableColumn column : columns) + { + if (!column.isSuperColumn() && GenConstants.TYPE_DATE.equals(column.getJavaType())) + { + importList.add("java.util.Date"); + importList.add("com.fasterxml.jackson.annotation.JsonFormat"); + } + else if (!column.isSuperColumn() && GenConstants.TYPE_BIGDECIMAL.equals(column.getJavaType())) + { + importList.add("java.math.BigDecimal"); + } + } + return importList; + } + + /** + * 根据列类型获取字典组 + * + * @param genTable 业务表对象 + * @return 返回字典组 + */ + public static String getDicts(GenTable genTable) + { + List columns = genTable.getColumns(); + Set dicts = new HashSet(); + addDicts(dicts, columns); + if (StringUtils.isNotNull(genTable.getSubTable())) + { + List subColumns = genTable.getSubTable().getColumns(); + addDicts(dicts, subColumns); + } + return StringUtils.join(dicts, ", "); + } + + /** + * 添加字典列表 + * + * @param dicts 字典列表 + * @param columns 列集合 + */ + public static void addDicts(Set dicts, List columns) + { + for (GenTableColumn column : columns) + { + if (!column.isSuperColumn() && StringUtils.isNotEmpty(column.getDictType()) && StringUtils.equalsAny( + column.getHtmlType(), + new String[] { GenConstants.HTML_SELECT, GenConstants.HTML_RADIO, GenConstants.HTML_CHECKBOX })) + { + dicts.add("'" + column.getDictType() + "'"); + } + } + } + + /** + * 获取权限前缀 + * + * @param moduleName 模块名称 + * @param businessName 业务名称 + * @return 返回权限前缀 + */ + public static String getPermissionPrefix(String moduleName, String businessName) + { + return StringUtils.format("{}:{}", moduleName, businessName); + } + + /** + * 获取上级菜单ID字段 + * + * @param paramsObj 生成其他选项 + * @return 上级菜单ID字段 + */ + public static String getParentMenuId(JSONObject paramsObj) + { + if (StringUtils.isNotEmpty(paramsObj) && paramsObj.containsKey(GenConstants.PARENT_MENU_ID) + && StringUtils.isNotEmpty(paramsObj.getString(GenConstants.PARENT_MENU_ID))) + { + return paramsObj.getString(GenConstants.PARENT_MENU_ID); + } + return DEFAULT_PARENT_MENU_ID; + } + + /** + * 获取树编码 + * + * @param paramsObj 生成其他选项 + * @return 树编码 + */ + public static String getTreecode(JSONObject paramsObj) + { + if (paramsObj.containsKey(GenConstants.TREE_CODE)) + { + return StringUtils.toCamelCase(paramsObj.getString(GenConstants.TREE_CODE)); + } + return StringUtils.EMPTY; + } + + /** + * 获取树父编码 + * + * @param paramsObj 生成其他选项 + * @return 树父编码 + */ + public static String getTreeParentCode(JSONObject paramsObj) + { + if (paramsObj.containsKey(GenConstants.TREE_PARENT_CODE)) + { + return StringUtils.toCamelCase(paramsObj.getString(GenConstants.TREE_PARENT_CODE)); + } + return StringUtils.EMPTY; + } + + /** + * 获取树名称 + * + * @param paramsObj 生成其他选项 + * @return 树名称 + */ + public static String getTreeName(JSONObject paramsObj) + { + if (paramsObj.containsKey(GenConstants.TREE_NAME)) + { + return StringUtils.toCamelCase(paramsObj.getString(GenConstants.TREE_NAME)); + } + return StringUtils.EMPTY; + } + + /** + * 获取需要在哪一列上面显示展开按钮 + * + * @param genTable 业务表对象 + * @return 展开按钮列序号 + */ + public static int getExpandColumn(GenTable genTable) + { + String options = genTable.getOptions(); + JSONObject paramsObj = JSON.parseObject(options); + String treeName = paramsObj.getString(GenConstants.TREE_NAME); + int num = 0; + for (GenTableColumn column : genTable.getColumns()) + { + if (column.isList()) + { + num++; + String columnName = column.getColumnName(); + if (columnName.equals(treeName)) + { + break; + } + } + } + return num; + } +} diff --git a/bs-generator/src/main/resources/generator.yml b/bs-generator/src/main/resources/generator.yml new file mode 100644 index 0000000..4eac475 --- /dev/null +++ b/bs-generator/src/main/resources/generator.yml @@ -0,0 +1,10 @@ +# 代码生成 +gen: + # 作者 + author: bs + # 默认生成包路径 system 需改成自己的模块名称 如 system monitor tool + packageName: com.bs.system + # 自动去除表前缀,默认是false + autoRemovePre: false + # 表前缀(生成类名不会包含表前缀,多个用逗号分隔) + tablePrefix: sys_ diff --git a/bs-generator/src/main/resources/mapper/generator/GenTableColumnMapper.xml b/bs-generator/src/main/resources/mapper/generator/GenTableColumnMapper.xml new file mode 100644 index 0000000..2c2eb25 --- /dev/null +++ b/bs-generator/src/main/resources/mapper/generator/GenTableColumnMapper.xml @@ -0,0 +1,127 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + select column_id, table_id, column_name, column_comment, column_type, java_type, java_field, is_pk, is_increment, is_required, is_insert, is_edit, is_list, is_query, query_type, html_type, dict_type, sort, create_by, create_time, update_by, update_time from gen_table_column + + + + + + + + insert into gen_table_column ( + table_id, + column_name, + column_comment, + column_type, + java_type, + java_field, + is_pk, + is_increment, + is_required, + is_insert, + is_edit, + is_list, + is_query, + query_type, + html_type, + dict_type, + sort, + create_by, + create_time + )values( + #{tableId}, + #{columnName}, + #{columnComment}, + #{columnType}, + #{javaType}, + #{javaField}, + #{isPk}, + #{isIncrement}, + #{isRequired}, + #{isInsert}, + #{isEdit}, + #{isList}, + #{isQuery}, + #{queryType}, + #{htmlType}, + #{dictType}, + #{sort}, + #{createBy}, + sysdate() + ) + + + + update gen_table_column + + column_comment = #{columnComment}, + java_type = #{javaType}, + java_field = #{javaField}, + is_insert = #{isInsert}, + is_edit = #{isEdit}, + is_list = #{isList}, + is_query = #{isQuery}, + is_required = #{isRequired}, + query_type = #{queryType}, + html_type = #{htmlType}, + dict_type = #{dictType}, + sort = #{sort}, + update_by = #{updateBy}, + update_time = sysdate() + + where column_id = #{columnId} + + + + delete from gen_table_column where table_id in + + #{tableId} + + + + + delete from gen_table_column where column_id in + + #{item.columnId} + + + + diff --git a/bs-generator/src/main/resources/mapper/generator/GenTableMapper.xml b/bs-generator/src/main/resources/mapper/generator/GenTableMapper.xml new file mode 100644 index 0000000..53a7c90 --- /dev/null +++ b/bs-generator/src/main/resources/mapper/generator/GenTableMapper.xml @@ -0,0 +1,202 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + select table_id, table_name, table_comment, sub_table_name, sub_table_fk_name, class_name, tpl_category, package_name, module_name, business_name, function_name, function_author, gen_type, gen_path, options, create_by, create_time, update_by, update_time, remark from gen_table + + + + + + + + + + + + + + + + + + insert into gen_table ( + table_name, + table_comment, + class_name, + tpl_category, + package_name, + module_name, + business_name, + function_name, + function_author, + gen_type, + gen_path, + remark, + create_by, + create_time + )values( + #{tableName}, + #{tableComment}, + #{className}, + #{tplCategory}, + #{packageName}, + #{moduleName}, + #{businessName}, + #{functionName}, + #{functionAuthor}, + #{genType}, + #{genPath}, + #{remark}, + #{createBy}, + sysdate() + ) + + + + update gen_table + + table_name = #{tableName}, + table_comment = #{tableComment}, + sub_table_name = #{subTableName}, + sub_table_fk_name = #{subTableFkName}, + class_name = #{className}, + function_author = #{functionAuthor}, + gen_type = #{genType}, + gen_path = #{genPath}, + tpl_category = #{tplCategory}, + package_name = #{packageName}, + module_name = #{moduleName}, + business_name = #{businessName}, + function_name = #{functionName}, + options = #{options}, + update_by = #{updateBy}, + remark = #{remark}, + update_time = sysdate() + + where table_id = #{tableId} + + + + delete from gen_table where table_id in + + #{tableId} + + + + diff --git a/bs-generator/src/main/resources/shiptemplates/java/controller.java.vm b/bs-generator/src/main/resources/shiptemplates/java/controller.java.vm new file mode 100644 index 0000000..9a03047 --- /dev/null +++ b/bs-generator/src/main/resources/shiptemplates/java/controller.java.vm @@ -0,0 +1,146 @@ +package ${packageName}.controller; + +import java.util.List; +import javax.servlet.http.HttpServletResponse; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.bs.common.annotation.Log; +import com.bs.common.core.controller.BaseController; +import com.bs.common.core.domain.AjaxResult; +import com.bs.common.core.page.TableDataInfo; +import com.bs.common.enums.BusinessType; +import com.bs.common.utils.poi.ExcelUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import cn.hutool.core.lang.Validator; +import ${packageName}.domain.${ClassName}; +import ${packageName}.service.I${ClassName}Service; +import javax.annotation.Resource; +#if($table.crud || $table.sub) +#elseif($table.tree) +#end + +/** + * ${functionName}Controller + * + * @author ${author} + * @date ${datetime} + */ +@Api(tags = "${functionName}") +@RestController +@RequestMapping("/${moduleName}/${businessName}") +public class ${ClassName}Controller extends BaseController { + @Resource + private I${ClassName}Service ${className}Service; + + /** + * 分页查询${functionName}列表 + */ + @ApiOperation("分页查询${functionName}列表") + @GetMapping("/pageList") + public TableDataInfo pageList(${ClassName} ${className}) { + startPage(); + LambdaQueryWrapper<${ClassName}> queryWrapper = new LambdaQueryWrapper(); + condition(queryWrapper,${className}); + List<${ClassName}> list = ${className}Service.list(queryWrapper); + return getDataTable(list); + } + + /** + * 查询${functionName}列表 + */ + @ApiOperation("查询${functionName}列表") + @GetMapping("/list") + public AjaxResult list(${ClassName} ${className}) { + LambdaQueryWrapper<${ClassName}> queryWrapper = new LambdaQueryWrapper(); + condition(queryWrapper,${className}); + List<${ClassName}> list = ${className}Service.list(queryWrapper); + return success(list); + } + + /** + * 导出${functionName}列表 + */ + @ApiOperation("导出${functionName}列表") + @Log(title = "${functionName}导出", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, ${ClassName} ${className}) { + LambdaQueryWrapper<${ClassName}> queryWrapper = new LambdaQueryWrapper(); + condition(queryWrapper,${className}); + List<${ClassName}> list = ${className}Service.list(queryWrapper); + ExcelUtil<${ClassName}> util = new ExcelUtil<${ClassName}>(${ClassName}. class); + util.exportExcel(response, list, "${functionName}数据"); + } + + /** + * 获取${functionName}详细信息 + */ + @ApiOperation("获取${functionName}详细信息") + @GetMapping(value = "/{${pkColumn.javaField}}") + public AjaxResult getInfo(@PathVariable("${pkColumn.javaField}") ${pkColumn.javaType} ${pkColumn.javaField}) { + return success(${className}Service.getById(${pkColumn.javaField})); + } + + /** + * 新增${functionName} + */ + @ApiOperation("新增${functionName}") + @Log(title = "${functionName}新增", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody ${ClassName} ${className}) { + return toAjax(${className}Service.save(${className})); + } + + /** + * 修改${functionName} + */ + @ApiOperation("修改${functionName}") + @Log(title = "${functionName}修改", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody ${ClassName} ${className}) { + return toAjax(${className}Service.updateById(${className})); + } + + /** + * 删除${functionName} + */ + @ApiOperation("删除${functionName}") + @Log(title = "${functionName}删除", businessType = BusinessType.DELETE) + @DeleteMapping("/{${pkColumn.javaField}s}") + public AjaxResult remove(@PathVariable List ${pkColumn.javaField}s) { + return toAjax(${className}Service.removeBatchByIds(${pkColumn.javaField}s)); + } + + /** + * 条件设置 + */ + private void condition (LambdaQueryWrapper<${ClassName}> queryWrapper,${ClassName} ${className}){ + +#foreach ($column in $columns) + #if(!$column.javaField.equals("updatestamp")&&!$column.javaField.equals("syncstamp")) + + #if($column.javaField.length() > 2 && $column.javaField.substring(1,2).matches("[A-Z]")) + #set($AttrName=$column.javaField) + #else + #set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)}) + #end + //${column.columnComment} + if(Validator.isNotEmpty(${className}.get${AttrName}())){ + queryWrapper.eq(${ClassName}::get${AttrName},${className}.get${AttrName}()); + } + #end +#end + + } + +} diff --git a/bs-generator/src/main/resources/shiptemplates/java/domain.java.vm b/bs-generator/src/main/resources/shiptemplates/java/domain.java.vm new file mode 100644 index 0000000..d448800 --- /dev/null +++ b/bs-generator/src/main/resources/shiptemplates/java/domain.java.vm @@ -0,0 +1,71 @@ +package ${packageName}.domain; + +#foreach ($import in $importList) +import ${import}; +#end +import com.bs.common.annotation.Excel; +import com.bs.common.core.domain.BaseEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModelProperty; +#if($table.crud || $table.sub) +#elseif($table.tree) +#end + +/** + * ${functionName}对象 ${tableName} + * + * @author ${author} + * @date ${datetime} + */ +#if($table.crud || $table.sub) +#set($Entity="BaseEntity") +#elseif($table.tree) +#set($Entity="TreeEntity") +#end +@EqualsAndHashCode(callSuper = true) +@Accessors(chain = true) +@TableName("${tableName}") +@Data +public class ${ClassName} extends ${Entity}{ + private static final long serialVersionUID = 1L; + +#foreach ($column in $columns) +#if(!$column.javaField.equals("tenantId")&&!$column.javaField.equals("createDept")&&!$column.javaField.equals("createBy")&&!$column.javaField.equals("createTime")&&!$column.javaField.equals("updateBy")&&!$column.javaField.equals("updateTime")&&!$column.javaField.equals("delFlag")&&!$column.javaField.equals("updatestamp")&&!$column.javaField.equals("syncstamp")) +#if(!$table.isSuperColumn($column.javaField)) + /** $column.columnComment */ +#if($column.list) +#set($parentheseIndex=$column.columnComment.indexOf("(")) +#if($parentheseIndex != -1) +#set($comment=$column.columnComment.substring(0, $parentheseIndex)) +#else +#set($comment=$column.columnComment) +#end + +#if($parentheseIndex != -1) + @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()") +#elseif($column.javaType == 'Date') + @JsonFormat(pattern = "yyyy-MM-dd") + @Excel(name = "${comment}", width = 30, dateFormat = "yyyy-MM-dd") +#else + @Excel(name = "${comment}") +#end +#end + #if($column.isPk.equals("1")) + @TableId(value = "${column.columnName}",type = IdType.AUTO) + #end + @ApiModelProperty(value = "${column.columnComment}") + private $column.javaType $column.javaField; + +#end +#end +#end + + + +} diff --git a/bs-generator/src/main/resources/shiptemplates/java/mapper.java.vm b/bs-generator/src/main/resources/shiptemplates/java/mapper.java.vm new file mode 100644 index 0000000..a988013 --- /dev/null +++ b/bs-generator/src/main/resources/shiptemplates/java/mapper.java.vm @@ -0,0 +1,17 @@ +package ${packageName}.mapper; + +import com.bs.common.mybatis.mapper.BaseMapperX; +import ${packageName}.domain.${ClassName}; +#if($table.sub) +import ${packageName}.domain.${subClassName}; +#end + +/** + * ${functionName}Mapper接口 + * + * @author ${author} + * @date ${datetime} + */ +public interface ${ClassName}Mapper extends BaseMapperX<${ClassName}> { + +} diff --git a/bs-generator/src/main/resources/shiptemplates/java/service.java.vm b/bs-generator/src/main/resources/shiptemplates/java/service.java.vm new file mode 100644 index 0000000..6a15a49 --- /dev/null +++ b/bs-generator/src/main/resources/shiptemplates/java/service.java.vm @@ -0,0 +1,14 @@ +package ${packageName}.service; + +import com.github.yulichang.base.MPJBaseService; +import ${packageName}.domain.${ClassName}; + +/** + * ${functionName}Service接口 + * + * @author ${author} + * @date ${datetime} + */ +public interface I${ClassName}Service extends MPJBaseService<${ClassName}>{ + +} diff --git a/bs-generator/src/main/resources/shiptemplates/java/serviceImpl.java.vm b/bs-generator/src/main/resources/shiptemplates/java/serviceImpl.java.vm new file mode 100644 index 0000000..2d8a90c --- /dev/null +++ b/bs-generator/src/main/resources/shiptemplates/java/serviceImpl.java.vm @@ -0,0 +1,27 @@ +package ${packageName}.service.impl; + +#foreach ($column in $columns) +#if($column.javaField == 'createTime' || $column.javaField == 'updateTime') +#break +#end +#end +#if($table.sub) +import ${packageName}.domain.${subClassName}; +#end +import ${packageName}.mapper.${ClassName}Mapper; +import ${packageName}.domain.${ClassName}; +import ${packageName}.service.I${ClassName}Service; +import com.github.yulichang.base.MPJBaseServiceImpl; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +/** + * ${functionName}Service业务层处理 + * + * @author ${author} + * @date ${datetime} + */ +@Service +@Transactional(rollbackFor = Exception.class) +public class ${ClassName}ServiceImpl extends MPJBaseServiceImpl<${ClassName}Mapper, ${ClassName}> implements I${ClassName}Service { + +} diff --git a/bs-generator/src/main/resources/shiptemplates/java/sub-domain.java.vm b/bs-generator/src/main/resources/shiptemplates/java/sub-domain.java.vm new file mode 100644 index 0000000..0eac3b2 --- /dev/null +++ b/bs-generator/src/main/resources/shiptemplates/java/sub-domain.java.vm @@ -0,0 +1,73 @@ +package ${packageName}.domain; + +#foreach ($import in $subImportList) +import ${import}; +#end +import com.chain.common.annotation.Excel; + +/** + * ${subTable.functionName}对象 ${subTableName} + * + * @author ${author} + * @date ${datetime} + */ +public class ${subClassName} extends BaseEntity +{ + private static final long serialVersionUID = 1L; + +#foreach ($column in $subTable.columns) +#if(!$table.isSuperColumn($column.javaField)) + /** $column.columnComment */ +#if($column.list) +#set($parentheseIndex=$column.columnComment.indexOf("(")) +#if($parentheseIndex != -1) +#set($comment=$column.columnComment.substring(0, $parentheseIndex)) +#else +#set($comment=$column.columnComment) +#end +#if($parentheseIndex != -1) + @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()") +#elseif($column.javaType == 'Date') + @JsonFormat(pattern = "yyyy-MM-dd") + @Excel(name = "${comment}", width = 30, dateFormat = "yyyy-MM-dd") +#else + @Excel(name = "${comment}") +#end +#end + private $column.javaType $column.javaField; + +#end +#end +#foreach ($column in $subTable.columns) +#if(!$table.isSuperColumn($column.javaField)) +#if($column.javaField.length() > 2 && $column.javaField.substring(1,2).matches("[A-Z]")) +#set($AttrName=$column.javaField) +#else +#set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)}) +#end + public void set${AttrName}($column.javaType $column.javaField) + { + this.$column.javaField = $column.javaField; + } + + public $column.javaType get${AttrName}() + { + return $column.javaField; + } +#end +#end + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) +#foreach ($column in $subTable.columns) +#if($column.javaField.length() > 2 && $column.javaField.substring(1,2).matches("[A-Z]")) +#set($AttrName=$column.javaField) +#else +#set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)}) +#end + .append("${column.javaField}", get${AttrName}()) +#end + .toString(); + } +} diff --git a/bs-generator/src/main/resources/shiptemplates/js/api.js.vm b/bs-generator/src/main/resources/shiptemplates/js/api.js.vm new file mode 100644 index 0000000..d169821 --- /dev/null +++ b/bs-generator/src/main/resources/shiptemplates/js/api.js.vm @@ -0,0 +1,62 @@ +import request from '@/utils/request' + +// 分页查询${functionName}列表 +export function pageList${BusinessName}(query) { + return request({ + url: '/${moduleName}/${businessName}/pageList', + method: 'get', + params: query + }) +} + +// 查询${functionName}列表 +export function list${BusinessName}(query) { + return request({ + url: '/${moduleName}/${businessName}/list', + method: 'get', + params: query + }) +} + +// 查询${functionName}详细 +export function get${BusinessName}(${pkColumn.javaField}) { + return request({ + url: '/${moduleName}/${businessName}/' + ${pkColumn.javaField}, + method: 'get' + }) +} + +// 新增${functionName} +export function add${BusinessName}(data) { + return request({ + url: '/${moduleName}/${businessName}', + method: 'post', + data: data + }) +} + +// 修改${functionName} +export function update${BusinessName}(data) { + return request({ + url: '/${moduleName}/${businessName}', + method: 'put', + data: data + }) +} + +// 删除${functionName} +export function del${BusinessName}(${pkColumn.javaField}) { + return request({ + url: '/${moduleName}/${businessName}/' + ${pkColumn.javaField}, + method: 'delete' + }) +} + +// 导出${functionName} +export function export${BusinessName}(query) { + return request({ + url: '/${moduleName}/${businessName}/' + 'export', + method: 'post', + params: query + }) +} diff --git a/bs-generator/src/main/resources/shiptemplates/sql/sql.vm b/bs-generator/src/main/resources/shiptemplates/sql/sql.vm new file mode 100644 index 0000000..e526a90 --- /dev/null +++ b/bs-generator/src/main/resources/shiptemplates/sql/sql.vm @@ -0,0 +1,22 @@ +-- 菜单 SQL +insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark) +values('${functionName}', '${parentMenuId}', '1', '${businessName}', '${moduleName}/${businessName}/index', 1, 0, 'C', '0', '0', '${permissionPrefix}:list', '#', '1', sysdate(), '', null, '${functionName}菜单'); + +-- 按钮父菜单ID +SELECT @parentId := LAST_INSERT_ID(); + +-- 按钮 SQL +insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark) +values('查询', @parentId, '1', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:query', '#', '1', sysdate(), '', null, ''); + +insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark) +values('新增', @parentId, '2', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:add', '#', '1', sysdate(), '', null, ''); + +insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark) +values('修改', @parentId, '3', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:edit', '#', '1', sysdate(), '', null, ''); + +insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark) +values('删除', @parentId, '4', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:remove', '#', '1', sysdate(), '', null, ''); + +insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark) +values('导出', @parentId, '5', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:export', '#', '1', sysdate(), '', null, ''); diff --git a/bs-generator/src/main/resources/shiptemplates/vue/index-tree.vue.vm b/bs-generator/src/main/resources/shiptemplates/vue/index-tree.vue.vm new file mode 100644 index 0000000..9a6b65d --- /dev/null +++ b/bs-generator/src/main/resources/shiptemplates/vue/index-tree.vue.vm @@ -0,0 +1,568 @@ + + + diff --git a/bs-generator/src/main/resources/shiptemplates/vue/index.vue.vm b/bs-generator/src/main/resources/shiptemplates/vue/index.vue.vm new file mode 100644 index 0000000..c566399 --- /dev/null +++ b/bs-generator/src/main/resources/shiptemplates/vue/index.vue.vm @@ -0,0 +1,665 @@ + + + diff --git a/bs-generator/src/main/resources/shiptemplates/vue/v3/index-tree.vue.vm b/bs-generator/src/main/resources/shiptemplates/vue/v3/index-tree.vue.vm new file mode 100644 index 0000000..255fe03 --- /dev/null +++ b/bs-generator/src/main/resources/shiptemplates/vue/v3/index-tree.vue.vm @@ -0,0 +1,536 @@ + + + diff --git a/bs-generator/src/main/resources/shiptemplates/vue/v3/index.vue.vm b/bs-generator/src/main/resources/shiptemplates/vue/v3/index.vue.vm new file mode 100644 index 0000000..f186575 --- /dev/null +++ b/bs-generator/src/main/resources/shiptemplates/vue/v3/index.vue.vm @@ -0,0 +1,714 @@ + + + diff --git a/bs-generator/src/main/resources/shiptemplates/vue/v3/readme.txt b/bs-generator/src/main/resources/shiptemplates/vue/v3/readme.txt new file mode 100644 index 0000000..7d64e5a --- /dev/null +++ b/bs-generator/src/main/resources/shiptemplates/vue/v3/readme.txt @@ -0,0 +1 @@ +如果使用的是bs-Vue3前端,那么需要覆盖一下此目录的模板index.vue.vm、index-tree.vue.vm文件到上级vue目录。 diff --git a/bs-generator/src/main/resources/shiptemplates/xml/mapper.xml.vm b/bs-generator/src/main/resources/shiptemplates/xml/mapper.xml.vm new file mode 100644 index 0000000..9fb48d9 --- /dev/null +++ b/bs-generator/src/main/resources/shiptemplates/xml/mapper.xml.vm @@ -0,0 +1,7 @@ + + + + + diff --git a/bs-generator/src/main/resources/vm/java/controller.java.vm b/bs-generator/src/main/resources/vm/java/controller.java.vm new file mode 100644 index 0000000..0993287 --- /dev/null +++ b/bs-generator/src/main/resources/vm/java/controller.java.vm @@ -0,0 +1,115 @@ +package ${packageName}.controller; + +import java.util.List; +import javax.servlet.http.HttpServletResponse; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.bs.common.annotation.Log; +import com.bs.common.core.controller.BaseController; +import com.bs.common.core.domain.AjaxResult; +import com.bs.common.enums.BusinessType; +import ${packageName}.domain.${ClassName}; +import ${packageName}.service.I${ClassName}Service; +import com.bs.common.utils.poi.ExcelUtil; +#if($table.crud || $table.sub) +import com.bs.common.core.page.TableDataInfo; +#elseif($table.tree) +#end + +/** + * ${functionName}Controller + * + * @author ${author} + * @date ${datetime} + */ +@RestController +@RequestMapping("/${moduleName}/${businessName}") +public class ${ClassName}Controller extends BaseController +{ + @Autowired + private I${ClassName}Service ${className}Service; + + /** + * 查询${functionName}列表 + */ + @PreAuthorize("@ss.hasPermi('${permissionPrefix}:list')") + @GetMapping("/list") +#if($table.crud || $table.sub) + public TableDataInfo list(${ClassName} ${className}) + { + startPage(); + List<${ClassName}> list = ${className}Service.select${ClassName}List(${className}); + return getDataTable(list); + } +#elseif($table.tree) + public AjaxResult list(${ClassName} ${className}) + { + List<${ClassName}> list = ${className}Service.select${ClassName}List(${className}); + return success(list); + } +#end + + /** + * 导出${functionName}列表 + */ + @PreAuthorize("@ss.hasPermi('${permissionPrefix}:export')") + @Log(title = "${functionName}", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, ${ClassName} ${className}) + { + List<${ClassName}> list = ${className}Service.select${ClassName}List(${className}); + ExcelUtil<${ClassName}> util = new ExcelUtil<${ClassName}>(${ClassName}.class); + util.exportExcel(response, list, "${functionName}数据"); + } + + /** + * 获取${functionName}详细信息 + */ + @PreAuthorize("@ss.hasPermi('${permissionPrefix}:query')") + @GetMapping(value = "/{${pkColumn.javaField}}") + public AjaxResult getInfo(@PathVariable("${pkColumn.javaField}") ${pkColumn.javaType} ${pkColumn.javaField}) + { + return success(${className}Service.select${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaField})); + } + + /** + * 新增${functionName} + */ + @PreAuthorize("@ss.hasPermi('${permissionPrefix}:add')") + @Log(title = "${functionName}", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody ${ClassName} ${className}) + { + return toAjax(${className}Service.insert${ClassName}(${className})); + } + + /** + * 修改${functionName} + */ + @PreAuthorize("@ss.hasPermi('${permissionPrefix}:edit')") + @Log(title = "${functionName}", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody ${ClassName} ${className}) + { + return toAjax(${className}Service.update${ClassName}(${className})); + } + + /** + * 删除${functionName} + */ + @PreAuthorize("@ss.hasPermi('${permissionPrefix}:remove')") + @Log(title = "${functionName}", businessType = BusinessType.DELETE) + @DeleteMapping("/{${pkColumn.javaField}s}") + public AjaxResult remove(@PathVariable ${pkColumn.javaType}[] ${pkColumn.javaField}s) + { + return toAjax(${className}Service.delete${ClassName}By${pkColumn.capJavaField}s(${pkColumn.javaField}s)); + } +} diff --git a/bs-generator/src/main/resources/vm/java/domain.java.vm b/bs-generator/src/main/resources/vm/java/domain.java.vm new file mode 100644 index 0000000..13415dc --- /dev/null +++ b/bs-generator/src/main/resources/vm/java/domain.java.vm @@ -0,0 +1,101 @@ +package ${packageName}.domain; + +#foreach ($import in $importList) +import ${import}; +#end +import com.bs.common.annotation.Excel; +#if($table.crud || $table.sub) +#elseif($table.tree) +#end + +/** + * ${functionName}对象 ${tableName} + * + * @author ${author} + * @date ${datetime} + */ +#if($table.crud || $table.sub) +#set($Entity="BaseEntity") +#elseif($table.tree) +#set($Entity="TreeEntity") +#end +public class ${ClassName} extends ${Entity} +{ + private static final long serialVersionUID = 1L; + +#foreach ($column in $columns) +#if(!$table.isSuperColumn($column.javaField)) + /** $column.columnComment */ +#if($column.list) +#set($parentheseIndex=$column.columnComment.indexOf("(")) +#if($parentheseIndex != -1) +#set($comment=$column.columnComment.substring(0, $parentheseIndex)) +#else +#set($comment=$column.columnComment) +#end +#if($parentheseIndex != -1) + @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()") +#elseif($column.javaType == 'Date') + @JsonFormat(pattern = "yyyy-MM-dd") + @Excel(name = "${comment}", width = 30, dateFormat = "yyyy-MM-dd") +#else + @Excel(name = "${comment}") +#end +#end + private $column.javaType $column.javaField; + +#end +#end +#if($table.sub) + /** $table.subTable.functionName信息 */ + private List<${subClassName}> ${subclassName}List; + +#end +#foreach ($column in $columns) +#if(!$table.isSuperColumn($column.javaField)) +#if($column.javaField.length() > 2 && $column.javaField.substring(1,2).matches("[A-Z]")) +#set($AttrName=$column.javaField) +#else +#set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)}) +#end + public void set${AttrName}($column.javaType $column.javaField) + { + this.$column.javaField = $column.javaField; + } + + public $column.javaType get${AttrName}() + { + return $column.javaField; + } +#end +#end + +#if($table.sub) + public List<${subClassName}> get${subClassName}List() + { + return ${subclassName}List; + } + + public void set${subClassName}List(List<${subClassName}> ${subclassName}List) + { + this.${subclassName}List = ${subclassName}List; + } + +#end + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) +#foreach ($column in $columns) +#if($column.javaField.length() > 2 && $column.javaField.substring(1,2).matches("[A-Z]")) +#set($AttrName=$column.javaField) +#else +#set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)}) +#end + .append("${column.javaField}", get${AttrName}()) +#end +#if($table.sub) + .append("${subclassName}List", get${subClassName}List()) +#end + .toString(); + } +} diff --git a/bs-generator/src/main/resources/vm/java/mapper.java.vm b/bs-generator/src/main/resources/vm/java/mapper.java.vm new file mode 100644 index 0000000..7e7d7c2 --- /dev/null +++ b/bs-generator/src/main/resources/vm/java/mapper.java.vm @@ -0,0 +1,91 @@ +package ${packageName}.mapper; + +import java.util.List; +import ${packageName}.domain.${ClassName}; +#if($table.sub) +import ${packageName}.domain.${subClassName}; +#end + +/** + * ${functionName}Mapper接口 + * + * @author ${author} + * @date ${datetime} + */ +public interface ${ClassName}Mapper +{ + /** + * 查询${functionName} + * + * @param ${pkColumn.javaField} ${functionName}主键 + * @return ${functionName} + */ + public ${ClassName} select${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaType} ${pkColumn.javaField}); + + /** + * 查询${functionName}列表 + * + * @param ${className} ${functionName} + * @return ${functionName}集合 + */ + public List<${ClassName}> select${ClassName}List(${ClassName} ${className}); + + /** + * 新增${functionName} + * + * @param ${className} ${functionName} + * @return 结果 + */ + public int insert${ClassName}(${ClassName} ${className}); + + /** + * 修改${functionName} + * + * @param ${className} ${functionName} + * @return 结果 + */ + public int update${ClassName}(${ClassName} ${className}); + + /** + * 删除${functionName} + * + * @param ${pkColumn.javaField} ${functionName}主键 + * @return 结果 + */ + public int delete${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaType} ${pkColumn.javaField}); + + /** + * 批量删除${functionName} + * + * @param ${pkColumn.javaField}s 需要删除的数据主键集合 + * @return 结果 + */ + public int delete${ClassName}By${pkColumn.capJavaField}s(${pkColumn.javaType}[] ${pkColumn.javaField}s); +#if($table.sub) + + /** + * 批量删除${subTable.functionName} + * + * @param ${pkColumn.javaField}s 需要删除的数据主键集合 + * @return 结果 + */ + public int delete${subClassName}By${subTableFkClassName}s(${pkColumn.javaType}[] ${pkColumn.javaField}s); + + /** + * 批量新增${subTable.functionName} + * + * @param ${subclassName}List ${subTable.functionName}列表 + * @return 结果 + */ + public int batch${subClassName}(List<${subClassName}> ${subclassName}List); + + + /** + * 通过${functionName}主键删除${subTable.functionName}信息 + * + * @param ${pkColumn.javaField} ${functionName}ID + * @return 结果 + */ + public int delete${subClassName}By${subTableFkClassName}(${pkColumn.javaType} ${pkColumn.javaField}); +#end +} diff --git a/bs-generator/src/main/resources/vm/java/service.java.vm b/bs-generator/src/main/resources/vm/java/service.java.vm new file mode 100644 index 0000000..264882b --- /dev/null +++ b/bs-generator/src/main/resources/vm/java/service.java.vm @@ -0,0 +1,61 @@ +package ${packageName}.service; + +import java.util.List; +import ${packageName}.domain.${ClassName}; + +/** + * ${functionName}Service接口 + * + * @author ${author} + * @date ${datetime} + */ +public interface I${ClassName}Service +{ + /** + * 查询${functionName} + * + * @param ${pkColumn.javaField} ${functionName}主键 + * @return ${functionName} + */ + public ${ClassName} select${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaType} ${pkColumn.javaField}); + + /** + * 查询${functionName}列表 + * + * @param ${className} ${functionName} + * @return ${functionName}集合 + */ + public List<${ClassName}> select${ClassName}List(${ClassName} ${className}); + + /** + * 新增${functionName} + * + * @param ${className} ${functionName} + * @return 结果 + */ + public int insert${ClassName}(${ClassName} ${className}); + + /** + * 修改${functionName} + * + * @param ${className} ${functionName} + * @return 结果 + */ + public int update${ClassName}(${ClassName} ${className}); + + /** + * 批量删除${functionName} + * + * @param ${pkColumn.javaField}s 需要删除的${functionName}主键集合 + * @return 结果 + */ + public int delete${ClassName}By${pkColumn.capJavaField}s(${pkColumn.javaType}[] ${pkColumn.javaField}s); + + /** + * 删除${functionName}信息 + * + * @param ${pkColumn.javaField} ${functionName}主键 + * @return 结果 + */ + public int delete${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaType} ${pkColumn.javaField}); +} diff --git a/bs-generator/src/main/resources/vm/java/serviceImpl.java.vm b/bs-generator/src/main/resources/vm/java/serviceImpl.java.vm new file mode 100644 index 0000000..080e303 --- /dev/null +++ b/bs-generator/src/main/resources/vm/java/serviceImpl.java.vm @@ -0,0 +1,169 @@ +package ${packageName}.service.impl; + +import java.util.List; +#foreach ($column in $columns) +#if($column.javaField == 'createTime' || $column.javaField == 'updateTime') +import com.bs.common.utils.DateUtils; +#break +#end +#end +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +#if($table.sub) +import java.util.ArrayList; +import com.bs.common.utils.StringUtils; +import org.springframework.transaction.annotation.Transactional; +import ${packageName}.domain.${subClassName}; +#end +import ${packageName}.mapper.${ClassName}Mapper; +import ${packageName}.domain.${ClassName}; +import ${packageName}.service.I${ClassName}Service; + +/** + * ${functionName}Service业务层处理 + * + * @author ${author} + * @date ${datetime} + */ +@Service +public class ${ClassName}ServiceImpl implements I${ClassName}Service +{ + @Autowired + private ${ClassName}Mapper ${className}Mapper; + + /** + * 查询${functionName} + * + * @param ${pkColumn.javaField} ${functionName}主键 + * @return ${functionName} + */ + @Override + public ${ClassName} select${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaType} ${pkColumn.javaField}) + { + return ${className}Mapper.select${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaField}); + } + + /** + * 查询${functionName}列表 + * + * @param ${className} ${functionName} + * @return ${functionName} + */ + @Override + public List<${ClassName}> select${ClassName}List(${ClassName} ${className}) + { + return ${className}Mapper.select${ClassName}List(${className}); + } + + /** + * 新增${functionName} + * + * @param ${className} ${functionName} + * @return 结果 + */ +#if($table.sub) + @Transactional +#end + @Override + public int insert${ClassName}(${ClassName} ${className}) + { +#foreach ($column in $columns) +#if($column.javaField == 'createTime') + ${className}.setCreateTime(DateUtils.getNowDate()); +#end +#end +#if($table.sub) + int rows = ${className}Mapper.insert${ClassName}(${className}); + insert${subClassName}(${className}); + return rows; +#else + return ${className}Mapper.insert${ClassName}(${className}); +#end + } + + /** + * 修改${functionName} + * + * @param ${className} ${functionName} + * @return 结果 + */ +#if($table.sub) + @Transactional +#end + @Override + public int update${ClassName}(${ClassName} ${className}) + { +#foreach ($column in $columns) +#if($column.javaField == 'updateTime') + ${className}.setUpdateTime(DateUtils.getNowDate()); +#end +#end +#if($table.sub) + ${className}Mapper.delete${subClassName}By${subTableFkClassName}(${className}.get${pkColumn.capJavaField}()); + insert${subClassName}(${className}); +#end + return ${className}Mapper.update${ClassName}(${className}); + } + + /** + * 批量删除${functionName} + * + * @param ${pkColumn.javaField}s 需要删除的${functionName}主键 + * @return 结果 + */ +#if($table.sub) + @Transactional +#end + @Override + public int delete${ClassName}By${pkColumn.capJavaField}s(${pkColumn.javaType}[] ${pkColumn.javaField}s) + { +#if($table.sub) + ${className}Mapper.delete${subClassName}By${subTableFkClassName}s(${pkColumn.javaField}s); +#end + return ${className}Mapper.delete${ClassName}By${pkColumn.capJavaField}s(${pkColumn.javaField}s); + } + + /** + * 删除${functionName}信息 + * + * @param ${pkColumn.javaField} ${functionName}主键 + * @return 结果 + */ +#if($table.sub) + @Transactional +#end + @Override + public int delete${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaType} ${pkColumn.javaField}) + { +#if($table.sub) + ${className}Mapper.delete${subClassName}By${subTableFkClassName}(${pkColumn.javaField}); +#end + return ${className}Mapper.delete${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaField}); + } +#if($table.sub) + + /** + * 新增${subTable.functionName}信息 + * + * @param ${className} ${functionName}对象 + */ + public void insert${subClassName}(${ClassName} ${className}) + { + List<${subClassName}> ${subclassName}List = ${className}.get${subClassName}List(); + ${pkColumn.javaType} ${pkColumn.javaField} = ${className}.get${pkColumn.capJavaField}(); + if (StringUtils.isNotNull(${subclassName}List)) + { + List<${subClassName}> list = new ArrayList<${subClassName}>(); + for (${subClassName} ${subclassName} : ${subclassName}List) + { + ${subclassName}.set${subTableFkClassName}(${pkColumn.javaField}); + list.add(${subclassName}); + } + if (list.size() > 0) + { + ${className}Mapper.batch${subClassName}(list); + } + } + } +#end +} diff --git a/bs-generator/src/main/resources/vm/java/sub-domain.java.vm b/bs-generator/src/main/resources/vm/java/sub-domain.java.vm new file mode 100644 index 0000000..41e07cf --- /dev/null +++ b/bs-generator/src/main/resources/vm/java/sub-domain.java.vm @@ -0,0 +1,73 @@ +package ${packageName}.domain; + +#foreach ($import in $subImportList) +import ${import}; +#end +import com.bs.common.annotation.Excel; + +/** + * ${subTable.functionName}对象 ${subTableName} + * + * @author ${author} + * @date ${datetime} + */ +public class ${subClassName} extends BaseEntity +{ + private static final long serialVersionUID = 1L; + +#foreach ($column in $subTable.columns) +#if(!$table.isSuperColumn($column.javaField)) + /** $column.columnComment */ +#if($column.list) +#set($parentheseIndex=$column.columnComment.indexOf("(")) +#if($parentheseIndex != -1) +#set($comment=$column.columnComment.substring(0, $parentheseIndex)) +#else +#set($comment=$column.columnComment) +#end +#if($parentheseIndex != -1) + @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()") +#elseif($column.javaType == 'Date') + @JsonFormat(pattern = "yyyy-MM-dd") + @Excel(name = "${comment}", width = 30, dateFormat = "yyyy-MM-dd") +#else + @Excel(name = "${comment}") +#end +#end + private $column.javaType $column.javaField; + +#end +#end +#foreach ($column in $subTable.columns) +#if(!$table.isSuperColumn($column.javaField)) +#if($column.javaField.length() > 2 && $column.javaField.substring(1,2).matches("[A-Z]")) +#set($AttrName=$column.javaField) +#else +#set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)}) +#end + public void set${AttrName}($column.javaType $column.javaField) + { + this.$column.javaField = $column.javaField; + } + + public $column.javaType get${AttrName}() + { + return $column.javaField; + } +#end +#end + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) +#foreach ($column in $subTable.columns) +#if($column.javaField.length() > 2 && $column.javaField.substring(1,2).matches("[A-Z]")) +#set($AttrName=$column.javaField) +#else +#set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)}) +#end + .append("${column.javaField}", get${AttrName}()) +#end + .toString(); + } +} diff --git a/bs-generator/src/main/resources/vm/js/api.js.vm b/bs-generator/src/main/resources/vm/js/api.js.vm new file mode 100644 index 0000000..9295524 --- /dev/null +++ b/bs-generator/src/main/resources/vm/js/api.js.vm @@ -0,0 +1,44 @@ +import request from '@/utils/request' + +// 查询${functionName}列表 +export function list${BusinessName}(query) { + return request({ + url: '/${moduleName}/${businessName}/list', + method: 'get', + params: query + }) +} + +// 查询${functionName}详细 +export function get${BusinessName}(${pkColumn.javaField}) { + return request({ + url: '/${moduleName}/${businessName}/' + ${pkColumn.javaField}, + method: 'get' + }) +} + +// 新增${functionName} +export function add${BusinessName}(data) { + return request({ + url: '/${moduleName}/${businessName}', + method: 'post', + data: data + }) +} + +// 修改${functionName} +export function update${BusinessName}(data) { + return request({ + url: '/${moduleName}/${businessName}', + method: 'put', + data: data + }) +} + +// 删除${functionName} +export function del${BusinessName}(${pkColumn.javaField}) { + return request({ + url: '/${moduleName}/${businessName}/' + ${pkColumn.javaField}, + method: 'delete' + }) +} diff --git a/bs-generator/src/main/resources/vm/sql/sql.vm b/bs-generator/src/main/resources/vm/sql/sql.vm new file mode 100644 index 0000000..0575583 --- /dev/null +++ b/bs-generator/src/main/resources/vm/sql/sql.vm @@ -0,0 +1,22 @@ +-- 菜单 SQL +insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark) +values('${functionName}', '${parentMenuId}', '1', '${businessName}', '${moduleName}/${businessName}/index', 1, 0, 'C', '0', '0', '${permissionPrefix}:list', '#', 'admin', sysdate(), '', null, '${functionName}菜单'); + +-- 按钮父菜单ID +SELECT @parentId := LAST_INSERT_ID(); + +-- 按钮 SQL +insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark) +values('${functionName}查询', @parentId, '1', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:query', '#', 'admin', sysdate(), '', null, ''); + +insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark) +values('${functionName}新增', @parentId, '2', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:add', '#', 'admin', sysdate(), '', null, ''); + +insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark) +values('${functionName}修改', @parentId, '3', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:edit', '#', 'admin', sysdate(), '', null, ''); + +insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark) +values('${functionName}删除', @parentId, '4', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:remove', '#', 'admin', sysdate(), '', null, ''); + +insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark) +values('${functionName}导出', @parentId, '5', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:export', '#', 'admin', sysdate(), '', null, ''); \ No newline at end of file diff --git a/bs-generator/src/main/resources/vm/vue/index-tree.vue.vm b/bs-generator/src/main/resources/vm/vue/index-tree.vue.vm new file mode 100644 index 0000000..a4c64a0 --- /dev/null +++ b/bs-generator/src/main/resources/vm/vue/index-tree.vue.vm @@ -0,0 +1,505 @@ + + + diff --git a/bs-generator/src/main/resources/vm/vue/index.vue.vm b/bs-generator/src/main/resources/vm/vue/index.vue.vm new file mode 100644 index 0000000..6296014 --- /dev/null +++ b/bs-generator/src/main/resources/vm/vue/index.vue.vm @@ -0,0 +1,602 @@ + + + diff --git a/bs-generator/src/main/resources/vm/vue/v3/index-tree.vue.vm b/bs-generator/src/main/resources/vm/vue/v3/index-tree.vue.vm new file mode 100644 index 0000000..7bbd2fc --- /dev/null +++ b/bs-generator/src/main/resources/vm/vue/v3/index-tree.vue.vm @@ -0,0 +1,474 @@ + + + diff --git a/bs-generator/src/main/resources/vm/vue/v3/index.vue.vm b/bs-generator/src/main/resources/vm/vue/v3/index.vue.vm new file mode 100644 index 0000000..8b25665 --- /dev/null +++ b/bs-generator/src/main/resources/vm/vue/v3/index.vue.vm @@ -0,0 +1,590 @@ + + + diff --git a/bs-generator/src/main/resources/vm/vue/v3/readme.txt b/bs-generator/src/main/resources/vm/vue/v3/readme.txt new file mode 100644 index 0000000..1d7aaa0 --- /dev/null +++ b/bs-generator/src/main/resources/vm/vue/v3/readme.txt @@ -0,0 +1 @@ +���ʹ�õ���bs-Vue3ǰ�ˣ���ô��Ҫ����һ�´�Ŀ¼��ģ��index.vue.vm��index-tree.vue.vm�ļ����ϼ�vueĿ¼�� diff --git a/bs-generator/src/main/resources/vm/xml/mapper.xml.vm b/bs-generator/src/main/resources/vm/xml/mapper.xml.vm new file mode 100644 index 0000000..0ceb3d8 --- /dev/null +++ b/bs-generator/src/main/resources/vm/xml/mapper.xml.vm @@ -0,0 +1,135 @@ + + + + + +#foreach ($column in $columns) + +#end + +#if($table.sub) + + + + + + +#foreach ($column in $subTable.columns) + +#end + +#end + + + select#foreach($column in $columns) $column.columnName#if($foreach.count != $columns.size()),#end#end from ${tableName} + + + + + + + + insert into ${tableName} + +#foreach($column in $columns) +#if($column.columnName != $pkColumn.columnName || !$pkColumn.increment) + $column.columnName, +#end +#end + + +#foreach($column in $columns) +#if($column.columnName != $pkColumn.columnName || !$pkColumn.increment) + #{$column.javaField}, +#end +#end + + + + + update ${tableName} + +#foreach($column in $columns) +#if($column.columnName != $pkColumn.columnName) + $column.columnName = #{$column.javaField}, +#end +#end + + where ${pkColumn.columnName} = #{${pkColumn.javaField}} + + + + delete from ${tableName} where ${pkColumn.columnName} = #{${pkColumn.javaField}} + + + + delete from ${tableName} where ${pkColumn.columnName} in + + #{${pkColumn.javaField}} + + +#if($table.sub) + + + delete from ${subTableName} where ${subTableFkName} in + + #{${subTableFkclassName}} + + + + + delete from ${subTableName} where ${subTableFkName} = #{${subTableFkclassName}} + + + + insert into ${subTableName}(#foreach($column in $subTable.columns) $column.columnName#if($foreach.count != $subTable.columns.size()),#end#end) values + + (#foreach($column in $subTable.columns) #{item.$column.javaField}#if($foreach.count != $subTable.columns.size()),#end#end) + + +#end + \ No newline at end of file diff --git a/bs-quartz/pom.xml b/bs-quartz/pom.xml new file mode 100644 index 0000000..aefc75f --- /dev/null +++ b/bs-quartz/pom.xml @@ -0,0 +1,40 @@ + + + + my-base + com.bs + 3.8.6 + + 4.0.0 + + bs-quartz + + + quartz定时任务 + + + + + + + org.quartz-scheduler + quartz + + + com.mchange + c3p0 + + + + + + + com.bs + bs-common + + + + + diff --git a/bs-quartz/src/main/java/com/bs/quartz/config/ScheduleConfig.java b/bs-quartz/src/main/java/com/bs/quartz/config/ScheduleConfig.java new file mode 100644 index 0000000..c6bc579 --- /dev/null +++ b/bs-quartz/src/main/java/com/bs/quartz/config/ScheduleConfig.java @@ -0,0 +1,57 @@ +//package com.bs.quartz.config; +// +//import org.springframework.context.annotation.Bean; +//import org.springframework.context.annotation.Configuration; +//import org.springframework.scheduling.quartz.SchedulerFactoryBean; +//import javax.sql.DataSource; +//import java.util.Properties; +// +///** +// * 定时任务配置(单机部署建议删除此类和qrtz数据库表,默认走内存会最高效) +// * +// * @author bs +// */ +//@Configuration +//public class ScheduleConfig +//{ +// @Bean +// public SchedulerFactoryBean schedulerFactoryBean(DataSource dataSource) +// { +// SchedulerFactoryBean factory = new SchedulerFactoryBean(); +// factory.setDataSource(dataSource); +// +// // quartz参数 +// Properties prop = new Properties(); +// prop.put("org.quartz.scheduler.instanceName", "bsScheduler"); +// prop.put("org.quartz.scheduler.instanceId", "AUTO"); +// // 线程池配置 +// prop.put("org.quartz.threadPool.class", "org.quartz.simpl.SimpleThreadPool"); +// prop.put("org.quartz.threadPool.threadCount", "20"); +// prop.put("org.quartz.threadPool.threadPriority", "5"); +// // JobStore配置 +// prop.put("org.quartz.jobStore.class", "org.springframework.scheduling.quartz.LocalDataSourceJobStore"); +// // 集群配置 +// prop.put("org.quartz.jobStore.isClustered", "true"); +// prop.put("org.quartz.jobStore.clusterCheckinInterval", "15000"); +// prop.put("org.quartz.jobStore.maxMisfiresToHandleAtATime", "1"); +// prop.put("org.quartz.jobStore.txIsolationLevelSerializable", "true"); +// +// // sqlserver 启用 +// // prop.put("org.quartz.jobStore.selectWithLockSQL", "SELECT * FROM {0}LOCKS UPDLOCK WHERE LOCK_NAME = ?"); +// prop.put("org.quartz.jobStore.misfireThreshold", "12000"); +// prop.put("org.quartz.jobStore.tablePrefix", "QRTZ_"); +// factory.setQuartzProperties(prop); +// +// factory.setSchedulerName("bsScheduler"); +// // 延时启动 +// factory.setStartupDelay(1); +// factory.setApplicationContextSchedulerContextKey("applicationContextKey"); +// // 可选,QuartzScheduler +// // 启动时更新己存在的Job,这样就不用每次修改targetObject后删除qrtz_job_details表对应记录了 +// factory.setOverwriteExistingJobs(true); +// // 设置自动启动,默认为true +// factory.setAutoStartup(true); +// +// return factory; +// } +//} diff --git a/bs-quartz/src/main/java/com/bs/quartz/controller/SysJobController.java b/bs-quartz/src/main/java/com/bs/quartz/controller/SysJobController.java new file mode 100644 index 0000000..6e4ebe2 --- /dev/null +++ b/bs-quartz/src/main/java/com/bs/quartz/controller/SysJobController.java @@ -0,0 +1,185 @@ +package com.bs.quartz.controller; + +import java.util.List; +import javax.servlet.http.HttpServletResponse; +import org.quartz.SchedulerException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.bs.common.annotation.Log; +import com.bs.common.constant.Constants; +import com.bs.common.core.controller.BaseController; +import com.bs.common.core.domain.AjaxResult; +import com.bs.common.core.page.TableDataInfo; +import com.bs.common.enums.BusinessType; +import com.bs.common.exception.job.TaskException; +import com.bs.common.utils.StringUtils; +import com.bs.common.utils.poi.ExcelUtil; +import com.bs.quartz.domain.SysJob; +import com.bs.quartz.service.ISysJobService; +import com.bs.quartz.util.CronUtils; +import com.bs.quartz.util.ScheduleUtils; + +/** + * 调度任务信息操作处理 + * + * @author bs + */ +@RestController +@RequestMapping("/monitor/job") +public class SysJobController extends BaseController +{ + @Autowired + private ISysJobService jobService; + + /** + * 查询定时任务列表 + */ + @PreAuthorize("@ss.hasPermi('monitor:job:list')") + @GetMapping("/list") + public TableDataInfo list(SysJob sysJob) + { + startPage(); + List list = jobService.selectJobList(sysJob); + return getDataTable(list); + } + + /** + * 导出定时任务列表 + */ + @PreAuthorize("@ss.hasPermi('monitor:job:export')") + @Log(title = "定时任务", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, SysJob sysJob) + { + List list = jobService.selectJobList(sysJob); + ExcelUtil util = new ExcelUtil(SysJob.class); + util.exportExcel(response, list, "定时任务"); + } + + /** + * 获取定时任务详细信息 + */ + @PreAuthorize("@ss.hasPermi('monitor:job:query')") + @GetMapping(value = "/{jobId}") + public AjaxResult getInfo(@PathVariable("jobId") Long jobId) + { + return success(jobService.selectJobById(jobId)); + } + + /** + * 新增定时任务 + */ + @PreAuthorize("@ss.hasPermi('monitor:job:add')") + @Log(title = "定时任务", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody SysJob job) throws SchedulerException, TaskException + { + if (!CronUtils.isValid(job.getCronExpression())) + { + return error("新增任务'" + job.getJobName() + "'失败,Cron表达式不正确"); + } + else if (StringUtils.containsIgnoreCase(job.getInvokeTarget(), Constants.LOOKUP_RMI)) + { + return error("新增任务'" + job.getJobName() + "'失败,目标字符串不允许'rmi'调用"); + } + else if (StringUtils.containsAnyIgnoreCase(job.getInvokeTarget(), new String[] { Constants.LOOKUP_LDAP, Constants.LOOKUP_LDAPS })) + { + return error("新增任务'" + job.getJobName() + "'失败,目标字符串不允许'ldap(s)'调用"); + } + else if (StringUtils.containsAnyIgnoreCase(job.getInvokeTarget(), new String[] { Constants.HTTP, Constants.HTTPS })) + { + return error("新增任务'" + job.getJobName() + "'失败,目标字符串不允许'http(s)'调用"); + } + else if (StringUtils.containsAnyIgnoreCase(job.getInvokeTarget(), Constants.JOB_ERROR_STR)) + { + return error("新增任务'" + job.getJobName() + "'失败,目标字符串存在违规"); + } + else if (!ScheduleUtils.whiteList(job.getInvokeTarget())) + { + return error("新增任务'" + job.getJobName() + "'失败,目标字符串不在白名单内"); + } + job.setCreateBy(getUsername()); + return toAjax(jobService.insertJob(job)); + } + + /** + * 修改定时任务 + */ + @PreAuthorize("@ss.hasPermi('monitor:job:edit')") + @Log(title = "定时任务", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody SysJob job) throws SchedulerException, TaskException + { + if (!CronUtils.isValid(job.getCronExpression())) + { + return error("修改任务'" + job.getJobName() + "'失败,Cron表达式不正确"); + } + else if (StringUtils.containsIgnoreCase(job.getInvokeTarget(), Constants.LOOKUP_RMI)) + { + return error("修改任务'" + job.getJobName() + "'失败,目标字符串不允许'rmi'调用"); + } + else if (StringUtils.containsAnyIgnoreCase(job.getInvokeTarget(), new String[] { Constants.LOOKUP_LDAP, Constants.LOOKUP_LDAPS })) + { + return error("修改任务'" + job.getJobName() + "'失败,目标字符串不允许'ldap(s)'调用"); + } + else if (StringUtils.containsAnyIgnoreCase(job.getInvokeTarget(), new String[] { Constants.HTTP, Constants.HTTPS })) + { + return error("修改任务'" + job.getJobName() + "'失败,目标字符串不允许'http(s)'调用"); + } + else if (StringUtils.containsAnyIgnoreCase(job.getInvokeTarget(), Constants.JOB_ERROR_STR)) + { + return error("修改任务'" + job.getJobName() + "'失败,目标字符串存在违规"); + } + else if (!ScheduleUtils.whiteList(job.getInvokeTarget())) + { + return error("修改任务'" + job.getJobName() + "'失败,目标字符串不在白名单内"); + } + job.setUpdateBy(getUsername()); + return toAjax(jobService.updateJob(job)); + } + + /** + * 定时任务状态修改 + */ + @PreAuthorize("@ss.hasPermi('monitor:job:changeStatus')") + @Log(title = "定时任务", businessType = BusinessType.UPDATE) + @PutMapping("/changeStatus") + public AjaxResult changeStatus(@RequestBody SysJob job) throws SchedulerException + { + SysJob newJob = jobService.selectJobById(job.getJobId()); + newJob.setStatus(job.getStatus()); + return toAjax(jobService.changeStatus(newJob)); + } + + /** + * 定时任务立即执行一次 + */ + @PreAuthorize("@ss.hasPermi('monitor:job:changeStatus')") + @Log(title = "定时任务", businessType = BusinessType.UPDATE) + @PutMapping("/run") + public AjaxResult run(@RequestBody SysJob job) throws SchedulerException + { + boolean result = jobService.run(job); + return result ? success() : error("任务不存在或已过期!"); + } + + /** + * 删除定时任务 + */ + @PreAuthorize("@ss.hasPermi('monitor:job:remove')") + @Log(title = "定时任务", businessType = BusinessType.DELETE) + @DeleteMapping("/{jobIds}") + public AjaxResult remove(@PathVariable Long[] jobIds) throws SchedulerException, TaskException + { + jobService.deleteJobByIds(jobIds); + return success(); + } +} diff --git a/bs-quartz/src/main/java/com/bs/quartz/controller/SysJobLogController.java b/bs-quartz/src/main/java/com/bs/quartz/controller/SysJobLogController.java new file mode 100644 index 0000000..da7f6eb --- /dev/null +++ b/bs-quartz/src/main/java/com/bs/quartz/controller/SysJobLogController.java @@ -0,0 +1,92 @@ +package com.bs.quartz.controller; + +import java.util.List; +import javax.servlet.http.HttpServletResponse; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.bs.common.annotation.Log; +import com.bs.common.core.controller.BaseController; +import com.bs.common.core.domain.AjaxResult; +import com.bs.common.core.page.TableDataInfo; +import com.bs.common.enums.BusinessType; +import com.bs.common.utils.poi.ExcelUtil; +import com.bs.quartz.domain.SysJobLog; +import com.bs.quartz.service.ISysJobLogService; + +/** + * 调度日志操作处理 + * + * @author bs + */ +@RestController +@RequestMapping("/monitor/jobLog") +public class SysJobLogController extends BaseController +{ + @Autowired + private ISysJobLogService jobLogService; + + /** + * 查询定时任务调度日志列表 + */ + @PreAuthorize("@ss.hasPermi('monitor:job:list')") + @GetMapping("/list") + public TableDataInfo list(SysJobLog sysJobLog) + { + startPage(); + List list = jobLogService.selectJobLogList(sysJobLog); + return getDataTable(list); + } + + /** + * 导出定时任务调度日志列表 + */ + @PreAuthorize("@ss.hasPermi('monitor:job:export')") + @Log(title = "任务调度日志", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, SysJobLog sysJobLog) + { + List list = jobLogService.selectJobLogList(sysJobLog); + ExcelUtil util = new ExcelUtil(SysJobLog.class); + util.exportExcel(response, list, "调度日志"); + } + + /** + * 根据调度编号获取详细信息 + */ + @PreAuthorize("@ss.hasPermi('monitor:job:query')") + @GetMapping(value = "/{jobLogId}") + public AjaxResult getInfo(@PathVariable Long jobLogId) + { + return success(jobLogService.selectJobLogById(jobLogId)); + } + + + /** + * 删除定时任务调度日志 + */ + @PreAuthorize("@ss.hasPermi('monitor:job:remove')") + @Log(title = "定时任务调度日志", businessType = BusinessType.DELETE) + @DeleteMapping("/{jobLogIds}") + public AjaxResult remove(@PathVariable Long[] jobLogIds) + { + return toAjax(jobLogService.deleteJobLogByIds(jobLogIds)); + } + + /** + * 清空定时任务调度日志 + */ + @PreAuthorize("@ss.hasPermi('monitor:job:remove')") + @Log(title = "调度日志", businessType = BusinessType.CLEAN) + @DeleteMapping("/clean") + public AjaxResult clean() + { + jobLogService.cleanJobLog(); + return success(); + } +} diff --git a/bs-quartz/src/main/java/com/bs/quartz/domain/SysJob.java b/bs-quartz/src/main/java/com/bs/quartz/domain/SysJob.java new file mode 100644 index 0000000..45578cf --- /dev/null +++ b/bs-quartz/src/main/java/com/bs/quartz/domain/SysJob.java @@ -0,0 +1,173 @@ +package com.bs.quartz.domain; + +import com.bs.common.annotation.Excel; +import com.bs.common.annotation.Excel.ColumnType; +import com.bs.common.constant.ScheduleConstants; +import com.bs.common.core.domain.BaseEntity; +import com.bs.common.utils.StringUtils; +import com.bs.quartz.util.CronUtils; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Size; +import java.util.Date; + +/** + * 定时任务调度表 sys_job + * + * @author bs + */ +@Data +public class SysJob extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 任务ID */ + @Excel(name = "任务序号", cellType = ColumnType.NUMERIC) + private Long jobId; + + /** 任务名称 */ + @Excel(name = "任务名称") + private String jobName; + + /** 任务组名 */ + @Excel(name = "任务组名") + private String jobGroup; + + /** 调用目标字符串 */ + @Excel(name = "调用目标字符串") + private String invokeTarget; + + /** cron执行表达式 */ + @Excel(name = "执行表达式 ") + private String cronExpression; + + /** cron计划策略 */ + @Excel(name = "计划策略 ", readConverterExp = "0=默认,1=立即触发执行,2=触发一次执行,3=不触发立即执行") + private String misfirePolicy = ScheduleConstants.MISFIRE_DEFAULT; + + /** 是否并发执行(0允许 1禁止) */ + @Excel(name = "并发执行", readConverterExp = "0=允许,1=禁止") + private String concurrent; + + /** 任务状态(0正常 1暂停) */ + @Excel(name = "任务状态", readConverterExp = "0=正常,1=暂停") + private String status; + private String remark; + public Long getJobId() + { + return jobId; + } + + public void setJobId(Long jobId) + { + this.jobId = jobId; + } + + @NotBlank(message = "任务名称不能为空") + @Size(min = 0, max = 64, message = "任务名称不能超过64个字符") + public String getJobName() + { + return jobName; + } + + public void setJobName(String jobName) + { + this.jobName = jobName; + } + + public String getJobGroup() + { + return jobGroup; + } + + public void setJobGroup(String jobGroup) + { + this.jobGroup = jobGroup; + } + + @NotBlank(message = "调用目标字符串不能为空") + @Size(min = 0, max = 500, message = "调用目标字符串长度不能超过500个字符") + public String getInvokeTarget() + { + return invokeTarget; + } + + public void setInvokeTarget(String invokeTarget) + { + this.invokeTarget = invokeTarget; + } + + @NotBlank(message = "Cron执行表达式不能为空") + @Size(min = 0, max = 255, message = "Cron执行表达式不能超过255个字符") + public String getCronExpression() + { + return cronExpression; + } + + public void setCronExpression(String cronExpression) + { + this.cronExpression = cronExpression; + } + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + public Date getNextValidTime() + { + if (StringUtils.isNotEmpty(cronExpression)) + { + return CronUtils.getNextExecution(cronExpression); + } + return null; + } + + public String getMisfirePolicy() + { + return misfirePolicy; + } + + public void setMisfirePolicy(String misfirePolicy) + { + this.misfirePolicy = misfirePolicy; + } + + public String getConcurrent() + { + return concurrent; + } + + public void setConcurrent(String concurrent) + { + this.concurrent = concurrent; + } + + public String getStatus() + { + return status; + } + + public void setStatus(String status) + { + this.status = status; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("jobId", getJobId()) + .append("jobName", getJobName()) + .append("jobGroup", getJobGroup()) + .append("cronExpression", getCronExpression()) + .append("nextValidTime", getNextValidTime()) + .append("misfirePolicy", getMisfirePolicy()) + .append("concurrent", getConcurrent()) + .append("status", getStatus()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .toString(); + } +} diff --git a/bs-quartz/src/main/java/com/bs/quartz/domain/SysJobLog.java b/bs-quartz/src/main/java/com/bs/quartz/domain/SysJobLog.java new file mode 100644 index 0000000..d157aff --- /dev/null +++ b/bs-quartz/src/main/java/com/bs/quartz/domain/SysJobLog.java @@ -0,0 +1,155 @@ +package com.bs.quartz.domain; + +import java.util.Date; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.bs.common.annotation.Excel; +import com.bs.common.core.domain.BaseEntity; + +/** + * 定时任务调度日志表 sys_job_log + * + * @author bs + */ +public class SysJobLog extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** ID */ + @Excel(name = "日志序号") + private Long jobLogId; + + /** 任务名称 */ + @Excel(name = "任务名称") + private String jobName; + + /** 任务组名 */ + @Excel(name = "任务组名") + private String jobGroup; + + /** 调用目标字符串 */ + @Excel(name = "调用目标字符串") + private String invokeTarget; + + /** 日志信息 */ + @Excel(name = "日志信息") + private String jobMessage; + + /** 执行状态(0正常 1失败) */ + @Excel(name = "执行状态", readConverterExp = "0=正常,1=失败") + private String status; + + /** 异常信息 */ + @Excel(name = "异常信息") + private String exceptionInfo; + + /** 开始时间 */ + private Date startTime; + + /** 停止时间 */ + private Date stopTime; + + public Long getJobLogId() + { + return jobLogId; + } + + public void setJobLogId(Long jobLogId) + { + this.jobLogId = jobLogId; + } + + public String getJobName() + { + return jobName; + } + + public void setJobName(String jobName) + { + this.jobName = jobName; + } + + public String getJobGroup() + { + return jobGroup; + } + + public void setJobGroup(String jobGroup) + { + this.jobGroup = jobGroup; + } + + public String getInvokeTarget() + { + return invokeTarget; + } + + public void setInvokeTarget(String invokeTarget) + { + this.invokeTarget = invokeTarget; + } + + public String getJobMessage() + { + return jobMessage; + } + + public void setJobMessage(String jobMessage) + { + this.jobMessage = jobMessage; + } + + public String getStatus() + { + return status; + } + + public void setStatus(String status) + { + this.status = status; + } + + public String getExceptionInfo() + { + return exceptionInfo; + } + + public void setExceptionInfo(String exceptionInfo) + { + this.exceptionInfo = exceptionInfo; + } + + public Date getStartTime() + { + return startTime; + } + + public void setStartTime(Date startTime) + { + this.startTime = startTime; + } + + public Date getStopTime() + { + return stopTime; + } + + public void setStopTime(Date stopTime) + { + this.stopTime = stopTime; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("jobLogId", getJobLogId()) + .append("jobName", getJobName()) + .append("jobGroup", getJobGroup()) + .append("jobMessage", getJobMessage()) + .append("status", getStatus()) + .append("exceptionInfo", getExceptionInfo()) + .append("startTime", getStartTime()) + .append("stopTime", getStopTime()) + .toString(); + } +} diff --git a/bs-quartz/src/main/java/com/bs/quartz/mapper/SysJobLogMapper.java b/bs-quartz/src/main/java/com/bs/quartz/mapper/SysJobLogMapper.java new file mode 100644 index 0000000..cf25ca9 --- /dev/null +++ b/bs-quartz/src/main/java/com/bs/quartz/mapper/SysJobLogMapper.java @@ -0,0 +1,64 @@ +package com.bs.quartz.mapper; + +import java.util.List; +import com.bs.quartz.domain.SysJobLog; + +/** + * 调度任务日志信息 数据层 + * + * @author bs + */ +public interface SysJobLogMapper +{ + /** + * 获取quartz调度器日志的计划任务 + * + * @param jobLog 调度日志信息 + * @return 调度任务日志集合 + */ + public List selectJobLogList(SysJobLog jobLog); + + /** + * 查询所有调度任务日志 + * + * @return 调度任务日志列表 + */ + public List selectJobLogAll(); + + /** + * 通过调度任务日志ID查询调度信息 + * + * @param jobLogId 调度任务日志ID + * @return 调度任务日志对象信息 + */ + public SysJobLog selectJobLogById(Long jobLogId); + + /** + * 新增任务日志 + * + * @param jobLog 调度日志信息 + * @return 结果 + */ + public int insertJobLog(SysJobLog jobLog); + + /** + * 批量删除调度日志信息 + * + * @param logIds 需要删除的数据ID + * @return 结果 + */ + public int deleteJobLogByIds(Long[] logIds); + + /** + * 删除任务日志 + * + * @param jobId 调度日志ID + * @return 结果 + */ + public int deleteJobLogById(Long jobId); + + /** + * 清空任务日志 + */ + public void cleanJobLog(); +} diff --git a/bs-quartz/src/main/java/com/bs/quartz/mapper/SysJobMapper.java b/bs-quartz/src/main/java/com/bs/quartz/mapper/SysJobMapper.java new file mode 100644 index 0000000..4f70700 --- /dev/null +++ b/bs-quartz/src/main/java/com/bs/quartz/mapper/SysJobMapper.java @@ -0,0 +1,67 @@ +package com.bs.quartz.mapper; + +import java.util.List; +import com.bs.quartz.domain.SysJob; + +/** + * 调度任务信息 数据层 + * + * @author bs + */ +public interface SysJobMapper +{ + /** + * 查询调度任务日志集合 + * + * @param job 调度信息 + * @return 操作日志集合 + */ + public List selectJobList(SysJob job); + + /** + * 查询所有调度任务 + * + * @return 调度任务列表 + */ + public List selectJobAll(); + + /** + * 通过调度ID查询调度任务信息 + * + * @param jobId 调度ID + * @return 角色对象信息 + */ + public SysJob selectJobById(Long jobId); + + /** + * 通过调度ID删除调度任务信息 + * + * @param jobId 调度ID + * @return 结果 + */ + public int deleteJobById(Long jobId); + + /** + * 批量删除调度任务信息 + * + * @param ids 需要删除的数据ID + * @return 结果 + */ + public int deleteJobByIds(Long[] ids); + + /** + * 修改调度任务信息 + * + * @param job 调度任务信息 + * @return 结果 + */ + public int updateJob(SysJob job); + + /** + * 新增调度任务信息 + * + * @param job 调度任务信息 + * @return 结果 + */ + public int insertJob(SysJob job); +} diff --git a/bs-quartz/src/main/java/com/bs/quartz/service/ISysJobLogService.java b/bs-quartz/src/main/java/com/bs/quartz/service/ISysJobLogService.java new file mode 100644 index 0000000..f6b26ac --- /dev/null +++ b/bs-quartz/src/main/java/com/bs/quartz/service/ISysJobLogService.java @@ -0,0 +1,56 @@ +package com.bs.quartz.service; + +import java.util.List; +import com.bs.quartz.domain.SysJobLog; + +/** + * 定时任务调度日志信息信息 服务层 + * + * @author bs + */ +public interface ISysJobLogService +{ + /** + * 获取quartz调度器日志的计划任务 + * + * @param jobLog 调度日志信息 + * @return 调度任务日志集合 + */ + public List selectJobLogList(SysJobLog jobLog); + + /** + * 通过调度任务日志ID查询调度信息 + * + * @param jobLogId 调度任务日志ID + * @return 调度任务日志对象信息 + */ + public SysJobLog selectJobLogById(Long jobLogId); + + /** + * 新增任务日志 + * + * @param jobLog 调度日志信息 + */ + public void addJobLog(SysJobLog jobLog); + + /** + * 批量删除调度日志信息 + * + * @param logIds 需要删除的日志ID + * @return 结果 + */ + public int deleteJobLogByIds(Long[] logIds); + + /** + * 删除任务日志 + * + * @param jobId 调度日志ID + * @return 结果 + */ + public int deleteJobLogById(Long jobId); + + /** + * 清空任务日志 + */ + public void cleanJobLog(); +} diff --git a/bs-quartz/src/main/java/com/bs/quartz/service/ISysJobService.java b/bs-quartz/src/main/java/com/bs/quartz/service/ISysJobService.java new file mode 100644 index 0000000..9d2d93e --- /dev/null +++ b/bs-quartz/src/main/java/com/bs/quartz/service/ISysJobService.java @@ -0,0 +1,102 @@ +package com.bs.quartz.service; + +import java.util.List; +import org.quartz.SchedulerException; +import com.bs.common.exception.job.TaskException; +import com.bs.quartz.domain.SysJob; + +/** + * 定时任务调度信息信息 服务层 + * + * @author bs + */ +public interface ISysJobService +{ + /** + * 获取quartz调度器的计划任务 + * + * @param job 调度信息 + * @return 调度任务集合 + */ + public List selectJobList(SysJob job); + + /** + * 通过调度任务ID查询调度信息 + * + * @param jobId 调度任务ID + * @return 调度任务对象信息 + */ + public SysJob selectJobById(Long jobId); + + /** + * 暂停任务 + * + * @param job 调度信息 + * @return 结果 + */ + public int pauseJob(SysJob job) throws SchedulerException; + + /** + * 恢复任务 + * + * @param job 调度信息 + * @return 结果 + */ + public int resumeJob(SysJob job) throws SchedulerException; + + /** + * 删除任务后,所对应的trigger也将被删除 + * + * @param job 调度信息 + * @return 结果 + */ + public int deleteJob(SysJob job) throws SchedulerException; + + /** + * 批量删除调度信息 + * + * @param jobIds 需要删除的任务ID + * @return 结果 + */ + public void deleteJobByIds(Long[] jobIds) throws SchedulerException; + + /** + * 任务调度状态修改 + * + * @param job 调度信息 + * @return 结果 + */ + public int changeStatus(SysJob job) throws SchedulerException; + + /** + * 立即运行任务 + * + * @param job 调度信息 + * @return 结果 + */ + public boolean run(SysJob job) throws SchedulerException; + + /** + * 新增任务 + * + * @param job 调度信息 + * @return 结果 + */ + public int insertJob(SysJob job) throws SchedulerException, TaskException; + + /** + * 更新任务 + * + * @param job 调度信息 + * @return 结果 + */ + public int updateJob(SysJob job) throws SchedulerException, TaskException; + + /** + * 校验cron表达式是否有效 + * + * @param cronExpression 表达式 + * @return 结果 + */ + public boolean checkCronExpressionIsValid(String cronExpression); +} diff --git a/bs-quartz/src/main/java/com/bs/quartz/service/impl/SysJobLogServiceImpl.java b/bs-quartz/src/main/java/com/bs/quartz/service/impl/SysJobLogServiceImpl.java new file mode 100644 index 0000000..9e933ed --- /dev/null +++ b/bs-quartz/src/main/java/com/bs/quartz/service/impl/SysJobLogServiceImpl.java @@ -0,0 +1,87 @@ +package com.bs.quartz.service.impl; + +import java.util.List; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.bs.quartz.domain.SysJobLog; +import com.bs.quartz.mapper.SysJobLogMapper; +import com.bs.quartz.service.ISysJobLogService; + +/** + * 定时任务调度日志信息 服务层 + * + * @author bs + */ +@Service +public class SysJobLogServiceImpl implements ISysJobLogService +{ + @Autowired + private SysJobLogMapper jobLogMapper; + + /** + * 获取quartz调度器日志的计划任务 + * + * @param jobLog 调度日志信息 + * @return 调度任务日志集合 + */ + @Override + public List selectJobLogList(SysJobLog jobLog) + { + return jobLogMapper.selectJobLogList(jobLog); + } + + /** + * 通过调度任务日志ID查询调度信息 + * + * @param jobLogId 调度任务日志ID + * @return 调度任务日志对象信息 + */ + @Override + public SysJobLog selectJobLogById(Long jobLogId) + { + return jobLogMapper.selectJobLogById(jobLogId); + } + + /** + * 新增任务日志 + * + * @param jobLog 调度日志信息 + */ + @Override + public void addJobLog(SysJobLog jobLog) + { + jobLogMapper.insertJobLog(jobLog); + } + + /** + * 批量删除调度日志信息 + * + * @param logIds 需要删除的数据ID + * @return 结果 + */ + @Override + public int deleteJobLogByIds(Long[] logIds) + { + return jobLogMapper.deleteJobLogByIds(logIds); + } + + /** + * 删除任务日志 + * + * @param jobId 调度日志ID + */ + @Override + public int deleteJobLogById(Long jobId) + { + return jobLogMapper.deleteJobLogById(jobId); + } + + /** + * 清空任务日志 + */ + @Override + public void cleanJobLog() + { + jobLogMapper.cleanJobLog(); + } +} diff --git a/bs-quartz/src/main/java/com/bs/quartz/service/impl/SysJobServiceImpl.java b/bs-quartz/src/main/java/com/bs/quartz/service/impl/SysJobServiceImpl.java new file mode 100644 index 0000000..fe22660 --- /dev/null +++ b/bs-quartz/src/main/java/com/bs/quartz/service/impl/SysJobServiceImpl.java @@ -0,0 +1,261 @@ +package com.bs.quartz.service.impl; + +import java.util.List; +import javax.annotation.PostConstruct; +import org.quartz.JobDataMap; +import org.quartz.JobKey; +import org.quartz.Scheduler; +import org.quartz.SchedulerException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import com.bs.common.constant.ScheduleConstants; +import com.bs.common.exception.job.TaskException; +import com.bs.quartz.domain.SysJob; +import com.bs.quartz.mapper.SysJobMapper; +import com.bs.quartz.service.ISysJobService; +import com.bs.quartz.util.CronUtils; +import com.bs.quartz.util.ScheduleUtils; + +/** + * 定时任务调度信息 服务层 + * + * @author bs + */ +@Service +public class SysJobServiceImpl implements ISysJobService +{ + @Autowired + private Scheduler scheduler; + + @Autowired + private SysJobMapper jobMapper; + + /** + * 项目启动时,初始化定时器 主要是防止手动修改数据库导致未同步到定时任务处理(注:不能手动修改数据库ID和任务组名,否则会导致脏数据) + */ + @PostConstruct + public void init() throws SchedulerException, TaskException + { + scheduler.clear(); + List jobList = jobMapper.selectJobAll(); + for (SysJob job : jobList) + { + ScheduleUtils.createScheduleJob(scheduler, job); + } + } + + /** + * 获取quartz调度器的计划任务列表 + * + * @param job 调度信息 + * @return + */ + @Override + public List selectJobList(SysJob job) + { + return jobMapper.selectJobList(job); + } + + /** + * 通过调度任务ID查询调度信息 + * + * @param jobId 调度任务ID + * @return 调度任务对象信息 + */ + @Override + public SysJob selectJobById(Long jobId) + { + return jobMapper.selectJobById(jobId); + } + + /** + * 暂停任务 + * + * @param job 调度信息 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public int pauseJob(SysJob job) throws SchedulerException + { + Long jobId = job.getJobId(); + String jobGroup = job.getJobGroup(); + job.setStatus(ScheduleConstants.Status.PAUSE.getValue()); + int rows = jobMapper.updateJob(job); + if (rows > 0) + { + scheduler.pauseJob(ScheduleUtils.getJobKey(jobId, jobGroup)); + } + return rows; + } + + /** + * 恢复任务 + * + * @param job 调度信息 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public int resumeJob(SysJob job) throws SchedulerException + { + Long jobId = job.getJobId(); + String jobGroup = job.getJobGroup(); + job.setStatus(ScheduleConstants.Status.NORMAL.getValue()); + int rows = jobMapper.updateJob(job); + if (rows > 0) + { + scheduler.resumeJob(ScheduleUtils.getJobKey(jobId, jobGroup)); + } + return rows; + } + + /** + * 删除任务后,所对应的trigger也将被删除 + * + * @param job 调度信息 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public int deleteJob(SysJob job) throws SchedulerException + { + Long jobId = job.getJobId(); + String jobGroup = job.getJobGroup(); + int rows = jobMapper.deleteJobById(jobId); + if (rows > 0) + { + scheduler.deleteJob(ScheduleUtils.getJobKey(jobId, jobGroup)); + } + return rows; + } + + /** + * 批量删除调度信息 + * + * @param jobIds 需要删除的任务ID + * @return 结果 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteJobByIds(Long[] jobIds) throws SchedulerException + { + for (Long jobId : jobIds) + { + SysJob job = jobMapper.selectJobById(jobId); + deleteJob(job); + } + } + + /** + * 任务调度状态修改 + * + * @param job 调度信息 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public int changeStatus(SysJob job) throws SchedulerException + { + int rows = 0; + String status = job.getStatus(); + if (ScheduleConstants.Status.NORMAL.getValue().equals(status)) + { + rows = resumeJob(job); + } + else if (ScheduleConstants.Status.PAUSE.getValue().equals(status)) + { + rows = pauseJob(job); + } + return rows; + } + + /** + * 立即运行任务 + * + * @param job 调度信息 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public boolean run(SysJob job) throws SchedulerException + { + boolean result = false; + Long jobId = job.getJobId(); + String jobGroup = job.getJobGroup(); + SysJob properties = selectJobById(job.getJobId()); + // 参数 + JobDataMap dataMap = new JobDataMap(); + dataMap.put(ScheduleConstants.TASK_PROPERTIES, properties); + JobKey jobKey = ScheduleUtils.getJobKey(jobId, jobGroup); + if (scheduler.checkExists(jobKey)) + { + result = true; + scheduler.triggerJob(jobKey, dataMap); + } + return result; + } + + /** + * 新增任务 + * + * @param job 调度信息 调度信息 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public int insertJob(SysJob job) throws SchedulerException, TaskException + { + job.setStatus(ScheduleConstants.Status.PAUSE.getValue()); + int rows = jobMapper.insertJob(job); + if (rows > 0) + { + ScheduleUtils.createScheduleJob(scheduler, job); + } + return rows; + } + + /** + * 更新任务的时间表达式 + * + * @param job 调度信息 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public int updateJob(SysJob job) throws SchedulerException, TaskException + { + SysJob properties = selectJobById(job.getJobId()); + int rows = jobMapper.updateJob(job); + if (rows > 0) + { + updateSchedulerJob(job, properties.getJobGroup()); + } + return rows; + } + + /** + * 更新任务 + * + * @param job 任务对象 + * @param jobGroup 任务组名 + */ + public void updateSchedulerJob(SysJob job, String jobGroup) throws SchedulerException, TaskException + { + Long jobId = job.getJobId(); + // 判断是否存在 + JobKey jobKey = ScheduleUtils.getJobKey(jobId, jobGroup); + if (scheduler.checkExists(jobKey)) + { + // 防止创建时存在数据问题 先移除,然后在执行创建操作 + scheduler.deleteJob(jobKey); + } + ScheduleUtils.createScheduleJob(scheduler, job); + } + + /** + * 校验cron表达式是否有效 + * + * @param cronExpression 表达式 + * @return 结果 + */ + @Override + public boolean checkCronExpressionIsValid(String cronExpression) + { + return CronUtils.isValid(cronExpression); + } +} diff --git a/bs-quartz/src/main/java/com/bs/quartz/task/RyTask.java b/bs-quartz/src/main/java/com/bs/quartz/task/RyTask.java new file mode 100644 index 0000000..c1fe6f8 --- /dev/null +++ b/bs-quartz/src/main/java/com/bs/quartz/task/RyTask.java @@ -0,0 +1,28 @@ +package com.bs.quartz.task; + +import org.springframework.stereotype.Component; +import com.bs.common.utils.StringUtils; + +/** + * 定时任务调度测试 + * + * @author bs + */ +@Component("ryTask") +public class RyTask +{ + public void ryMultipleParams(String s, Boolean b, Long l, Double d, Integer i) + { + System.out.println(StringUtils.format("执行多参方法: 字符串类型{},布尔类型{},长整型{},浮点型{},整形{}", s, b, l, d, i)); + } + + public void ryParams(String params) + { + System.out.println("执行有参方法:" + params); + } + + public void ryNoParams() + { + System.out.println("执行无参方法"); + } +} diff --git a/bs-quartz/src/main/java/com/bs/quartz/util/AbstractQuartzJob.java b/bs-quartz/src/main/java/com/bs/quartz/util/AbstractQuartzJob.java new file mode 100644 index 0000000..94c6daf --- /dev/null +++ b/bs-quartz/src/main/java/com/bs/quartz/util/AbstractQuartzJob.java @@ -0,0 +1,107 @@ +package com.bs.quartz.util; + +import java.util.Date; +import org.quartz.Job; +import org.quartz.JobExecutionContext; +import org.quartz.JobExecutionException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import com.bs.common.constant.Constants; +import com.bs.common.constant.ScheduleConstants; +import com.bs.common.utils.ExceptionUtil; +import com.bs.common.utils.StringUtils; +import com.bs.common.utils.bean.BeanUtils; +import com.bs.common.utils.spring.SpringUtils; +import com.bs.quartz.domain.SysJob; +import com.bs.quartz.domain.SysJobLog; +import com.bs.quartz.service.ISysJobLogService; + +/** + * 抽象quartz调用 + * + * @author bs + */ +public abstract class AbstractQuartzJob implements Job +{ + private static final Logger log = LoggerFactory.getLogger(AbstractQuartzJob.class); + + /** + * 线程本地变量 + */ + private static ThreadLocal threadLocal = new ThreadLocal<>(); + + @Override + public void execute(JobExecutionContext context) throws JobExecutionException + { + SysJob sysJob = new SysJob(); + BeanUtils.copyBeanProp(sysJob, context.getMergedJobDataMap().get(ScheduleConstants.TASK_PROPERTIES)); + try + { + before(context, sysJob); + if (sysJob != null) + { + doExecute(context, sysJob); + } + after(context, sysJob, null); + } + catch (Exception e) + { + log.error("任务执行异常 - :", e); + after(context, sysJob, e); + } + } + + /** + * 执行前 + * + * @param context 工作执行上下文对象 + * @param sysJob 系统计划任务 + */ + protected void before(JobExecutionContext context, SysJob sysJob) + { + threadLocal.set(new Date()); + } + + /** + * 执行后 + * + * @param context 工作执行上下文对象 + * @param sysJob 系统计划任务 + */ + protected void after(JobExecutionContext context, SysJob sysJob, Exception e) + { + Date startTime = threadLocal.get(); + threadLocal.remove(); + + final SysJobLog sysJobLog = new SysJobLog(); + sysJobLog.setJobName(sysJob.getJobName()); + sysJobLog.setJobGroup(sysJob.getJobGroup()); + sysJobLog.setInvokeTarget(sysJob.getInvokeTarget()); + sysJobLog.setStartTime(startTime); + sysJobLog.setStopTime(new Date()); + long runMs = sysJobLog.getStopTime().getTime() - sysJobLog.getStartTime().getTime(); + sysJobLog.setJobMessage(sysJobLog.getJobName() + " 总共耗时:" + runMs + "毫秒"); + if (e != null) + { + sysJobLog.setStatus(Constants.FAIL); + String errorMsg = StringUtils.substring(ExceptionUtil.getExceptionMessage(e), 0, 2000); + sysJobLog.setExceptionInfo(errorMsg); + } + else + { + sysJobLog.setStatus(Constants.SUCCESS); + } + + // 写入数据库当中 + SpringUtils.getBean(ISysJobLogService.class).addJobLog(sysJobLog); + } + + /** + * 执行方法,由子类重载 + * + * @param context 工作执行上下文对象 + * @param sysJob 系统计划任务 + * @throws Exception 执行过程中的异常 + */ + protected abstract void doExecute(JobExecutionContext context, SysJob sysJob) throws Exception; +} diff --git a/bs-quartz/src/main/java/com/bs/quartz/util/CronUtils.java b/bs-quartz/src/main/java/com/bs/quartz/util/CronUtils.java new file mode 100644 index 0000000..d222a3d --- /dev/null +++ b/bs-quartz/src/main/java/com/bs/quartz/util/CronUtils.java @@ -0,0 +1,63 @@ +package com.bs.quartz.util; + +import java.text.ParseException; +import java.util.Date; +import org.quartz.CronExpression; + +/** + * cron表达式工具类 + * + * @author bs + * + */ +public class CronUtils +{ + /** + * 返回一个布尔值代表一个给定的Cron表达式的有效性 + * + * @param cronExpression Cron表达式 + * @return boolean 表达式是否有效 + */ + public static boolean isValid(String cronExpression) + { + return CronExpression.isValidExpression(cronExpression); + } + + /** + * 返回一个字符串值,表示该消息无效Cron表达式给出有效性 + * + * @param cronExpression Cron表达式 + * @return String 无效时返回表达式错误描述,如果有效返回null + */ + public static String getInvalidMessage(String cronExpression) + { + try + { + new CronExpression(cronExpression); + return null; + } + catch (ParseException pe) + { + return pe.getMessage(); + } + } + + /** + * 返回下一个执行时间根据给定的Cron表达式 + * + * @param cronExpression Cron表达式 + * @return Date 下次Cron表达式执行时间 + */ + public static Date getNextExecution(String cronExpression) + { + try + { + CronExpression cron = new CronExpression(cronExpression); + return cron.getNextValidTimeAfter(new Date(System.currentTimeMillis())); + } + catch (ParseException e) + { + throw new IllegalArgumentException(e.getMessage()); + } + } +} diff --git a/bs-quartz/src/main/java/com/bs/quartz/util/JobInvokeUtil.java b/bs-quartz/src/main/java/com/bs/quartz/util/JobInvokeUtil.java new file mode 100644 index 0000000..2ac9d5e --- /dev/null +++ b/bs-quartz/src/main/java/com/bs/quartz/util/JobInvokeUtil.java @@ -0,0 +1,182 @@ +package com.bs.quartz.util; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.LinkedList; +import java.util.List; +import com.bs.common.utils.StringUtils; +import com.bs.common.utils.spring.SpringUtils; +import com.bs.quartz.domain.SysJob; + +/** + * 任务执行工具 + * + * @author bs + */ +public class JobInvokeUtil +{ + /** + * 执行方法 + * + * @param sysJob 系统任务 + */ + public static void invokeMethod(SysJob sysJob) throws Exception + { + String invokeTarget = sysJob.getInvokeTarget(); + String beanName = getBeanName(invokeTarget); + String methodName = getMethodName(invokeTarget); + List methodParams = getMethodParams(invokeTarget); + + if (!isValidClassName(beanName)) + { + Object bean = SpringUtils.getBean(beanName); + invokeMethod(bean, methodName, methodParams); + } + else + { + Object bean = Class.forName(beanName).getDeclaredConstructor().newInstance(); + invokeMethod(bean, methodName, methodParams); + } + } + + /** + * 调用任务方法 + * + * @param bean 目标对象 + * @param methodName 方法名称 + * @param methodParams 方法参数 + */ + private static void invokeMethod(Object bean, String methodName, List methodParams) + throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, + InvocationTargetException + { + if (StringUtils.isNotNull(methodParams) && methodParams.size() > 0) + { + Method method = bean.getClass().getMethod(methodName, getMethodParamsType(methodParams)); + method.invoke(bean, getMethodParamsValue(methodParams)); + } + else + { + Method method = bean.getClass().getMethod(methodName); + method.invoke(bean); + } + } + + /** + * 校验是否为为class包名 + * + * @param invokeTarget 名称 + * @return true是 false否 + */ + public static boolean isValidClassName(String invokeTarget) + { + return StringUtils.countMatches(invokeTarget, ".") > 1; + } + + /** + * 获取bean名称 + * + * @param invokeTarget 目标字符串 + * @return bean名称 + */ + public static String getBeanName(String invokeTarget) + { + String beanName = StringUtils.substringBefore(invokeTarget, "("); + return StringUtils.substringBeforeLast(beanName, "."); + } + + /** + * 获取bean方法 + * + * @param invokeTarget 目标字符串 + * @return method方法 + */ + public static String getMethodName(String invokeTarget) + { + String methodName = StringUtils.substringBefore(invokeTarget, "("); + return StringUtils.substringAfterLast(methodName, "."); + } + + /** + * 获取method方法参数相关列表 + * + * @param invokeTarget 目标字符串 + * @return method方法相关参数列表 + */ + public static List getMethodParams(String invokeTarget) + { + String methodStr = StringUtils.substringBetween(invokeTarget, "(", ")"); + if (StringUtils.isEmpty(methodStr)) + { + return null; + } + String[] methodParams = methodStr.split(",(?=([^\"']*[\"'][^\"']*[\"'])*[^\"']*$)"); + List classs = new LinkedList<>(); + for (int i = 0; i < methodParams.length; i++) + { + String str = StringUtils.trimToEmpty(methodParams[i]); + // String字符串类型,以'或"开头 + if (StringUtils.startsWithAny(str, "'", "\"")) + { + classs.add(new Object[] { StringUtils.substring(str, 1, str.length() - 1), String.class }); + } + // boolean布尔类型,等于true或者false + else if ("true".equalsIgnoreCase(str) || "false".equalsIgnoreCase(str)) + { + classs.add(new Object[] { Boolean.valueOf(str), Boolean.class }); + } + // long长整形,以L结尾 + else if (StringUtils.endsWith(str, "L")) + { + classs.add(new Object[] { Long.valueOf(StringUtils.substring(str, 0, str.length() - 1)), Long.class }); + } + // double浮点类型,以D结尾 + else if (StringUtils.endsWith(str, "D")) + { + classs.add(new Object[] { Double.valueOf(StringUtils.substring(str, 0, str.length() - 1)), Double.class }); + } + // 其他类型归类为整形 + else + { + classs.add(new Object[] { Integer.valueOf(str), Integer.class }); + } + } + return classs; + } + + /** + * 获取参数类型 + * + * @param methodParams 参数相关列表 + * @return 参数类型列表 + */ + public static Class[] getMethodParamsType(List methodParams) + { + Class[] classs = new Class[methodParams.size()]; + int index = 0; + for (Object[] os : methodParams) + { + classs[index] = (Class) os[1]; + index++; + } + return classs; + } + + /** + * 获取参数值 + * + * @param methodParams 参数相关列表 + * @return 参数值列表 + */ + public static Object[] getMethodParamsValue(List methodParams) + { + Object[] classs = new Object[methodParams.size()]; + int index = 0; + for (Object[] os : methodParams) + { + classs[index] = (Object) os[0]; + index++; + } + return classs; + } +} diff --git a/bs-quartz/src/main/java/com/bs/quartz/util/QuartzDisallowConcurrentExecution.java b/bs-quartz/src/main/java/com/bs/quartz/util/QuartzDisallowConcurrentExecution.java new file mode 100644 index 0000000..98d2cf3 --- /dev/null +++ b/bs-quartz/src/main/java/com/bs/quartz/util/QuartzDisallowConcurrentExecution.java @@ -0,0 +1,21 @@ +package com.bs.quartz.util; + +import org.quartz.DisallowConcurrentExecution; +import org.quartz.JobExecutionContext; +import com.bs.quartz.domain.SysJob; + +/** + * 定时任务处理(禁止并发执行) + * + * @author bs + * + */ +@DisallowConcurrentExecution +public class QuartzDisallowConcurrentExecution extends AbstractQuartzJob +{ + @Override + protected void doExecute(JobExecutionContext context, SysJob sysJob) throws Exception + { + JobInvokeUtil.invokeMethod(sysJob); + } +} diff --git a/bs-quartz/src/main/java/com/bs/quartz/util/QuartzJobExecution.java b/bs-quartz/src/main/java/com/bs/quartz/util/QuartzJobExecution.java new file mode 100644 index 0000000..faec5ac --- /dev/null +++ b/bs-quartz/src/main/java/com/bs/quartz/util/QuartzJobExecution.java @@ -0,0 +1,19 @@ +package com.bs.quartz.util; + +import org.quartz.JobExecutionContext; +import com.bs.quartz.domain.SysJob; + +/** + * 定时任务处理(允许并发执行) + * + * @author bs + * + */ +public class QuartzJobExecution extends AbstractQuartzJob +{ + @Override + protected void doExecute(JobExecutionContext context, SysJob sysJob) throws Exception + { + JobInvokeUtil.invokeMethod(sysJob); + } +} diff --git a/bs-quartz/src/main/java/com/bs/quartz/util/ScheduleUtils.java b/bs-quartz/src/main/java/com/bs/quartz/util/ScheduleUtils.java new file mode 100644 index 0000000..532a251 --- /dev/null +++ b/bs-quartz/src/main/java/com/bs/quartz/util/ScheduleUtils.java @@ -0,0 +1,141 @@ +package com.bs.quartz.util; + +import org.quartz.CronScheduleBuilder; +import org.quartz.CronTrigger; +import org.quartz.Job; +import org.quartz.JobBuilder; +import org.quartz.JobDetail; +import org.quartz.JobKey; +import org.quartz.Scheduler; +import org.quartz.SchedulerException; +import org.quartz.TriggerBuilder; +import org.quartz.TriggerKey; +import com.bs.common.constant.Constants; +import com.bs.common.constant.ScheduleConstants; +import com.bs.common.exception.job.TaskException; +import com.bs.common.exception.job.TaskException.Code; +import com.bs.common.utils.StringUtils; +import com.bs.common.utils.spring.SpringUtils; +import com.bs.quartz.domain.SysJob; + +/** + * 定时任务工具类 + * + * @author bs + * + */ +public class ScheduleUtils +{ + /** + * 得到quartz任务类 + * + * @param sysJob 执行计划 + * @return 具体执行任务类 + */ + private static Class getQuartzJobClass(SysJob sysJob) + { + boolean isConcurrent = "0".equals(sysJob.getConcurrent()); + return isConcurrent ? QuartzJobExecution.class : QuartzDisallowConcurrentExecution.class; + } + + /** + * 构建任务触发对象 + */ + public static TriggerKey getTriggerKey(Long jobId, String jobGroup) + { + return TriggerKey.triggerKey(ScheduleConstants.TASK_CLASS_NAME + jobId, jobGroup); + } + + /** + * 构建任务键对象 + */ + public static JobKey getJobKey(Long jobId, String jobGroup) + { + return JobKey.jobKey(ScheduleConstants.TASK_CLASS_NAME + jobId, jobGroup); + } + + /** + * 创建定时任务 + */ + public static void createScheduleJob(Scheduler scheduler, SysJob job) throws SchedulerException, TaskException + { + Class jobClass = getQuartzJobClass(job); + // 构建job信息 + Long jobId = job.getJobId(); + String jobGroup = job.getJobGroup(); + JobDetail jobDetail = JobBuilder.newJob(jobClass).withIdentity(getJobKey(jobId, jobGroup)).build(); + + // 表达式调度构建器 + CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(job.getCronExpression()); + cronScheduleBuilder = handleCronScheduleMisfirePolicy(job, cronScheduleBuilder); + + // 按新的cronExpression表达式构建一个新的trigger + CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity(getTriggerKey(jobId, jobGroup)) + .withSchedule(cronScheduleBuilder).build(); + + // 放入参数,运行时的方法可以获取 + jobDetail.getJobDataMap().put(ScheduleConstants.TASK_PROPERTIES, job); + + // 判断是否存在 + if (scheduler.checkExists(getJobKey(jobId, jobGroup))) + { + // 防止创建时存在数据问题 先移除,然后在执行创建操作 + scheduler.deleteJob(getJobKey(jobId, jobGroup)); + } + + // 判断任务是否过期 + if (StringUtils.isNotNull(CronUtils.getNextExecution(job.getCronExpression()))) + { + // 执行调度任务 + scheduler.scheduleJob(jobDetail, trigger); + } + + // 暂停任务 + if (job.getStatus().equals(ScheduleConstants.Status.PAUSE.getValue())) + { + scheduler.pauseJob(ScheduleUtils.getJobKey(jobId, jobGroup)); + } + } + + /** + * 设置定时任务策略 + */ + public static CronScheduleBuilder handleCronScheduleMisfirePolicy(SysJob job, CronScheduleBuilder cb) + throws TaskException + { + switch (job.getMisfirePolicy()) + { + case ScheduleConstants.MISFIRE_DEFAULT: + return cb; + case ScheduleConstants.MISFIRE_IGNORE_MISFIRES: + return cb.withMisfireHandlingInstructionIgnoreMisfires(); + case ScheduleConstants.MISFIRE_FIRE_AND_PROCEED: + return cb.withMisfireHandlingInstructionFireAndProceed(); + case ScheduleConstants.MISFIRE_DO_NOTHING: + return cb.withMisfireHandlingInstructionDoNothing(); + default: + throw new TaskException("The task misfire policy '" + job.getMisfirePolicy() + + "' cannot be used in cron schedule tasks", Code.CONFIG_ERROR); + } + } + + /** + * 检查包名是否为白名单配置 + * + * @param invokeTarget 目标字符串 + * @return 结果 + */ + public static boolean whiteList(String invokeTarget) + { + String packageName = StringUtils.substringBefore(invokeTarget, "("); + int count = StringUtils.countMatches(packageName, "."); + if (count > 1) + { + return StringUtils.containsAnyIgnoreCase(invokeTarget, Constants.JOB_WHITELIST_STR); + } + Object obj = SpringUtils.getBean(StringUtils.split(invokeTarget, ".")[0]); + String beanPackageName = obj.getClass().getPackage().getName(); + return StringUtils.containsAnyIgnoreCase(beanPackageName, Constants.JOB_WHITELIST_STR) + && !StringUtils.containsAnyIgnoreCase(beanPackageName, Constants.JOB_ERROR_STR); + } +} diff --git a/bs-quartz/src/main/resources/mapper/quartz/SysJobLogMapper.xml b/bs-quartz/src/main/resources/mapper/quartz/SysJobLogMapper.xml new file mode 100644 index 0000000..60c3e90 --- /dev/null +++ b/bs-quartz/src/main/resources/mapper/quartz/SysJobLogMapper.xml @@ -0,0 +1,93 @@ + + + + + + + + + + + + + + + + + select job_log_id, job_name, job_group, invoke_target, job_message, status, exception_info, create_time + from sys_job_log + + + + + + + + + + delete from sys_job_log where job_log_id = #{jobLogId} + + + + delete from sys_job_log where job_log_id in + + #{jobLogId} + + + + + truncate table sys_job_log + + + + insert into sys_job_log( + job_log_id, + job_name, + job_group, + invoke_target, + job_message, + status, + exception_info, + create_time + )values( + #{jobLogId}, + #{jobName}, + #{jobGroup}, + #{invokeTarget}, + #{jobMessage}, + #{status}, + #{exceptionInfo}, + sysdate() + ) + + + diff --git a/bs-quartz/src/main/resources/mapper/quartz/SysJobMapper.xml b/bs-quartz/src/main/resources/mapper/quartz/SysJobMapper.xml new file mode 100644 index 0000000..da08805 --- /dev/null +++ b/bs-quartz/src/main/resources/mapper/quartz/SysJobMapper.xml @@ -0,0 +1,111 @@ + + + + + + + + + + + + + + + + + + + + + + select job_id, job_name, job_group, invoke_target, cron_expression, misfire_policy, concurrent, status, create_by, create_time, remark + from sys_job + + + + + + + + + + delete from sys_job where job_id = #{jobId} + + + + delete from sys_job where job_id in + + #{jobId} + + + + + update sys_job + + job_name = #{jobName}, + job_group = #{jobGroup}, + invoke_target = #{invokeTarget}, + cron_expression = #{cronExpression}, + misfire_policy = #{misfirePolicy}, + concurrent = #{concurrent}, + status = #{status}, + remark = #{remark}, + update_by = #{updateBy}, + update_time = sysdate() + + where job_id = #{jobId} + + + + insert into sys_job( + job_id, + job_name, + job_group, + invoke_target, + cron_expression, + misfire_policy, + concurrent, + status, + remark, + create_by, + create_time + )values( + #{jobId}, + #{jobName}, + #{jobGroup}, + #{invokeTarget}, + #{cronExpression}, + #{misfirePolicy}, + #{concurrent}, + #{status}, + #{remark}, + #{createBy}, + sysdate() + ) + + + diff --git a/bs-system/pom.xml b/bs-system/pom.xml new file mode 100644 index 0000000..f3840a1 --- /dev/null +++ b/bs-system/pom.xml @@ -0,0 +1,28 @@ + + + + my-base + com.bs + 3.8.6 + + 4.0.0 + + bs-system + + + system系统模块 + + + + + + + com.bs + bs-common + + + + + diff --git a/bs-system/src/main/java/com/bs/system/domain/SysCache.java b/bs-system/src/main/java/com/bs/system/domain/SysCache.java new file mode 100644 index 0000000..fe56bce --- /dev/null +++ b/bs-system/src/main/java/com/bs/system/domain/SysCache.java @@ -0,0 +1,81 @@ +package com.bs.system.domain; + +import com.bs.common.utils.StringUtils; + +/** + * 缓存信息 + * + * @author bs + */ +public class SysCache +{ + /** 缓存名称 */ + private String cacheName = ""; + + /** 缓存键名 */ + private String cacheKey = ""; + + /** 缓存内容 */ + private String cacheValue = ""; + + /** 备注 */ + private String remark = ""; + + public SysCache() + { + + } + + public SysCache(String cacheName, String remark) + { + this.cacheName = cacheName; + this.remark = remark; + } + + public SysCache(String cacheName, String cacheKey, String cacheValue) + { + this.cacheName = StringUtils.replace(cacheName, ":", ""); + this.cacheKey = StringUtils.replace(cacheKey, cacheName, ""); + this.cacheValue = cacheValue; + } + + public String getCacheName() + { + return cacheName; + } + + public void setCacheName(String cacheName) + { + this.cacheName = cacheName; + } + + public String getCacheKey() + { + return cacheKey; + } + + public void setCacheKey(String cacheKey) + { + this.cacheKey = cacheKey; + } + + public String getCacheValue() + { + return cacheValue; + } + + public void setCacheValue(String cacheValue) + { + this.cacheValue = cacheValue; + } + + public String getRemark() + { + return remark; + } + + public void setRemark(String remark) + { + this.remark = remark; + } +} diff --git a/bs-system/src/main/java/com/bs/system/domain/SysConfig.java b/bs-system/src/main/java/com/bs/system/domain/SysConfig.java new file mode 100644 index 0000000..a24c503 --- /dev/null +++ b/bs-system/src/main/java/com/bs/system/domain/SysConfig.java @@ -0,0 +1,51 @@ +package com.bs.system.domain; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Size; + +import lombok.Data; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.bs.common.annotation.Excel; +import com.bs.common.annotation.Excel.ColumnType; +import com.bs.common.core.domain.BaseEntity; + +/** + * 参数配置表 sys_config + * + * @author bs + */ +@Data +public class SysConfig extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 参数主键 */ + @Excel(name = "参数主键", cellType = ColumnType.NUMERIC) + private Long configId; + + /** 参数名称 */ + @Excel(name = "参数名称") + @NotBlank(message = "参数名称不能为空") + @Size(min = 0, max = 100, message = "参数名称不能超过100个字符") + private String configName; + + /** 参数键名 */ + @Excel(name = "参数键名") + @NotBlank(message = "参数键名长度不能为空") + @Size(min = 0, max = 100, message = "参数键名长度不能超过100个字符") + private String configKey; + + /** 参数键值 */ + @Excel(name = "参数键值") + @NotBlank(message = "参数键值不能为空") + @Size(min = 0, max = 500, message = "参数键值长度不能超过500个字符") + private String configValue; + + /** 系统内置(Y是 N否) */ + @Excel(name = "系统内置", readConverterExp = "Y=是,N=否") + private String configType; + private String remark; + + +} diff --git a/bs-system/src/main/java/com/bs/system/domain/SysLogininfor.java b/bs-system/src/main/java/com/bs/system/domain/SysLogininfor.java new file mode 100644 index 0000000..87594ea --- /dev/null +++ b/bs-system/src/main/java/com/bs/system/domain/SysLogininfor.java @@ -0,0 +1,144 @@ +package com.bs.system.domain; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.bs.common.annotation.Excel; +import com.bs.common.annotation.Excel.ColumnType; +import com.bs.common.core.domain.BaseEntity; + +/** + * 系统访问记录表 sys_logininfor + * + * @author bs + */ +public class SysLogininfor extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** ID */ + @Excel(name = "序号", cellType = ColumnType.NUMERIC) + private Long infoId; + + /** 用户账号 */ + @Excel(name = "用户账号") + private String userName; + + /** 登录状态 0成功 1失败 */ + @Excel(name = "登录状态", readConverterExp = "0=成功,1=失败") + private String status; + + /** 登录IP地址 */ + @Excel(name = "登录地址") + private String ipaddr; + + /** 登录地点 */ + @Excel(name = "登录地点") + private String loginLocation; + + /** 浏览器类型 */ + @Excel(name = "浏览器") + private String browser; + + /** 操作系统 */ + @Excel(name = "操作系统") + private String os; + + /** 提示消息 */ + @Excel(name = "提示消息") + private String msg; + + /** 访问时间 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @Excel(name = "访问时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") + private Date loginTime; + + public Long getInfoId() + { + return infoId; + } + + public void setInfoId(Long infoId) + { + this.infoId = infoId; + } + + public String getUserName() + { + return userName; + } + + public void setUserName(String userName) + { + this.userName = userName; + } + + public String getStatus() + { + return status; + } + + public void setStatus(String status) + { + this.status = status; + } + + public String getIpaddr() + { + return ipaddr; + } + + public void setIpaddr(String ipaddr) + { + this.ipaddr = ipaddr; + } + + public String getLoginLocation() + { + return loginLocation; + } + + public void setLoginLocation(String loginLocation) + { + this.loginLocation = loginLocation; + } + + public String getBrowser() + { + return browser; + } + + public void setBrowser(String browser) + { + this.browser = browser; + } + + public String getOs() + { + return os; + } + + public void setOs(String os) + { + this.os = os; + } + + public String getMsg() + { + return msg; + } + + public void setMsg(String msg) + { + this.msg = msg; + } + + public Date getLoginTime() + { + return loginTime; + } + + public void setLoginTime(Date loginTime) + { + this.loginTime = loginTime; + } +} diff --git a/bs-system/src/main/java/com/bs/system/domain/SysNotice.java b/bs-system/src/main/java/com/bs/system/domain/SysNotice.java new file mode 100644 index 0000000..7dc5b00 --- /dev/null +++ b/bs-system/src/main/java/com/bs/system/domain/SysNotice.java @@ -0,0 +1,77 @@ +package com.bs.system.domain; + +import com.bs.common.annotation.Excel; +import com.bs.common.core.domain.BaseEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModelProperty; + +/** + * 通知公告对象 sys_notice + * + * @author bs + * @date 2023-08-06 + */ +@EqualsAndHashCode(callSuper = true) +@Accessors(chain = true) +@TableName("sys_notice") +@Data +public class SysNotice extends BaseEntity{ + private static final long serialVersionUID = 1L; + + /** 公告ID */ + @TableId(value = "notice_id",type = IdType.AUTO) + @ApiModelProperty(value = "公告ID") + private Long noticeId; + + /** 公告标题 */ + + @Excel(name = "公告标题") + @ApiModelProperty(value = "公告标题") + private String noticeTitle; + + /** 公告类型sys_notice_type字典(1通知 2公告) */ + + @Excel(name = "公告类型sys_notice_type字典", readConverterExp = "1=通知,2=公告") + @ApiModelProperty(value = "公告类型sys_notice_type字典(1通知 2公告)") + private String noticeType; + + /** 公告内容 */ + + @Excel(name = "公告内容") + @ApiModelProperty(value = "公告内容") + private String noticeContent; + + /** 公告状态(0正常 1关闭) */ + + @Excel(name = "公告状态", readConverterExp = "0=正常,1=关闭") + @ApiModelProperty(value = "公告状态(0正常 1关闭)") + private String status; + + /** 阅读状态(0未阅读 1已阅读) */ + + @Excel(name = "阅读状态", readConverterExp = "0=未阅读,1=已阅读") + @ApiModelProperty(value = "阅读状态(0未阅读 1已阅读)") + private String readStatus; + + /** 查看人 */ + + @Excel(name = "查看人") + @ApiModelProperty(value = "查看人") + private Long readUser; + + /** 备注 */ + + @Excel(name = "备注") + @ApiModelProperty(value = "备注") + private String remark; + + + + +} + diff --git a/bs-system/src/main/java/com/bs/system/domain/SysOperLog.java b/bs-system/src/main/java/com/bs/system/domain/SysOperLog.java new file mode 100644 index 0000000..4d15f4a --- /dev/null +++ b/bs-system/src/main/java/com/bs/system/domain/SysOperLog.java @@ -0,0 +1,269 @@ +package com.bs.system.domain; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.bs.common.annotation.Excel; +import com.bs.common.annotation.Excel.ColumnType; +import com.bs.common.core.domain.BaseEntity; + +/** + * 操作日志记录表 oper_log + * + * @author bs + */ +public class SysOperLog extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 日志主键 */ + @Excel(name = "操作序号", cellType = ColumnType.NUMERIC) + private Long operId; + + /** 操作模块 */ + @Excel(name = "操作模块") + private String title; + + /** 业务类型(0其它 1新增 2修改 3删除) */ + @Excel(name = "业务类型", readConverterExp = "0=其它,1=新增,2=修改,3=删除,4=授权,5=导出,6=导入,7=强退,8=生成代码,9=清空数据") + private Integer businessType; + + /** 业务类型数组 */ + private Integer[] businessTypes; + + /** 请求方法 */ + @Excel(name = "请求方法") + private String method; + + /** 请求方式 */ + @Excel(name = "请求方式") + private String requestMethod; + + /** 操作类别(0其它 1后台用户 2手机端用户) */ + @Excel(name = "操作类别", readConverterExp = "0=其它,1=后台用户,2=手机端用户") + private Integer operatorType; + + /** 操作人员 */ + @Excel(name = "操作人员") + private String operName; + + /** 部门名称 */ + @Excel(name = "部门名称") + private String deptName; + + /** 请求url */ + @Excel(name = "请求地址") + private String operUrl; + + /** 操作地址 */ + @Excel(name = "操作地址") + private String operIp; + + /** 操作地点 */ + @Excel(name = "操作地点") + private String operLocation; + + /** 请求参数 */ + @Excel(name = "请求参数") + private String operParam; + + /** 返回参数 */ + @Excel(name = "返回参数") + private String jsonResult; + + /** 操作状态(0正常 1异常) */ + @Excel(name = "状态", readConverterExp = "0=正常,1=异常") + private Integer status; + + /** 错误消息 */ + @Excel(name = "错误消息") + private String errorMsg; + + /** 操作时间 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @Excel(name = "操作时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") + private Date operTime; + + /** 消耗时间 */ + @Excel(name = "消耗时间", suffix = "毫秒") + private Long costTime; + + public Long getOperId() + { + return operId; + } + + public void setOperId(Long operId) + { + this.operId = operId; + } + + public String getTitle() + { + return title; + } + + public void setTitle(String title) + { + this.title = title; + } + + public Integer getBusinessType() + { + return businessType; + } + + public void setBusinessType(Integer businessType) + { + this.businessType = businessType; + } + + public Integer[] getBusinessTypes() + { + return businessTypes; + } + + public void setBusinessTypes(Integer[] businessTypes) + { + this.businessTypes = businessTypes; + } + + public String getMethod() + { + return method; + } + + public void setMethod(String method) + { + this.method = method; + } + + public String getRequestMethod() + { + return requestMethod; + } + + public void setRequestMethod(String requestMethod) + { + this.requestMethod = requestMethod; + } + + public Integer getOperatorType() + { + return operatorType; + } + + public void setOperatorType(Integer operatorType) + { + this.operatorType = operatorType; + } + + public String getOperName() + { + return operName; + } + + public void setOperName(String operName) + { + this.operName = operName; + } + + public String getDeptName() + { + return deptName; + } + + public void setDeptName(String deptName) + { + this.deptName = deptName; + } + + public String getOperUrl() + { + return operUrl; + } + + public void setOperUrl(String operUrl) + { + this.operUrl = operUrl; + } + + public String getOperIp() + { + return operIp; + } + + public void setOperIp(String operIp) + { + this.operIp = operIp; + } + + public String getOperLocation() + { + return operLocation; + } + + public void setOperLocation(String operLocation) + { + this.operLocation = operLocation; + } + + public String getOperParam() + { + return operParam; + } + + public void setOperParam(String operParam) + { + this.operParam = operParam; + } + + public String getJsonResult() + { + return jsonResult; + } + + public void setJsonResult(String jsonResult) + { + this.jsonResult = jsonResult; + } + + public Integer getStatus() + { + return status; + } + + public void setStatus(Integer status) + { + this.status = status; + } + + public String getErrorMsg() + { + return errorMsg; + } + + public void setErrorMsg(String errorMsg) + { + this.errorMsg = errorMsg; + } + + public Date getOperTime() + { + return operTime; + } + + public void setOperTime(Date operTime) + { + this.operTime = operTime; + } + + public Long getCostTime() + { + return costTime; + } + + public void setCostTime(Long costTime) + { + this.costTime = costTime; + } +} diff --git a/bs-system/src/main/java/com/bs/system/domain/SysPost.java b/bs-system/src/main/java/com/bs/system/domain/SysPost.java new file mode 100644 index 0000000..df253f8 --- /dev/null +++ b/bs-system/src/main/java/com/bs/system/domain/SysPost.java @@ -0,0 +1,126 @@ +package com.bs.system.domain; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.bs.common.annotation.Excel; +import com.bs.common.annotation.Excel.ColumnType; +import com.bs.common.core.domain.BaseEntity; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; + +/** + * 岗位表 sys_post + * + * @author bs + */ +public class SysPost extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 岗位序号 */ + @Excel(name = "岗位序号", cellType = ColumnType.NUMERIC) + private Long postId; + + /** 岗位编码 */ + @Excel(name = "岗位编码") + private String postCode; + + /** 岗位名称 */ + @Excel(name = "岗位名称") + private String postName; + + /** 岗位排序 */ + @Excel(name = "岗位排序") + private Integer postSort; + + /** 状态(0正常 1停用) */ + @Excel(name = "状态", readConverterExp = "0=正常,1=停用") + private String status; + private String remark; + /** 用户是否存在此岗位标识 默认不存在 */ + @TableField(exist = false) + private boolean flag = false; + + public Long getPostId() + { + return postId; + } + + public void setPostId(Long postId) + { + this.postId = postId; + } + + @NotBlank(message = "岗位编码不能为空") + @Size(min = 0, max = 64, message = "岗位编码长度不能超过64个字符") + public String getPostCode() + { + return postCode; + } + + public void setPostCode(String postCode) + { + this.postCode = postCode; + } + + @NotBlank(message = "岗位名称不能为空") + @Size(min = 0, max = 50, message = "岗位名称长度不能超过50个字符") + public String getPostName() + { + return postName; + } + + public void setPostName(String postName) + { + this.postName = postName; + } + + @NotNull(message = "显示顺序不能为空") + public Integer getPostSort() + { + return postSort; + } + + public void setPostSort(Integer postSort) + { + this.postSort = postSort; + } + + public String getStatus() + { + return status; + } + + public void setStatus(String status) + { + this.status = status; + } + + public boolean isFlag() + { + return flag; + } + + public void setFlag(boolean flag) + { + this.flag = flag; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("postId", getPostId()) + .append("postCode", getPostCode()) + .append("postName", getPostName()) + .append("postSort", getPostSort()) + .append("status", getStatus()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .toString(); + } +} diff --git a/bs-system/src/main/java/com/bs/system/domain/SysRoleDept.java b/bs-system/src/main/java/com/bs/system/domain/SysRoleDept.java new file mode 100644 index 0000000..fd0d5a4 --- /dev/null +++ b/bs-system/src/main/java/com/bs/system/domain/SysRoleDept.java @@ -0,0 +1,46 @@ +package com.bs.system.domain; + +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; + +/** + * 角色和部门关联 sys_role_dept + * + * @author bs + */ +public class SysRoleDept +{ + /** 角色ID */ + private Long roleId; + + /** 部门ID */ + private Long deptId; + + public Long getRoleId() + { + return roleId; + } + + public void setRoleId(Long roleId) + { + this.roleId = roleId; + } + + public Long getDeptId() + { + return deptId; + } + + public void setDeptId(Long deptId) + { + this.deptId = deptId; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("roleId", getRoleId()) + .append("deptId", getDeptId()) + .toString(); + } +} diff --git a/bs-system/src/main/java/com/bs/system/domain/SysRoleMenu.java b/bs-system/src/main/java/com/bs/system/domain/SysRoleMenu.java new file mode 100644 index 0000000..974ed4c --- /dev/null +++ b/bs-system/src/main/java/com/bs/system/domain/SysRoleMenu.java @@ -0,0 +1,47 @@ +package com.bs.system.domain; + +import com.baomidou.mybatisplus.annotation.TableId; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; + +/** + * 角色和菜单关联 sys_role_menu + * + * @author bs + */ +public class SysRoleMenu +{ + /** 角色ID */ + private Long roleId; + + /** 菜单ID */ + private Long menuId; + + public Long getRoleId() + { + return roleId; + } + + public void setRoleId(Long roleId) + { + this.roleId = roleId; + } + + public Long getMenuId() + { + return menuId; + } + + public void setMenuId(Long menuId) + { + this.menuId = menuId; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("roleId", getRoleId()) + .append("menuId", getMenuId()) + .toString(); + } +} diff --git a/bs-system/src/main/java/com/bs/system/domain/SysUserOnline.java b/bs-system/src/main/java/com/bs/system/domain/SysUserOnline.java new file mode 100644 index 0000000..ce6d993 --- /dev/null +++ b/bs-system/src/main/java/com/bs/system/domain/SysUserOnline.java @@ -0,0 +1,113 @@ +package com.bs.system.domain; + +/** + * 当前在线会话 + * + * @author bs + */ +public class SysUserOnline +{ + /** 会话编号 */ + private String tokenId; + + /** 部门名称 */ + private String deptName; + + /** 用户名称 */ + private String userName; + + /** 登录IP地址 */ + private String ipaddr; + + /** 登录地址 */ + private String loginLocation; + + /** 浏览器类型 */ + private String browser; + + /** 操作系统 */ + private String os; + + /** 登录时间 */ + private Long loginTime; + + public String getTokenId() + { + return tokenId; + } + + public void setTokenId(String tokenId) + { + this.tokenId = tokenId; + } + + public String getDeptName() + { + return deptName; + } + + public void setDeptName(String deptName) + { + this.deptName = deptName; + } + + public String getUserName() + { + return userName; + } + + public void setUserName(String userName) + { + this.userName = userName; + } + + public String getIpaddr() + { + return ipaddr; + } + + public void setIpaddr(String ipaddr) + { + this.ipaddr = ipaddr; + } + + public String getLoginLocation() + { + return loginLocation; + } + + public void setLoginLocation(String loginLocation) + { + this.loginLocation = loginLocation; + } + + public String getBrowser() + { + return browser; + } + + public void setBrowser(String browser) + { + this.browser = browser; + } + + public String getOs() + { + return os; + } + + public void setOs(String os) + { + this.os = os; + } + + public Long getLoginTime() + { + return loginTime; + } + + public void setLoginTime(Long loginTime) + { + this.loginTime = loginTime; + } +} diff --git a/bs-system/src/main/java/com/bs/system/domain/SysUserPost.java b/bs-system/src/main/java/com/bs/system/domain/SysUserPost.java new file mode 100644 index 0000000..c3323af --- /dev/null +++ b/bs-system/src/main/java/com/bs/system/domain/SysUserPost.java @@ -0,0 +1,46 @@ +package com.bs.system.domain; + +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; + +/** + * 用户和岗位关联 sys_user_post + * + * @author bs + */ +public class SysUserPost +{ + /** 用户ID */ + private Long userId; + + /** 岗位ID */ + private Long postId; + + public Long getUserId() + { + return userId; + } + + public void setUserId(Long userId) + { + this.userId = userId; + } + + public Long getPostId() + { + return postId; + } + + public void setPostId(Long postId) + { + this.postId = postId; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("userId", getUserId()) + .append("postId", getPostId()) + .toString(); + } +} diff --git a/bs-system/src/main/java/com/bs/system/domain/SysUserRole.java b/bs-system/src/main/java/com/bs/system/domain/SysUserRole.java new file mode 100644 index 0000000..7efcd42 --- /dev/null +++ b/bs-system/src/main/java/com/bs/system/domain/SysUserRole.java @@ -0,0 +1,47 @@ +package com.bs.system.domain; + +import com.baomidou.mybatisplus.annotation.TableId; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; + +/** + * 用户和角色关联 sys_user_role + * + * @author bs + */ +public class SysUserRole +{ + /** 用户ID */ + private Long userId; + + /** 角色ID */ + private Long roleId; + + public Long getUserId() + { + return userId; + } + + public void setUserId(Long userId) + { + this.userId = userId; + } + + public Long getRoleId() + { + return roleId; + } + + public void setRoleId(Long roleId) + { + this.roleId = roleId; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("userId", getUserId()) + .append("roleId", getRoleId()) + .toString(); + } +} diff --git a/bs-system/src/main/java/com/bs/system/domain/vo/MetaVo.java b/bs-system/src/main/java/com/bs/system/domain/vo/MetaVo.java new file mode 100644 index 0000000..3419bf5 --- /dev/null +++ b/bs-system/src/main/java/com/bs/system/domain/vo/MetaVo.java @@ -0,0 +1,106 @@ +package com.bs.system.domain.vo; + +import com.bs.common.utils.StringUtils; + +/** + * 路由显示信息 + * + * @author bs + */ +public class MetaVo +{ + /** + * 设置该路由在侧边栏和面包屑中展示的名字 + */ + private String title; + + /** + * 设置该路由的图标,对应路径src/assets/icons/svg + */ + private String icon; + + /** + * 设置为true,则不会被 缓存 + */ + private boolean noCache; + + /** + * 内链地址(http(s)://开头) + */ + private String link; + + public MetaVo() + { + } + + public MetaVo(String title, String icon) + { + this.title = title; + this.icon = icon; + } + + public MetaVo(String title, String icon, boolean noCache) + { + this.title = title; + this.icon = icon; + this.noCache = noCache; + } + + public MetaVo(String title, String icon, String link) + { + this.title = title; + this.icon = icon; + this.link = link; + } + + public MetaVo(String title, String icon, boolean noCache, String link) + { + this.title = title; + this.icon = icon; + this.noCache = noCache; + if (StringUtils.ishttp(link)) + { + this.link = link; + } + } + + public boolean isNoCache() + { + return noCache; + } + + public void setNoCache(boolean noCache) + { + this.noCache = noCache; + } + + public String getTitle() + { + return title; + } + + public void setTitle(String title) + { + this.title = title; + } + + public String getIcon() + { + return icon; + } + + public void setIcon(String icon) + { + this.icon = icon; + } + + public String getLink() + { + return link; + } + + public void setLink(String link) + { + this.link = link; + } +} diff --git a/bs-system/src/main/java/com/bs/system/domain/vo/RouterVo.java b/bs-system/src/main/java/com/bs/system/domain/vo/RouterVo.java new file mode 100644 index 0000000..ad5dfe6 --- /dev/null +++ b/bs-system/src/main/java/com/bs/system/domain/vo/RouterVo.java @@ -0,0 +1,148 @@ +package com.bs.system.domain.vo; + +import com.fasterxml.jackson.annotation.JsonInclude; +import java.util.List; + +/** + * 路由配置信息 + * + * @author bs + */ +@JsonInclude(JsonInclude.Include.NON_EMPTY) +public class RouterVo +{ + /** + * 路由名字 + */ + private String name; + + /** + * 路由地址 + */ + private String path; + + /** + * 是否隐藏路由,当设置 true 的时候该路由不会再侧边栏出现 + */ + private boolean hidden; + + /** + * 重定向地址,当设置 noRedirect 的时候该路由在面包屑导航中不可被点击 + */ + private String redirect; + + /** + * 组件地址 + */ + private String component; + + /** + * 路由参数:如 {"id": 1, "name": "ry"} + */ + private String query; + + /** + * 当你一个路由下面的 children 声明的路由大于1个时,自动会变成嵌套的模式--如组件页面 + */ + private Boolean alwaysShow; + + /** + * 其他元素 + */ + private MetaVo meta; + + /** + * 子路由 + */ + private List children; + + public String getName() + { + return name; + } + + public void setName(String name) + { + this.name = name; + } + + public String getPath() + { + return path; + } + + public void setPath(String path) + { + this.path = path; + } + + public boolean getHidden() + { + return hidden; + } + + public void setHidden(boolean hidden) + { + this.hidden = hidden; + } + + public String getRedirect() + { + return redirect; + } + + public void setRedirect(String redirect) + { + this.redirect = redirect; + } + + public String getComponent() + { + return component; + } + + public void setComponent(String component) + { + this.component = component; + } + + public String getQuery() + { + return query; + } + + public void setQuery(String query) + { + this.query = query; + } + + public Boolean getAlwaysShow() + { + return alwaysShow; + } + + public void setAlwaysShow(Boolean alwaysShow) + { + this.alwaysShow = alwaysShow; + } + + public MetaVo getMeta() + { + return meta; + } + + public void setMeta(MetaVo meta) + { + this.meta = meta; + } + + public List getChildren() + { + return children; + } + + public void setChildren(List children) + { + this.children = children; + } +} diff --git a/bs-system/src/main/java/com/bs/system/mapper/SysConfigMapper.java b/bs-system/src/main/java/com/bs/system/mapper/SysConfigMapper.java new file mode 100644 index 0000000..b343208 --- /dev/null +++ b/bs-system/src/main/java/com/bs/system/mapper/SysConfigMapper.java @@ -0,0 +1,76 @@ +package com.bs.system.mapper; + +import java.util.List; +import com.bs.system.domain.SysConfig; + +/** + * 参数配置 数据层 + * + * @author bs + */ +public interface SysConfigMapper +{ + /** + * 查询参数配置信息 + * + * @param config 参数配置信息 + * @return 参数配置信息 + */ + public SysConfig selectConfig(SysConfig config); + + /** + * 通过ID查询配置 + * + * @param configId 参数ID + * @return 参数配置信息 + */ + public SysConfig selectConfigById(Long configId); + + /** + * 查询参数配置列表 + * + * @param config 参数配置信息 + * @return 参数配置集合 + */ + public List selectConfigList(SysConfig config); + + /** + * 根据键名查询参数配置信息 + * + * @param configKey 参数键名 + * @return 参数配置信息 + */ + public SysConfig checkConfigKeyUnique(String configKey); + + /** + * 新增参数配置 + * + * @param config 参数配置信息 + * @return 结果 + */ + public int insertConfig(SysConfig config); + + /** + * 修改参数配置 + * + * @param config 参数配置信息 + * @return 结果 + */ + public int updateConfig(SysConfig config); + + /** + * 删除参数配置 + * + * @param configId 参数ID + * @return 结果 + */ + public int deleteConfigById(Long configId); + + /** + * 批量删除参数信息 + * + * @param configIds 需要删除的参数ID + * @return 结果 + */ + public int deleteConfigByIds(Long[] configIds); +} diff --git a/bs-system/src/main/java/com/bs/system/mapper/SysDeptMapper.java b/bs-system/src/main/java/com/bs/system/mapper/SysDeptMapper.java new file mode 100644 index 0000000..248f7c5 --- /dev/null +++ b/bs-system/src/main/java/com/bs/system/mapper/SysDeptMapper.java @@ -0,0 +1,119 @@ +package com.bs.system.mapper; + +import com.bs.common.core.domain.entity.SysDept; +import com.bs.common.mybatis.mapper.BaseMapperX; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 部门管理 数据层 + * + * @author bs + */ +public interface SysDeptMapper extends BaseMapperX { + /** + * 查询部门管理数据 + * + * @param dept 部门信息 + * @return 部门信息集合 + */ + public List selectDeptList(SysDept dept); + + /** + * 根据角色ID查询部门树信息 + * + * @param roleId 角色ID + * @param deptCheckStrictly 部门树选择项是否关联显示 + * @return 选中部门列表 + */ + public List selectDeptListByRoleId(@Param("roleId") Long roleId, @Param("deptCheckStrictly") boolean deptCheckStrictly); + + /** + * 根据部门ID查询信息 + * + * @param deptId 部门ID + * @return 部门信息 + */ + public SysDept selectDeptById(Long deptId); + + /** + * 根据ID查询所有子部门 + * + * @param deptId 部门ID + * @return 部门列表 + */ + public List selectChildrenDeptById(Long deptId); + + /** + * 根据ID查询所有子部门(正常状态) + * + * @param deptId 部门ID + * @return 子部门数 + */ + public int selectNormalChildrenDeptById(Long deptId); + + /** + * 是否存在子节点 + * + * @param deptId 部门ID + * @return 结果 + */ + public int hasChildByDeptId(Long deptId); + + /** + * 查询部门是否存在用户 + * + * @param deptId 部门ID + * @return 结果 + */ + public int checkDeptExistUser(Long deptId); + + /** + * 校验部门名称是否唯一 + * + * @param deptName 部门名称 + * @param parentId 父部门ID + * @return 结果 + */ + public SysDept checkDeptNameUnique(@Param("deptName") String deptName, @Param("parentId") Long parentId); + + /** + * 新增部门信息 + * + * @param dept 部门信息 + * @return 结果 + */ + public int insertDept(SysDept dept); + + /** + * 修改部门信息 + * + * @param dept 部门信息 + * @return 结果 + */ + public int updateDept(SysDept dept); + + /** + * 修改所在部门正常状态 + * + * @param deptIds 部门ID组 + */ + public void updateDeptStatusNormal(Long[] deptIds); + + /** + * 修改子元素关系 + * + * @param depts 子元素 + * @return 结果 + */ + public int updateDeptChildren(@Param("depts") List depts); + + /** + * 删除部门管理信息 + * + * @param deptId 部门ID + * @return 结果 + */ + public int deleteDeptById(Long deptId); +} diff --git a/bs-system/src/main/java/com/bs/system/mapper/SysDictDataMapper.java b/bs-system/src/main/java/com/bs/system/mapper/SysDictDataMapper.java new file mode 100644 index 0000000..da1a2df --- /dev/null +++ b/bs-system/src/main/java/com/bs/system/mapper/SysDictDataMapper.java @@ -0,0 +1,95 @@ +package com.bs.system.mapper; + +import java.util.List; +import org.apache.ibatis.annotations.Param; +import com.bs.common.core.domain.entity.SysDictData; + +/** + * 字典表 数据层 + * + * @author bs + */ +public interface SysDictDataMapper +{ + /** + * 根据条件分页查询字典数据 + * + * @param dictData 字典数据信息 + * @return 字典数据集合信息 + */ + public List selectDictDataList(SysDictData dictData); + + /** + * 根据字典类型查询字典数据 + * + * @param dictType 字典类型 + * @return 字典数据集合信息 + */ + public List selectDictDataByType(String dictType); + + /** + * 根据字典类型和字典键值查询字典数据信息 + * + * @param dictType 字典类型 + * @param dictValue 字典键值 + * @return 字典标签 + */ + public String selectDictLabel(@Param("dictType") String dictType, @Param("dictValue") String dictValue); + + /** + * 根据字典数据ID查询信息 + * + * @param dictCode 字典数据ID + * @return 字典数据 + */ + public SysDictData selectDictDataById(Long dictCode); + + /** + * 查询字典数据 + * + * @param dictType 字典类型 + * @return 字典数据 + */ + public int countDictDataByType(String dictType); + + /** + * 通过字典ID删除字典数据信息 + * + * @param dictCode 字典数据ID + * @return 结果 + */ + public int deleteDictDataById(Long dictCode); + + /** + * 批量删除字典数据信息 + * + * @param dictCodes 需要删除的字典数据ID + * @return 结果 + */ + public int deleteDictDataByIds(Long[] dictCodes); + + /** + * 新增字典数据信息 + * + * @param dictData 字典数据信息 + * @return 结果 + */ + public int insertDictData(SysDictData dictData); + + /** + * 修改字典数据信息 + * + * @param dictData 字典数据信息 + * @return 结果 + */ + public int updateDictData(SysDictData dictData); + + /** + * 同步修改字典类型 + * + * @param oldDictType 旧字典类型 + * @param newDictType 新旧字典类型 + * @return 结果 + */ + public int updateDictDataType(@Param("oldDictType") String oldDictType, @Param("newDictType") String newDictType); +} diff --git a/bs-system/src/main/java/com/bs/system/mapper/SysDictTypeMapper.java b/bs-system/src/main/java/com/bs/system/mapper/SysDictTypeMapper.java new file mode 100644 index 0000000..4c7449e --- /dev/null +++ b/bs-system/src/main/java/com/bs/system/mapper/SysDictTypeMapper.java @@ -0,0 +1,83 @@ +package com.bs.system.mapper; + +import java.util.List; +import com.bs.common.core.domain.entity.SysDictType; + +/** + * 字典表 数据层 + * + * @author bs + */ +public interface SysDictTypeMapper +{ + /** + * 根据条件分页查询字典类型 + * + * @param dictType 字典类型信息 + * @return 字典类型集合信息 + */ + public List selectDictTypeList(SysDictType dictType); + + /** + * 根据所有字典类型 + * + * @return 字典类型集合信息 + */ + public List selectDictTypeAll(); + + /** + * 根据字典类型ID查询信息 + * + * @param dictId 字典类型ID + * @return 字典类型 + */ + public SysDictType selectDictTypeById(Long dictId); + + /** + * 根据字典类型查询信息 + * + * @param dictType 字典类型 + * @return 字典类型 + */ + public SysDictType selectDictTypeByType(String dictType); + + /** + * 通过字典ID删除字典信息 + * + * @param dictId 字典ID + * @return 结果 + */ + public int deleteDictTypeById(Long dictId); + + /** + * 批量删除字典类型信息 + * + * @param dictIds 需要删除的字典ID + * @return 结果 + */ + public int deleteDictTypeByIds(Long[] dictIds); + + /** + * 新增字典类型信息 + * + * @param dictType 字典类型信息 + * @return 结果 + */ + public int insertDictType(SysDictType dictType); + + /** + * 修改字典类型信息 + * + * @param dictType 字典类型信息 + * @return 结果 + */ + public int updateDictType(SysDictType dictType); + + /** + * 校验字典类型称是否唯一 + * + * @param dictType 字典类型 + * @return 结果 + */ + public SysDictType checkDictTypeUnique(String dictType); +} diff --git a/bs-system/src/main/java/com/bs/system/mapper/SysLogininforMapper.java b/bs-system/src/main/java/com/bs/system/mapper/SysLogininforMapper.java new file mode 100644 index 0000000..41950e5 --- /dev/null +++ b/bs-system/src/main/java/com/bs/system/mapper/SysLogininforMapper.java @@ -0,0 +1,42 @@ +package com.bs.system.mapper; + +import java.util.List; +import com.bs.system.domain.SysLogininfor; + +/** + * 系统访问日志情况信息 数据层 + * + * @author bs + */ +public interface SysLogininforMapper +{ + /** + * 新增系统登录日志 + * + * @param logininfor 访问日志对象 + */ + public void insertLogininfor(SysLogininfor logininfor); + + /** + * 查询系统登录日志集合 + * + * @param logininfor 访问日志对象 + * @return 登录记录集合 + */ + public List selectLogininforList(SysLogininfor logininfor); + + /** + * 批量删除系统登录日志 + * + * @param infoIds 需要删除的登录日志ID + * @return 结果 + */ + public int deleteLogininforByIds(Long[] infoIds); + + /** + * 清空系统登录日志 + * + * @return 结果 + */ + public int cleanLogininfor(); +} diff --git a/bs-system/src/main/java/com/bs/system/mapper/SysMenuMapper.java b/bs-system/src/main/java/com/bs/system/mapper/SysMenuMapper.java new file mode 100644 index 0000000..f7446ba --- /dev/null +++ b/bs-system/src/main/java/com/bs/system/mapper/SysMenuMapper.java @@ -0,0 +1,127 @@ +package com.bs.system.mapper; + +import com.bs.common.core.domain.entity.SysMenu; +import com.bs.common.mybatis.mapper.BaseMapperX; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 菜单表 数据层 + * + * @author bs + */ +public interface SysMenuMapper extends BaseMapperX { + + /** + * 查询系统菜单列表 + * + * @param menu 菜单信息 + * @return 菜单列表 + */ + public List selectMenuList(SysMenu menu); + + /** + * 根据用户所有权限 + * + * @return 权限列表 + */ + public List selectMenuPerms(); + + /** + * 根据用户查询系统菜单列表 + * + * @param menu 菜单信息 + * @return 菜单列表 + */ + public List selectMenuListByUserId(SysMenu menu); + + /** + * 根据角色ID查询权限 + * + * @param roleId 角色ID + * @return 权限列表 + */ + public List selectMenuPermsByRoleId(Long roleId); + + /** + * 根据用户ID查询权限 + * + * @param userId 用户ID + * @return 权限列表 + */ + public List selectMenuPermsByUserId(Long userId); + + /** + * 根据用户ID查询菜单 + * + * @return 菜单列表 + */ + public List selectMenuTreeAll(); + + /** + * 根据用户ID查询菜单 + * + * @param userId 用户ID + * @return 菜单列表 + */ + public List selectMenuTreeByUserId(Long userId); + + /** + * 根据角色ID查询菜单树信息 + * + * @param roleId 角色ID + * @param menuCheckStrictly 菜单树选择项是否关联显示 + * @return 选中菜单列表 + */ + public List selectMenuListByRoleId(@Param("roleId") Long roleId, @Param("menuCheckStrictly") boolean menuCheckStrictly); + + /** + * 根据菜单ID查询信息 + * + * @param menuId 菜单ID + * @return 菜单信息 + */ + public SysMenu selectMenuById(Long menuId); + + /** + * 是否存在菜单子节点 + * + * @param menuId 菜单ID + * @return 结果 + */ + public int hasChildByMenuId(Long menuId); + + /** + * 新增菜单信息 + * + * @param menu 菜单信息 + * @return 结果 + */ + public int insertMenu(SysMenu menu); + + /** + * 修改菜单信息 + * + * @param menu 菜单信息 + * @return 结果 + */ + public int updateMenu(SysMenu menu); + + /** + * 删除菜单管理信息 + * + * @param menuId 菜单ID + * @return 结果 + */ + public int deleteMenuById(Long menuId); + + /** + * 校验菜单名称是否唯一 + * + * @param menuName 菜单名称 + * @param parentId 父菜单ID + * @return 结果 + */ + public SysMenu checkMenuNameUnique(@Param("menuName") String menuName, @Param("parentId") Long parentId); +} diff --git a/bs-system/src/main/java/com/bs/system/mapper/SysNoticeMapper.java b/bs-system/src/main/java/com/bs/system/mapper/SysNoticeMapper.java new file mode 100644 index 0000000..c293e24 --- /dev/null +++ b/bs-system/src/main/java/com/bs/system/mapper/SysNoticeMapper.java @@ -0,0 +1,14 @@ +package com.bs.system.mapper; + +import com.bs.common.mybatis.mapper.BaseMapperX; +import com.bs.system.domain.SysNotice; + +/** + * 通知公告Mapper接口 + * + * @author bs + * @date 2023-08-06 + */ +public interface SysNoticeMapper extends BaseMapperX { + +} diff --git a/bs-system/src/main/java/com/bs/system/mapper/SysOperLogMapper.java b/bs-system/src/main/java/com/bs/system/mapper/SysOperLogMapper.java new file mode 100644 index 0000000..a5256df --- /dev/null +++ b/bs-system/src/main/java/com/bs/system/mapper/SysOperLogMapper.java @@ -0,0 +1,48 @@ +package com.bs.system.mapper; + +import java.util.List; +import com.bs.system.domain.SysOperLog; + +/** + * 操作日志 数据层 + * + * @author bs + */ +public interface SysOperLogMapper +{ + /** + * 新增操作日志 + * + * @param operLog 操作日志对象 + */ + public void insertOperlog(SysOperLog operLog); + + /** + * 查询系统操作日志集合 + * + * @param operLog 操作日志对象 + * @return 操作日志集合 + */ + public List selectOperLogList(SysOperLog operLog); + + /** + * 批量删除系统操作日志 + * + * @param operIds 需要删除的操作日志ID + * @return 结果 + */ + public int deleteOperLogByIds(Long[] operIds); + + /** + * 查询操作日志详细 + * + * @param operId 操作ID + * @return 操作日志对象 + */ + public SysOperLog selectOperLogById(Long operId); + + /** + * 清空操作日志 + */ + public void cleanOperLog(); +} diff --git a/bs-system/src/main/java/com/bs/system/mapper/SysPostMapper.java b/bs-system/src/main/java/com/bs/system/mapper/SysPostMapper.java new file mode 100644 index 0000000..e7e044c --- /dev/null +++ b/bs-system/src/main/java/com/bs/system/mapper/SysPostMapper.java @@ -0,0 +1,101 @@ +package com.bs.system.mapper; + +import com.bs.common.mybatis.mapper.BaseMapperX; +import com.bs.system.domain.SysPost; + +import java.util.List; + +/** + * 岗位信息 数据层 + * + * @author bs + */ +public interface SysPostMapper extends BaseMapperX { + + /** + * 查询岗位数据集合 + * + * @param post 岗位信息 + * @return 岗位数据集合 + */ + public List selectPostList(SysPost post); + + /** + * 查询所有岗位 + * + * @return 岗位列表 + */ + public List selectPostAll(); + + /** + * 通过岗位ID查询岗位信息 + * + * @param postId 岗位ID + * @return 角色对象信息 + */ + public SysPost selectPostById(Long postId); + + /** + * 根据用户ID获取岗位选择框列表 + * + * @param userId 用户ID + * @return 选中岗位ID列表 + */ + public List selectPostListByUserId(Long userId); + + /** + * 查询用户所属岗位组 + * + * @param userName 用户名 + * @return 结果 + */ + public List selectPostsByUserName(String userName); + + /** + * 删除岗位信息 + * + * @param postId 岗位ID + * @return 结果 + */ + public int deletePostById(Long postId); + + /** + * 批量删除岗位信息 + * + * @param postIds 需要删除的岗位ID + * @return 结果 + */ + public int deletePostByIds(Long[] postIds); + + /** + * 修改岗位信息 + * + * @param post 岗位信息 + * @return 结果 + */ + public int updatePost(SysPost post); + + /** + * 新增岗位信息 + * + * @param post 岗位信息 + * @return 结果 + */ + public int insertPost(SysPost post); + + /** + * 校验岗位名称 + * + * @param postName 岗位名称 + * @return 结果 + */ + public SysPost checkPostNameUnique(String postName); + + /** + * 校验岗位编码 + * + * @param postCode 岗位编码 + * @return 结果 + */ + public SysPost checkPostCodeUnique(String postCode); +} diff --git a/bs-system/src/main/java/com/bs/system/mapper/SysRoleDeptMapper.java b/bs-system/src/main/java/com/bs/system/mapper/SysRoleDeptMapper.java new file mode 100644 index 0000000..a859ae5 --- /dev/null +++ b/bs-system/src/main/java/com/bs/system/mapper/SysRoleDeptMapper.java @@ -0,0 +1,44 @@ +package com.bs.system.mapper; + +import java.util.List; +import com.bs.system.domain.SysRoleDept; + +/** + * 角色与部门关联表 数据层 + * + * @author bs + */ +public interface SysRoleDeptMapper +{ + /** + * 通过角色ID删除角色和部门关联 + * + * @param roleId 角色ID + * @return 结果 + */ + public int deleteRoleDeptByRoleId(Long roleId); + + /** + * 批量删除角色部门关联信息 + * + * @param ids 需要删除的数据ID + * @return 结果 + */ + public int deleteRoleDept(Long[] ids); + + /** + * 查询部门使用数量 + * + * @param deptId 部门ID + * @return 结果 + */ + public int selectCountRoleDeptByDeptId(Long deptId); + + /** + * 批量新增角色部门信息 + * + * @param roleDeptList 角色部门列表 + * @return 结果 + */ + public int batchRoleDept(List roleDeptList); +} diff --git a/bs-system/src/main/java/com/bs/system/mapper/SysRoleMapper.java b/bs-system/src/main/java/com/bs/system/mapper/SysRoleMapper.java new file mode 100644 index 0000000..979bf47 --- /dev/null +++ b/bs-system/src/main/java/com/bs/system/mapper/SysRoleMapper.java @@ -0,0 +1,119 @@ +package com.bs.system.mapper; + +import com.baomidou.mybatisplus.annotation.InterceptorIgnore; +import com.baomidou.mybatisplus.core.toolkit.Constants; +import com.bs.common.core.domain.entity.SysRole; +import com.bs.common.mybatis.mapper.BaseMapperX; +import org.apache.ibatis.annotations.Param; + +import java.io.Serializable; +import java.util.Collection; +import java.util.List; + +/** + * 角色表 数据层 + * + * @author bs + */ +public interface SysRoleMapper extends BaseMapperX +{ + + @Override + @InterceptorIgnore(tenantLine = "on") + List selectBatchIds(@Param(Constants.COLLECTION) Collection idList); + /** + * 根据条件分页查询角色数据 + * + * @param role 角色信息 + * @return 角色数据集合信息 + */ + public List selectRoleList(SysRole role); + + /** + * 根据用户ID查询角色 + * + * @param userId 用户ID + * @return 角色列表 + */ + + public List selectRolePermissionByUserId(Long userId); + + /** + * 查询所有角色 + * + * @return 角色列表 + */ + public List selectRoleAll(); + + /** + * 根据用户ID获取角色选择框列表 + * + * @param userId 用户ID + * @return 选中角色ID列表 + */ + public List selectRoleListByUserId(Long userId); + + /** + * 通过角色ID查询角色 + * + * @param roleId 角色ID + * @return 角色对象信息 + */ + public SysRole selectRoleById(Long roleId); + + /** + * 根据用户ID查询角色 + * + * @param userName 用户名 + * @return 角色列表 + */ + public List selectRolesByUserName(String userName); + + /** + * 校验角色名称是否唯一 + * + * @param roleName 角色名称 + * @return 角色信息 + */ + public SysRole checkRoleNameUnique(String roleName); + + /** + * 校验角色权限是否唯一 + * + * @param roleKey 角色权限 + * @return 角色信息 + */ + public SysRole checkRoleKeyUnique(String roleKey); + + /** + * 修改角色信息 + * + * @param role 角色信息 + * @return 结果 + */ + public int updateRole(SysRole role); + + /** + * 新增角色信息 + * + * @param role 角色信息 + * @return 结果 + */ + public int insertRole(SysRole role); + + /** + * 通过角色ID删除角色 + * + * @param roleId 角色ID + * @return 结果 + */ + public int deleteRoleById(Long roleId); + + /** + * 批量删除角色信息 + * + * @param roleIds 需要删除的角色ID + * @return 结果 + */ + public int deleteRoleByIds(Long[] roleIds); +} diff --git a/bs-system/src/main/java/com/bs/system/mapper/SysRoleMenuMapper.java b/bs-system/src/main/java/com/bs/system/mapper/SysRoleMenuMapper.java new file mode 100644 index 0000000..e842463 --- /dev/null +++ b/bs-system/src/main/java/com/bs/system/mapper/SysRoleMenuMapper.java @@ -0,0 +1,46 @@ +package com.bs.system.mapper; + +import com.bs.common.mybatis.mapper.BaseMapperX; +import com.bs.system.domain.SysRoleMenu; + +import java.util.List; + +/** + * 角色与菜单关联表 数据层 + * + * @author bs + */ +public interface SysRoleMenuMapper extends BaseMapperX +{ + /** + * 查询菜单使用数量 + * + * @param menuId 菜单ID + * @return 结果 + */ + public int checkMenuExistRole(Long menuId); + + /** + * 通过角色ID删除角色和菜单关联 + * + * @param roleId 角色ID + * @return 结果 + */ + public int deleteRoleMenuByRoleId(Long roleId); + + /** + * 批量删除角色菜单关联信息 + * + * @param ids 需要删除的数据ID + * @return 结果 + */ + public int deleteRoleMenu(Long[] ids); + + /** + * 批量新增角色菜单信息 + * + * @param roleMenuList 角色菜单列表 + * @return 结果 + */ + public int batchRoleMenu(List roleMenuList); +} diff --git a/bs-system/src/main/java/com/bs/system/mapper/SysTenantMapper.java b/bs-system/src/main/java/com/bs/system/mapper/SysTenantMapper.java new file mode 100644 index 0000000..9016cfc --- /dev/null +++ b/bs-system/src/main/java/com/bs/system/mapper/SysTenantMapper.java @@ -0,0 +1,13 @@ + +package com.bs.system.mapper; + + +import com.bs.common.core.domain.entity.SysTenant; +import com.bs.common.mybatis.mapper.BaseMapperX; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +public interface SysTenantMapper extends BaseMapperX { + +} diff --git a/bs-system/src/main/java/com/bs/system/mapper/SysUserMapper.java b/bs-system/src/main/java/com/bs/system/mapper/SysUserMapper.java new file mode 100644 index 0000000..7ead97a --- /dev/null +++ b/bs-system/src/main/java/com/bs/system/mapper/SysUserMapper.java @@ -0,0 +1,68 @@ +package com.bs.system.mapper; + +import com.baomidou.mybatisplus.annotation.InterceptorIgnore; +import com.bs.common.core.domain.entity.SysUser; +import com.bs.common.mybatis.mapper.BaseMapperX; + +import java.util.List; + +/** + * 用户表 数据层 + * + * @author bs + */ +public interface SysUserMapper extends BaseMapperX { + + /** + * 根据条件分页查询用户列表 + * + * @param sysUser 用户信息 + * @return 用户信息集合信息 + */ + public List selectUserList(SysUser sysUser); + + /** + * 根据条件分页查询已配用户角色列表 + * + * @param user 用户信息 + * @return 用户信息集合信息 + */ + public List selectAllocatedList(SysUser user); + + /** + * 根据条件分页查询未分配用户角色列表 + * + * @param user 用户信息 + * @return 用户信息集合信息 + */ + public List selectUnallocatedList(SysUser user); + + + + /** + * 校验用户名称是否唯一 + * + * @param userName 用户名称 + * @return 结果 + */ + public SysUser checkUserNameUnique(String userName); + + @InterceptorIgnore(tenantLine = "on") + public SysUser selectTenantAdmin(Long tenantId); + + /** + * 校验手机号码是否唯一 + * + * @param phonenumber 手机号码 + * @return 结果 + */ + public SysUser checkPhoneUnique(String phonenumber); + + /** + * 校验email是否唯一 + * + * @param email 用户邮箱 + * @return 结果 + */ + public SysUser checkEmailUnique(String email); +} diff --git a/bs-system/src/main/java/com/bs/system/mapper/SysUserPostMapper.java b/bs-system/src/main/java/com/bs/system/mapper/SysUserPostMapper.java new file mode 100644 index 0000000..f1f0a4e --- /dev/null +++ b/bs-system/src/main/java/com/bs/system/mapper/SysUserPostMapper.java @@ -0,0 +1,44 @@ +package com.bs.system.mapper; + +import java.util.List; +import com.bs.system.domain.SysUserPost; + +/** + * 用户与岗位关联表 数据层 + * + * @author bs + */ +public interface SysUserPostMapper +{ + /** + * 通过用户ID删除用户和岗位关联 + * + * @param userId 用户ID + * @return 结果 + */ + public int deleteUserPostByUserId(Long userId); + + /** + * 通过岗位ID查询岗位使用数量 + * + * @param postId 岗位ID + * @return 结果 + */ + public int countUserPostById(Long postId); + + /** + * 批量删除用户和岗位关联 + * + * @param ids 需要删除的数据ID + * @return 结果 + */ + public int deleteUserPost(Long[] ids); + + /** + * 批量新增用户岗位信息 + * + * @param userPostList 用户角色列表 + * @return 结果 + */ + public int batchUserPost(List userPostList); +} diff --git a/bs-system/src/main/java/com/bs/system/mapper/SysUserRoleMapper.java b/bs-system/src/main/java/com/bs/system/mapper/SysUserRoleMapper.java new file mode 100644 index 0000000..0ee4860 --- /dev/null +++ b/bs-system/src/main/java/com/bs/system/mapper/SysUserRoleMapper.java @@ -0,0 +1,64 @@ +package com.bs.system.mapper; + +import com.bs.common.mybatis.mapper.BaseMapperX; +import com.bs.system.domain.SysUserRole; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 用户与角色关联表 数据层 + * + * @author bs + */ +public interface SysUserRoleMapper extends BaseMapperX +{ + /** + * 通过用户ID删除用户和角色关联 + * + * @param userId 用户ID + * @return 结果 + */ + public int deleteUserRoleByUserId(Long userId); + + /** + * 批量删除用户和角色关联 + * + * @param ids 需要删除的数据ID + * @return 结果 + */ + public int deleteUserRole(Long[] ids); + + /** + * 通过角色ID查询角色使用数量 + * + * @param roleId 角色ID + * @return 结果 + */ + public int countUserRoleByRoleId(Long roleId); + + /** + * 批量新增用户角色信息 + * + * @param userRoleList 用户角色列表 + * @return 结果 + */ + public int batchUserRole(List userRoleList); + + /** + * 删除用户和角色关联信息 + * + * @param userRole 用户和角色关联信息 + * @return 结果 + */ + public int deleteUserRoleInfo(SysUserRole userRole); + + /** + * 批量取消授权用户角色 + * + * @param roleId 角色ID + * @param userIds 需要删除的用户数据ID + * @return 结果 + */ + public int deleteUserRoleInfos(@Param("roleId") Long roleId, @Param("userIds") Long[] userIds); +} diff --git a/bs-system/src/main/java/com/bs/system/mapper/TenantConfigMapper.java b/bs-system/src/main/java/com/bs/system/mapper/TenantConfigMapper.java new file mode 100644 index 0000000..f7f9c0e --- /dev/null +++ b/bs-system/src/main/java/com/bs/system/mapper/TenantConfigMapper.java @@ -0,0 +1,15 @@ +package com.bs.system.mapper; + + +import com.bs.common.core.domain.entity.TenantConfig; +import com.bs.common.mybatis.mapper.BaseMapperX; + +/** + * 租户配置Mapper接口 + * + * @author ruoyi + * @date 2023-04-02 + */ +public interface TenantConfigMapper extends BaseMapperX { + +} diff --git a/bs-system/src/main/java/com/bs/system/service/ISysConfigService.java b/bs-system/src/main/java/com/bs/system/service/ISysConfigService.java new file mode 100644 index 0000000..7588c94 --- /dev/null +++ b/bs-system/src/main/java/com/bs/system/service/ISysConfigService.java @@ -0,0 +1,89 @@ +package com.bs.system.service; + +import java.util.List; +import com.bs.system.domain.SysConfig; + +/** + * 参数配置 服务层 + * + * @author bs + */ +public interface ISysConfigService +{ + /** + * 查询参数配置信息 + * + * @param configId 参数配置ID + * @return 参数配置信息 + */ + public SysConfig selectConfigById(Long configId); + + /** + * 根据键名查询参数配置信息 + * + * @param configKey 参数键名 + * @return 参数键值 + */ + public String selectConfigByKey(String configKey); + + /** + * 获取验证码开关 + * + * @return true开启,false关闭 + */ + public boolean selectCaptchaEnabled(); + + /** + * 查询参数配置列表 + * + * @param config 参数配置信息 + * @return 参数配置集合 + */ + public List selectConfigList(SysConfig config); + + /** + * 新增参数配置 + * + * @param config 参数配置信息 + * @return 结果 + */ + public int insertConfig(SysConfig config); + + /** + * 修改参数配置 + * + * @param config 参数配置信息 + * @return 结果 + */ + public int updateConfig(SysConfig config); + + /** + * 批量删除参数信息 + * + * @param configIds 需要删除的参数ID + */ + public void deleteConfigByIds(Long[] configIds); + + /** + * 加载参数缓存数据 + */ + public void loadingConfigCache(); + + /** + * 清空参数缓存数据 + */ + public void clearConfigCache(); + + /** + * 重置参数缓存数据 + */ + public void resetConfigCache(); + + /** + * 校验参数键名是否唯一 + * + * @param config 参数信息 + * @return 结果 + */ + public boolean checkConfigKeyUnique(SysConfig config); +} diff --git a/bs-system/src/main/java/com/bs/system/service/ISysDeptService.java b/bs-system/src/main/java/com/bs/system/service/ISysDeptService.java new file mode 100644 index 0000000..074857c --- /dev/null +++ b/bs-system/src/main/java/com/bs/system/service/ISysDeptService.java @@ -0,0 +1,124 @@ +package com.bs.system.service; + +import java.util.List; +import com.bs.common.core.domain.TreeSelect; +import com.bs.common.core.domain.entity.SysDept; + +/** + * 部门管理 服务层 + * + * @author bs + */ +public interface ISysDeptService +{ + /** + * 查询部门管理数据 + * + * @param dept 部门信息 + * @return 部门信息集合 + */ + public List selectDeptList(SysDept dept); + + /** + * 查询部门树结构信息 + * + * @param dept 部门信息 + * @return 部门树信息集合 + */ + public List selectDeptTreeList(SysDept dept); + + /** + * 构建前端所需要树结构 + * + * @param depts 部门列表 + * @return 树结构列表 + */ + public List buildDeptTree(List depts); + + /** + * 构建前端所需要下拉树结构 + * + * @param depts 部门列表 + * @return 下拉树结构列表 + */ + public List buildDeptTreeSelect(List depts); + + /** + * 根据角色ID查询部门树信息 + * + * @param roleId 角色ID + * @return 选中部门列表 + */ + public List selectDeptListByRoleId(Long roleId); + + /** + * 根据部门ID查询信息 + * + * @param deptId 部门ID + * @return 部门信息 + */ + public SysDept selectDeptById(Long deptId); + + /** + * 根据ID查询所有子部门(正常状态) + * + * @param deptId 部门ID + * @return 子部门数 + */ + public int selectNormalChildrenDeptById(Long deptId); + + /** + * 是否存在部门子节点 + * + * @param deptId 部门ID + * @return 结果 + */ + public boolean hasChildByDeptId(Long deptId); + + /** + * 查询部门是否存在用户 + * + * @param deptId 部门ID + * @return 结果 true 存在 false 不存在 + */ + public boolean checkDeptExistUser(Long deptId); + + /** + * 校验部门名称是否唯一 + * + * @param dept 部门信息 + * @return 结果 + */ + public boolean checkDeptNameUnique(SysDept dept); + + /** + * 校验部门是否有数据权限 + * + * @param deptId 部门id + */ + public void checkDeptDataScope(Long deptId); + + /** + * 新增保存部门信息 + * + * @param dept 部门信息 + * @return 结果 + */ + public int insertDept(SysDept dept); + + /** + * 修改保存部门信息 + * + * @param dept 部门信息 + * @return 结果 + */ + public int updateDept(SysDept dept); + + /** + * 删除部门管理信息 + * + * @param deptId 部门ID + * @return 结果 + */ + public int deleteDeptById(Long deptId); +} diff --git a/bs-system/src/main/java/com/bs/system/service/ISysDictDataService.java b/bs-system/src/main/java/com/bs/system/service/ISysDictDataService.java new file mode 100644 index 0000000..fe7ea31 --- /dev/null +++ b/bs-system/src/main/java/com/bs/system/service/ISysDictDataService.java @@ -0,0 +1,60 @@ +package com.bs.system.service; + +import java.util.List; +import com.bs.common.core.domain.entity.SysDictData; + +/** + * 字典 业务层 + * + * @author bs + */ +public interface ISysDictDataService +{ + /** + * 根据条件分页查询字典数据 + * + * @param dictData 字典数据信息 + * @return 字典数据集合信息 + */ + public List selectDictDataList(SysDictData dictData); + + /** + * 根据字典类型和字典键值查询字典数据信息 + * + * @param dictType 字典类型 + * @param dictValue 字典键值 + * @return 字典标签 + */ + public String selectDictLabel(String dictType, String dictValue); + + /** + * 根据字典数据ID查询信息 + * + * @param dictCode 字典数据ID + * @return 字典数据 + */ + public SysDictData selectDictDataById(Long dictCode); + + /** + * 批量删除字典数据信息 + * + * @param dictCodes 需要删除的字典数据ID + */ + public void deleteDictDataByIds(Long[] dictCodes); + + /** + * 新增保存字典数据信息 + * + * @param dictData 字典数据信息 + * @return 结果 + */ + public int insertDictData(SysDictData dictData); + + /** + * 修改保存字典数据信息 + * + * @param dictData 字典数据信息 + * @return 结果 + */ + public int updateDictData(SysDictData dictData); +} diff --git a/bs-system/src/main/java/com/bs/system/service/ISysDictTypeService.java b/bs-system/src/main/java/com/bs/system/service/ISysDictTypeService.java new file mode 100644 index 0000000..1d9bdbc --- /dev/null +++ b/bs-system/src/main/java/com/bs/system/service/ISysDictTypeService.java @@ -0,0 +1,98 @@ +package com.bs.system.service; + +import java.util.List; +import com.bs.common.core.domain.entity.SysDictData; +import com.bs.common.core.domain.entity.SysDictType; + +/** + * 字典 业务层 + * + * @author bs + */ +public interface ISysDictTypeService +{ + /** + * 根据条件分页查询字典类型 + * + * @param dictType 字典类型信息 + * @return 字典类型集合信息 + */ + public List selectDictTypeList(SysDictType dictType); + + /** + * 根据所有字典类型 + * + * @return 字典类型集合信息 + */ + public List selectDictTypeAll(); + + /** + * 根据字典类型查询字典数据 + * + * @param dictType 字典类型 + * @return 字典数据集合信息 + */ + public List selectDictDataByType(String dictType); + + /** + * 根据字典类型ID查询信息 + * + * @param dictId 字典类型ID + * @return 字典类型 + */ + public SysDictType selectDictTypeById(Long dictId); + + /** + * 根据字典类型查询信息 + * + * @param dictType 字典类型 + * @return 字典类型 + */ + public SysDictType selectDictTypeByType(String dictType); + + /** + * 批量删除字典信息 + * + * @param dictIds 需要删除的字典ID + */ + public void deleteDictTypeByIds(Long[] dictIds); + + /** + * 加载字典缓存数据 + */ + public void loadingDictCache(); + + /** + * 清空字典缓存数据 + */ + public void clearDictCache(); + + /** + * 重置字典缓存数据 + */ + public void resetDictCache(); + + /** + * 新增保存字典类型信息 + * + * @param dictType 字典类型信息 + * @return 结果 + */ + public int insertDictType(SysDictType dictType); + + /** + * 修改保存字典类型信息 + * + * @param dictType 字典类型信息 + * @return 结果 + */ + public int updateDictType(SysDictType dictType); + + /** + * 校验字典类型称是否唯一 + * + * @param dictType 字典类型 + * @return 结果 + */ + public boolean checkDictTypeUnique(SysDictType dictType); +} diff --git a/bs-system/src/main/java/com/bs/system/service/ISysLogininforService.java b/bs-system/src/main/java/com/bs/system/service/ISysLogininforService.java new file mode 100644 index 0000000..311ff06 --- /dev/null +++ b/bs-system/src/main/java/com/bs/system/service/ISysLogininforService.java @@ -0,0 +1,40 @@ +package com.bs.system.service; + +import java.util.List; +import com.bs.system.domain.SysLogininfor; + +/** + * 系统访问日志情况信息 服务层 + * + * @author bs + */ +public interface ISysLogininforService +{ + /** + * 新增系统登录日志 + * + * @param logininfor 访问日志对象 + */ + public void insertLogininfor(SysLogininfor logininfor); + + /** + * 查询系统登录日志集合 + * + * @param logininfor 访问日志对象 + * @return 登录记录集合 + */ + public List selectLogininforList(SysLogininfor logininfor); + + /** + * 批量删除系统登录日志 + * + * @param infoIds 需要删除的登录日志ID + * @return 结果 + */ + public int deleteLogininforByIds(Long[] infoIds); + + /** + * 清空系统登录日志 + */ + public void cleanLogininfor(); +} diff --git a/bs-system/src/main/java/com/bs/system/service/ISysMenuService.java b/bs-system/src/main/java/com/bs/system/service/ISysMenuService.java new file mode 100644 index 0000000..59c0d83 --- /dev/null +++ b/bs-system/src/main/java/com/bs/system/service/ISysMenuService.java @@ -0,0 +1,144 @@ +package com.bs.system.service; + +import java.util.List; +import java.util.Set; +import com.bs.common.core.domain.TreeSelect; +import com.bs.common.core.domain.entity.SysMenu; +import com.bs.system.domain.vo.RouterVo; + +/** + * 菜单 业务层 + * + * @author bs + */ +public interface ISysMenuService +{ + /** + * 根据用户查询系统菜单列表 + * + * @param userId 用户ID + * @return 菜单列表 + */ + public List selectMenuList(Long userId); + + /** + * 根据用户查询系统菜单列表 + * + * @param menu 菜单信息 + * @param userId 用户ID + * @return 菜单列表 + */ + public List selectMenuList(SysMenu menu, Long userId); + + /** + * 根据用户ID查询权限 + * + * @param userId 用户ID + * @return 权限列表 + */ + public Set selectMenuPermsByUserId(Long userId); + + /** + * 根据角色ID查询权限 + * + * @param roleId 角色ID + * @return 权限列表 + */ + public Set selectMenuPermsByRoleId(Long roleId); + + /** + * 根据用户ID查询菜单树信息 + * + * @param userId 用户ID + * @return 菜单列表 + */ + public List selectMenuTreeByUserId(Long userId); + + /** + * 根据角色ID查询菜单树信息 + * + * @param roleId 角色ID + * @return 选中菜单列表 + */ + public List selectMenuListByRoleId(Long roleId); + + /** + * 构建前端路由所需要的菜单 + * + * @param menus 菜单列表 + * @return 路由列表 + */ + public List buildMenus(List menus); + + /** + * 构建前端所需要树结构 + * + * @param menus 菜单列表 + * @return 树结构列表 + */ + public List buildMenuTree(List menus); + + /** + * 构建前端所需要下拉树结构 + * + * @param menus 菜单列表 + * @return 下拉树结构列表 + */ + public List buildMenuTreeSelect(List menus); + + /** + * 根据菜单ID查询信息 + * + * @param menuId 菜单ID + * @return 菜单信息 + */ + public SysMenu selectMenuById(Long menuId); + + /** + * 是否存在菜单子节点 + * + * @param menuId 菜单ID + * @return 结果 true 存在 false 不存在 + */ + public boolean hasChildByMenuId(Long menuId); + + /** + * 查询菜单是否存在角色 + * + * @param menuId 菜单ID + * @return 结果 true 存在 false 不存在 + */ + public boolean checkMenuExistRole(Long menuId); + + /** + * 新增保存菜单信息 + * + * @param menu 菜单信息 + * @return 结果 + */ + public int insertMenu(SysMenu menu); + + /** + * 修改保存菜单信息 + * + * @param menu 菜单信息 + * @return 结果 + */ + public int updateMenu(SysMenu menu); + + /** + * 删除菜单管理信息 + * + * @param menuId 菜单ID + * @return 结果 + */ + public int deleteMenuById(Long menuId); + + /** + * 校验菜单名称是否唯一 + * + * @param menu 菜单信息 + * @return 结果 + */ + public boolean checkMenuNameUnique(SysMenu menu); +} diff --git a/bs-system/src/main/java/com/bs/system/service/ISysNoticeService.java b/bs-system/src/main/java/com/bs/system/service/ISysNoticeService.java new file mode 100644 index 0000000..c9ac56a --- /dev/null +++ b/bs-system/src/main/java/com/bs/system/service/ISysNoticeService.java @@ -0,0 +1,14 @@ +package com.bs.system.service; + +import com.github.yulichang.base.MPJBaseService; +import com.bs.system.domain.SysNotice; + +/** + * 通知公告Service接口 + * + * @author bs + * @date 2023-08-06 + */ +public interface ISysNoticeService extends MPJBaseService{ + +} diff --git a/bs-system/src/main/java/com/bs/system/service/ISysOperLogService.java b/bs-system/src/main/java/com/bs/system/service/ISysOperLogService.java new file mode 100644 index 0000000..4e8ab0e --- /dev/null +++ b/bs-system/src/main/java/com/bs/system/service/ISysOperLogService.java @@ -0,0 +1,48 @@ +package com.bs.system.service; + +import java.util.List; +import com.bs.system.domain.SysOperLog; + +/** + * 操作日志 服务层 + * + * @author bs + */ +public interface ISysOperLogService +{ + /** + * 新增操作日志 + * + * @param operLog 操作日志对象 + */ + public void insertOperlog(SysOperLog operLog); + + /** + * 查询系统操作日志集合 + * + * @param operLog 操作日志对象 + * @return 操作日志集合 + */ + public List selectOperLogList(SysOperLog operLog); + + /** + * 批量删除系统操作日志 + * + * @param operIds 需要删除的操作日志ID + * @return 结果 + */ + public int deleteOperLogByIds(Long[] operIds); + + /** + * 查询操作日志详细 + * + * @param operId 操作ID + * @return 操作日志对象 + */ + public SysOperLog selectOperLogById(Long operId); + + /** + * 清空操作日志 + */ + public void cleanOperLog(); +} diff --git a/bs-system/src/main/java/com/bs/system/service/ISysPostService.java b/bs-system/src/main/java/com/bs/system/service/ISysPostService.java new file mode 100644 index 0000000..e4f2d7b --- /dev/null +++ b/bs-system/src/main/java/com/bs/system/service/ISysPostService.java @@ -0,0 +1,99 @@ +package com.bs.system.service; + +import java.util.List; +import com.bs.system.domain.SysPost; + +/** + * 岗位信息 服务层 + * + * @author bs + */ +public interface ISysPostService +{ + /** + * 查询岗位信息集合 + * + * @param post 岗位信息 + * @return 岗位列表 + */ + public List selectPostList(SysPost post); + + /** + * 查询所有岗位 + * + * @return 岗位列表 + */ + public List selectPostAll(); + + /** + * 通过岗位ID查询岗位信息 + * + * @param postId 岗位ID + * @return 角色对象信息 + */ + public SysPost selectPostById(Long postId); + + /** + * 根据用户ID获取岗位选择框列表 + * + * @param userId 用户ID + * @return 选中岗位ID列表 + */ + public List selectPostListByUserId(Long userId); + + /** + * 校验岗位名称 + * + * @param post 岗位信息 + * @return 结果 + */ + public boolean checkPostNameUnique(SysPost post); + + /** + * 校验岗位编码 + * + * @param post 岗位信息 + * @return 结果 + */ + public boolean checkPostCodeUnique(SysPost post); + + /** + * 通过岗位ID查询岗位使用数量 + * + * @param postId 岗位ID + * @return 结果 + */ + public int countUserPostById(Long postId); + + /** + * 删除岗位信息 + * + * @param postId 岗位ID + * @return 结果 + */ + public int deletePostById(Long postId); + + /** + * 批量删除岗位信息 + * + * @param postIds 需要删除的岗位ID + * @return 结果 + */ + public int deletePostByIds(Long[] postIds); + + /** + * 新增保存岗位信息 + * + * @param post 岗位信息 + * @return 结果 + */ + public int insertPost(SysPost post); + + /** + * 修改保存岗位信息 + * + * @param post 岗位信息 + * @return 结果 + */ + public int updatePost(SysPost post); +} diff --git a/bs-system/src/main/java/com/bs/system/service/ISysRoleService.java b/bs-system/src/main/java/com/bs/system/service/ISysRoleService.java new file mode 100644 index 0000000..2f1ab63 --- /dev/null +++ b/bs-system/src/main/java/com/bs/system/service/ISysRoleService.java @@ -0,0 +1,173 @@ +package com.bs.system.service; + +import java.util.List; +import java.util.Set; +import com.bs.common.core.domain.entity.SysRole; +import com.bs.system.domain.SysUserRole; + +/** + * 角色业务层 + * + * @author bs + */ +public interface ISysRoleService +{ + /** + * 根据条件分页查询角色数据 + * + * @param role 角色信息 + * @return 角色数据集合信息 + */ + public List selectRoleList(SysRole role); + + /** + * 根据用户ID查询角色列表 + * + * @param userId 用户ID + * @return 角色列表 + */ + public List selectRolesByUserId(Long userId); + + /** + * 根据用户ID查询角色权限 + * + * @param userId 用户ID + * @return 权限列表 + */ + public Set selectRolePermissionByUserId(Long userId); + + /** + * 查询所有角色 + * + * @return 角色列表 + */ + public List selectRoleAll(); + + /** + * 根据用户ID获取角色选择框列表 + * + * @param userId 用户ID + * @return 选中角色ID列表 + */ + public List selectRoleListByUserId(Long userId); + + /** + * 通过角色ID查询角色 + * + * @param roleId 角色ID + * @return 角色对象信息 + */ + public SysRole selectRoleById(Long roleId); + + /** + * 校验角色名称是否唯一 + * + * @param role 角色信息 + * @return 结果 + */ + public boolean checkRoleNameUnique(SysRole role); + + /** + * 校验角色权限是否唯一 + * + * @param role 角色信息 + * @return 结果 + */ + public boolean checkRoleKeyUnique(SysRole role); + + /** + * 校验角色是否允许操作 + * + * @param role 角色信息 + */ + public void checkRoleAllowed(SysRole role); + + /** + * 校验角色是否有数据权限 + * + * @param roleId 角色id + */ + public void checkRoleDataScope(Long roleId); + + /** + * 通过角色ID查询角色使用数量 + * + * @param roleId 角色ID + * @return 结果 + */ + public int countUserRoleByRoleId(Long roleId); + + /** + * 新增保存角色信息 + * + * @param role 角色信息 + * @return 结果 + */ + public int insertRole(SysRole role); + + /** + * 修改保存角色信息 + * + * @param role 角色信息 + * @return 结果 + */ + public int updateRole(SysRole role); + + /** + * 修改角色状态 + * + * @param role 角色信息 + * @return 结果 + */ + public int updateRoleStatus(SysRole role); + + /** + * 修改数据权限信息 + * + * @param role 角色信息 + * @return 结果 + */ + public int authDataScope(SysRole role); + + /** + * 通过角色ID删除角色 + * + * @param roleId 角色ID + * @return 结果 + */ + public int deleteRoleById(Long roleId); + + /** + * 批量删除角色信息 + * + * @param roleIds 需要删除的角色ID + * @return 结果 + */ + public int deleteRoleByIds(Long[] roleIds); + + /** + * 取消授权用户角色 + * + * @param userRole 用户和角色关联信息 + * @return 结果 + */ + public int deleteAuthUser(SysUserRole userRole); + + /** + * 批量取消授权用户角色 + * + * @param roleId 角色ID + * @param userIds 需要取消授权的用户数据ID + * @return 结果 + */ + public int deleteAuthUsers(Long roleId, Long[] userIds); + + /** + * 批量选择授权用户角色 + * + * @param roleId 角色ID + * @param userIds 需要删除的用户数据ID + * @return 结果 + */ + public int insertAuthUsers(Long roleId, Long[] userIds); +} diff --git a/bs-system/src/main/java/com/bs/system/service/ISysUserOnlineService.java b/bs-system/src/main/java/com/bs/system/service/ISysUserOnlineService.java new file mode 100644 index 0000000..c6cbdf3 --- /dev/null +++ b/bs-system/src/main/java/com/bs/system/service/ISysUserOnlineService.java @@ -0,0 +1,48 @@ +package com.bs.system.service; + +import com.bs.common.core.domain.model.LoginUser; +import com.bs.system.domain.SysUserOnline; + +/** + * 在线用户 服务层 + * + * @author bs + */ +public interface ISysUserOnlineService +{ + /** + * 通过登录地址查询信息 + * + * @param ipaddr 登录地址 + * @param user 用户信息 + * @return 在线用户信息 + */ + public SysUserOnline selectOnlineByIpaddr(String ipaddr, LoginUser user); + + /** + * 通过用户名称查询信息 + * + * @param userName 用户名称 + * @param user 用户信息 + * @return 在线用户信息 + */ + public SysUserOnline selectOnlineByUserName(String userName, LoginUser user); + + /** + * 通过登录地址/用户名称查询信息 + * + * @param ipaddr 登录地址 + * @param userName 用户名称 + * @param user 用户信息 + * @return 在线用户信息 + */ + public SysUserOnline selectOnlineByInfo(String ipaddr, String userName, LoginUser user); + + /** + * 设置在线用户信息 + * + * @param user 用户信息 + * @return 在线用户 + */ + public SysUserOnline loginUserToUserOnline(LoginUser user); +} diff --git a/bs-system/src/main/java/com/bs/system/service/ISysUserService.java b/bs-system/src/main/java/com/bs/system/service/ISysUserService.java new file mode 100644 index 0000000..7cc298c --- /dev/null +++ b/bs-system/src/main/java/com/bs/system/service/ISysUserService.java @@ -0,0 +1,208 @@ +package com.bs.system.service; + +import com.bs.common.core.domain.entity.SysUser; +import com.github.yulichang.base.MPJBaseService; + +import java.util.List; + +/** + * 用户 业务层 + * + * @author bs + */ +public interface ISysUserService extends MPJBaseService +{ + /** + * 根据条件分页查询用户列表 + * + * @param user 用户信息 + * @return 用户信息集合信息 + */ + public List selectUserList(SysUser user); + + /** + * 根据条件分页查询已分配用户角色列表 + * + * @param user 用户信息 + * @return 用户信息集合信息 + */ + public List selectAllocatedList(SysUser user); + + /** + * 根据条件分页查询未分配用户角色列表 + * + * @param user 用户信息 + * @return 用户信息集合信息 + */ + public List selectUnallocatedList(SysUser user); + + /** + * 通过用户名查询用户 + * + * @param userName 用户名 + * @return 用户对象信息 + */ + public SysUser selectUserByUserName(String userName); + + /** + * 通过用户ID查询用户 + * + * @param userId 用户ID + * @return 用户对象信息 + */ + public SysUser selectUserById(Long userId); + + /** + * 根据用户ID查询用户所属角色组 + * + * @param userName 用户名 + * @return 结果 + */ + public String selectUserRoleGroup(String userName); + + /** + * 根据用户ID查询用户所属岗位组 + * + * @param userName 用户名 + * @return 结果 + */ + public String selectUserPostGroup(String userName); + + /** + * 校验用户名称是否唯一 + * + * @param user 用户信息 + * @return 结果 + */ + public boolean checkUserNameUnique(SysUser user); + + /** + * 校验手机号码是否唯一 + * + * @param user 用户信息 + * @return 结果 + */ + public boolean checkPhoneUnique(SysUser user); + + /** + * 校验email是否唯一 + * + * @param user 用户信息 + * @return 结果 + */ + public boolean checkEmailUnique(SysUser user); + + /** + * 校验用户是否允许操作 + * + * @param user 用户信息 + */ + public void checkUserAllowed(SysUser user); + + /** + * 校验用户是否有数据权限 + * + * @param userId 用户id + */ + public void checkUserDataScope(Long userId); + + /** + * 新增用户信息 + * + * @param user 用户信息 + * @return 结果 + */ + public int insertUser(SysUser user); + + /** + * 注册用户信息 + * + * @param user 用户信息 + * @return 结果 + */ + public boolean registerUser(SysUser user); + + /** + * 修改用户信息 + * + * @param user 用户信息 + * @return 结果 + */ + public int updateUser(SysUser user); + + /** + * 用户授权角色 + * + * @param userId 用户ID + * @param roleIds 角色组 + */ + public void insertUserAuth(Long userId, Long[] roleIds); + + /** + * 修改用户状态 + * + * @param user 用户信息 + * @return 结果 + */ + public int updateUserStatus(SysUser user); + + /** + * 修改用户基本信息 + * + * @param user 用户信息 + * @return 结果 + */ + public int updateUserProfile(SysUser user); + + /** + * 修改用户头像 + * + * @param userName 用户名 + * @param avatar 头像地址 + * @return 结果 + */ + public boolean updateUserAvatar(String userName, String avatar); + + /** + * 重置用户密码 + * + * @param user 用户信息 + * @return 结果 + */ + public int resetPwd(SysUser user); + + /** + * 重置用户密码 + * + * @param userName 用户名 + * @param password 密码 + * @return 结果 + */ + public int resetUserPwd(String userName, String password); + + /** + * 通过用户ID删除用户 + * + * @param userId 用户ID + * @return 结果 + */ + public int deleteUserById(Long userId); + + /** + * 批量删除用户信息 + * + * @param userIds 需要删除的用户ID + * @return 结果 + */ + public int deleteUserByIds(Long[] userIds); + + /** + * 导入用户数据 + * + * @param userList 用户数据列表 + * @param isUpdateSupport 是否更新支持,如果已存在,则进行更新数据 + * @param operName 操作用户 + * @return 结果 + */ + public String importUser(List userList, Boolean isUpdateSupport, Long operName); +} diff --git a/bs-system/src/main/java/com/bs/system/service/ITenantConfigService.java b/bs-system/src/main/java/com/bs/system/service/ITenantConfigService.java new file mode 100644 index 0000000..e737206 --- /dev/null +++ b/bs-system/src/main/java/com/bs/system/service/ITenantConfigService.java @@ -0,0 +1,15 @@ +package com.bs.system.service; + + +import com.bs.common.core.domain.entity.TenantConfig; +import com.github.yulichang.base.MPJBaseService; + +/** + * 租户配置Service接口 + * + * @author ruoyi + * @date 2023-04-02 + */ +public interface ITenantConfigService extends MPJBaseService { + +} diff --git a/bs-system/src/main/java/com/bs/system/service/SysTenantService.java b/bs-system/src/main/java/com/bs/system/service/SysTenantService.java new file mode 100644 index 0000000..f029372 --- /dev/null +++ b/bs-system/src/main/java/com/bs/system/service/SysTenantService.java @@ -0,0 +1,20 @@ + +package com.bs.system.service; + + +import com.bs.common.core.domain.entity.SysTenant; +import com.github.yulichang.base.MPJBaseService; + +import java.util.List; + +public interface SysTenantService extends MPJBaseService { + + + + /** + * + * @param tenant + * @return + */ + int disableTenant(SysTenant tenant); +} diff --git a/bs-system/src/main/java/com/bs/system/service/impl/SysConfigServiceImpl.java b/bs-system/src/main/java/com/bs/system/service/impl/SysConfigServiceImpl.java new file mode 100644 index 0000000..5f8dc8f --- /dev/null +++ b/bs-system/src/main/java/com/bs/system/service/impl/SysConfigServiceImpl.java @@ -0,0 +1,233 @@ +package com.bs.system.service.impl; + +import com.bs.common.annotation.DataSource; +import com.bs.common.constant.CacheConstants; +import com.bs.common.constant.UserConstants; +import com.bs.common.core.redis.RedisCache; +import com.bs.common.core.text.Convert; +import com.bs.common.enums.DataSourceType; +import com.bs.common.exception.ServiceException; +import com.bs.common.utils.StringUtils; +import com.bs.system.domain.SysConfig; +import com.bs.system.mapper.SysConfigMapper; +import com.bs.system.service.ISysConfigService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import javax.annotation.PostConstruct; +import java.util.Collection; +import java.util.List; + +/** + * 参数配置 服务层实现 + * + * @author bs + */ +@Service +public class SysConfigServiceImpl implements ISysConfigService +{ + @Autowired + private SysConfigMapper configMapper; + + @Autowired + private RedisCache redisCache; + + /** + * 项目启动时,初始化参数到缓存 + */ + @PostConstruct + public void init() + { + loadingConfigCache(); + } + + /** + * 查询参数配置信息 + * + * @param configId 参数配置ID + * @return 参数配置信息 + */ + @Override + @DataSource(DataSourceType.MASTER) + public SysConfig selectConfigById(Long configId) + { + SysConfig config = new SysConfig(); + config.setConfigId(configId); + return configMapper.selectConfig(config); + } + + /** + * 根据键名查询参数配置信息 + * + * @param configKey 参数key + * @return 参数键值 + */ + @Override + public String selectConfigByKey(String configKey) + { + String configValue = Convert.toStr(redisCache.getCacheObject(getCacheKey(configKey))); + if (StringUtils.isNotEmpty(configValue)) + { + return configValue; + } + SysConfig config = new SysConfig(); + config.setConfigKey(configKey); + SysConfig retConfig = configMapper.selectConfig(config); + if (StringUtils.isNotNull(retConfig)) + { + redisCache.setCacheObject(getCacheKey(configKey), retConfig.getConfigValue()); + return retConfig.getConfigValue(); + } + return StringUtils.EMPTY; + } + + /** + * 获取验证码开关 + * + * @return true开启,false关闭 + */ + @Override + public boolean selectCaptchaEnabled() + { + String captchaEnabled = selectConfigByKey("sys.account.captchaEnabled"); + if (StringUtils.isEmpty(captchaEnabled)) + { + return true; + } + return Convert.toBool(captchaEnabled); + } + + /** + * 查询参数配置列表 + * + * @param config 参数配置信息 + * @return 参数配置集合 + */ + @Override + public List selectConfigList(SysConfig config) + { + return configMapper.selectConfigList(config); + } + + /** + * 新增参数配置 + * + * @param config 参数配置信息 + * @return 结果 + */ + @Override + public int insertConfig(SysConfig config) + { + int row = configMapper.insertConfig(config); + if (row > 0) + { + redisCache.setCacheObject(getCacheKey(config.getConfigKey()), config.getConfigValue()); + } + return row; + } + + /** + * 修改参数配置 + * + * @param config 参数配置信息 + * @return 结果 + */ + @Override + public int updateConfig(SysConfig config) + { + SysConfig temp = configMapper.selectConfigById(config.getConfigId()); + if (!StringUtils.equals(temp.getConfigKey(), config.getConfigKey())) + { + redisCache.deleteObject(getCacheKey(temp.getConfigKey())); + } + + int row = configMapper.updateConfig(config); + if (row > 0) + { + redisCache.setCacheObject(getCacheKey(config.getConfigKey()), config.getConfigValue()); + } + return row; + } + + /** + * 批量删除参数信息 + * + * @param configIds 需要删除的参数ID + */ + @Override + public void deleteConfigByIds(Long[] configIds) + { + for (Long configId : configIds) + { + SysConfig config = selectConfigById(configId); + if (StringUtils.equals(UserConstants.YES, config.getConfigType())) + { + throw new ServiceException(String.format("内置参数【%1$s】不能删除 ", config.getConfigKey())); + } + configMapper.deleteConfigById(configId); + redisCache.deleteObject(getCacheKey(config.getConfigKey())); + } + } + + /** + * 加载参数缓存数据 + */ + @Override + public void loadingConfigCache() + { + List configsList = configMapper.selectConfigList(new SysConfig()); + for (SysConfig config : configsList) + { + redisCache.setCacheObject(getCacheKey(config.getConfigKey()), config.getConfigValue()); + } + } + + /** + * 清空参数缓存数据 + */ + @Override + public void clearConfigCache() + { + Collection keys = redisCache.keys(CacheConstants.SYS_CONFIG_KEY + "*"); + redisCache.deleteObject(keys); + } + + /** + * 重置参数缓存数据 + */ + @Override + public void resetConfigCache() + { + clearConfigCache(); + loadingConfigCache(); + } + + /** + * 校验参数键名是否唯一 + * + * @param config 参数配置信息 + * @return 结果 + */ + @Override + public boolean checkConfigKeyUnique(SysConfig config) + { + Long configId = StringUtils.isNull(config.getConfigId()) ? -1L : config.getConfigId(); + SysConfig info = configMapper.checkConfigKeyUnique(config.getConfigKey()); + if (StringUtils.isNotNull(info) && info.getConfigId().longValue() != configId.longValue()) + { + return UserConstants.NOT_UNIQUE; + } + return UserConstants.UNIQUE; + } + + /** + * 设置cache key + * + * @param configKey 参数键 + * @return 缓存键key + */ + private String getCacheKey(String configKey) + { + return CacheConstants.SYS_CONFIG_KEY + configKey; + } +} diff --git a/bs-system/src/main/java/com/bs/system/service/impl/SysDeptServiceImpl.java b/bs-system/src/main/java/com/bs/system/service/impl/SysDeptServiceImpl.java new file mode 100644 index 0000000..44354a4 --- /dev/null +++ b/bs-system/src/main/java/com/bs/system/service/impl/SysDeptServiceImpl.java @@ -0,0 +1,344 @@ +package com.bs.system.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.bs.common.constant.UserConstants; +import com.bs.common.core.domain.TreeSelect; +import com.bs.common.core.domain.entity.SysDept; +import com.bs.common.core.domain.entity.SysRole; +import com.bs.common.core.domain.entity.SysUser; +import com.bs.common.core.text.Convert; +import com.bs.common.exception.ServiceException; +import com.bs.common.utils.SecurityUtils; +import com.bs.common.utils.StringUtils; +import com.bs.system.mapper.SysDeptMapper; +import com.bs.system.mapper.SysRoleMapper; +import com.bs.system.service.ISysDeptService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 部门管理 服务实现 + * + * @author bs + */ +@Service +public class SysDeptServiceImpl implements ISysDeptService +{ + @Autowired + private SysDeptMapper deptMapper; + + @Autowired + private SysRoleMapper roleMapper; + + /** + * 查询部门管理数据 + * + * @param dept 部门信息 + * @return 部门信息集合 + */ + @Override + public List selectDeptList(SysDept dept) + { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper(); + queryWrapper.eq(dept.getDeptId()!=null,SysDept::getDeptId,dept.getDeptId()); + queryWrapper.eq(dept.getParentId()!=null,SysDept::getParentId,dept.getParentId()); + queryWrapper.eq(StringUtils.isNotEmpty(dept.getStatus()),SysDept::getStatus,dept.getStatus()); + queryWrapper.like(StringUtils.isNotEmpty(dept.getDeptName()),SysDept::getDeptName,dept.getDeptName()); + + queryWrapper.orderByAsc(SysDept::getOrderNum); + return deptMapper.selectList(queryWrapper); + } + + /** + * 查询部门树结构信息 + * + * @param dept 部门信息 + * @return 部门树信息集合 + */ + @Override + public List selectDeptTreeList(SysDept dept) + { + List depts = this.selectDeptList(dept); + return buildDeptTreeSelect(depts); + } + + /** + * 构建前端所需要树结构 + * + * @param depts 部门列表 + * @return 树结构列表 + */ + @Override + public List buildDeptTree(List depts) + { + List returnList = new ArrayList(); + List tempList = depts.stream().map(SysDept::getDeptId).collect(Collectors.toList()); + for (SysDept dept : depts) + { + // 如果是顶级节点, 遍历该父节点的所有子节点 + if (!tempList.contains(dept.getParentId())) + { + recursionFn(depts, dept); + returnList.add(dept); + } + } + if (returnList.isEmpty()) + { + returnList = depts; + } + return returnList; + } + + /** + * 构建前端所需要下拉树结构 + * + * @param depts 部门列表 + * @return 下拉树结构列表 + */ + @Override + public List buildDeptTreeSelect(List depts) + { + List deptTrees = buildDeptTree(depts); + return deptTrees.stream().map(TreeSelect::new).collect(Collectors.toList()); + } + + /** + * 根据角色ID查询部门树信息 + * + * @param roleId 角色ID + * @return 选中部门列表 + */ + @Override + public List selectDeptListByRoleId(Long roleId) + { + SysRole role = roleMapper.selectRoleById(roleId); + return deptMapper.selectDeptListByRoleId(roleId, role.isDeptCheckStrictly()); + } + + /** + * 根据部门ID查询信息 + * + * @param deptId 部门ID + * @return 部门信息 + */ + @Override + public SysDept selectDeptById(Long deptId) + { + return deptMapper.selectDeptById(deptId); + } + + /** + * 根据ID查询所有子部门(正常状态) + * + * @param deptId 部门ID + * @return 子部门数 + */ + @Override + public int selectNormalChildrenDeptById(Long deptId) + { + return deptMapper.selectNormalChildrenDeptById(deptId); + } + + /** + * 是否存在子节点 + * + * @param deptId 部门ID + * @return 结果 + */ + @Override + public boolean hasChildByDeptId(Long deptId) + { + int result = deptMapper.hasChildByDeptId(deptId); + return result > 0; + } + + /** + * 查询部门是否存在用户 + * + * @param deptId 部门ID + * @return 结果 true 存在 false 不存在 + */ + @Override + public boolean checkDeptExistUser(Long deptId) + { + int result = deptMapper.checkDeptExistUser(deptId); + return result > 0; + } + + /** + * 校验部门名称是否唯一 + * + * @param dept 部门信息 + * @return 结果 + */ + @Override + public boolean checkDeptNameUnique(SysDept dept) + { + Long deptId = StringUtils.isNull(dept.getDeptId()) ? -1L : dept.getDeptId(); + SysDept info = deptMapper.checkDeptNameUnique(dept.getDeptName(), dept.getParentId()); + if (StringUtils.isNotNull(info) && info.getDeptId().longValue() != deptId.longValue()) + { + return UserConstants.NOT_UNIQUE; + } + return UserConstants.UNIQUE; + } + + /** + * 校验部门是否有数据权限 + * + * @param deptId 部门id + */ + @Override + public void checkDeptDataScope(Long deptId) + { + if (!SysUser.isAdmin(SecurityUtils.getUserId())) + { + SysDept dept = new SysDept(); + dept.setDeptId(deptId); + List depts = selectDeptList(dept); + if (StringUtils.isEmpty(depts)) + { + throw new ServiceException("没有权限访问部门数据!"); + } + } + } + + /** + * 新增保存部门信息 + * + * @param dept 部门信息 + * @return 结果 + */ + @Override + public int insertDept(SysDept dept) + { + SysDept info = deptMapper.selectDeptById(dept.getParentId()); + // 如果父节点不为正常状态,则不允许新增子节点 + if (!UserConstants.DEPT_NORMAL.equals(info.getStatus())) + { + throw new ServiceException("部门停用,不允许新增"); + } + dept.setAncestors(info.getAncestors() + "," + dept.getParentId()); + return deptMapper.insertDept(dept); + } + + /** + * 修改保存部门信息 + * + * @param dept 部门信息 + * @return 结果 + */ + @Override + public int updateDept(SysDept dept) + { + SysDept newParentDept = deptMapper.selectDeptById(dept.getParentId()); + SysDept oldDept = deptMapper.selectDeptById(dept.getDeptId()); + if (StringUtils.isNotNull(newParentDept) && StringUtils.isNotNull(oldDept)) + { + String newAncestors = newParentDept.getAncestors() + "," + newParentDept.getDeptId(); + String oldAncestors = oldDept.getAncestors(); + dept.setAncestors(newAncestors); + updateDeptChildren(dept.getDeptId(), newAncestors, oldAncestors); + } + int result = deptMapper.updateDept(dept); + if (UserConstants.DEPT_NORMAL.equals(dept.getStatus()) && StringUtils.isNotEmpty(dept.getAncestors()) + && !StringUtils.equals("0", dept.getAncestors())) + { + // 如果该部门是启用状态,则启用该部门的所有上级部门 + updateParentDeptStatusNormal(dept); + } + return result; + } + + /** + * 修改该部门的父级部门状态 + * + * @param dept 当前部门 + */ + private void updateParentDeptStatusNormal(SysDept dept) + { + String ancestors = dept.getAncestors(); + Long[] deptIds = Convert.toLongArray(ancestors); + deptMapper.updateDeptStatusNormal(deptIds); + } + + /** + * 修改子元素关系 + * + * @param deptId 被修改的部门ID + * @param newAncestors 新的父ID集合 + * @param oldAncestors 旧的父ID集合 + */ + public void updateDeptChildren(Long deptId, String newAncestors, String oldAncestors) + { + List children = deptMapper.selectChildrenDeptById(deptId); + for (SysDept child : children) + { + child.setAncestors(child.getAncestors().replaceFirst(oldAncestors, newAncestors)); + } + if (children.size() > 0) + { + deptMapper.updateDeptChildren(children); + } + } + + /** + * 删除部门管理信息 + * + * @param deptId 部门ID + * @return 结果 + */ + @Override + public int deleteDeptById(Long deptId) + { + return deptMapper.deleteDeptById(deptId); + } + + /** + * 递归列表 + */ + private void recursionFn(List list, SysDept t) + { + // 得到子节点列表 + List childList = getChildList(list, t); + t.setChildren(childList); + for (SysDept tChild : childList) + { + if (hasChild(list, tChild)) + { + recursionFn(list, tChild); + } + } + } + + /** + * 得到子节点列表 + */ + private List getChildList(List list, SysDept t) + { + List tlist = new ArrayList(); + Iterator it = list.iterator(); + while (it.hasNext()) + { + SysDept n = (SysDept) it.next(); + if (StringUtils.isNotNull(n.getParentId()) && n.getParentId().longValue() == t.getDeptId().longValue()) + { + tlist.add(n); + } + } + return tlist; + } + + /** + * 判断是否有子节点 + */ + private boolean hasChild(List list, SysDept t) + { + return getChildList(list, t).size() > 0; + } +} diff --git a/bs-system/src/main/java/com/bs/system/service/impl/SysDictDataServiceImpl.java b/bs-system/src/main/java/com/bs/system/service/impl/SysDictDataServiceImpl.java new file mode 100644 index 0000000..ea7f70d --- /dev/null +++ b/bs-system/src/main/java/com/bs/system/service/impl/SysDictDataServiceImpl.java @@ -0,0 +1,111 @@ +package com.bs.system.service.impl; + +import java.util.List; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.bs.common.core.domain.entity.SysDictData; +import com.bs.common.utils.DictUtils; +import com.bs.system.mapper.SysDictDataMapper; +import com.bs.system.service.ISysDictDataService; + +/** + * 字典 业务层处理 + * + * @author bs + */ +@Service +public class SysDictDataServiceImpl implements ISysDictDataService +{ + @Autowired + private SysDictDataMapper dictDataMapper; + + /** + * 根据条件分页查询字典数据 + * + * @param dictData 字典数据信息 + * @return 字典数据集合信息 + */ + @Override + public List selectDictDataList(SysDictData dictData) + { + return dictDataMapper.selectDictDataList(dictData); + } + + /** + * 根据字典类型和字典键值查询字典数据信息 + * + * @param dictType 字典类型 + * @param dictValue 字典键值 + * @return 字典标签 + */ + @Override + public String selectDictLabel(String dictType, String dictValue) + { + return dictDataMapper.selectDictLabel(dictType, dictValue); + } + + /** + * 根据字典数据ID查询信息 + * + * @param dictCode 字典数据ID + * @return 字典数据 + */ + @Override + public SysDictData selectDictDataById(Long dictCode) + { + return dictDataMapper.selectDictDataById(dictCode); + } + + /** + * 批量删除字典数据信息 + * + * @param dictCodes 需要删除的字典数据ID + */ + @Override + public void deleteDictDataByIds(Long[] dictCodes) + { + for (Long dictCode : dictCodes) + { + SysDictData data = selectDictDataById(dictCode); + dictDataMapper.deleteDictDataById(dictCode); + List dictDatas = dictDataMapper.selectDictDataByType(data.getDictType()); + DictUtils.setDictCache(data.getDictType(), dictDatas); + } + } + + /** + * 新增保存字典数据信息 + * + * @param data 字典数据信息 + * @return 结果 + */ + @Override + public int insertDictData(SysDictData data) + { + int row = dictDataMapper.insertDictData(data); + if (row > 0) + { + List dictDatas = dictDataMapper.selectDictDataByType(data.getDictType()); + DictUtils.setDictCache(data.getDictType(), dictDatas); + } + return row; + } + + /** + * 修改保存字典数据信息 + * + * @param data 字典数据信息 + * @return 结果 + */ + @Override + public int updateDictData(SysDictData data) + { + int row = dictDataMapper.updateDictData(data); + if (row > 0) + { + List dictDatas = dictDataMapper.selectDictDataByType(data.getDictType()); + DictUtils.setDictCache(data.getDictType(), dictDatas); + } + return row; + } +} diff --git a/bs-system/src/main/java/com/bs/system/service/impl/SysDictTypeServiceImpl.java b/bs-system/src/main/java/com/bs/system/service/impl/SysDictTypeServiceImpl.java new file mode 100644 index 0000000..8c02b05 --- /dev/null +++ b/bs-system/src/main/java/com/bs/system/service/impl/SysDictTypeServiceImpl.java @@ -0,0 +1,224 @@ +package com.bs.system.service.impl; + +import com.bs.common.constant.UserConstants; +import com.bs.common.core.domain.entity.SysDictData; +import com.bs.common.core.domain.entity.SysDictType; +import com.bs.common.exception.ServiceException; +import com.bs.common.utils.DictUtils; +import com.bs.common.utils.StringUtils; +import com.bs.system.mapper.SysDictDataMapper; +import com.bs.system.mapper.SysDictTypeMapper; +import com.bs.system.service.ISysDictTypeService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.PostConstruct; +import java.util.Comparator; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * 字典 业务层处理 + * + * @author bs + */ +@Service +public class SysDictTypeServiceImpl implements ISysDictTypeService +{ + @Autowired + private SysDictTypeMapper dictTypeMapper; + + @Autowired + private SysDictDataMapper dictDataMapper; + + /** + * 项目启动时,初始化字典到缓存 + */ + @PostConstruct + public void init() + { + loadingDictCache(); + } + + /** + * 根据条件分页查询字典类型 + * + * @param dictType 字典类型信息 + * @return 字典类型集合信息 + */ + @Override + public List selectDictTypeList(SysDictType dictType) + { + return dictTypeMapper.selectDictTypeList(dictType); + } + + /** + * 根据所有字典类型 + * + * @return 字典类型集合信息 + */ + @Override + public List selectDictTypeAll() + { + return dictTypeMapper.selectDictTypeAll(); + } + + /** + * 根据字典类型查询字典数据 + * + * @param dictType 字典类型 + * @return 字典数据集合信息 + */ + @Override + public List selectDictDataByType(String dictType) + { + List dictDatas = DictUtils.getDictCache(dictType); + if (StringUtils.isNotEmpty(dictDatas)) + { + return dictDatas; + } + dictDatas = dictDataMapper.selectDictDataByType(dictType); + if (StringUtils.isNotEmpty(dictDatas)) + { + DictUtils.setDictCache(dictType, dictDatas); + return dictDatas; + } + return null; + } + + /** + * 根据字典类型ID查询信息 + * + * @param dictId 字典类型ID + * @return 字典类型 + */ + @Override + public SysDictType selectDictTypeById(Long dictId) + { + return dictTypeMapper.selectDictTypeById(dictId); + } + + /** + * 根据字典类型查询信息 + * + * @param dictType 字典类型 + * @return 字典类型 + */ + @Override + public SysDictType selectDictTypeByType(String dictType) + { + return dictTypeMapper.selectDictTypeByType(dictType); + } + + /** + * 批量删除字典类型信息 + * + * @param dictIds 需要删除的字典ID + */ + @Override + public void deleteDictTypeByIds(Long[] dictIds) + { + for (Long dictId : dictIds) + { + SysDictType dictType = selectDictTypeById(dictId); + if (dictDataMapper.countDictDataByType(dictType.getDictType()) > 0) + { + throw new ServiceException(String.format("%1$s已分配,不能删除", dictType.getDictName())); + } + dictTypeMapper.deleteDictTypeById(dictId); + DictUtils.removeDictCache(dictType.getDictType()); + } + } + + /** + * 加载字典缓存数据 + */ + @Override + public void loadingDictCache() + { + SysDictData dictData = new SysDictData(); + dictData.setStatus("0"); + Map> dictDataMap = dictDataMapper.selectDictDataList(dictData).stream().collect(Collectors.groupingBy(SysDictData::getDictType)); + for (Map.Entry> entry : dictDataMap.entrySet()) + { + DictUtils.setDictCache(entry.getKey(), entry.getValue().stream().sorted(Comparator.comparing(SysDictData::getDictSort)).collect(Collectors.toList())); + } + } + + /** + * 清空字典缓存数据 + */ + @Override + public void clearDictCache() + { + DictUtils.clearDictCache(); + } + + /** + * 重置字典缓存数据 + */ + @Override + public void resetDictCache() + { + clearDictCache(); + loadingDictCache(); + } + + /** + * 新增保存字典类型信息 + * + * @param dict 字典类型信息 + * @return 结果 + */ + @Override + public int insertDictType(SysDictType dict) + { + int row = dictTypeMapper.insertDictType(dict); + if (row > 0) + { + DictUtils.setDictCache(dict.getDictType(), null); + } + return row; + } + + /** + * 修改保存字典类型信息 + * + * @param dict 字典类型信息 + * @return 结果 + */ + @Override + @Transactional + public int updateDictType(SysDictType dict) + { + SysDictType oldDict = dictTypeMapper.selectDictTypeById(dict.getDictId()); + dictDataMapper.updateDictDataType(oldDict.getDictType(), dict.getDictType()); + int row = dictTypeMapper.updateDictType(dict); + if (row > 0) + { + List dictDatas = dictDataMapper.selectDictDataByType(dict.getDictType()); + DictUtils.setDictCache(dict.getDictType(), dictDatas); + } + return row; + } + + /** + * 校验字典类型称是否唯一 + * + * @param dict 字典类型 + * @return 结果 + */ + @Override + public boolean checkDictTypeUnique(SysDictType dict) + { + Long dictId = StringUtils.isNull(dict.getDictId()) ? -1L : dict.getDictId(); + SysDictType dictType = dictTypeMapper.checkDictTypeUnique(dict.getDictType()); + if (StringUtils.isNotNull(dictType) && dictType.getDictId().longValue() != dictId.longValue()) + { + return UserConstants.NOT_UNIQUE; + } + return UserConstants.UNIQUE; + } +} diff --git a/bs-system/src/main/java/com/bs/system/service/impl/SysLogininforServiceImpl.java b/bs-system/src/main/java/com/bs/system/service/impl/SysLogininforServiceImpl.java new file mode 100644 index 0000000..e41da5c --- /dev/null +++ b/bs-system/src/main/java/com/bs/system/service/impl/SysLogininforServiceImpl.java @@ -0,0 +1,65 @@ +package com.bs.system.service.impl; + +import java.util.List; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.bs.system.domain.SysLogininfor; +import com.bs.system.mapper.SysLogininforMapper; +import com.bs.system.service.ISysLogininforService; + +/** + * 系统访问日志情况信息 服务层处理 + * + * @author bs + */ +@Service +public class SysLogininforServiceImpl implements ISysLogininforService +{ + + @Autowired + private SysLogininforMapper logininforMapper; + + /** + * 新增系统登录日志 + * + * @param logininfor 访问日志对象 + */ + @Override + public void insertLogininfor(SysLogininfor logininfor) + { + logininforMapper.insertLogininfor(logininfor); + } + + /** + * 查询系统登录日志集合 + * + * @param logininfor 访问日志对象 + * @return 登录记录集合 + */ + @Override + public List selectLogininforList(SysLogininfor logininfor) + { + return logininforMapper.selectLogininforList(logininfor); + } + + /** + * 批量删除系统登录日志 + * + * @param infoIds 需要删除的登录日志ID + * @return 结果 + */ + @Override + public int deleteLogininforByIds(Long[] infoIds) + { + return logininforMapper.deleteLogininforByIds(infoIds); + } + + /** + * 清空系统登录日志 + */ + @Override + public void cleanLogininfor() + { + logininforMapper.cleanLogininfor(); + } +} diff --git a/bs-system/src/main/java/com/bs/system/service/impl/SysMenuServiceImpl.java b/bs-system/src/main/java/com/bs/system/service/impl/SysMenuServiceImpl.java new file mode 100644 index 0000000..78a5709 --- /dev/null +++ b/bs-system/src/main/java/com/bs/system/service/impl/SysMenuServiceImpl.java @@ -0,0 +1,502 @@ +package com.bs.system.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.bs.common.constant.Constants; +import com.bs.common.constant.UserConstants; +import com.bs.common.core.domain.TreeSelect; +import com.bs.common.core.domain.entity.SysMenu; +import com.bs.common.core.domain.entity.SysRole; +import com.bs.common.core.domain.entity.SysUser; +import com.bs.common.utils.SecurityUtils; +import com.bs.common.utils.StringUtils; +import com.bs.system.domain.SysRoleMenu; +import com.bs.system.domain.SysUserRole; +import com.bs.system.domain.vo.MetaVo; +import com.bs.system.domain.vo.RouterVo; +import com.bs.system.mapper.SysMenuMapper; +import com.bs.system.mapper.SysRoleMapper; +import com.bs.system.mapper.SysRoleMenuMapper; +import com.bs.system.mapper.SysUserRoleMapper; +import com.bs.system.service.ISysMenuService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * 菜单 业务层处理 + * + * @author bs + */ +@Service +public class SysMenuServiceImpl implements ISysMenuService { + public static final String PREMISSION_STRING = "perms[\"{0}\"]"; + + @Autowired + private SysMenuMapper menuMapper; + + @Autowired + private SysRoleMapper roleMapper; + + @Autowired + private SysRoleMenuMapper roleMenuMapper; + + @Autowired + private SysUserRoleMapper userRoleMapper; + + /** + * 根据用户查询系统菜单列表 + * + * @param userId 用户ID + * @return 菜单列表 + */ + @Override + public List selectMenuList(Long userId) { + return selectMenuList(new SysMenu(), userId); + } + + /** + * 查询系统菜单列表 + * + * @param menu 菜单信息 + * @return 菜单列表 + */ + @Override + public List selectMenuList(SysMenu menu, Long userId) { + List menuList = null; + // 管理员显示所有菜单信息 + if (SysUser.isAdmin(userId)) { + menuList = menuMapper.selectMenuList(menu); + } else { + menu.getParams().put("userId", userId); + menuList = menuMapper.selectMenuListByUserId(menu); + } + return menuList; + } + + /** + * 根据用户ID查询权限 + * + * @param userId 用户ID + * @return 权限列表 + */ + @Override + public Set selectMenuPermsByUserId(Long userId) { + //1 用户有哪些角色,2角色有哪些菜单 + LambdaQueryWrapper userRoleWrapper = new LambdaQueryWrapper<>(); + userRoleWrapper.select(SysUserRole::getRoleId); + userRoleWrapper.eq(SysUserRole::getUserId, userId); + List roleIds = userRoleMapper.selectObjs(userRoleWrapper); + LambdaQueryWrapper roleMenuWrapper = new LambdaQueryWrapper<>(); + roleMenuWrapper.select(SysRoleMenu::getMenuId); + roleMenuWrapper.in(SysRoleMenu::getRoleId, roleIds); + List menuIds = roleMenuMapper.selectObjs(roleMenuWrapper); + return getStrings(menuIds); + } + + /** + * 根据角色ID查询权限 + * + * @param roleId 角色ID + * @return 权限列表 + */ + @Override + public Set selectMenuPermsByRoleId(Long roleId) { + LambdaQueryWrapper roleMenuWrapper = new LambdaQueryWrapper<>(); + roleMenuWrapper.select(SysRoleMenu::getMenuId); + roleMenuWrapper.eq(SysRoleMenu::getRoleId, roleId); + List menuIds = roleMenuMapper.selectObjs(roleMenuWrapper); + return getStrings(menuIds); + } + + private Set getStrings(List menuIds) { + LambdaQueryWrapper menuWrapper = new LambdaQueryWrapper<>(); + menuWrapper.select(SysMenu::getPerms); + menuWrapper.in(SysMenu::getMenuId, menuIds); + menuWrapper.eq(SysMenu::getStatus, "0"); + List perms = menuMapper.selectObjs(menuWrapper); + Set permsSet = new HashSet<>(); + for (Object perm : perms) { + if (StringUtils.isNotNull(perm)) { + permsSet.addAll(Arrays.asList(perm.toString().trim().split(","))); + } + } + return permsSet; + } + + /** + * 根据用户ID查询菜单 + * + * @param userId 用户名称 + * @return 菜单列表 + */ + @Override + public List selectMenuTreeByUserId(Long userId) { + List menus = null; + if (SecurityUtils.isAdmin(userId)) { + List types = new ArrayList<>(); + types.add("M"); + types.add("C"); + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(SysMenu::getStatus, "0"); + wrapper.in(SysMenu::getMenuType, types); + wrapper.orderByAsc(SysMenu::getOrderNum); + menus = menuMapper.selectList(wrapper); + } else { + LambdaQueryWrapper userRoleWrapper = new LambdaQueryWrapper<>(); + userRoleWrapper.select(SysUserRole::getRoleId); + userRoleWrapper.eq(SysUserRole::getUserId, userId); + List roleIds = userRoleMapper.selectObjs(userRoleWrapper); + LambdaQueryWrapper roleMenuWrapper = new LambdaQueryWrapper<>(); + roleMenuWrapper.select(SysRoleMenu::getMenuId); + roleMenuWrapper.in(SysRoleMenu::getRoleId, roleIds); + List menuIds = roleMenuMapper.selectObjs(roleMenuWrapper); + LambdaQueryWrapper menuWrapper = new LambdaQueryWrapper<>(); + menuWrapper.in(SysMenu::getMenuId, menuIds); + menuWrapper.orderByAsc(SysMenu::getOrderNum); + menus = menuMapper.selectList(menuWrapper); + } + return getChildPerms(menus, 0); + } + + /** + * 根据角色ID查询菜单树信息 + * + * @param roleId 角色ID + * @return 选中菜单列表 + */ + @Override + public List selectMenuListByRoleId(Long roleId) { + SysRole role = roleMapper.selectRoleById(roleId); + return menuMapper.selectMenuListByRoleId(roleId, role.isMenuCheckStrictly()); + } + + /** + * 构建前端路由所需要的菜单 + * + * @param menus 菜单列表 + * @return 路由列表 + */ + @Override + public List buildMenus(List menus) { + List routers = new LinkedList(); + for (SysMenu menu : menus) { + RouterVo router = new RouterVo(); + router.setHidden("1".equals(menu.getVisible())); + router.setName(getRouteName(menu)); + router.setPath(getRouterPath(menu)); + router.setComponent(getComponent(menu)); + router.setQuery(menu.getQuery()); + router.setMeta(new MetaVo(menu.getMenuName(), menu.getIcon(), StringUtils.equals("1", menu.getIsCache()), menu.getPath())); + List cMenus = menu.getChildren(); + if (StringUtils.isNotEmpty(cMenus) && UserConstants.TYPE_DIR.equals(menu.getMenuType())) { + router.setAlwaysShow(true); + router.setRedirect("noRedirect"); + router.setChildren(buildMenus(cMenus)); + } else if (isMenuFrame(menu)) { + router.setMeta(null); + List childrenList = new ArrayList(); + RouterVo children = new RouterVo(); + children.setPath(menu.getPath()); + children.setComponent(menu.getComponent()); + children.setName(StringUtils.capitalize(menu.getPath())); + children.setMeta(new MetaVo(menu.getMenuName(), menu.getIcon(), StringUtils.equals("1", menu.getIsCache()), menu.getPath())); + children.setQuery(menu.getQuery()); + childrenList.add(children); + router.setChildren(childrenList); + } else if (menu.getParentId().intValue() == 0 && isInnerLink(menu)) { + router.setMeta(new MetaVo(menu.getMenuName(), menu.getIcon())); + router.setPath("/"); + List childrenList = new ArrayList(); + RouterVo children = new RouterVo(); + String routerPath = innerLinkReplaceEach(menu.getPath()); + children.setPath(routerPath); + children.setComponent(UserConstants.INNER_LINK); + children.setName(StringUtils.capitalize(routerPath)); + children.setMeta(new MetaVo(menu.getMenuName(), menu.getIcon(), menu.getPath())); + childrenList.add(children); + router.setChildren(childrenList); + } + routers.add(router); + } + return routers; + } + + /** + * 构建前端所需要树结构 + * + * @param menus 菜单列表 + * @return 树结构列表 + */ + @Override + public List buildMenuTree(List menus) { + List returnList = new ArrayList(); + List tempList = menus.stream().map(SysMenu::getMenuId).collect(Collectors.toList()); + for (Iterator iterator = menus.iterator(); iterator.hasNext(); ) { + SysMenu menu = (SysMenu) iterator.next(); + // 如果是顶级节点, 遍历该父节点的所有子节点 + if (!tempList.contains(menu.getParentId())) { + recursionFn(menus, menu); + returnList.add(menu); + } + } + if (returnList.isEmpty()) { + returnList = menus; + } + return returnList; + } + + /** + * 构建前端所需要下拉树结构 + * + * @param menus 菜单列表 + * @return 下拉树结构列表 + */ + @Override + public List buildMenuTreeSelect(List menus) { + List menuTrees = buildMenuTree(menus); + return menuTrees.stream().map(TreeSelect::new).collect(Collectors.toList()); + } + + /** + * 根据菜单ID查询信息 + * + * @param menuId 菜单ID + * @return 菜单信息 + */ + @Override + public SysMenu selectMenuById(Long menuId) { + return menuMapper.selectMenuById(menuId); + } + + /** + * 是否存在菜单子节点 + * + * @param menuId 菜单ID + * @return 结果 + */ + @Override + public boolean hasChildByMenuId(Long menuId) { + int result = menuMapper.hasChildByMenuId(menuId); + return result > 0; + } + + /** + * 查询菜单使用数量 + * + * @param menuId 菜单ID + * @return 结果 + */ + @Override + public boolean checkMenuExistRole(Long menuId) { + int result = roleMenuMapper.checkMenuExistRole(menuId); + return result > 0; + } + + /** + * 新增保存菜单信息 + * + * @param menu 菜单信息 + * @return 结果 + */ + @Override + public int insertMenu(SysMenu menu) { + return menuMapper.insertMenu(menu); + } + + /** + * 修改保存菜单信息 + * + * @param menu 菜单信息 + * @return 结果 + */ + @Override + public int updateMenu(SysMenu menu) { + return menuMapper.updateMenu(menu); + } + + /** + * 删除菜单管理信息 + * + * @param menuId 菜单ID + * @return 结果 + */ + @Override + public int deleteMenuById(Long menuId) { + return menuMapper.deleteMenuById(menuId); + } + + /** + * 校验菜单名称是否唯一 + * + * @param menu 菜单信息 + * @return 结果 + */ + @Override + public boolean checkMenuNameUnique(SysMenu menu) { + Long menuId = StringUtils.isNull(menu.getMenuId()) ? -1L : menu.getMenuId(); + SysMenu info = menuMapper.checkMenuNameUnique(menu.getMenuName(), menu.getParentId()); + if (StringUtils.isNotNull(info) && info.getMenuId().longValue() != menuId.longValue()) { + return UserConstants.NOT_UNIQUE; + } + return UserConstants.UNIQUE; + } + + /** + * 获取路由名称 + * + * @param menu 菜单信息 + * @return 路由名称 + */ + public String getRouteName(SysMenu menu) { + String routerName = StringUtils.capitalize(menu.getPath()); + // 非外链并且是一级目录(类型为目录) + if (isMenuFrame(menu)) { + routerName = StringUtils.EMPTY; + } + return routerName; + } + + /** + * 获取路由地址 + * + * @param menu 菜单信息 + * @return 路由地址 + */ + public String getRouterPath(SysMenu menu) { + String routerPath = menu.getPath(); + // 内链打开外网方式 + if (menu.getParentId().intValue() != 0 && isInnerLink(menu)) { + routerPath = innerLinkReplaceEach(routerPath); + } + // 非外链并且是一级目录(类型为目录) + if (0 == menu.getParentId().intValue() && UserConstants.TYPE_DIR.equals(menu.getMenuType()) + && UserConstants.NO_FRAME.equals(menu.getIsFrame())) { + routerPath = "/" + menu.getPath(); + } + // 非外链并且是一级目录(类型为菜单) + else if (isMenuFrame(menu)) { + routerPath = "/"; + } + return routerPath; + } + + /** + * 获取组件信息 + * + * @param menu 菜单信息 + * @return 组件信息 + */ + public String getComponent(SysMenu menu) { + String component = UserConstants.LAYOUT; + if (StringUtils.isNotEmpty(menu.getComponent()) && !isMenuFrame(menu)) { + component = menu.getComponent(); + } else if (StringUtils.isEmpty(menu.getComponent()) && menu.getParentId().intValue() != 0 && isInnerLink(menu)) { + component = UserConstants.INNER_LINK; + } else if (StringUtils.isEmpty(menu.getComponent()) && isParentView(menu)) { + component = UserConstants.PARENT_VIEW; + } + return component; + } + + /** + * 是否为菜单内部跳转 + * + * @param menu 菜单信息 + * @return 结果 + */ + public boolean isMenuFrame(SysMenu menu) { + return menu.getParentId().intValue() == 0 && UserConstants.TYPE_MENU.equals(menu.getMenuType()) + && menu.getIsFrame().equals(UserConstants.NO_FRAME); + } + + /** + * 是否为内链组件 + * + * @param menu 菜单信息 + * @return 结果 + */ + public boolean isInnerLink(SysMenu menu) { + return menu.getIsFrame().equals(UserConstants.NO_FRAME) && StringUtils.ishttp(menu.getPath()); + } + + /** + * 是否为parent_view组件 + * + * @param menu 菜单信息 + * @return 结果 + */ + public boolean isParentView(SysMenu menu) { + return menu.getParentId().intValue() != 0 && UserConstants.TYPE_DIR.equals(menu.getMenuType()); + } + + /** + * 根据父节点的ID获取所有子节点 + * + * @param list 分类表 + * @param parentId 传入的父节点ID + * @return String + */ + public List getChildPerms(List list, int parentId) { + List returnList = new ArrayList(); + for (Iterator iterator = list.iterator(); iterator.hasNext(); ) { + SysMenu t = (SysMenu) iterator.next(); + // 一、根据传入的某个父节点ID,遍历该父节点的所有子节点 + if (t.getParentId() == parentId) { + recursionFn(list, t); + returnList.add(t); + } + } + return returnList; + } + + /** + * 递归列表 + * + * @param list 分类表 + * @param t 子节点 + */ + private void recursionFn(List list, SysMenu t) { + // 得到子节点列表 + List childList = getChildList(list, t); + t.setChildren(childList); + for (SysMenu tChild : childList) { + if (hasChild(list, tChild)) { + recursionFn(list, tChild); + } + } + } + + /** + * 得到子节点列表 + */ + private List getChildList(List list, SysMenu t) { + List tlist = new ArrayList(); + Iterator it = list.iterator(); + while (it.hasNext()) { + SysMenu n = (SysMenu) it.next(); + if (n.getParentId().longValue() == t.getMenuId().longValue()) { + tlist.add(n); + } + } + return tlist; + } + + /** + * 判断是否有子节点 + */ + private boolean hasChild(List list, SysMenu t) { + return getChildList(list, t).size() > 0; + } + + /** + * 内链域名特殊字符替换 + * + * @return 替换后的内链域名 + */ + public String innerLinkReplaceEach(String path) { + return StringUtils.replaceEach(path, new String[]{Constants.HTTP, Constants.HTTPS, Constants.WWW, "."}, + new String[]{"", "", "", "/"}); + } +} diff --git a/bs-system/src/main/java/com/bs/system/service/impl/SysNoticeServiceImpl.java b/bs-system/src/main/java/com/bs/system/service/impl/SysNoticeServiceImpl.java new file mode 100644 index 0000000..858a17c --- /dev/null +++ b/bs-system/src/main/java/com/bs/system/service/impl/SysNoticeServiceImpl.java @@ -0,0 +1,19 @@ +package com.bs.system.service.impl; + +import com.bs.system.mapper.SysNoticeMapper; +import com.bs.system.domain.SysNotice; +import com.bs.system.service.ISysNoticeService; +import com.github.yulichang.base.MPJBaseServiceImpl; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +/** + * 通知公告Service业务层处理 + * + * @author bs + * @date 2023-08-06 + */ +@Service +@Transactional(rollbackFor = Exception.class) +public class SysNoticeServiceImpl extends MPJBaseServiceImpl implements ISysNoticeService { + +} diff --git a/bs-system/src/main/java/com/bs/system/service/impl/SysOperLogServiceImpl.java b/bs-system/src/main/java/com/bs/system/service/impl/SysOperLogServiceImpl.java new file mode 100644 index 0000000..33dfb2d --- /dev/null +++ b/bs-system/src/main/java/com/bs/system/service/impl/SysOperLogServiceImpl.java @@ -0,0 +1,76 @@ +package com.bs.system.service.impl; + +import java.util.List; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.bs.system.domain.SysOperLog; +import com.bs.system.mapper.SysOperLogMapper; +import com.bs.system.service.ISysOperLogService; + +/** + * 操作日志 服务层处理 + * + * @author bs + */ +@Service +public class SysOperLogServiceImpl implements ISysOperLogService +{ + @Autowired + private SysOperLogMapper operLogMapper; + + /** + * 新增操作日志 + * + * @param operLog 操作日志对象 + */ + @Override + public void insertOperlog(SysOperLog operLog) + { + operLogMapper.insertOperlog(operLog); + } + + /** + * 查询系统操作日志集合 + * + * @param operLog 操作日志对象 + * @return 操作日志集合 + */ + @Override + public List selectOperLogList(SysOperLog operLog) + { + return operLogMapper.selectOperLogList(operLog); + } + + /** + * 批量删除系统操作日志 + * + * @param operIds 需要删除的操作日志ID + * @return 结果 + */ + @Override + public int deleteOperLogByIds(Long[] operIds) + { + return operLogMapper.deleteOperLogByIds(operIds); + } + + /** + * 查询操作日志详细 + * + * @param operId 操作ID + * @return 操作日志对象 + */ + @Override + public SysOperLog selectOperLogById(Long operId) + { + return operLogMapper.selectOperLogById(operId); + } + + /** + * 清空操作日志 + */ + @Override + public void cleanOperLog() + { + operLogMapper.cleanOperLog(); + } +} diff --git a/bs-system/src/main/java/com/bs/system/service/impl/SysPostServiceImpl.java b/bs-system/src/main/java/com/bs/system/service/impl/SysPostServiceImpl.java new file mode 100644 index 0000000..14aacac --- /dev/null +++ b/bs-system/src/main/java/com/bs/system/service/impl/SysPostServiceImpl.java @@ -0,0 +1,178 @@ +package com.bs.system.service.impl; + +import java.util.List; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.bs.common.constant.UserConstants; +import com.bs.common.exception.ServiceException; +import com.bs.common.utils.StringUtils; +import com.bs.system.domain.SysPost; +import com.bs.system.mapper.SysPostMapper; +import com.bs.system.mapper.SysUserPostMapper; +import com.bs.system.service.ISysPostService; + +/** + * 岗位信息 服务层处理 + * + * @author bs + */ +@Service +public class SysPostServiceImpl implements ISysPostService +{ + @Autowired + private SysPostMapper postMapper; + + @Autowired + private SysUserPostMapper userPostMapper; + + /** + * 查询岗位信息集合 + * + * @param post 岗位信息 + * @return 岗位信息集合 + */ + @Override + public List selectPostList(SysPost post) + { + return postMapper.selectPostList(post); + } + + /** + * 查询所有岗位 + * + * @return 岗位列表 + */ + @Override + public List selectPostAll() + { + return postMapper.selectPostAll(); + } + + /** + * 通过岗位ID查询岗位信息 + * + * @param postId 岗位ID + * @return 角色对象信息 + */ + @Override + public SysPost selectPostById(Long postId) + { + return postMapper.selectPostById(postId); + } + + /** + * 根据用户ID获取岗位选择框列表 + * + * @param userId 用户ID + * @return 选中岗位ID列表 + */ + @Override + public List selectPostListByUserId(Long userId) + { + return postMapper.selectPostListByUserId(userId); + } + + /** + * 校验岗位名称是否唯一 + * + * @param post 岗位信息 + * @return 结果 + */ + @Override + public boolean checkPostNameUnique(SysPost post) + { + Long postId = StringUtils.isNull(post.getPostId()) ? -1L : post.getPostId(); + SysPost info = postMapper.checkPostNameUnique(post.getPostName()); + if (StringUtils.isNotNull(info) && info.getPostId().longValue() != postId.longValue()) + { + return UserConstants.NOT_UNIQUE; + } + return UserConstants.UNIQUE; + } + + /** + * 校验岗位编码是否唯一 + * + * @param post 岗位信息 + * @return 结果 + */ + @Override + public boolean checkPostCodeUnique(SysPost post) + { + Long postId = StringUtils.isNull(post.getPostId()) ? -1L : post.getPostId(); + SysPost info = postMapper.checkPostCodeUnique(post.getPostCode()); + if (StringUtils.isNotNull(info) && info.getPostId().longValue() != postId.longValue()) + { + return UserConstants.NOT_UNIQUE; + } + return UserConstants.UNIQUE; + } + + /** + * 通过岗位ID查询岗位使用数量 + * + * @param postId 岗位ID + * @return 结果 + */ + @Override + public int countUserPostById(Long postId) + { + return userPostMapper.countUserPostById(postId); + } + + /** + * 删除岗位信息 + * + * @param postId 岗位ID + * @return 结果 + */ + @Override + public int deletePostById(Long postId) + { + return postMapper.deletePostById(postId); + } + + /** + * 批量删除岗位信息 + * + * @param postIds 需要删除的岗位ID + * @return 结果 + */ + @Override + public int deletePostByIds(Long[] postIds) + { + for (Long postId : postIds) + { + SysPost post = selectPostById(postId); + if (countUserPostById(postId) > 0) + { + throw new ServiceException(String.format("%1$s已分配,不能删除", post.getPostName())); + } + } + return postMapper.deletePostByIds(postIds); + } + + /** + * 新增保存岗位信息 + * + * @param post 岗位信息 + * @return 结果 + */ + @Override + public int insertPost(SysPost post) + { + return postMapper.insertPost(post); + } + + /** + * 修改保存岗位信息 + * + * @param post 岗位信息 + * @return 结果 + */ + @Override + public int updatePost(SysPost post) + { + return postMapper.updatePost(post); + } +} diff --git a/bs-system/src/main/java/com/bs/system/service/impl/SysRoleServiceImpl.java b/bs-system/src/main/java/com/bs/system/service/impl/SysRoleServiceImpl.java new file mode 100644 index 0000000..6ba9b5d --- /dev/null +++ b/bs-system/src/main/java/com/bs/system/service/impl/SysRoleServiceImpl.java @@ -0,0 +1,433 @@ +package com.bs.system.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.bs.common.constant.UserConstants; +import com.bs.common.core.domain.entity.SysRole; +import com.bs.common.core.domain.entity.SysUser; +import com.bs.common.exception.ServiceException; +import com.bs.common.utils.SecurityUtils; +import com.bs.common.utils.StringUtils; +import com.bs.common.utils.spring.SpringUtils; +import com.bs.system.domain.SysRoleDept; +import com.bs.system.domain.SysRoleMenu; +import com.bs.system.domain.SysUserRole; +import com.bs.system.mapper.SysRoleDeptMapper; +import com.bs.system.mapper.SysRoleMapper; +import com.bs.system.mapper.SysRoleMenuMapper; +import com.bs.system.mapper.SysUserRoleMapper; +import com.bs.system.service.ISysRoleService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; + +/** + * 角色 业务层处理 + * + * @author bs + */ +@Service +public class SysRoleServiceImpl implements ISysRoleService +{ + @Autowired + private SysRoleMapper roleMapper; + + @Autowired + private SysRoleMenuMapper roleMenuMapper; + + @Autowired + private SysUserRoleMapper userRoleMapper; + + @Autowired + private SysRoleDeptMapper roleDeptMapper; + + /** + * 根据条件分页查询角色数据 + * + * @param role 角色信息 + * @return 角色数据集合信息 + */ + @Override + public List selectRoleList(SysRole role) + { + LambdaQueryWrapper wrapper= new LambdaQueryWrapper<>(); + wrapper.eq(role.getRoleId()!=null,SysRole::getRoleId,role.getRoleId()); + wrapper.eq(StringUtils.isNotEmpty(role.getStatus()),SysRole::getStatus,role.getStatus()); + wrapper.like(StringUtils.isNotEmpty(role.getRoleName()),SysRole::getRoleName,role.getRoleName()); + wrapper.like(StringUtils.isNotEmpty(role.getRoleKey()),SysRole::getRoleKey,role.getRoleKey()); + wrapper.ge(StringUtils.isNotNull(role.getParams().get("beginTime")), SysRole::getCreateTime,role.getParams().get("beginTime")); + wrapper.le(StringUtils.isNotNull(role.getParams().get("endTime")), SysRole::getCreateTime,role.getParams().get("endTime")); + wrapper.orderByAsc(SysRole::getRoleSort); + return roleMapper.selectList(wrapper); + } + + /** + * 根据用户ID查询角色 + * + * @param userId 用户ID + * @return 角色列表 + */ + @Override + public List selectRolesByUserId(Long userId) + { + List userRoles = roleMapper.selectRolePermissionByUserId(userId); + List roles = selectRoleAll(); + for (SysRole role : roles) + { + for (SysRole userRole : userRoles) + { + if (role.getRoleId().longValue() == userRole.getRoleId().longValue()) + { + role.setFlag(true); + break; + } + } + } + return roles; + } + + /** + * 根据用户ID查询权限 + * + * @param userId 用户ID + * @return 权限列表 + */ + @Override + public Set selectRolePermissionByUserId(Long userId) + { + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.select(SysUserRole::getRoleId); + lambdaQueryWrapper.eq(SysUserRole::getUserId,userId); + List userRoles =userRoleMapper.selectObjs(lambdaQueryWrapper); + if(userRoles.isEmpty()){ + return null; + } + List perms = roleMapper.selectBatchIds((List)(List)userRoles); + Set permsSet = new HashSet<>(); + for (SysRole perm : perms) { + if (StringUtils.isNotNull(perm)) { + permsSet.addAll(Arrays.asList(perm.getRoleKey().trim().split(","))); + } + } + return permsSet; + } + + /** + * 查询所有角色 + * + * @return 角色列表 + */ + @Override + public List selectRoleAll() + { + return SpringUtils.getAopProxy(this).selectRoleList(new SysRole()); + } + + /** + * 根据用户ID获取角色选择框列表 + * + * @param userId 用户ID + * @return 选中角色ID列表 + */ + @Override + public List selectRoleListByUserId(Long userId) + { + return roleMapper.selectRoleListByUserId(userId); + } + + /** + * 通过角色ID查询角色 + * + * @param roleId 角色ID + * @return 角色对象信息 + */ + @Override + public SysRole selectRoleById(Long roleId) + { + return roleMapper.selectRoleById(roleId); + } + + /** + * 校验角色名称是否唯一 + * + * @param role 角色信息 + * @return 结果 + */ + @Override + public boolean checkRoleNameUnique(SysRole role) + { + Long roleId = StringUtils.isNull(role.getRoleId()) ? -1L : role.getRoleId(); + SysRole info = roleMapper.checkRoleNameUnique(role.getRoleName()); + if (StringUtils.isNotNull(info) && info.getRoleId().longValue() != roleId.longValue()) + { + return UserConstants.NOT_UNIQUE; + } + return UserConstants.UNIQUE; + } + + /** + * 校验角色权限是否唯一 + * + * @param role 角色信息 + * @return 结果 + */ + @Override + public boolean checkRoleKeyUnique(SysRole role) + { + Long roleId = StringUtils.isNull(role.getRoleId()) ? -1L : role.getRoleId(); + SysRole info = roleMapper.checkRoleKeyUnique(role.getRoleKey()); + if (StringUtils.isNotNull(info) && info.getRoleId().longValue() != roleId.longValue()) + { + return UserConstants.NOT_UNIQUE; + } + return UserConstants.UNIQUE; + } + + /** + * 校验角色是否允许操作 + * + * @param role 角色信息 + */ + @Override + public void checkRoleAllowed(SysRole role) + { + if (StringUtils.isNotNull(role.getRoleId()) && role.isAdmin()) + { + throw new ServiceException("不允许操作超级管理员角色"); + } + } + + /** + * 校验角色是否有数据权限 + * + * @param roleId 角色id + */ + @Override + public void checkRoleDataScope(Long roleId) + { + if (!SysUser.isAdmin(SecurityUtils.getUserId())) + { + SysRole role = new SysRole(); + role.setRoleId(roleId); + List roles = SpringUtils.getAopProxy(this).selectRoleList(role); + if (StringUtils.isEmpty(roles)) + { + throw new ServiceException("没有权限访问角色数据!"); + } + } + } + + /** + * 通过角色ID查询角色使用数量 + * + * @param roleId 角色ID + * @return 结果 + */ + @Override + public int countUserRoleByRoleId(Long roleId) + { + return userRoleMapper.countUserRoleByRoleId(roleId); + } + + /** + * 新增保存角色信息 + * + * @param role 角色信息 + * @return 结果 + */ + @Override + @Transactional + public int insertRole(SysRole role) + { + // 新增角色信息 + roleMapper.insertRole(role); + return insertRoleMenu(role); + } + + /** + * 修改保存角色信息 + * + * @param role 角色信息 + * @return 结果 + */ + @Override + @Transactional + public int updateRole(SysRole role) + { + // 修改角色信息 + roleMapper.updateRole(role); + // 删除角色与菜单关联 + roleMenuMapper.deleteRoleMenuByRoleId(role.getRoleId()); + return insertRoleMenu(role); + } + + /** + * 修改角色状态 + * + * @param role 角色信息 + * @return 结果 + */ + @Override + public int updateRoleStatus(SysRole role) + { + return roleMapper.updateRole(role); + } + + /** + * 修改数据权限信息 + * + * @param role 角色信息 + * @return 结果 + */ + @Override + @Transactional + public int authDataScope(SysRole role) + { + // 修改角色信息 + roleMapper.updateRole(role); + // 删除角色与部门关联 + roleDeptMapper.deleteRoleDeptByRoleId(role.getRoleId()); + // 新增角色和部门信息(数据权限) + return insertRoleDept(role); + } + + /** + * 新增角色菜单信息 + * + * @param role 角色对象 + */ + public int insertRoleMenu(SysRole role) + { + int rows = 1; + // 新增用户与角色管理 + List list = new ArrayList(); + for (Long menuId : role.getMenuIds()) + { + SysRoleMenu rm = new SysRoleMenu(); + rm.setRoleId(role.getRoleId()); + rm.setMenuId(menuId); + list.add(rm); + } + if (list.size() > 0) + { + rows = roleMenuMapper.batchRoleMenu(list); + } + return rows; + } + + /** + * 新增角色部门信息(数据权限) + * + * @param role 角色对象 + */ + public int insertRoleDept(SysRole role) + { + int rows = 1; + // 新增角色与部门(数据权限)管理 + List list = new ArrayList(); + for (Long deptId : role.getDeptIds()) + { + SysRoleDept rd = new SysRoleDept(); + rd.setRoleId(role.getRoleId()); + rd.setDeptId(deptId); + list.add(rd); + } + if (list.size() > 0) + { + rows = roleDeptMapper.batchRoleDept(list); + } + return rows; + } + + /** + * 通过角色ID删除角色 + * + * @param roleId 角色ID + * @return 结果 + */ + @Override + @Transactional + public int deleteRoleById(Long roleId) + { + // 删除角色与菜单关联 + roleMenuMapper.deleteRoleMenuByRoleId(roleId); + // 删除角色与部门关联 + roleDeptMapper.deleteRoleDeptByRoleId(roleId); + return roleMapper.deleteRoleById(roleId); + } + + /** + * 批量删除角色信息 + * + * @param roleIds 需要删除的角色ID + * @return 结果 + */ + @Override + @Transactional + public int deleteRoleByIds(Long[] roleIds) + { + for (Long roleId : roleIds) + { + checkRoleAllowed(new SysRole(roleId)); + checkRoleDataScope(roleId); + SysRole role = selectRoleById(roleId); + if (countUserRoleByRoleId(roleId) > 0) + { + throw new ServiceException(String.format("%1$s已分配,不能删除", role.getRoleName())); + } + } + // 删除角色与菜单关联 + roleMenuMapper.deleteRoleMenu(roleIds); + // 删除角色与部门关联 + roleDeptMapper.deleteRoleDept(roleIds); + return roleMapper.deleteRoleByIds(roleIds); + } + + /** + * 取消授权用户角色 + * + * @param userRole 用户和角色关联信息 + * @return 结果 + */ + @Override + public int deleteAuthUser(SysUserRole userRole) + { + return userRoleMapper.deleteUserRoleInfo(userRole); + } + + /** + * 批量取消授权用户角色 + * + * @param roleId 角色ID + * @param userIds 需要取消授权的用户数据ID + * @return 结果 + */ + @Override + public int deleteAuthUsers(Long roleId, Long[] userIds) + { + return userRoleMapper.deleteUserRoleInfos(roleId, userIds); + } + + /** + * 批量选择授权用户角色 + * + * @param roleId 角色ID + * @param userIds 需要授权的用户数据ID + * @return 结果 + */ + @Override + public int insertAuthUsers(Long roleId, Long[] userIds) + { + // 新增用户与角色管理 + List list = new ArrayList(); + for (Long userId : userIds) + { + SysUserRole ur = new SysUserRole(); + ur.setUserId(userId); + ur.setRoleId(roleId); + list.add(ur); + } + return userRoleMapper.batchUserRole(list); + } +} diff --git a/bs-system/src/main/java/com/bs/system/service/impl/SysTenantServiceImpl.java b/bs-system/src/main/java/com/bs/system/service/impl/SysTenantServiceImpl.java new file mode 100644 index 0000000..174bbc2 --- /dev/null +++ b/bs-system/src/main/java/com/bs/system/service/impl/SysTenantServiceImpl.java @@ -0,0 +1,28 @@ + +package com.bs.system.service.impl; + + +import com.bs.common.core.domain.entity.SysTenant; +import com.bs.system.mapper.SysTenantMapper; +import com.bs.system.service.SysTenantService; +import com.github.yulichang.base.MPJBaseServiceImpl; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.List; + +@Service +public class SysTenantServiceImpl extends MPJBaseServiceImpl implements SysTenantService { + + @Resource + private SysTenantMapper sysTenantMapper; + + + + @Override + public int disableTenant(SysTenant tenant) { + return sysTenantMapper.updateById(tenant); + } + +} diff --git a/bs-system/src/main/java/com/bs/system/service/impl/SysUserOnlineServiceImpl.java b/bs-system/src/main/java/com/bs/system/service/impl/SysUserOnlineServiceImpl.java new file mode 100644 index 0000000..94dd061 --- /dev/null +++ b/bs-system/src/main/java/com/bs/system/service/impl/SysUserOnlineServiceImpl.java @@ -0,0 +1,96 @@ +package com.bs.system.service.impl; + +import org.springframework.stereotype.Service; +import com.bs.common.core.domain.model.LoginUser; +import com.bs.common.utils.StringUtils; +import com.bs.system.domain.SysUserOnline; +import com.bs.system.service.ISysUserOnlineService; + +/** + * 在线用户 服务层处理 + * + * @author bs + */ +@Service +public class SysUserOnlineServiceImpl implements ISysUserOnlineService +{ + /** + * 通过登录地址查询信息 + * + * @param ipaddr 登录地址 + * @param user 用户信息 + * @return 在线用户信息 + */ + @Override + public SysUserOnline selectOnlineByIpaddr(String ipaddr, LoginUser user) + { + if (StringUtils.equals(ipaddr, user.getIpaddr())) + { + return loginUserToUserOnline(user); + } + return null; + } + + /** + * 通过用户名称查询信息 + * + * @param userName 用户名称 + * @param user 用户信息 + * @return 在线用户信息 + */ + @Override + public SysUserOnline selectOnlineByUserName(String userName, LoginUser user) + { + if (StringUtils.equals(userName, user.getUsername())) + { + return loginUserToUserOnline(user); + } + return null; + } + + /** + * 通过登录地址/用户名称查询信息 + * + * @param ipaddr 登录地址 + * @param userName 用户名称 + * @param user 用户信息 + * @return 在线用户信息 + */ + @Override + public SysUserOnline selectOnlineByInfo(String ipaddr, String userName, LoginUser user) + { + if (StringUtils.equals(ipaddr, user.getIpaddr()) && StringUtils.equals(userName, user.getUsername())) + { + return loginUserToUserOnline(user); + } + return null; + } + + /** + * 设置在线用户信息 + * + * @param user 用户信息 + * @return 在线用户 + */ + @Override + public SysUserOnline loginUserToUserOnline(LoginUser user) + { + if (StringUtils.isNull(user) || StringUtils.isNull(user.getUser())) + { + return null; + } + SysUserOnline sysUserOnline = new SysUserOnline(); + sysUserOnline.setTokenId(user.getToken()); + sysUserOnline.setUserName(user.getUsername()); + sysUserOnline.setIpaddr(user.getIpaddr()); + sysUserOnline.setLoginLocation(user.getLoginLocation()); + sysUserOnline.setBrowser(user.getBrowser()); + sysUserOnline.setOs(user.getOs()); + sysUserOnline.setLoginTime(user.getLoginTime()); + if (StringUtils.isNotNull(user.getUser().getDept())) + { + sysUserOnline.setDeptName(user.getUser().getDept().getDeptName()); + } + return sysUserOnline; + } +} diff --git a/bs-system/src/main/java/com/bs/system/service/impl/SysUserServiceImpl.java b/bs-system/src/main/java/com/bs/system/service/impl/SysUserServiceImpl.java new file mode 100644 index 0000000..5aa4751 --- /dev/null +++ b/bs-system/src/main/java/com/bs/system/service/impl/SysUserServiceImpl.java @@ -0,0 +1,603 @@ +package com.bs.system.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.bs.common.constant.UserConstants; +import com.bs.common.core.domain.entity.SysDept; +import com.bs.common.core.domain.entity.SysRole; +import com.bs.common.core.domain.entity.SysUser; +import com.bs.common.exception.ServiceException; +import com.bs.common.utils.PageUtils; +import com.bs.common.utils.SecurityUtils; +import com.bs.common.utils.StringUtils; +import com.bs.common.utils.bean.BeanValidators; +import com.bs.common.utils.spring.SpringUtils; +import com.bs.system.domain.SysPost; +import com.bs.system.domain.SysUserPost; +import com.bs.system.domain.SysUserRole; +import com.bs.system.mapper.*; +import com.bs.system.service.ISysConfigService; +import com.bs.system.service.ISysUserService; +import com.github.yulichang.base.MPJBaseServiceImpl; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; + +import javax.validation.Validator; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 用户 业务层处理 + * + * @author bs + */ +@Service +public class SysUserServiceImpl extends MPJBaseServiceImpl implements ISysUserService +{ + private static final Logger log = LoggerFactory.getLogger(SysUserServiceImpl.class); + + @Autowired + private SysUserMapper userMapper; + @Autowired + private SysDeptMapper deptMapper; + + @Autowired + private SysRoleMapper roleMapper; + + @Autowired + private SysPostMapper postMapper; + + @Autowired + private SysUserRoleMapper userRoleMapper; + @Autowired + private SysUserRoleMapper sysUserRoleMapper; + + @Autowired + private SysUserPostMapper userPostMapper; + + @Autowired + private ISysConfigService configService; + + @Autowired + protected Validator validator; + + /** + * 根据条件分页查询用户列表 + * + * @param user 用户信息 + * @return 用户信息集合信息 + */ + @Override + public List selectUserList(SysUser user) + { + //旧的有联表查询部门表,把部门名称顺带查询出来 + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper(); + queryWrapper.eq(user.getUserId()!=null, SysUser::getUserId,user.getUserId()); + queryWrapper.eq(user.getTenantId()!=null, SysUser::getTenantId,user.getTenantId()); + queryWrapper.like(StringUtils.isNotEmpty(user.getUserName()), SysUser::getUserName,user.getUserName()); + queryWrapper.like(StringUtils.isNotEmpty(user.getNickName()), SysUser::getNickName,user.getNickName()); + queryWrapper.eq(StringUtils.isNotEmpty(user.getStatus()), SysUser::getStatus,user.getStatus()); + queryWrapper.like(StringUtils.isNotEmpty(user.getPhonenumber()), SysUser::getPhonenumber,user.getPhonenumber()); + queryWrapper.ge(StringUtils.isNotNull(user.getParams().get("beginTime")), SysUser::getCreateTime,user.getParams().get("beginTime")); + queryWrapper.le(StringUtils.isNotNull(user.getParams().get("endTime")), SysUser::getCreateTime,user.getParams().get("endTime")); + + if(user.getDeptId()!= null){ + LambdaQueryWrapper deptWrapepr = new LambdaQueryWrapper(); + deptWrapepr.select(SysDept::getDeptId); + deptWrapepr.apply("FIND_IN_SET ('"+user.getDeptId()+"',ancestors)"); + List deptIds = deptMapper.selectObjs(deptWrapepr); + queryWrapper.and(wq->{ + wq.eq(SysUser::getDeptId,user.getDeptId()); + if(!CollectionUtils.isEmpty(deptIds)){ + wq.or().in(SysUser::getDeptId,deptIds); + } + }); + } + queryWrapper.orderByAsc(SysUser::getCreateTime); + return userMapper.selectList(queryWrapper); + } + + /** + * 根据条件分页查询已分配用户角色列表 + * + * @param user 用户信息 + * @return 用户信息集合信息 + */ + @Override + public List selectAllocatedList(SysUser user) + { + LambdaQueryWrapper userRoleWrapper = new LambdaQueryWrapper<>(); + userRoleWrapper.select(SysUserRole::getUserId); + userRoleWrapper.eq(SysUserRole::getRoleId,user.getRoleId()); + List userIds = sysUserRoleMapper.selectObjs(userRoleWrapper); + LambdaQueryWrapper userWrapper = new LambdaQueryWrapper<>(); + userWrapper.like(StringUtils.isNotEmpty(user.getUserName()), SysUser::getUserName,user.getUserName()); + userWrapper.like(StringUtils.isNotEmpty(user.getPhonenumber()), SysUser::getPhonenumber,user.getPhonenumber()); + if(userIds.isEmpty()){ + return new ArrayList<>(); + }else{ + userWrapper.in(SysUser::getUserId,userIds); + } + PageUtils.startPage(); + return userMapper.selectList(userWrapper); + } + + /** + * 根据条件分页查询未分配用户角色列表 + * + * @param user 用户信息 + * @return 用户信息集合信息 + */ + @Override + public List selectUnallocatedList(SysUser user) + { + return userMapper.selectUnallocatedList(user); + } + + /** + * 通过用户名查询用户 + * + * @param userName 用户名 + * @return 用户对象信息 + */ + @Override + public SysUser selectUserByUserName(String userName) + { + return userMapper.selectOne(new LambdaQueryWrapper().eq(SysUser::getUserName, userName)); + } + + /** + * 通过用户ID查询用户 + * + * @param userId 用户ID + * @return 用户对象信息 + */ + @Override + public SysUser selectUserById(Long userId) + { + final SysUser sysUser = userMapper.selectById(userId); + //查询用户下的角色 + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.select(SysUserRole::getRoleId); + lambdaQueryWrapper.eq(SysUserRole::getUserId, userId); + List roleIds = sysUserRoleMapper.selectObjs(lambdaQueryWrapper); + if(!roleIds.isEmpty()){ + List userRoles = roleMapper.selectBatchIds((List)(List)roleIds); + sysUser.setRoles(userRoles); + }else{ + sysUser.setRoles(new ArrayList<>()); + } + return sysUser; + } + + /** + * 查询用户所属角色组 + * + * @param userName 用户名 + * @return 结果 + */ + @Override + public String selectUserRoleGroup(String userName) + { + List list = roleMapper.selectRolesByUserName(userName); + if (CollectionUtils.isEmpty(list)) + { + return StringUtils.EMPTY; + } + return list.stream().map(SysRole::getRoleName).collect(Collectors.joining(",")); + } + + /** + * 查询用户所属岗位组 + * + * @param userName 用户名 + * @return 结果 + */ + @Override + public String selectUserPostGroup(String userName) + { + List list = postMapper.selectPostsByUserName(userName); + if (CollectionUtils.isEmpty(list)) + { + return StringUtils.EMPTY; + } + return list.stream().map(SysPost::getPostName).collect(Collectors.joining(",")); + } + + /** + * 校验用户名称是否唯一 + * + * @param user 用户信息 + * @return 结果 + */ + @Override + public boolean checkUserNameUnique(SysUser user) + { + Long userId = StringUtils.isNull(user.getUserId()) ? -1L : user.getUserId(); + SysUser info = userMapper.checkUserNameUnique(user.getUserName()); + if (StringUtils.isNotNull(info) && info.getUserId().longValue() != userId.longValue()) + { + return UserConstants.NOT_UNIQUE; + } + return UserConstants.UNIQUE; + } + + /** + * 校验手机号码是否唯一 + * + * @param user 用户信息 + * @return + */ + @Override + public boolean checkPhoneUnique(SysUser user) + { + Long userId = StringUtils.isNull(user.getUserId()) ? -1L : user.getUserId(); + SysUser info = userMapper.checkPhoneUnique(user.getPhonenumber()); + if (StringUtils.isNotNull(info) && info.getUserId().longValue() != userId.longValue()) + { + return UserConstants.NOT_UNIQUE; + } + return UserConstants.UNIQUE; + } + + /** + * 校验email是否唯一 + * + * @param user 用户信息 + * @return + */ + @Override + public boolean checkEmailUnique(SysUser user) + { + Long userId = StringUtils.isNull(user.getUserId()) ? -1L : user.getUserId(); + SysUser info = userMapper.checkEmailUnique(user.getEmail()); + if (StringUtils.isNotNull(info) && info.getUserId().longValue() != userId.longValue()) + { + return UserConstants.NOT_UNIQUE; + } + return UserConstants.UNIQUE; + } + + /** + * 校验用户是否允许操作 + * + * @param user 用户信息 + */ + @Override + public void checkUserAllowed(SysUser user) + { + if (StringUtils.isNotNull(user.getUserId()) && user.isAdmin()) + { + throw new ServiceException("不允许操作超级管理员用户"); + } + } + + /** + * 校验用户是否有数据权限 + * + * @param userId 用户id + */ + @Override + public void checkUserDataScope(Long userId) + { + if (!SysUser.isAdmin(SecurityUtils.getUserId())) + { + SysUser user = new SysUser(); + user.setUserId(userId); + List users = SpringUtils.getAopProxy(this).selectUserList(user); + if (StringUtils.isEmpty(users)) + { + throw new ServiceException("没有权限访问用户数据!"); + } + } + } + + /** + * 新增保存用户信息 + * + * @param user 用户信息 + * @return 结果 + */ + @Override + @Transactional + public int insertUser(SysUser user) + { + // 新增用户信息 + int rows = userMapper.insert(user); + // 新增用户岗位关联 + insertUserPost(user); + // 新增用户与角色管理 + insertUserRole(user); + return rows; + } + + /** + * 注册用户信息 + * + * @param user 用户信息 + * @return 结果 + */ + @Override + public boolean registerUser(SysUser user) + { + return userMapper.insert(user) > 0; + } + + /** + * 修改保存用户信息 + * + * @param user 用户信息 + * @return 结果 + */ + @Override + @Transactional + public int updateUser(SysUser user) + { + Long userId = user.getUserId(); + // 删除用户与角色关联 + userRoleMapper.deleteUserRoleByUserId(userId); + // 新增用户与角色管理 + insertUserRole(user); + // 删除用户与岗位关联 + userPostMapper.deleteUserPostByUserId(userId); + // 新增用户与岗位管理 + insertUserPost(user); + return userMapper.updateById(user); + } + + /** + * 用户授权角色 + * + * @param userId 用户ID + * @param roleIds 角色组 + */ + @Override + @Transactional + public void insertUserAuth(Long userId, Long[] roleIds) + { + userRoleMapper.deleteUserRoleByUserId(userId); + insertUserRole(userId, roleIds); + } + + /** + * 修改用户状态 + * + * @param user 用户信息 + * @return 结果 + */ + @Override + public int updateUserStatus(SysUser user) + { + return userMapper.updateById(user); + } + + /** + * 修改用户基本信息 + * + * @param user 用户信息 + * @return 结果 + */ + @Override + public int updateUserProfile(SysUser user) + { + return userMapper.updateById(user); + } + + /** + * 修改用户头像 + * + * @param userName 用户名 + * @param avatar 头像地址 + * @return 结果 + */ + @Override + public boolean updateUserAvatar(String userName, String avatar) + { + SysUser user = new SysUser(); + user.setAvatar(avatar); + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(SysUser::getUserName, userName); + return userMapper.update(user,queryWrapper) > 0; + } + + /** + * 重置用户密码 + * + * @param user 用户信息 + * @return 结果 + */ + @Override + public int resetPwd(SysUser user) + { + return userMapper.updateById(user); + } + + /** + * 重置用户密码 + * + * @param userName 用户名 + * @param password 密码 + * @return 结果 + */ + @Override + public int resetUserPwd(String userName, String password) + { + SysUser user = new SysUser(); + user.setPassword(password); + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(SysUser::getUserName, userName); + return userMapper.update(user, queryWrapper); + } + + /** + * 新增用户角色信息 + * + * @param user 用户对象 + */ + public void insertUserRole(SysUser user) + { + this.insertUserRole(user.getUserId(), user.getRoleIds()); + } + + /** + * 新增用户岗位信息 + * + * @param user 用户对象 + */ + public void insertUserPost(SysUser user) + { + Long[] posts = user.getPostIds(); + if (StringUtils.isNotEmpty(posts)) + { + // 新增用户与岗位管理 + List list = new ArrayList(posts.length); + for (Long postId : posts) + { + SysUserPost up = new SysUserPost(); + up.setUserId(user.getUserId()); + up.setPostId(postId); + list.add(up); + } + userPostMapper.batchUserPost(list); + } + } + + /** + * 新增用户角色信息 + * + * @param userId 用户ID + * @param roleIds 角色组 + */ + public void insertUserRole(Long userId, Long[] roleIds) + { + if (StringUtils.isNotEmpty(roleIds)) + { + // 新增用户与角色管理 + List list = new ArrayList(roleIds.length); + for (Long roleId : roleIds) + { + SysUserRole ur = new SysUserRole(); + ur.setUserId(userId); + ur.setRoleId(roleId); + list.add(ur); + } + userRoleMapper.batchUserRole(list); + } + } + + /** + * 通过用户ID删除用户 + * + * @param userId 用户ID + * @return 结果 + */ + @Override + @Transactional + public int deleteUserById(Long userId) + { + // 删除用户与角色关联 + userRoleMapper.deleteUserRoleByUserId(userId); + // 删除用户与岗位表 + userPostMapper.deleteUserPostByUserId(userId); + return userMapper.deleteById(userId); + } + + /** + * 批量删除用户信息 + * + * @param userIds 需要删除的用户ID + * @return 结果 + */ + @Override + @Transactional + public int deleteUserByIds(Long[] userIds) + { + for (Long userId : userIds) + { + checkUserAllowed(new SysUser(userId)); + checkUserDataScope(userId); + } + // 删除用户与角色关联 + userRoleMapper.deleteUserRole(userIds); + // 删除用户与岗位关联 + userPostMapper.deleteUserPost(userIds); + return userMapper.deleteBatchIds(Arrays.asList(userIds)); + } + + /** + * 导入用户数据 + * + * @param userList 用户数据列表 + * @param isUpdateSupport 是否更新支持,如果已存在,则进行更新数据 + * @param operName 操作用户 + * @return 结果 + */ + @Override + public String importUser(List userList, Boolean isUpdateSupport, Long operName) + { + if (StringUtils.isNull(userList) || userList.size() == 0) + { + throw new ServiceException("导入用户数据不能为空!"); + } + int successNum = 0; + int failureNum = 0; + StringBuilder successMsg = new StringBuilder(); + StringBuilder failureMsg = new StringBuilder(); + String password = configService.selectConfigByKey("sys.user.initPassword"); + for (SysUser user : userList) + { + try + { + // 验证是否存在这个用户 + SysUser u = userMapper.selectOne(new LambdaQueryWrapper().eq(SysUser::getUserName,user.getUserName())); + if (StringUtils.isNull(u)) + { + BeanValidators.validateWithException(validator, user); + user.setPassword(SecurityUtils.encryptPassword(password)); + user.setCreateBy(operName); + userMapper.insert(user); + successNum++; + successMsg.append("
" + successNum + "、账号 " + user.getUserName() + " 导入成功"); + } + else if (isUpdateSupport) + { + BeanValidators.validateWithException(validator, user); + checkUserAllowed(u); + checkUserDataScope(u.getUserId()); + user.setUserId(u.getUserId()); + user.setUpdateBy(operName); + userMapper.updateById(user); + successNum++; + successMsg.append("
" + successNum + "、账号 " + user.getUserName() + " 更新成功"); + } + else + { + failureNum++; + failureMsg.append("
" + failureNum + "、账号 " + user.getUserName() + " 已存在"); + } + } + catch (Exception e) + { + failureNum++; + String msg = "
" + failureNum + "、账号 " + user.getUserName() + " 导入失败:"; + failureMsg.append(msg + e.getMessage()); + log.error(msg, e); + } + } + if (failureNum > 0) + { + failureMsg.insert(0, "很抱歉,导入失败!共 " + failureNum + " 条数据格式不正确,错误如下:"); + throw new ServiceException(failureMsg.toString()); + } + else + { + successMsg.insert(0, "恭喜您,数据已全部导入成功!共 " + successNum + " 条,数据如下:"); + } + return successMsg.toString(); + } +} diff --git a/bs-system/src/main/java/com/bs/system/service/impl/TenantConfigServiceImpl.java b/bs-system/src/main/java/com/bs/system/service/impl/TenantConfigServiceImpl.java new file mode 100644 index 0000000..f3809ce --- /dev/null +++ b/bs-system/src/main/java/com/bs/system/service/impl/TenantConfigServiceImpl.java @@ -0,0 +1,19 @@ +package com.bs.system.service.impl; + +import com.bs.common.core.domain.entity.TenantConfig; +import com.bs.system.mapper.TenantConfigMapper; +import com.bs.system.service.ITenantConfigService; +import com.github.yulichang.base.MPJBaseServiceImpl; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +/** + * 租户配置Service业务层处理 + * + * @author ruoyi + * @date 2023-04-02 + */ +@Service +@Transactional(rollbackFor = Exception.class) +public class TenantConfigServiceImpl extends MPJBaseServiceImpl implements ITenantConfigService { + +} diff --git a/bs-system/src/main/resources/mapper/system/SysConfigMapper.xml b/bs-system/src/main/resources/mapper/system/SysConfigMapper.xml new file mode 100644 index 0000000..4b48ecc --- /dev/null +++ b/bs-system/src/main/resources/mapper/system/SysConfigMapper.xml @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + select config_id, config_name, config_key, config_value, config_type, create_by, create_time, update_by, update_time, remark + from sys_config + + + + + + + and config_id = #{configId} + + + and config_key = #{configKey} + + + + + + + + + + + + + + insert into sys_config ( + config_name, + config_key, + config_value, + config_type, + create_by, + remark, + create_time + )values( + #{configName}, + #{configKey}, + #{configValue}, + #{configType}, + #{createBy}, + #{remark}, + sysdate() + ) + + + + update sys_config + + config_name = #{configName}, + config_key = #{configKey}, + config_value = #{configValue}, + config_type = #{configType}, + update_by = #{updateBy}, + remark = #{remark}, + update_time = sysdate() + + where config_id = #{configId} + + + + delete from sys_config where config_id = #{configId} + + + + delete from sys_config where config_id in + + #{configId} + + + + diff --git a/bs-system/src/main/resources/mapper/system/SysDeptMapper.xml b/bs-system/src/main/resources/mapper/system/SysDeptMapper.xml new file mode 100644 index 0000000..3c1f4ae --- /dev/null +++ b/bs-system/src/main/resources/mapper/system/SysDeptMapper.xml @@ -0,0 +1,159 @@ + + + + + + + + + + + + + + + + + + + + + + + + select d.dept_id, d.parent_id, d.ancestors, d.dept_name, d.order_num, d.leader, d.phone, d.email, d.status, d.del_flag, d.create_by, d.create_time + from sys_dept d + + + + + + + + + + + + + + + + + + + + insert into sys_dept( + dept_id, + parent_id, + dept_name, + ancestors, + order_num, + leader, + phone, + email, + status, + create_by, + create_time + )values( + #{deptId}, + #{parentId}, + #{deptName}, + #{ancestors}, + #{orderNum}, + #{leader}, + #{phone}, + #{email}, + #{status}, + #{createBy}, + sysdate() + ) + + + + update sys_dept + + parent_id = #{parentId}, + dept_name = #{deptName}, + ancestors = #{ancestors}, + order_num = #{orderNum}, + leader = #{leader}, + phone = #{phone}, + email = #{email}, + status = #{status}, + update_by = #{updateBy}, + update_time = sysdate() + + where dept_id = #{deptId} + + + + update sys_dept set ancestors = + + when #{item.deptId} then #{item.ancestors} + + where dept_id in + + #{item.deptId} + + + + + update sys_dept set status = '0' where dept_id in + + #{deptId} + + + + + update sys_dept set del_flag = '2' where dept_id = #{deptId} + + + diff --git a/bs-system/src/main/resources/mapper/system/SysDictDataMapper.xml b/bs-system/src/main/resources/mapper/system/SysDictDataMapper.xml new file mode 100644 index 0000000..bfa7f82 --- /dev/null +++ b/bs-system/src/main/resources/mapper/system/SysDictDataMapper.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + select dict_code, dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status, create_by, create_time, remark + from sys_dict_data + + + + + + + + + + + + + + delete from sys_dict_data where dict_code = #{dictCode} + + + + delete from sys_dict_data where dict_code in + + #{dictCode} + + + + + update sys_dict_data + + dict_sort = #{dictSort}, + dict_label = #{dictLabel}, + dict_value = #{dictValue}, + dict_type = #{dictType}, + css_class = #{cssClass}, + list_class = #{listClass}, + is_default = #{isDefault}, + status = #{status}, + remark = #{remark}, + update_by = #{updateBy}, + update_time = sysdate() + + where dict_code = #{dictCode} + + + + update sys_dict_data set dict_type = #{newDictType} where dict_type = #{oldDictType} + + + + insert into sys_dict_data( + dict_sort, + dict_label, + dict_value, + dict_type, + css_class, + list_class, + is_default, + status, + remark, + create_by, + create_time + )values( + #{dictSort}, + #{dictLabel}, + #{dictValue}, + #{dictType}, + #{cssClass}, + #{listClass}, + #{isDefault}, + #{status}, + #{remark}, + #{createBy}, + sysdate() + ) + + + diff --git a/bs-system/src/main/resources/mapper/system/SysDictTypeMapper.xml b/bs-system/src/main/resources/mapper/system/SysDictTypeMapper.xml new file mode 100644 index 0000000..a91379a --- /dev/null +++ b/bs-system/src/main/resources/mapper/system/SysDictTypeMapper.xml @@ -0,0 +1,105 @@ + + + + + + + + + + + + + + + + + select dict_id, dict_name, dict_type, status, create_by, create_time, remark + from sys_dict_type + + + + + + + + + + + + + + delete from sys_dict_type where dict_id = #{dictId} + + + + delete from sys_dict_type where dict_id in + + #{dictId} + + + + + update sys_dict_type + + dict_name = #{dictName}, + dict_type = #{dictType}, + status = #{status}, + remark = #{remark}, + update_by = #{updateBy}, + update_time = sysdate() + + where dict_id = #{dictId} + + + + insert into sys_dict_type( + dict_name, + dict_type, + status, + remark, + create_by, + create_time + )values( + #{dictName}, + #{dictType}, + #{status}, + #{remark}, + #{createBy}, + sysdate() + ) + + + diff --git a/bs-system/src/main/resources/mapper/system/SysLogininforMapper.xml b/bs-system/src/main/resources/mapper/system/SysLogininforMapper.xml new file mode 100644 index 0000000..5e006f6 --- /dev/null +++ b/bs-system/src/main/resources/mapper/system/SysLogininforMapper.xml @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + insert into sys_logininfor (user_name, status, ipaddr, login_location, browser, os, msg, login_time) + values (#{userName}, #{status}, #{ipaddr}, #{loginLocation}, #{browser}, #{os}, #{msg}, sysdate()) + + + + + + delete from sys_logininfor where info_id in + + #{infoId} + + + + + truncate table sys_logininfor + + + diff --git a/bs-system/src/main/resources/mapper/system/SysMenuMapper.xml b/bs-system/src/main/resources/mapper/system/SysMenuMapper.xml new file mode 100644 index 0000000..51ed04c --- /dev/null +++ b/bs-system/src/main/resources/mapper/system/SysMenuMapper.xml @@ -0,0 +1,202 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + select menu_id, menu_name, parent_id, order_num, path, component, `query`, is_frame, is_cache, menu_type, visible, status, ifnull(perms,'') as perms, icon, create_time + from sys_menu + + + + + + + + + + + + + + + + + + + + + + + + + + update sys_menu + + menu_name = #{menuName}, + parent_id = #{parentId}, + order_num = #{orderNum}, + path = #{path}, + component = #{component}, + `query` = #{query}, + is_frame = #{isFrame}, + is_cache = #{isCache}, + menu_type = #{menuType}, + visible = #{visible}, + status = #{status}, + perms = #{perms}, + icon = #{icon}, + remark = #{remark}, + update_by = #{updateBy}, + update_time = sysdate() + + where menu_id = #{menuId} + + + + insert into sys_menu( + menu_id, + parent_id, + menu_name, + order_num, + path, + component, + `query`, + is_frame, + is_cache, + menu_type, + visible, + status, + perms, + icon, + remark, + create_by, + create_time + )values( + #{menuId}, + #{parentId}, + #{menuName}, + #{orderNum}, + #{path}, + #{component}, + #{query}, + #{isFrame}, + #{isCache}, + #{menuType}, + #{visible}, + #{status}, + #{perms}, + #{icon}, + #{remark}, + #{createBy}, + sysdate() + ) + + + + delete from sys_menu where menu_id = #{menuId} + + + diff --git a/bs-system/src/main/resources/mapper/system/SysNoticeMapper.xml b/bs-system/src/main/resources/mapper/system/SysNoticeMapper.xml new file mode 100644 index 0000000..392b2d1 --- /dev/null +++ b/bs-system/src/main/resources/mapper/system/SysNoticeMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/bs-system/src/main/resources/mapper/system/SysOperLogMapper.xml b/bs-system/src/main/resources/mapper/system/SysOperLogMapper.xml new file mode 100644 index 0000000..21b9419 --- /dev/null +++ b/bs-system/src/main/resources/mapper/system/SysOperLogMapper.xml @@ -0,0 +1,84 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + select oper_id, title, business_type, method, request_method, operator_type, oper_name, dept_name, oper_url, oper_ip, oper_location, oper_param, json_result, status, error_msg, oper_time, cost_time + from sys_oper_log + + + + insert into sys_oper_log(title, business_type, method, request_method, operator_type, oper_name, dept_name, oper_url, oper_ip, oper_location, oper_param, json_result, status, error_msg, cost_time, oper_time) + values (#{title}, #{businessType}, #{method}, #{requestMethod}, #{operatorType}, #{operName}, #{deptName}, #{operUrl}, #{operIp}, #{operLocation}, #{operParam}, #{jsonResult}, #{status}, #{errorMsg}, #{costTime}, sysdate()) + + + + + + delete from sys_oper_log where oper_id in + + #{operId} + + + + + + + truncate table sys_oper_log + + + diff --git a/bs-system/src/main/resources/mapper/system/SysPostMapper.xml b/bs-system/src/main/resources/mapper/system/SysPostMapper.xml new file mode 100644 index 0000000..5bfb8ac --- /dev/null +++ b/bs-system/src/main/resources/mapper/system/SysPostMapper.xml @@ -0,0 +1,122 @@ + + + + + + + + + + + + + + + + + + + select post_id, post_code, post_name, post_sort, status, create_by, create_time, remark + from sys_post + + + + + + + + + + + + + + + + + + update sys_post + + post_code = #{postCode}, + post_name = #{postName}, + post_sort = #{postSort}, + status = #{status}, + remark = #{remark}, + update_by = #{updateBy}, + update_time = sysdate() + + where post_id = #{postId} + + + + insert into sys_post( + post_id, + post_code, + post_name, + post_sort, + status, + remark, + create_by, + create_time + )values( + #{postId}, + #{postCode}, + #{postName}, + #{postSort}, + #{status}, + #{remark}, + #{createBy}, + sysdate() + ) + + + + delete from sys_post where post_id = #{postId} + + + + delete from sys_post where post_id in + + #{postId} + + + + diff --git a/bs-system/src/main/resources/mapper/system/SysRoleDeptMapper.xml b/bs-system/src/main/resources/mapper/system/SysRoleDeptMapper.xml new file mode 100644 index 0000000..0f9a931 --- /dev/null +++ b/bs-system/src/main/resources/mapper/system/SysRoleDeptMapper.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + delete from sys_role_dept where role_id=#{roleId} + + + + + + delete from sys_role_dept where role_id in + + #{roleId} + + + + + insert into sys_role_dept(role_id, dept_id) values + + (#{item.roleId},#{item.deptId}) + + + + diff --git a/bs-system/src/main/resources/mapper/system/SysRoleMapper.xml b/bs-system/src/main/resources/mapper/system/SysRoleMapper.xml new file mode 100644 index 0000000..aad66e0 --- /dev/null +++ b/bs-system/src/main/resources/mapper/system/SysRoleMapper.xml @@ -0,0 +1,152 @@ + + + + + + + + + + + + + + + + + + + + + + + select distinct r.role_id, r.role_name, r.role_key, r.role_sort, r.data_scope, r.menu_check_strictly, r.dept_check_strictly, + r.status, r.del_flag, r.create_time, r.remark + from sys_role r + left join sys_user_role ur on ur.role_id = r.role_id + left join sys_user u on u.user_id = ur.user_id + left join sys_dept d on u.dept_id = d.dept_id + + + + + + + + + + + + + + + + + + + + insert into sys_role( + role_id, + role_name, + role_key, + role_sort, + data_scope, + menu_check_strictly, + dept_check_strictly, + status, + remark, + create_by, + create_time + )values( + #{roleId}, + #{roleName}, + #{roleKey}, + #{roleSort}, + #{dataScope}, + #{menuCheckStrictly}, + #{deptCheckStrictly}, + #{status}, + #{remark}, + #{createBy}, + sysdate() + ) + + + + update sys_role + + role_name = #{roleName}, + role_key = #{roleKey}, + role_sort = #{roleSort}, + data_scope = #{dataScope}, + menu_check_strictly = #{menuCheckStrictly}, + dept_check_strictly = #{deptCheckStrictly}, + status = #{status}, + remark = #{remark}, + update_by = #{updateBy}, + update_time = sysdate() + + where role_id = #{roleId} + + + + update sys_role set del_flag = '2' where role_id = #{roleId} + + + + update sys_role set del_flag = '2' where role_id in + + #{roleId} + + + + diff --git a/bs-system/src/main/resources/mapper/system/SysRoleMenuMapper.xml b/bs-system/src/main/resources/mapper/system/SysRoleMenuMapper.xml new file mode 100644 index 0000000..c554aef --- /dev/null +++ b/bs-system/src/main/resources/mapper/system/SysRoleMenuMapper.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + delete from sys_role_menu where role_id=#{roleId} + + + + delete from sys_role_menu where role_id in + + #{roleId} + + + + + insert into sys_role_menu(role_id, menu_id) values + + (#{item.roleId},#{item.menuId}) + + + + diff --git a/bs-system/src/main/resources/mapper/system/SysUserMapper.xml b/bs-system/src/main/resources/mapper/system/SysUserMapper.xml new file mode 100644 index 0000000..4178a23 --- /dev/null +++ b/bs-system/src/main/resources/mapper/system/SysUserMapper.xml @@ -0,0 +1,225 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + select u.user_id, u.dept_id, u.user_name, u.nick_name, u.email, u.avatar, u.phonenumber, u.password, u.sex, u.status, u.del_flag, u.login_ip, u.login_date, u.create_by, u.create_time, u.remark, + d.dept_id, d.parent_id, d.ancestors, d.dept_name, d.order_num, d.leader, d.status as dept_status, + r.role_id, r.role_name, r.role_key, r.role_sort, r.data_scope, r.status as role_status + from sys_user u + left join sys_dept d on u.dept_id = d.dept_id + left join sys_user_role ur on u.user_id = ur.user_id + left join sys_role r on r.role_id = ur.role_id + + + + + + + + + + + + + + + + + + + + + + insert into sys_user( + user_id, + dept_id, + user_name, + nick_name, + email, + avatar, + phonenumber, + sex, + password, + status, + create_by, + remark, + create_time + )values( + #{userId}, + #{deptId}, + #{userName}, + #{nickName}, + #{email}, + #{avatar}, + #{phonenumber}, + #{sex}, + #{password}, + #{status}, + #{createBy}, + #{remark}, + sysdate() + ) + + + + update sys_user + + dept_id = #{deptId}, + user_name = #{userName}, + nick_name = #{nickName}, + email = #{email}, + phonenumber = #{phonenumber}, + sex = #{sex}, + avatar = #{avatar}, + password = #{password}, + status = #{status}, + login_ip = #{loginIp}, + login_date = #{loginDate}, + remark = #{remark}, + update_time = sysdate() + + where user_id = #{userId} + + + + update sys_user set status = #{status} where user_id = #{userId} + + + + update sys_user set avatar = #{avatar} where user_name = #{userName} + + + + update sys_user set password = #{password} where user_name = #{userName} + + + + update sys_user set del_flag = '2' where user_id = #{userId} + + + + update sys_user set del_flag = '2' where user_id in + + #{userId} + + + + diff --git a/bs-system/src/main/resources/mapper/system/SysUserPostMapper.xml b/bs-system/src/main/resources/mapper/system/SysUserPostMapper.xml new file mode 100644 index 0000000..cf47798 --- /dev/null +++ b/bs-system/src/main/resources/mapper/system/SysUserPostMapper.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + delete from sys_user_post where user_id=#{userId} + + + + + + delete from sys_user_post where user_id in + + #{userId} + + + + + insert into sys_user_post(user_id, post_id) values + + (#{item.userId},#{item.postId}) + + + + diff --git a/bs-system/src/main/resources/mapper/system/SysUserRoleMapper.xml b/bs-system/src/main/resources/mapper/system/SysUserRoleMapper.xml new file mode 100644 index 0000000..36ebe4c --- /dev/null +++ b/bs-system/src/main/resources/mapper/system/SysUserRoleMapper.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + delete from sys_user_role where user_id=#{userId} + + + + + + delete from sys_user_role where user_id in + + #{userId} + + + + + insert into sys_user_role(user_id, role_id) values + + (#{item.userId},#{item.roleId}) + + + + + delete from sys_user_role where user_id=#{userId} and role_id=#{roleId} + + + + delete from sys_user_role where role_id=#{roleId} and user_id in + + #{userId} + + + diff --git a/bs-ui/.editorconfig b/bs-ui/.editorconfig new file mode 100644 index 0000000..7034f9b --- /dev/null +++ b/bs-ui/.editorconfig @@ -0,0 +1,22 @@ +# 告诉EditorConfig插件,这是根文件,不用继续往上查找 +root = true + +# 匹配全部文件 +[*] +# 设置字符集 +charset = utf-8 +# 缩进风格,可选space、tab +indent_style = space +# 缩进的空格数 +indent_size = 2 +# 结尾换行符,可选lf、cr、crlf +end_of_line = lf +# 在文件结尾插入新行 +insert_final_newline = true +# 删除一行中的前后空格 +trim_trailing_whitespace = true + +# 匹配md结尾的文件 +[*.md] +insert_final_newline = false +trim_trailing_whitespace = false diff --git a/bs-ui/.env.development b/bs-ui/.env.development new file mode 100644 index 0000000..decaffb --- /dev/null +++ b/bs-ui/.env.development @@ -0,0 +1,14 @@ +# 页面标题 +VUE_APP_TITLE = 保税仓库管理系统 + +# 开发环境配置 +ENV = 'development' + +# 保税仓库管理系统/开发环境 +#VUE_APP_BASE_API = 'http://124.71.134.146:8096/prod-api' +VUE_APP_BASE_API = 'http://localhost:8080' +# VUE_APP_BASE_API = 'http://tanjunwei.test.jiutianda.cn' +# VUE_APP_BASE_API = 'http://wangyi.test.jiutianda.cn' + +# 路由懒加载 +VUE_CLI_BABEL_TRANSPILE_MODULES = true diff --git a/bs-ui/.env.production b/bs-ui/.env.production new file mode 100644 index 0000000..0275ed7 --- /dev/null +++ b/bs-ui/.env.production @@ -0,0 +1,8 @@ +# 页面标题 +VUE_APP_TITLE = 保税仓库管理系统 + +# 生产环境配置 +ENV = 'production' + +# 保税仓库管理系统/生产环境 +VUE_APP_BASE_API = '/prod-api' diff --git a/bs-ui/.env.staging b/bs-ui/.env.staging new file mode 100644 index 0000000..61d3677 --- /dev/null +++ b/bs-ui/.env.staging @@ -0,0 +1,10 @@ +# 页面标题 +VUE_APP_TITLE = 保税仓库管理系统 + +NODE_ENV = production + +# 测试环境配置 +ENV = 'staging' + +# 保税仓库管理系统/测试环境 +VUE_APP_BASE_API = '/stage-api' diff --git a/bs-ui/.eslintignore b/bs-ui/.eslintignore new file mode 100644 index 0000000..89be6f6 --- /dev/null +++ b/bs-ui/.eslintignore @@ -0,0 +1,10 @@ +# 忽略build目录下类型为js的文件的语法检查 +build/*.js +# 忽略src/assets目录下文件的语法检查 +src/assets +# 忽略public目录下文件的语法检查 +public +# 忽略当前目录下为js的文件的语法检查 +*.js +# 忽略当前目录下为vue的文件的语法检查 +*.vue \ No newline at end of file diff --git a/bs-ui/.eslintrc.js b/bs-ui/.eslintrc.js new file mode 100644 index 0000000..82bbdee --- /dev/null +++ b/bs-ui/.eslintrc.js @@ -0,0 +1,199 @@ +// ESlint 检查配置 +module.exports = { + root: true, + parserOptions: { + parser: 'babel-eslint', + sourceType: 'module' + }, + env: { + browser: true, + node: true, + es6: true, + }, + extends: ['plugin:vue/recommended', 'eslint:recommended'], + + // add your custom rules here + //it is base on https://github.com/vuejs/eslint-config-vue + rules: { + "vue/max-attributes-per-line": [2, { + "singleline": 10, + "multiline": { + "max": 1, + "allowFirstLine": false + } + }], + "vue/singleline-html-element-content-newline": "off", + "vue/multiline-html-element-content-newline":"off", + "vue/name-property-casing": ["error", "PascalCase"], + "vue/no-v-html": "off", + 'accessor-pairs': 2, + 'arrow-spacing': [2, { + 'before': true, + 'after': true + }], + 'block-spacing': [2, 'always'], + 'brace-style': [2, '1tbs', { + 'allowSingleLine': true + }], + 'camelcase': [0, { + 'properties': 'always' + }], + 'comma-dangle': [2, 'never'], + 'comma-spacing': [2, { + 'before': false, + 'after': true + }], + 'comma-style': [2, 'last'], + 'constructor-super': 2, + 'curly': [2, 'multi-line'], + 'dot-location': [2, 'property'], + 'eol-last': 2, + 'eqeqeq': ["error", "always", {"null": "ignore"}], + 'generator-star-spacing': [2, { + 'before': true, + 'after': true + }], + 'handle-callback-err': [2, '^(err|error)$'], + 'indent': [2, 2, { + 'SwitchCase': 1 + }], + 'jsx-quotes': [2, 'prefer-single'], + 'key-spacing': [2, { + 'beforeColon': false, + 'afterColon': true + }], + 'keyword-spacing': [2, { + 'before': true, + 'after': true + }], + 'new-cap': [2, { + 'newIsCap': true, + 'capIsNew': false + }], + 'new-parens': 2, + 'no-array-constructor': 2, + 'no-caller': 2, + 'no-console': 'off', + 'no-class-assign': 2, + 'no-cond-assign': 2, + 'no-const-assign': 2, + 'no-control-regex': 0, + 'no-delete-var': 2, + 'no-dupe-args': 2, + 'no-dupe-class-members': 2, + 'no-dupe-keys': 2, + 'no-duplicate-case': 2, + 'no-empty-character-class': 2, + 'no-empty-pattern': 2, + 'no-eval': 2, + 'no-ex-assign': 2, + 'no-extend-native': 2, + 'no-extra-bind': 2, + 'no-extra-boolean-cast': 2, + 'no-extra-parens': [2, 'functions'], + 'no-fallthrough': 2, + 'no-floating-decimal': 2, + 'no-func-assign': 2, + 'no-implied-eval': 2, + 'no-inner-declarations': [2, 'functions'], + 'no-invalid-regexp': 2, + 'no-irregular-whitespace': 2, + 'no-iterator': 2, + 'no-label-var': 2, + 'no-labels': [2, { + 'allowLoop': false, + 'allowSwitch': false + }], + 'no-lone-blocks': 2, + 'no-mixed-spaces-and-tabs': 2, + 'no-multi-spaces': 2, + 'no-multi-str': 2, + 'no-multiple-empty-lines': [2, { + 'max': 1 + }], + 'no-native-reassign': 2, + 'no-negated-in-lhs': 2, + 'no-new-object': 2, + 'no-new-require': 2, + 'no-new-symbol': 2, + 'no-new-wrappers': 2, + 'no-obj-calls': 2, + 'no-octal': 2, + 'no-octal-escape': 2, + 'no-path-concat': 2, + 'no-proto': 2, + 'no-redeclare': 2, + 'no-regex-spaces': 2, + 'no-return-assign': [2, 'except-parens'], + 'no-self-assign': 2, + 'no-self-compare': 2, + 'no-sequences': 2, + 'no-shadow-restricted-names': 2, + 'no-spaced-func': 2, + 'no-sparse-arrays': 2, + 'no-this-before-super': 2, + 'no-throw-literal': 2, + 'no-trailing-spaces': 2, + 'no-undef': 2, + 'no-undef-init': 2, + 'no-unexpected-multiline': 2, + 'no-unmodified-loop-condition': 2, + 'no-unneeded-ternary': [2, { + 'defaultAssignment': false + }], + 'no-unreachable': 2, + 'no-unsafe-finally': 2, + 'no-unused-vars': [2, { + 'vars': 'all', + 'args': 'none' + }], + 'no-useless-call': 2, + 'no-useless-computed-key': 2, + 'no-useless-constructor': 2, + 'no-useless-escape': 0, + 'no-whitespace-before-property': 2, + 'no-with': 2, + 'one-var': [2, { + 'initialized': 'never' + }], + 'operator-linebreak': [2, 'after', { + 'overrides': { + '?': 'before', + ':': 'before' + } + }], + 'padded-blocks': [2, 'never'], + 'quotes': [2, 'single', { + 'avoidEscape': true, + 'allowTemplateLiterals': true + }], + 'semi': [2, 'never'], + 'semi-spacing': [2, { + 'before': false, + 'after': true + }], + 'space-before-blocks': [2, 'always'], + 'space-before-function-paren': [2, 'never'], + 'space-in-parens': [2, 'never'], + 'space-infix-ops': 2, + 'space-unary-ops': [2, { + 'words': true, + 'nonwords': false + }], + 'spaced-comment': [2, 'always', { + 'markers': ['global', 'globals', 'eslint', 'eslint-disable', '*package', '!', ','] + }], + 'template-curly-spacing': [2, 'never'], + 'use-isnan': 2, + 'valid-typeof': 2, + 'wrap-iife': [2, 'any'], + 'yield-star-spacing': [2, 'both'], + 'yoda': [2, 'never'], + 'prefer-const': 2, + 'no-debugger': process.env.NODE_ENV === 'production' ? 2 : 0, + 'object-curly-spacing': [2, 'always', { + objectsInObjects: false + }], + 'array-bracket-spacing': [2, 'never'] + } +} diff --git a/bs-ui/.gitignore b/bs-ui/.gitignore new file mode 100644 index 0000000..78a752d --- /dev/null +++ b/bs-ui/.gitignore @@ -0,0 +1,23 @@ +.DS_Store +node_modules/ +dist/ +npm-debug.log* +yarn-debug.log* +yarn-error.log* +**/*.log + +tests/**/coverage/ +tests/e2e/reports +selenium-debug.log + +# Editor directories and files +.idea +.vscode +*.suo +*.ntvs* +*.njsproj +*.sln +*.local + +package-lock.json +yarn.lock diff --git a/bs-ui/babel.config.js b/bs-ui/babel.config.js new file mode 100644 index 0000000..c8267b2 --- /dev/null +++ b/bs-ui/babel.config.js @@ -0,0 +1,13 @@ +module.exports = { + presets: [ + // https://github.com/vuejs/vue-cli/tree/master/packages/@vue/babel-preset-app + '@vue/cli-plugin-babel/preset' + ], + 'env': { + 'development': { + // babel-plugin-dynamic-import-node plugin only does one thing by converting all import() to require(). + // This plugin can significantly increase the speed of hot updates, when you have a large number of pages. + 'plugins': ['dynamic-import-node'] + } + } +} \ No newline at end of file diff --git a/bs-ui/bin/build.bat b/bs-ui/bin/build.bat new file mode 100644 index 0000000..dda590d --- /dev/null +++ b/bs-ui/bin/build.bat @@ -0,0 +1,12 @@ +@echo off +echo. +echo [Ϣ] Weḅdistļ +echo. + +%~d0 +cd %~dp0 + +cd .. +npm run build:prod + +pause \ No newline at end of file diff --git a/bs-ui/bin/package.bat b/bs-ui/bin/package.bat new file mode 100644 index 0000000..0e5bc0f --- /dev/null +++ b/bs-ui/bin/package.bat @@ -0,0 +1,12 @@ +@echo off +echo. +echo [Ϣ] װWeḅnode_modulesļ +echo. + +%~d0 +cd %~dp0 + +cd .. +npm install --registry=https://registry.npmmirror.com + +pause \ No newline at end of file diff --git a/bs-ui/bin/run-web.bat b/bs-ui/bin/run-web.bat new file mode 100644 index 0000000..d30deae --- /dev/null +++ b/bs-ui/bin/run-web.bat @@ -0,0 +1,12 @@ +@echo off +echo. +echo [Ϣ] ʹ Vue CLI Web ̡ +echo. + +%~d0 +cd %~dp0 + +cd .. +npm run dev + +pause \ No newline at end of file diff --git a/bs-ui/build/index.js b/bs-ui/build/index.js new file mode 100644 index 0000000..0c57de2 --- /dev/null +++ b/bs-ui/build/index.js @@ -0,0 +1,35 @@ +const { run } = require('runjs') +const chalk = require('chalk') +const config = require('../vue.config.js') +const rawArgv = process.argv.slice(2) +const args = rawArgv.join(' ') + +if (process.env.npm_config_preview || rawArgv.includes('--preview')) { + const report = rawArgv.includes('--report') + + run(`vue-cli-service build ${args}`) + + const port = 9526 + const publicPath = config.publicPath + + var connect = require('connect') + var serveStatic = require('serve-static') + const app = connect() + + app.use( + publicPath, + serveStatic('./dist', { + index: ['index.html', '/'] + }) + ) + + app.listen(port, function () { + console.log(chalk.green(`> Preview at http://localhost:${port}${publicPath}`)) + if (report) { + console.log(chalk.green(`> Report at http://localhost:${port}${publicPath}report.html`)) + } + + }) +} else { + run(`vue-cli-service build ${args}`) +} diff --git a/bs-ui/package.json b/bs-ui/package.json new file mode 100644 index 0000000..05bdb2f --- /dev/null +++ b/bs-ui/package.json @@ -0,0 +1,92 @@ +{ + "name": "bs", + "version": "3.8.6", + "description": "保税仓库管理系统", + "author": "保税仓库", + "license": "MIT", + "scripts": { + "dev": "vue-cli-service serve", + "build:prod": "vue-cli-service build", + "build:stage": "vue-cli-service build --mode staging", + "preview": "node build/index.js --preview", + "lint": "eslint --ext .js,.vue src" + }, + "husky": { + "hooks": { + "pre-commit": "lint-staged" + } + }, + "lint-staged": { + "src/**/*.{js,vue}": [ + "eslint --fix", + "git add" + ] + }, + "keywords": [ + "vue", + "admin", + "dashboard", + "element-ui", + "boilerplate", + "admin-template", + "management-system" + ], + "repository": { + "type": "git", + "url": "https://gitee.com/y_project/bs-Vue.git" + }, + "dependencies": { + "@riophae/vue-treeselect": "0.4.0", + "axios": "0.24.0", + "clipboard": "2.0.8", + "core-js": "3.25.3", + "echarts": "5.4.0", + "element-ui": "2.15.13", + "file-saver": "2.0.5", + "fuse.js": "6.4.3", + "highlight.js": "9.18.5", + "js-beautify": "1.13.0", + "js-cookie": "3.0.1", + "jsencrypt": "3.0.0-rc.1", + "nprogress": "0.2.0", + "quill": "1.3.7", + "screenfull": "5.0.2", + "sortablejs": "1.10.2", + "uuid": "^9.0.1", + "vue": "2.6.12", + "vue-count-to": "1.0.13", + "vue-cropper": "0.5.5", + "vue-meta": "2.4.0", + "vue-router": "3.4.9", + "vuedraggable": "2.24.3", + "vuex": "3.6.0", + "xe-utils": "^3.5.20" + }, + "devDependencies": { + "@vue/cli-plugin-babel": "4.4.6", + "@vue/cli-plugin-eslint": "4.4.6", + "@vue/cli-service": "4.4.6", + "babel-eslint": "10.1.0", + "babel-plugin-dynamic-import-node": "2.3.3", + "chalk": "4.1.0", + "compression-webpack-plugin": "5.0.2", + "connect": "3.6.6", + "eslint": "7.15.0", + "eslint-plugin-vue": "7.2.0", + "lint-staged": "10.5.3", + "runjs": "4.4.2", + "sass": "1.32.13", + "sass-loader": "10.1.1", + "script-ext-html-webpack-plugin": "2.1.5", + "svg-sprite-loader": "5.1.1", + "vue-template-compiler": "2.6.12" + }, + "engines": { + "node": ">=8.9", + "npm": ">= 3.0.0" + }, + "browserslist": [ + "> 1%", + "last 2 versions" + ] +} diff --git a/bs-ui/public/favicon.ico b/bs-ui/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..2c3a2f20ae6c0aa85345cf2ef8c845db3048f59c GIT binary patch literal 9657 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 literal 0 HcmV?d00001 diff --git a/bs-ui/public/html/ie.html b/bs-ui/public/html/ie.html new file mode 100644 index 0000000..052ffcd --- /dev/null +++ b/bs-ui/public/html/ie.html @@ -0,0 +1,46 @@ + + + + + + 请升级您的浏览器 + + + + + + +

请升级您的浏览器,以便我们更好的为您提供服务!

+

您正在使用 Internet Explorer 的早期版本(IE11以下版本或使用该内核的浏览器)。这意味着在升级浏览器前,您将无法访问此网站。

+
+

请注意:微软公司对Windows XP 及 Internet Explorer 早期版本的支持已经结束

+

自 2016 年 1 月 12 日起,Microsoft 不再为 IE 11 以下版本提供相应支持和更新。没有关键的浏览器安全更新,您的电脑可能易受有害病毒、间谍软件和其他恶意软件的攻击,它们可以窃取或损害您的业务数据和信息。请参阅 微软对 Internet Explorer 早期版本的支持将于 2016 年 1 月 12 日结束的说明

+
+

您可以选择更先进的浏览器

+

推荐使用以下浏览器的最新版本。如果您的电脑已有以下浏览器的最新版本则直接使用该浏览器访问即可。

+ +
+ + \ No newline at end of file diff --git a/bs-ui/public/index.html b/bs-ui/public/index.html new file mode 100644 index 0000000..925455c --- /dev/null +++ b/bs-ui/public/index.html @@ -0,0 +1,208 @@ + + + + + + + + + <%= webpackConfig.name %> + + + + +
+
+
+
+
+
正在加载系统资源,请耐心等待
+
+
+ + diff --git a/bs-ui/public/robots.txt b/bs-ui/public/robots.txt new file mode 100644 index 0000000..77470cb --- /dev/null +++ b/bs-ui/public/robots.txt @@ -0,0 +1,2 @@ +User-agent: * +Disallow: / \ No newline at end of file diff --git a/bs-ui/src/App.vue b/bs-ui/src/App.vue new file mode 100644 index 0000000..be49cc4 --- /dev/null +++ b/bs-ui/src/App.vue @@ -0,0 +1,31 @@ + + + + diff --git a/bs-ui/src/api/amortize/cost.js b/bs-ui/src/api/amortize/cost.js new file mode 100644 index 0000000..1c820e0 --- /dev/null +++ b/bs-ui/src/api/amortize/cost.js @@ -0,0 +1,71 @@ +import request from '@/utils/request' + +// 分页查询费用列表 +export function pageListCost(query) { + return request({ + url: '/amortize/cost/pageList', + method: 'get', + params: query + }) +} + +// 查询费用列表 +export function listCost(query) { + return request({ + url: '/amortize/cost/list', + method: 'get', + params: query + }) +} + +// 查询费用详细 +export function getCost(ID) { + return request({ + url: '/amortize/cost/' + ID, + method: 'get' + }) +} + +// 自动计算费用 +export function autoCalc(data) { + return request({ + url: '/amortize/cost/autoCalc', + method: 'post', + data: data + }) +} + +// 新增费用 +export function addCost(data) { + return request({ + url: '/amortize/cost', + method: 'post', + data: data + }) +} + +// 修改费用 +export function updateCost(data) { + return request({ + url: '/amortize/cost', + method: 'put', + data: data + }) +} + +// 删除费用 +export function delCost(ID) { + return request({ + url: '/amortize/cost/' + ID, + method: 'delete' + }) +} + +// 导出费用 +export function exportCost(query) { + return request({ + url: '/amortize/cost/' + 'export', + method: 'post', + params: query + }) +} diff --git a/bs-ui/src/api/bill/number.js b/bs-ui/src/api/bill/number.js new file mode 100644 index 0000000..bfee9fc --- /dev/null +++ b/bs-ui/src/api/bill/number.js @@ -0,0 +1,69 @@ +import request from '@/utils/request' + +// 分页查询单据编号表列表 +export function pageListNumber(query) { + return request({ + url: '/bill/number/pageList', + method: 'get', + params: query + }) +} + +// 查询单据编号表列表 +export function listNumber(query) { + return request({ + url: '/bill/number/list', + method: 'get', + params: query + }) +} + +// 查询单据编号表详细 +export function getNumber(id) { + return request({ + url: '/bill/number/' + id, + method: 'get' + }) +} + +// 新增单据编号表 +export function addNumber(data) { + return request({ + url: '/bill/number', + method: 'post', + data: data + }) +} + +// 修改单据编号表 +export function updateNumber(data) { + return request({ + url: '/bill/number', + method: 'put', + data: data + }) +} + +// 删除单据编号表 +export function delNumber(id) { + return request({ + url: '/bill/number/' + id, + method: 'delete' + }) +} + +// 导出单据编号表 +export function exportNumber(query) { + return request({ + url: '/bill/number/' + 'export', + method: 'post', + params: query + }) +} + +export function getBillNumber(billPrefix) { + return request({ + url: '/bill/number/getBillNo/' + billPrefix, + method: 'get' + }) +} diff --git a/bs-ui/src/api/cargo/detail.js b/bs-ui/src/api/cargo/detail.js new file mode 100644 index 0000000..a7de674 --- /dev/null +++ b/bs-ui/src/api/cargo/detail.js @@ -0,0 +1,62 @@ +import request from '@/utils/request' + +// 分页查询货源明细列表 +export function pageListDetail(query) { + return request({ + url: '/cargo/detail/pageList', + method: 'get', + params: query + }) +} + +// 查询货源明细列表 +export function listDetail(query) { + return request({ + url: '/cargo/detail/list', + method: 'get', + params: query + }) +} + +// 查询货源明细详细 +export function getDetail(ID) { + return request({ + url: '/cargo/detail/' + ID, + method: 'get' + }) +} + +// 新增货源明细 +export function addDetail(data) { + return request({ + url: '/cargo/detail', + method: 'post', + data: data + }) +} + +// 修改货源明细 +export function updateDetail(data) { + return request({ + url: '/cargo/detail', + method: 'put', + data: data + }) +} + +// 删除货源明细 +export function delDetail(ID) { + return request({ + url: '/cargo/detail/' + ID, + method: 'delete' + }) +} + +// 导出货源明细 +export function exportDetail(query) { + return request({ + url: '/cargo/detail/' + 'export', + method: 'post', + params: query + }) +} diff --git a/bs-ui/src/api/cargo/source.js b/bs-ui/src/api/cargo/source.js new file mode 100644 index 0000000..f804776 --- /dev/null +++ b/bs-ui/src/api/cargo/source.js @@ -0,0 +1,71 @@ +import request from '@/utils/request' + +// 分页查询货源信息列表 +export function pageListSource(query) { + return request({ + url: '/cargo/source/pageList', + method: 'get', + params: query + }) +} + +// 查询货源信息列表 +export function listSource(query) { + return request({ + url: '/cargo/source/list', + method: 'get', + params: query + }) +} + +// 查询货源信息详细 +export function getSource(ID) { + return request({ + url: '/cargo/source/' + ID, + method: 'get' + }) +} + +// 新增货源信息 +export function addSource(data) { + return request({ + url: '/cargo/source', + method: 'post', + data: data + }) +} + +// 修改货源信息 +export function updateSource(data) { + return request({ + url: '/cargo/source', + method: 'put', + data: data + }) +} + +// 删除货源信息 +export function delSource(ID) { + return request({ + url: '/cargo/source/' + ID, + method: 'delete' + }) +} + +// 导出货源信息 +export function exportSource(query) { + return request({ + url: '/cargo/source/' + 'export', + method: 'post', + params: query + }) +} + +// 撤销订单到已经完成 +export function revokeOrder(data) { + return request({ + url: '/cargo/source/revokeOrder', + method: 'post', + data, + }) +} \ No newline at end of file diff --git a/bs-ui/src/api/cargo/target.js b/bs-ui/src/api/cargo/target.js new file mode 100644 index 0000000..2b2cfe3 --- /dev/null +++ b/bs-ui/src/api/cargo/target.js @@ -0,0 +1,62 @@ +import request from '@/utils/request' + +// 分页查询货源定向发布列表 +export function pageListTarget(query) { + return request({ + url: '/cargo/target/pageList', + method: 'get', + params: query + }) +} + +// 查询货源定向发布列表 +export function listTarget(query) { + return request({ + url: '/cargo/target/list', + method: 'get', + params: query + }) +} + +// 查询货源定向发布详细 +export function getTarget(ID) { + return request({ + url: '/cargo/target/' + ID, + method: 'get' + }) +} + +// 新增货源定向发布 +export function addTarget(data) { + return request({ + url: '/cargo/target', + method: 'post', + data: data + }) +} + +// 修改货源定向发布 +export function updateTarget(data) { + return request({ + url: '/cargo/target', + method: 'put', + data: data + }) +} + +// 删除货源定向发布 +export function delTarget(ID) { + return request({ + url: '/cargo/target/' + ID, + method: 'delete' + }) +} + +// 导出货源定向发布 +export function exportTarget(query) { + return request({ + url: '/cargo/target/' + 'export', + method: 'post', + params: query + }) +} diff --git a/bs-ui/src/api/common/file.js b/bs-ui/src/api/common/file.js new file mode 100644 index 0000000..8dc96df --- /dev/null +++ b/bs-ui/src/api/common/file.js @@ -0,0 +1,84 @@ +import request from '@/utils/request' + +/** + * 通过attachId删除文件 + * @param {*} attachId + */ +export function deleteFile(attachId) { + return request({ + url: '/common/deleteFile/' + attachId, + method: 'DELETE' + }) +} + +/** + * 通过fileId删除文件 + * @param {*} fileId + */ +export function deleteFileByFileId(fileId) { + return request({ + url: '/common/deleteFileByFileId/' + fileId, + method: 'DELETE' + }) +} + +/** + * 下载文件 + * @param {*} fileName 文件名 + */ +export function download(fileName) { + return request({ + url: '/common/download', + method: 'GET', + params: { + fileName + }, + responseType: 'blob' + }) +} + +/** + * 通过fileId查找附件列表 + * @param {*} fileId + */ +export function getAttachList(fileId) { + return request({ + url: '/common/getAttachList/' + fileId, + method: 'GET' + }) +} + +/** + * 通过fileIds获取附件列表 + * @param {string} fileIds + */ +export function getAttachListByFileIds(fileIds) { + if (!fileIds) return { data: null } + return request({ + url: '/common/getFileIdsByAttachVos', + method: 'get', + params: { + fileIds + } + }) +} + +/** + * 单文件上传 + */ +export function uploadFile() { + return request({ + url: '/common/upload', + method: 'post' + }) +} + +/** + * 多文件上传 + */ +export function uploadFiles() { + return request({ + url: '/common/uploads', + method: 'post' + }) +} diff --git a/bs-ui/src/api/cust/item.js b/bs-ui/src/api/cust/item.js new file mode 100644 index 0000000..5881868 --- /dev/null +++ b/bs-ui/src/api/cust/item.js @@ -0,0 +1,62 @@ +import request from '@/utils/request' + +// 分页查询客户子项信息列表 +export function pageListItem(query) { + return request({ + url: '/cust/item/pageList', + method: 'get', + params: query + }) +} + +// 查询客户子项信息列表 +export function listItem(query) { + return request({ + url: '/cust/item/list', + method: 'get', + params: query + }) +} + +// 查询客户子项信息详细 +export function getItem(ID) { + return request({ + url: '/cust/item/' + ID, + method: 'get' + }) +} + +// 新增客户子项信息 +export function addItem(data) { + return request({ + url: '/cust/item', + method: 'post', + data: data + }) +} + +// 修改客户子项信息 +export function updateItem(data) { + return request({ + url: '/cust/item', + method: 'put', + data: data + }) +} + +// 删除客户子项信息 +export function delItem(ID) { + return request({ + url: '/cust/item/' + ID, + method: 'delete' + }) +} + +// 导出客户子项信息 +export function exportItem(query) { + return request({ + url: '/cust/item/' + 'export', + method: 'post', + params: query + }) +} diff --git a/bs-ui/src/api/finance/cash.js b/bs-ui/src/api/finance/cash.js new file mode 100644 index 0000000..7c703fa --- /dev/null +++ b/bs-ui/src/api/finance/cash.js @@ -0,0 +1,62 @@ +import request from '@/utils/request' + +// 分页查询现金日记账列表 +export function pageListCash(query) { + return request({ + url: '/finance/cash/pageList', + method: 'get', + params: query + }) +} + +// 查询现金日记账列表 +export function listCash(query) { + return request({ + url: '/finance/cash/list', + method: 'get', + params: query + }) +} + +// 查询现金日记账详细 +export function getCash(ID) { + return request({ + url: '/finance/cash/' + ID, + method: 'get' + }) +} + +// 新增现金日记账 +export function addCash(data) { + return request({ + url: '/finance/cash', + method: 'post', + data: data + }) +} + +// 修改现金日记账 +export function updateCash(data) { + return request({ + url: '/finance/cash', + method: 'put', + data: data + }) +} + +// 删除现金日记账 +export function delCash(ID) { + return request({ + url: '/finance/cash/' + ID, + method: 'delete' + }) +} + +// 导出现金日记账 +export function exportCash(query) { + return request({ + url: '/finance/cash/' + 'export', + method: 'post', + params: query + }) +} diff --git a/bs-ui/src/api/finance/writeoff.js b/bs-ui/src/api/finance/writeoff.js new file mode 100644 index 0000000..c6e02bc --- /dev/null +++ b/bs-ui/src/api/finance/writeoff.js @@ -0,0 +1,98 @@ +import request from '@/utils/request' + +// 分页查询费用核销记录列表 +export function pageListWriteoff(query) { + return request({ + url: '/finance/writeoff/pageList', + method: 'get', + params: query + }) +} + +// 查询费用核销记录列表 +export function listWriteoff(query) { + return request({ + url: '/finance/writeoff/list', + method: 'get', + params: query + }) +} + +// 查询费用核销记录详细 +export function getWriteoff(ID) { + return request({ + url: '/finance/writeoff/' + ID, + method: 'get' + }) +} + +// 新增费用核销记录 +export function addWriteoff(data) { + return request({ + url: '/finance/writeoff', + method: 'post', + data: data + }) +} + +// 修改费用核销记录 +export function updateWriteoff(data) { + return request({ + url: '/finance/writeoff', + method: 'put', + data: data + }) +} + +// 删除费用核销记录 +export function delWriteoff(ID) { + return request({ + url: '/finance/writeoff/' + ID, + method: 'delete' + }) +} + +// 导出费用核销记录 +export function exportWriteoff(query) { + return request({ + url: '/finance/writeoff/' + 'export', + method: 'post', + params: query + }) +} + +// 根据现金日记账核销 +export function autoWriteoffByCash(data) { + return request({ + url: '/finance/writeoff/autoWriteoffByCash', + method: 'post', + data: data + }) +} + +// 根据费用核销 +export function autoWriteoffByCost(data) { + return request({ + url: '/finance/writeoff/autoWriteoffByCost', + method: 'post', + data: data + }) +} + +// 根据现金日记账反核销 +export function cancelWriteoffByCash(data) { + return request({ + url: '/finance/writeoff/cancelWriteoffByCash', + method: 'post', + data: data + }) +} + +// 根据费用核销 +export function cancelWriteoffByCost(data) { + return request({ + url: '/finance/writeoff/cancelWriteoffByCost', + method: 'post', + data: data + }) +} \ No newline at end of file diff --git a/bs-ui/src/api/jxc/berth.js b/bs-ui/src/api/jxc/berth.js new file mode 100644 index 0000000..68c121a --- /dev/null +++ b/bs-ui/src/api/jxc/berth.js @@ -0,0 +1,62 @@ +import request from '@/utils/request' + +// 分页查询泊位信息列表 +export function pageListBerth(query) { + return request({ + url: '/jxc/berth/pageList', + method: 'get', + params: query + }) +} + +// 查询泊位信息列表 +export function listBerth(query) { + return request({ + url: '/jxc/berth/list', + method: 'get', + params: query + }) +} + +// 查询泊位信息详细 +export function getBerth(id) { + return request({ + url: '/jxc/berth/' + id, + method: 'get' + }) +} + +// 新增泊位信息 +export function addBerth(data) { + return request({ + url: '/jxc/berth', + method: 'post', + data: data + }) +} + +// 修改泊位信息 +export function updateBerth(data) { + return request({ + url: '/jxc/berth', + method: 'put', + data: data + }) +} + +// 删除泊位信息 +export function delBerth(id) { + return request({ + url: '/jxc/berth/' + id, + method: 'delete' + }) +} + +// 导出泊位信息 +export function exportBerth(query) { + return request({ + url: '/jxc/berth/' + 'export', + method: 'post', + params: query + }) +} diff --git a/bs-ui/src/api/jxc/billCar.js b/bs-ui/src/api/jxc/billCar.js new file mode 100644 index 0000000..86f14f4 --- /dev/null +++ b/bs-ui/src/api/jxc/billCar.js @@ -0,0 +1,62 @@ +import request from '@/utils/request' + +// 分页查询车辆批量出库列表 +export function pageListBillCar(query) { + return request({ + url: '/jxc/billCar/pageList', + method: 'get', + params: query + }) +} + +// 查询车辆批量出库列表 +export function listBillCar(query) { + return request({ + url: '/jxc/billCar/list', + method: 'get', + params: query + }) +} + +// 查询车辆批量出库详细 +export function getBillCar(id) { + return request({ + url: '/jxc/billCar/' + id, + method: 'get' + }) +} + +// 新增车辆批量出库 +export function addBillCar(data) { + return request({ + url: '/jxc/billCar', + method: 'post', + data: data + }) +} + +// 修改车辆批量出库 +export function updateBillCar(data) { + return request({ + url: '/jxc/billCar', + method: 'put', + data: data + }) +} + +// 删除车辆批量出库 +export function delBillCar(id) { + return request({ + url: '/jxc/billCar/' + id, + method: 'delete' + }) +} + +// 导出车辆批量出库 +export function exportBillCar(query) { + return request({ + url: '/jxc/billCar/' + 'export', + method: 'post', + params: query + }) +} diff --git a/bs-ui/src/api/jxc/bmcargo.js b/bs-ui/src/api/jxc/bmcargo.js new file mode 100644 index 0000000..b102745 --- /dev/null +++ b/bs-ui/src/api/jxc/bmcargo.js @@ -0,0 +1,79 @@ +import request from '@/utils/request' + +// 分页查询船舶载货清单列表 +export function pageListBmcargo(query) { + return request({ + url: '/jxc/bmcargo/pageList', + method: 'get', + params: query + }) +} + +// 查询船舶载货清单列表 +export function listBmcargo(query) { + return request({ + url: '/jxc/bmcargo/list', + method: 'get', + params: query + }) +} + +// 查询船舶载货清单详细 +export function getBmcargo(id) { + return request({ + url: '/jxc/bmcargo/' + id, + method: 'get' + }) +} + +// 获取船舶载货清单详细信息 +export function getConfirmOrder(id) { + return request({ + url: '/jxc/bmcargo/confirmOrder/' + id, + method: 'get' + }) +} +// 修改船舶载货清单 +export function confirmOrder(data) { + return request({ + url: '/jxc/bmcargo/confirmOrder', + method: 'put', + data: data + }) +} + + +// 新增船舶载货清单 +export function addBmcargo(data) { + return request({ + url: '/jxc/bmcargo', + method: 'post', + data: data + }) +} + +// 修改船舶载货清单 +export function updateBmcargo(data) { + return request({ + url: '/jxc/bmcargo', + method: 'put', + data: data + }) +} + +// 删除船舶载货清单 +export function delBmcargo(id) { + return request({ + url: '/jxc/bmcargo/' + id, + method: 'delete' + }) +} + +// 导出船舶载货清单 +export function exportBmcargo(query) { + return request({ + url: '/jxc/bmcargo/' + 'export', + method: 'post', + params: query + }) +} diff --git a/bs-ui/src/api/jxc/bmvoyage.js b/bs-ui/src/api/jxc/bmvoyage.js new file mode 100644 index 0000000..f2bc60e --- /dev/null +++ b/bs-ui/src/api/jxc/bmvoyage.js @@ -0,0 +1,85 @@ +import request from '@/utils/request' + +// 分页查询船舶航次列表 +export function pageListBmvoyage(query) { + return request({ + url: '/jxc/bmvoyage/pageList', + method: 'get', + params: query + }) +} + +// 查询船舶航次列表 +export function listBmvoyage(query) { + return request({ + url: '/jxc/bmvoyage/list', + method: 'get', + params: query + }) +} +// 查询船舶航次列表 +export function newListBmvoyage(query) { + return request({ + url: '/jxc/bmvoyage/newList', + method: 'get', + params: query + }) +} + + +// 查询船舶航次详细 +export function getBmvoyage(id) { + return request({ + url: '/jxc/bmvoyage/' + id, + method: 'get' + }) +} + +// 新增船舶航次 +export function addBmvoyage(data) { + return request({ + url: '/jxc/bmvoyage', + method: 'post', + data: data + }) +} + +// 修改船舶航次 +export function updateBmvoyage(data) { + return request({ + url: '/jxc/bmvoyage', + method: 'put', + data: data + }) +} + +// 删除船舶航次 +export function delBmvoyage(id) { + return request({ + url: '/jxc/bmvoyage/' + id, + method: 'delete' + }) +} + +// 导出船舶航次 +export function exportBmvoyage(query) { + return request({ + url: '/jxc/bmvoyage/' + 'export', + method: 'post', + params: query + }) +} + +export function checkBmvoyage(id) { + return request({ + url: '/jxc/bmvoyage/check/' + id, + method: 'get' + }) +} + +export function uncheckBmvoyage(id) { + return request({ + url: '/jxc/bmvoyage/uncheck/' + id, + method: 'get' + }) +} diff --git a/bs-ui/src/api/jxc/cargo.js b/bs-ui/src/api/jxc/cargo.js new file mode 100644 index 0000000..2100a86 --- /dev/null +++ b/bs-ui/src/api/jxc/cargo.js @@ -0,0 +1,70 @@ +import request from '@/utils/request' + +// 分页查询货物信息列表 +export function pageListCargo(query) { + return request({ + url: '/jxc/cargo/pageList', + method: 'get', + params: query + }) +} + +// 查询货物信息列表 +export function listCargo(query) { + return request({ + url: '/jxc/cargo/list', + method: 'get', + params: query + }) +} + +export function custCargoList(query) { + return request({ + url: '/jxc/cargo/custCargoList', + method: 'get', + params: query + }) +} + +// 查询货物信息详细 +export function getCargo(id) { + return request({ + url: '/jxc/cargo/' + id, + method: 'get' + }) +} + +// 新增货物信息 +export function addCargo(data) { + return request({ + url: '/jxc/cargo', + method: 'post', + data: data + }) +} + +// 修改货物信息 +export function updateCargo(data) { + return request({ + url: '/jxc/cargo', + method: 'put', + data: data + }) +} + +// 删除货物信息 +export function delCargo(id) { + return request({ + url: '/jxc/cargo/' + id, + method: 'delete' + }) +} + +// 导出货物信息 +export function exportCargo(query) { + return request({ + url: '/jxc/cargo/' + 'export', + method: 'post', + params: query + }) +} diff --git a/bs-ui/src/api/jxc/ckbill.js b/bs-ui/src/api/jxc/ckbill.js new file mode 100644 index 0000000..1fd520c --- /dev/null +++ b/bs-ui/src/api/jxc/ckbill.js @@ -0,0 +1,152 @@ +import request from '@/utils/request' + +// 分页查询出入库单据列表 +export function pageListCkbill(query) { + return request({ + url: '/jxc/ckbill/pageList', + method: 'get', + params: query + }) +} +// 分页查询出入库单据列表(全部 +export function stockPageListCkbill(query) { + return request({ + url: '/jxc/ckbill/stockPageList', + method: 'get', + params: query + }) +} +export function mixtureList(query) { + return request({ + url: '/jxc/ckbill/mixtureList', + method: 'get', + params: query + }) +} + +export function recallTransfer(id) { + return request({ + url: '/jxc/ckbill/recallTransfer/' + id, + method: 'get' + }) +} + +export function deleteBill(id) { + return request({ + url: '/jxc/ckbill/deleteBill/' + id, + method: 'get' + }) +} +export function recallMixture(id) { + return request({ + url: '/jxc/ckbill/recallMixture/' + id, + method: 'get' + }) +} + +export function transferList(query) { + return request({ + url: '/jxc/ckbill/transferList', + method: 'get', + params: query + }) +} +export function getMixtureInfo(id) { + return request({ + url: '/jxc/ckbill/getMixtureInfo/' + id, + method: 'get' + }) +} +export function getTransferInfo(id) { + return request({ + url: '/jxc/ckbill/getTransferInfo/' + id, + method: 'get' + }) +} + +// 查询出入库单据列表 +export function listCkbill(query) { + return request({ + url: '/jxc/ckbill/list', + method: 'get', + params: query + }) +} + +// 查询出入库单据详细 +export function getCkbill(id) { + return request({ + url: '/jxc/ckbill/' + id, + method: 'get' + }) +} +// 查询出入库单据详细加明细 +export function getCkbillInfo(id) { + return request({ + url: '/jxc/ckbill/getBillInfo/' + id, + method: 'get' + }) +} +export function addTransfer(data) { + return request({ + url: '/jxc/ckbill/addTransfer', + method: 'post', + data: data + }) +} +// 新增出入库单据 +export function addCkbill(data) { + return request({ + url: '/jxc/ckbill', + method: 'post', + data: data + }) +} +export function addMixture(data) { + return request({ + url: '/jxc/ckbill/addMixture', + method: 'post', + data: data + }) +} + +export function outBill(data) { + return request({ + url: '/jxc/ckbill/outBill', + method: 'post', + data: data + }) +} +export function putBill(data) { + return request({ + url: '/jxc/ckbill/putBill', + method: 'post', + data: data + }) +} + +// 修改出入库单据 +export function updateCkbill(data) { + return request({ + url: '/jxc/ckbill', + method: 'put', + data: data + }) +} + +// 删除出入库单据 +export function delCkbill(id) { + return request({ + url: '/jxc/ckbill/' + id, + method: 'delete' + }) +} + +// 导出出入库单据 +export function exportCkbill(query) { + return request({ + url: '/jxc/ckbill/' + 'export', + method: 'post', + params: query + }) +} diff --git a/bs-ui/src/api/jxc/ckcargo.js b/bs-ui/src/api/jxc/ckcargo.js new file mode 100644 index 0000000..2190cd2 --- /dev/null +++ b/bs-ui/src/api/jxc/ckcargo.js @@ -0,0 +1,113 @@ +import request from '@/utils/request' + +// 分页查询出入库单据明细列表 +export function pageListCkcargo(query) { + return request({ + url: '/jxc/ckcargo/pageList', + method: 'get', + params: query + }) +} + +// 分页查询出入库单据明细列表 +export function selectTotalWt(query) { + return request({ + url: '/jxc/ckcargo/selectTotalWt', + method: 'get', + params: query + }) +} + +// 查询出入库单据明细列表 +export function listCkcargo(query) { + return request({ + url: '/jxc/ckcargo/list', + method: 'get', + params: query + }) +} + +// 查询出入库单据明细列表 +export function pageListByBillCargoWithExpire(query) { + return request({ + url: '/jxc/ckcargo/pageListByBillCargoWithExpire', + method: 'get', + params: query + }) +} + +// 查询出入库单据明细详细 +export function getCkcargo(id) { + return request({ + url: '/jxc/ckcargo/' + id, + method: 'get' + }) +} +export function recallPutBill(id) { + return request({ + url: '/jxc/ckbill/recallPutBill/' + id, + method: 'get' + }) +} +export function confirmPutBill(id) { + return request({ + url: '/jxc/ckbill/confirmPutBill/' + id, + method: 'get' + }) +} + +export function confirmOutBill(id) { + return request({ + url: '/jxc/ckbill/confirmOutBill/' + id, + method: 'get' + }) +} +export function recallOutBill(id) { + return request({ + url: '/jxc/ckbill/recallOutBill/' + id, + method: 'get' + }) +} + +// 新增出入库单据明细 +export function addCkcargo(data) { + return request({ + url: '/jxc/ckcargo', + method: 'post', + data: data + }) +} + +// 修改出入库单据明细 +export function updateCkcargo(data) { + return request({ + url: '/jxc/ckcargo', + method: 'put', + data: data + }) +} + +// 删除出入库单据明细 +export function delCkcargo(id) { + return request({ + url: '/jxc/ckcargo/' + id, + method: 'delete' + }) +} + +// 导出出入库单据明细 +export function exportCkcargo(query) { + return request({ + url: '/jxc/ckcargo/' + 'export', + method: 'post', + params: query + }) +} + +export function queryCkcargo(query) { + return request({ + url: '/jxc/ckcargo/queryCkcargo', + method: 'get', + params: query + }) +} diff --git a/bs-ui/src/api/jxc/ckchange.js b/bs-ui/src/api/jxc/ckchange.js new file mode 100644 index 0000000..8cab105 --- /dev/null +++ b/bs-ui/src/api/jxc/ckchange.js @@ -0,0 +1,62 @@ +import request from '@/utils/request' + +// 分页查询库存变动记录列表 +export function pageListCkchange(query) { + return request({ + url: '/jxc/ckchange/pageList', + method: 'get', + params: query + }) +} + +// 查询库存变动记录列表 +export function listCkchange(query) { + return request({ + url: '/jxc/ckchange/list', + method: 'get', + params: query + }) +} + +// 查询库存变动记录详细 +export function getCkchange(id) { + return request({ + url: '/jxc/ckchange/' + id, + method: 'get' + }) +} + +// 新增库存变动记录 +export function addCkchange(data) { + return request({ + url: '/jxc/ckchange', + method: 'post', + data: data + }) +} + +// 修改库存变动记录 +export function updateCkchange(data) { + return request({ + url: '/jxc/ckchange', + method: 'put', + data: data + }) +} + +// 删除库存变动记录 +export function delCkchange(id) { + return request({ + url: '/jxc/ckchange/' + id, + method: 'delete' + }) +} + +// 导出库存变动记录 +export function exportCkchange(query) { + return request({ + url: '/jxc/ckchange/' + 'export', + method: 'post', + params: query + }) +} diff --git a/bs-ui/src/api/jxc/ckstock.js b/bs-ui/src/api/jxc/ckstock.js new file mode 100644 index 0000000..f22518b --- /dev/null +++ b/bs-ui/src/api/jxc/ckstock.js @@ -0,0 +1,108 @@ +import request from '@/utils/request' + +// 分页查询仓库库存列表 +export function pageListCkstock(query) { + return request({ + url: '/jxc/ckstock/pageList', + method: 'get', + params: query + }) +} +// 分页查询即将过期仓库库存列表 +export function pageListByExpire(query) { + return request({ + url: '/jxc/ckstock/pageListByExpire', + method: 'get', + params: query + }) +} +export function newList(query) { + return request({ + url: '/jxc/ckstock/newList', + method: 'get', + params: query + }) +} + +// 查询仓库库存列表 +export function listCkstock(query) { + return request({ + url: '/jxc/ckstock/list', + method: 'get', + params: query + }) +} + +// 查询仓库库存列表 +export function warehouseList(query) { + return request({ + url: '/jxc/ckstock/warehouseList', + method: 'get', + params: query + }) +} +export function stockNumList(query) { + return request({ + url: '/jxc/ckstock/stockNumList', + method: 'get', + params: query + }) +} +export function getIndexMsg() { + return request({ + url: '/jxc/ckstock/getIndexMsg', + method: 'get', + }) +} + +// 查询仓库库存列表 +export function newListCkstock(query) { + return request({ + url: '/jxc/ckstock/newList' , + method: 'get' + }) +} + + +// 查询仓库库存详细 +export function getCkstock(id) { + return request({ + url: '/jxc/ckstock/' + id, + method: 'get' + }) +} + +// 新增仓库库存 +export function addCkstock(data) { + return request({ + url: '/jxc/ckstock', + method: 'post', + data: data + }) +} + +// 修改仓库库存 +export function updateCkstock(data) { + return request({ + url: '/jxc/ckstock', + method: 'put', + data: data + }) +} + +// 删除仓库库存 +export function delCkstock(id) { + return request({ + url: '/jxc/ckstock/' + id, + method: 'delete' + }) +} + +// 导出仓库库存 +export function exportCkstock(query) { + return request({ + url: '/jxc/ckstock/' + 'export', + method: 'post', + params: query + }) +} diff --git a/bs-ui/src/api/jxc/cust.js b/bs-ui/src/api/jxc/cust.js new file mode 100644 index 0000000..625d709 --- /dev/null +++ b/bs-ui/src/api/jxc/cust.js @@ -0,0 +1,62 @@ +import request from '@/utils/request' + +// 分页查询客户信息列表 +export function pageListCust(query) { + return request({ + url: '/jxc/cust/pageList', + method: 'get', + params: query + }) +} + +// 查询客户信息列表 +export function listCust(query) { + return request({ + url: '/jxc/cust/list', + method: 'get', + params: query + }) +} + +// 查询客户信息详细 +export function getCust(id) { + return request({ + url: '/jxc/cust/' + id, + method: 'get' + }) +} + +// 新增客户信息 +export function addCust(data) { + return request({ + url: '/jxc/cust', + method: 'post', + data: data + }) +} + +// 修改客户信息 +export function updateCust(data) { + return request({ + url: '/jxc/cust', + method: 'put', + data: data + }) +} + +// 删除客户信息 +export function delCust(id) { + return request({ + url: '/jxc/cust/' + id, + method: 'delete' + }) +} + +// 导出客户信息 +export function exportCust(query) { + return request({ + url: '/jxc/cust/' + 'export', + method: 'post', + params: query + }) +} diff --git a/bs-ui/src/api/jxc/custItem.js b/bs-ui/src/api/jxc/custItem.js new file mode 100644 index 0000000..0f4742c --- /dev/null +++ b/bs-ui/src/api/jxc/custItem.js @@ -0,0 +1,62 @@ +import request from '@/utils/request' + +// 分页查询客户子项信息列表 +export function pageListCustItem(query) { + return request({ + url: '/jxc/custItem/pageList', + method: 'get', + params: query + }) +} + +// 查询客户子项信息列表 +export function listCustItem(query) { + return request({ + url: '/jxc/custItem/list', + method: 'get', + params: query + }) +} + +// 查询客户子项信息详细 +export function getCustItem(ID) { + return request({ + url: '/jxc/custItem/' + ID, + method: 'get' + }) +} + +// 新增客户子项信息 +export function addCustItem(data) { + return request({ + url: '/jxc/custItem', + method: 'post', + data: data + }) +} + +// 修改客户子项信息 +export function updateCustItem(data) { + return request({ + url: '/jxc/custItem', + method: 'put', + data: data + }) +} + +// 删除客户子项信息 +export function delCustItem(ID) { + return request({ + url: '/jxc/custItem/' + ID, + method: 'delete' + }) +} + +// 导出客户子项信息 +export function exportCustItem(query) { + return request({ + url: '/jxc/custItem/' + 'export', + method: 'post', + params: query + }) +} diff --git a/bs-ui/src/api/jxc/port.js b/bs-ui/src/api/jxc/port.js new file mode 100644 index 0000000..d6fb8e1 --- /dev/null +++ b/bs-ui/src/api/jxc/port.js @@ -0,0 +1,62 @@ +import request from '@/utils/request' + +// 分页查询港口信息列表 +export function pageListPort(query) { + return request({ + url: '/jxc/port/pageList', + method: 'get', + params: query + }) +} + +// 查询港口信息列表 +export function listPort(query) { + return request({ + url: '/jxc/port/list', + method: 'get', + params: query + }) +} + +// 查询港口信息详细 +export function getPort(id) { + return request({ + url: '/jxc/port/' + id, + method: 'get' + }) +} + +// 新增港口信息 +export function addPort(data) { + return request({ + url: '/jxc/port', + method: 'post', + data: data + }) +} + +// 修改港口信息 +export function updatePort(data) { + return request({ + url: '/jxc/port', + method: 'put', + data: data + }) +} + +// 删除港口信息 +export function delPort(id) { + return request({ + url: '/jxc/port/' + id, + method: 'delete' + }) +} + +// 导出港口信息 +export function exportPort(query) { + return request({ + url: '/jxc/port/' + 'export', + method: 'post', + params: query + }) +} diff --git a/bs-ui/src/api/jxc/stock.js b/bs-ui/src/api/jxc/stock.js new file mode 100644 index 0000000..51b799e --- /dev/null +++ b/bs-ui/src/api/jxc/stock.js @@ -0,0 +1,62 @@ +import request from '@/utils/request' + +// 分页查询库场管理列表 +export function pageListStock(query) { + return request({ + url: '/jxc/stock/pageList', + method: 'get', + params: query + }) +} + +// 查询库场管理列表 +export function listStock(query) { + return request({ + url: '/jxc/stock/list', + method: 'get', + params: query + }) +} + +// 查询库场管理详细 +export function getStock(id) { + return request({ + url: '/jxc/stock/' + id, + method: 'get' + }) +} + +// 新增库场管理 +export function addStock(data) { + return request({ + url: '/jxc/stock', + method: 'post', + data: data + }) +} + +// 修改库场管理 +export function updateStock(data) { + return request({ + url: '/jxc/stock', + method: 'put', + data: data + }) +} + +// 删除库场管理 +export function delStock(id) { + return request({ + url: '/jxc/stock/' + id, + method: 'delete' + }) +} + +// 导出库场管理 +export function exportStock(query) { + return request({ + url: '/jxc/stock/' + 'export', + method: 'post', + params: query + }) +} diff --git a/bs-ui/src/api/jxc/vessel.js b/bs-ui/src/api/jxc/vessel.js new file mode 100644 index 0000000..15612dd --- /dev/null +++ b/bs-ui/src/api/jxc/vessel.js @@ -0,0 +1,62 @@ +import request from '@/utils/request' + +// 分页查询船舶基本资料列表 +export function pageListVessel(query) { + return request({ + url: '/jxc/vessel/pageList', + method: 'get', + params: query + }) +} + +// 查询船舶基本资料列表 +export function listVessel(query) { + return request({ + url: '/jxc/vessel/list', + method: 'get', + params: query + }) +} + +// 查询船舶基本资料详细 +export function getVessel(id) { + return request({ + url: '/jxc/vessel/' + id, + method: 'get' + }) +} + +// 新增船舶基本资料 +export function addVessel(data) { + return request({ + url: '/jxc/vessel', + method: 'post', + data: data + }) +} + +// 修改船舶基本资料 +export function updateVessel(data) { + return request({ + url: '/jxc/vessel', + method: 'put', + data: data + }) +} + +// 删除船舶基本资料 +export function delVessel(id) { + return request({ + url: '/jxc/vessel/' + id, + method: 'delete' + }) +} + +// 导出船舶基本资料 +export function exportVessel(query) { + return request({ + url: '/jxc/vessel/' + 'export', + method: 'post', + params: query + }) +} diff --git a/bs-ui/src/api/jxc/warehouse.js b/bs-ui/src/api/jxc/warehouse.js new file mode 100644 index 0000000..50c192e --- /dev/null +++ b/bs-ui/src/api/jxc/warehouse.js @@ -0,0 +1,71 @@ +import request from '@/utils/request' + +// 分页查询仓库信息列表 +export function pageListWarehouse(query) { + return request({ + url: '/jxc/warehouse/pageList', + method: 'get', + params: query + }) +} + +// 分页查询即将过期仓库信息列表 +export function pageListByWarehouseWithExpire(query) { + return request({ + url: '/jxc/warehouse/pageListByWarehouseWithExpire', + method: 'get', + params: query + }) +} + +// 查询仓库信息列表 +export function listWarehouse(query) { + return request({ + url: '/jxc/warehouse/list', + method: 'get', + params: query + }) +} + +// 查询仓库信息详细 +export function getWarehouse(id) { + return request({ + url: '/jxc/warehouse/' + id, + method: 'get' + }) +} + +// 新增仓库信息 +export function addWarehouse(data) { + return request({ + url: '/jxc/warehouse', + method: 'post', + data: data + }) +} + +// 修改仓库信息 +export function updateWarehouse(data) { + return request({ + url: '/jxc/warehouse', + method: 'put', + data: data + }) +} + +// 删除仓库信息 +export function delWarehouse(id) { + return request({ + url: '/jxc/warehouse/' + id, + method: 'delete' + }) +} + +// 导出仓库信息 +export function exportWarehouse(query) { + return request({ + url: '/jxc/warehouse/' + 'export', + method: 'post', + params: query + }) +} diff --git a/bs-ui/src/api/login.js b/bs-ui/src/api/login.js new file mode 100644 index 0000000..649f59c --- /dev/null +++ b/bs-ui/src/api/login.js @@ -0,0 +1,59 @@ +import request from '@/utils/request' + +// 登录方法 +export function login(username, password, code, uuid) { + const data = { + username, + password, + code, + uuid + } + return request({ + url: '/login', + headers: { + isToken: false + }, + method: 'post', + data: data + }) +} + +// 注册方法 +export function register(data) { + return request({ + url: '/register', + headers: { + isToken: false + }, + method: 'post', + data: data + }) +} + +// 获取用户详细信息 +export function getInfo() { + return request({ + url: '/getInfo', + method: 'get' + }) +} + +// 退出方法 +export function logout() { + return request({ + url: '/logout', + method: 'post' + }) +} + +// 获取验证码 +export function getCodeImg() { + return request({ + url: '/captchaImage', + headers: { + isToken: false + }, + method: 'get', + timeout: 20000 + }) +} \ No newline at end of file diff --git a/bs-ui/src/api/menu.js b/bs-ui/src/api/menu.js new file mode 100644 index 0000000..faef101 --- /dev/null +++ b/bs-ui/src/api/menu.js @@ -0,0 +1,9 @@ +import request from '@/utils/request' + +// 获取路由 +export const getRouters = () => { + return request({ + url: '/getRouters', + method: 'get' + }) +} \ No newline at end of file diff --git a/bs-ui/src/api/monitor/cache.js b/bs-ui/src/api/monitor/cache.js new file mode 100644 index 0000000..72c5f6a --- /dev/null +++ b/bs-ui/src/api/monitor/cache.js @@ -0,0 +1,57 @@ +import request from '@/utils/request' + +// 查询缓存详细 +export function getCache() { + return request({ + url: '/monitor/cache', + method: 'get' + }) +} + +// 查询缓存名称列表 +export function listCacheName() { + return request({ + url: '/monitor/cache/getNames', + method: 'get' + }) +} + +// 查询缓存键名列表 +export function listCacheKey(cacheName) { + return request({ + url: '/monitor/cache/getKeys/' + cacheName, + method: 'get' + }) +} + +// 查询缓存内容 +export function getCacheValue(cacheName, cacheKey) { + return request({ + url: '/monitor/cache/getValue/' + cacheName + '/' + cacheKey, + method: 'get' + }) +} + +// 清理指定名称缓存 +export function clearCacheName(cacheName) { + return request({ + url: '/monitor/cache/clearCacheName/' + cacheName, + method: 'delete' + }) +} + +// 清理指定键名缓存 +export function clearCacheKey(cacheKey) { + return request({ + url: '/monitor/cache/clearCacheKey/' + cacheKey, + method: 'delete' + }) +} + +// 清理全部缓存 +export function clearCacheAll() { + return request({ + url: '/monitor/cache/clearCacheAll', + method: 'delete' + }) +} diff --git a/bs-ui/src/api/monitor/job.js b/bs-ui/src/api/monitor/job.js new file mode 100644 index 0000000..3815569 --- /dev/null +++ b/bs-ui/src/api/monitor/job.js @@ -0,0 +1,71 @@ +import request from '@/utils/request' + +// 查询定时任务调度列表 +export function listJob(query) { + return request({ + url: '/monitor/job/list', + method: 'get', + params: query + }) +} + +// 查询定时任务调度详细 +export function getJob(jobId) { + return request({ + url: '/monitor/job/' + jobId, + method: 'get' + }) +} + +// 新增定时任务调度 +export function addJob(data) { + return request({ + url: '/monitor/job', + method: 'post', + data: data + }) +} + +// 修改定时任务调度 +export function updateJob(data) { + return request({ + url: '/monitor/job', + method: 'put', + data: data + }) +} + +// 删除定时任务调度 +export function delJob(jobId) { + return request({ + url: '/monitor/job/' + jobId, + method: 'delete' + }) +} + +// 任务状态修改 +export function changeJobStatus(jobId, status) { + const data = { + jobId, + status + } + return request({ + url: '/monitor/job/changeStatus', + method: 'put', + data: data + }) +} + + +// 定时任务立即执行一次 +export function runJob(jobId, jobGroup) { + const data = { + jobId, + jobGroup + } + return request({ + url: '/monitor/job/run', + method: 'put', + data: data + }) +} \ No newline at end of file diff --git a/bs-ui/src/api/monitor/jobLog.js b/bs-ui/src/api/monitor/jobLog.js new file mode 100644 index 0000000..6e0be61 --- /dev/null +++ b/bs-ui/src/api/monitor/jobLog.js @@ -0,0 +1,26 @@ +import request from '@/utils/request' + +// 查询调度日志列表 +export function listJobLog(query) { + return request({ + url: '/monitor/jobLog/list', + method: 'get', + params: query + }) +} + +// 删除调度日志 +export function delJobLog(jobLogId) { + return request({ + url: '/monitor/jobLog/' + jobLogId, + method: 'delete' + }) +} + +// 清空调度日志 +export function cleanJobLog() { + return request({ + url: '/monitor/jobLog/clean', + method: 'delete' + }) +} diff --git a/bs-ui/src/api/monitor/logininfor.js b/bs-ui/src/api/monitor/logininfor.js new file mode 100644 index 0000000..4d112b7 --- /dev/null +++ b/bs-ui/src/api/monitor/logininfor.js @@ -0,0 +1,34 @@ +import request from '@/utils/request' + +// 查询登录日志列表 +export function list(query) { + return request({ + url: '/monitor/logininfor/list', + method: 'get', + params: query + }) +} + +// 删除登录日志 +export function delLogininfor(infoId) { + return request({ + url: '/monitor/logininfor/' + infoId, + method: 'delete' + }) +} + +// 解锁用户登录状态 +export function unlockLogininfor(userName) { + return request({ + url: '/monitor/logininfor/unlock/' + userName, + method: 'get' + }) +} + +// 清空登录日志 +export function cleanLogininfor() { + return request({ + url: '/monitor/logininfor/clean', + method: 'delete' + }) +} diff --git a/bs-ui/src/api/monitor/online.js b/bs-ui/src/api/monitor/online.js new file mode 100644 index 0000000..bd22137 --- /dev/null +++ b/bs-ui/src/api/monitor/online.js @@ -0,0 +1,18 @@ +import request from '@/utils/request' + +// 查询在线用户列表 +export function list(query) { + return request({ + url: '/monitor/online/list', + method: 'get', + params: query + }) +} + +// 强退用户 +export function forceLogout(tokenId) { + return request({ + url: '/monitor/online/' + tokenId, + method: 'delete' + }) +} diff --git a/bs-ui/src/api/monitor/operlog.js b/bs-ui/src/api/monitor/operlog.js new file mode 100644 index 0000000..a04bca8 --- /dev/null +++ b/bs-ui/src/api/monitor/operlog.js @@ -0,0 +1,26 @@ +import request from '@/utils/request' + +// 查询操作日志列表 +export function list(query) { + return request({ + url: '/monitor/operlog/list', + method: 'get', + params: query + }) +} + +// 删除操作日志 +export function delOperlog(operId) { + return request({ + url: '/monitor/operlog/' + operId, + method: 'delete' + }) +} + +// 清空操作日志 +export function cleanOperlog() { + return request({ + url: '/monitor/operlog/clean', + method: 'delete' + }) +} diff --git a/bs-ui/src/api/monitor/server.js b/bs-ui/src/api/monitor/server.js new file mode 100644 index 0000000..e1f9ca2 --- /dev/null +++ b/bs-ui/src/api/monitor/server.js @@ -0,0 +1,9 @@ +import request from '@/utils/request' + +// 获取服务信息 +export function getServer() { + return request({ + url: '/monitor/server', + method: 'get' + }) +} \ No newline at end of file diff --git a/bs-ui/src/api/order/cargo.js b/bs-ui/src/api/order/cargo.js new file mode 100644 index 0000000..3305d04 --- /dev/null +++ b/bs-ui/src/api/order/cargo.js @@ -0,0 +1,62 @@ +import request from '@/utils/request' + +// 分页查询承运货物信息列表 +export function pageListCargo(query) { + return request({ + url: '/order/cargo/pageList', + method: 'get', + params: query + }) +} + +// 查询承运货物信息列表 +export function listCargo(query) { + return request({ + url: '/order/cargo/list', + method: 'get', + params: query + }) +} + +// 查询承运货物信息详细 +export function getCargo(ID) { + return request({ + url: '/order/cargo/' + ID, + method: 'get' + }) +} + +// 新增承运货物信息 +export function addCargo(data) { + return request({ + url: '/order/cargo', + method: 'post', + data: data + }) +} + +// 修改承运货物信息 +export function updateCargo(data) { + return request({ + url: '/order/cargo', + method: 'put', + data: data + }) +} + +// 删除承运货物信息 +export function delCargo(ID) { + return request({ + url: '/order/cargo/' + ID, + method: 'delete' + }) +} + +// 导出承运货物信息 +export function exportCargo(query) { + return request({ + url: '/order/cargo/' + 'export', + method: 'post', + params: query + }) +} diff --git a/bs-ui/src/api/order/price.js b/bs-ui/src/api/order/price.js new file mode 100644 index 0000000..3b09782 --- /dev/null +++ b/bs-ui/src/api/order/price.js @@ -0,0 +1,62 @@ +import request from '@/utils/request' + +// 分页查询承运价格信息列表 +export function pageListPrice(query) { + return request({ + url: '/order/price/pageList', + method: 'get', + params: query + }) +} + +// 查询承运价格信息列表 +export function listPrice(query) { + return request({ + url: '/order/price/list', + method: 'get', + params: query + }) +} + +// 查询承运价格信息详细 +export function getPrice(ID) { + return request({ + url: '/order/price/' + ID, + method: 'get' + }) +} + +// 新增承运价格信息 +export function addPrice(data) { + return request({ + url: '/order/price', + method: 'post', + data: data + }) +} + +// 修改承运价格信息 +export function updatePrice(data) { + return request({ + url: '/order/price', + method: 'put', + data: data + }) +} + +// 删除承运价格信息 +export function delPrice(ID) { + return request({ + url: '/order/price/' + ID, + method: 'delete' + }) +} + +// 导出承运价格信息 +export function exportPrice(query) { + return request({ + url: '/order/price/' + 'export', + method: 'post', + params: query + }) +} diff --git a/bs-ui/src/api/order/trans.js b/bs-ui/src/api/order/trans.js new file mode 100644 index 0000000..96542b8 --- /dev/null +++ b/bs-ui/src/api/order/trans.js @@ -0,0 +1,71 @@ +import request from '@/utils/request' + +// 分页查询车辆货物运输列表 +export function pageListTrans(query) { + return request({ + url: '/order/trans/pageList', + method: 'get', + params: query + }) +} + +// 查询车辆货物运输列表 +export function listTrans(query) { + return request({ + url: '/order/trans/list', + method: 'get', + params: query + }) +} + +// 查询车辆货物运输详细 +export function getTrans(ID) { + return request({ + url: '/order/trans/' + ID, + method: 'get' + }) +} + +// 新增车辆货物运输 +export function addTrans(data) { + return request({ + url: '/order/trans', + method: 'post', + data: data + }) +} + +// 修改车辆货物运输 +export function updateTrans(data) { + return request({ + url: '/order/trans', + method: 'put', + data: data + }) +} + +// 批量修改新增运输计划 +export function saveTrans(data) { + return request({ + url: '/order/trans/saveTrans', + method: 'post', + data: data + }) +} + +// 删除车辆货物运输 +export function delTrans(ID) { + return request({ + url: '/order/trans/' + ID, + method: 'delete' + }) +} + +// 导出车辆货物运输 +export function exportTrans(query) { + return request({ + url: '/order/trans/' + 'export', + method: 'post', + params: query + }) +} diff --git a/bs-ui/src/api/order/vehicle.js b/bs-ui/src/api/order/vehicle.js new file mode 100644 index 0000000..8e78453 --- /dev/null +++ b/bs-ui/src/api/order/vehicle.js @@ -0,0 +1,62 @@ +import request from '@/utils/request' + +// 分页查询订单车辆列表 +export function pageListVehicle(query) { + return request({ + url: '/order/vehicle/pageList', + method: 'get', + params: query + }) +} + +// 查询订单车辆列表 +export function listVehicle(query) { + return request({ + url: '/order/vehicle/list', + method: 'get', + params: query + }) +} + +// 查询订单车辆详细 +export function getVehicle(ID) { + return request({ + url: '/order/vehicle/' + ID, + method: 'get' + }) +} + +// 新增订单车辆 +export function addVehicle(data) { + return request({ + url: '/order/vehicle', + method: 'post', + data: data + }) +} + +// 修改订单车辆 +export function updateVehicle(data) { + return request({ + url: '/order/vehicle', + method: 'put', + data: data + }) +} + +// 删除订单车辆 +export function delVehicle(ID) { + return request({ + url: '/order/vehicle/' + ID, + method: 'delete' + }) +} + +// 导出订单车辆 +export function exportVehicle(query) { + return request({ + url: '/order/vehicle/' + 'export', + method: 'post', + params: query + }) +} diff --git a/bs-ui/src/api/system/config.js b/bs-ui/src/api/system/config.js new file mode 100644 index 0000000..a404d82 --- /dev/null +++ b/bs-ui/src/api/system/config.js @@ -0,0 +1,60 @@ +import request from '@/utils/request' + +// 查询参数列表 +export function listConfig(query) { + return request({ + url: '/system/config/list', + method: 'get', + params: query + }) +} + +// 查询参数详细 +export function getConfig(configId) { + return request({ + url: '/system/config/' + configId, + method: 'get' + }) +} + +// 根据参数键名查询参数值 +export function getConfigKey(configKey) { + return request({ + url: '/system/config/configKey/' + configKey, + method: 'get' + }) +} + +// 新增参数配置 +export function addConfig(data) { + return request({ + url: '/system/config', + method: 'post', + data: data + }) +} + +// 修改参数配置 +export function updateConfig(data) { + return request({ + url: '/system/config', + method: 'put', + data: data + }) +} + +// 删除参数配置 +export function delConfig(configId) { + return request({ + url: '/system/config/' + configId, + method: 'delete' + }) +} + +// 刷新参数缓存 +export function refreshCache() { + return request({ + url: '/system/config/refreshCache', + method: 'delete' + }) +} diff --git a/bs-ui/src/api/system/dept.js b/bs-ui/src/api/system/dept.js new file mode 100644 index 0000000..fc943cd --- /dev/null +++ b/bs-ui/src/api/system/dept.js @@ -0,0 +1,52 @@ +import request from '@/utils/request' + +// 查询部门列表 +export function listDept(query) { + return request({ + url: '/system/dept/list', + method: 'get', + params: query + }) +} + +// 查询部门列表(排除节点) +export function listDeptExcludeChild(deptId) { + return request({ + url: '/system/dept/list/exclude/' + deptId, + method: 'get' + }) +} + +// 查询部门详细 +export function getDept(deptId) { + return request({ + url: '/system/dept/' + deptId, + method: 'get' + }) +} + +// 新增部门 +export function addDept(data) { + return request({ + url: '/system/dept', + method: 'post', + data: data + }) +} + +// 修改部门 +export function updateDept(data) { + return request({ + url: '/system/dept', + method: 'put', + data: data + }) +} + +// 删除部门 +export function delDept(deptId) { + return request({ + url: '/system/dept/' + deptId, + method: 'delete' + }) +} \ No newline at end of file diff --git a/bs-ui/src/api/system/dict/data.js b/bs-ui/src/api/system/dict/data.js new file mode 100644 index 0000000..6c9eb79 --- /dev/null +++ b/bs-ui/src/api/system/dict/data.js @@ -0,0 +1,52 @@ +import request from '@/utils/request' + +// 查询字典数据列表 +export function listData(query) { + return request({ + url: '/system/dict/data/list', + method: 'get', + params: query + }) +} + +// 查询字典数据详细 +export function getData(dictCode) { + return request({ + url: '/system/dict/data/' + dictCode, + method: 'get' + }) +} + +// 根据字典类型查询字典数据信息 +export function getDicts(dictType) { + return request({ + url: '/system/dict/data/type/' + dictType, + method: 'get' + }) +} + +// 新增字典数据 +export function addData(data) { + return request({ + url: '/system/dict/data', + method: 'post', + data: data + }) +} + +// 修改字典数据 +export function updateData(data) { + return request({ + url: '/system/dict/data', + method: 'put', + data: data + }) +} + +// 删除字典数据 +export function delData(dictCode) { + return request({ + url: '/system/dict/data/' + dictCode, + method: 'delete' + }) +} diff --git a/bs-ui/src/api/system/dict/type.js b/bs-ui/src/api/system/dict/type.js new file mode 100644 index 0000000..a7a6e01 --- /dev/null +++ b/bs-ui/src/api/system/dict/type.js @@ -0,0 +1,60 @@ +import request from '@/utils/request' + +// 查询字典类型列表 +export function listType(query) { + return request({ + url: '/system/dict/type/list', + method: 'get', + params: query + }) +} + +// 查询字典类型详细 +export function getType(dictId) { + return request({ + url: '/system/dict/type/' + dictId, + method: 'get' + }) +} + +// 新增字典类型 +export function addType(data) { + return request({ + url: '/system/dict/type', + method: 'post', + data: data + }) +} + +// 修改字典类型 +export function updateType(data) { + return request({ + url: '/system/dict/type', + method: 'put', + data: data + }) +} + +// 删除字典类型 +export function delType(dictId) { + return request({ + url: '/system/dict/type/' + dictId, + method: 'delete' + }) +} + +// 刷新字典缓存 +export function refreshCache() { + return request({ + url: '/system/dict/type/refreshCache', + method: 'delete' + }) +} + +// 获取字典选择框列表 +export function optionselect() { + return request({ + url: '/system/dict/type/optionselect', + method: 'get' + }) +} \ No newline at end of file diff --git a/bs-ui/src/api/system/menu.js b/bs-ui/src/api/system/menu.js new file mode 100644 index 0000000..f6415c6 --- /dev/null +++ b/bs-ui/src/api/system/menu.js @@ -0,0 +1,60 @@ +import request from '@/utils/request' + +// 查询菜单列表 +export function listMenu(query) { + return request({ + url: '/system/menu/list', + method: 'get', + params: query + }) +} + +// 查询菜单详细 +export function getMenu(menuId) { + return request({ + url: '/system/menu/' + menuId, + method: 'get' + }) +} + +// 查询菜单下拉树结构 +export function treeselect() { + return request({ + url: '/system/menu/treeselect', + method: 'get' + }) +} + +// 根据角色ID查询菜单下拉树结构 +export function roleMenuTreeselect(roleId) { + return request({ + url: '/system/menu/roleMenuTreeselect/' + roleId, + method: 'get' + }) +} + +// 新增菜单 +export function addMenu(data) { + return request({ + url: '/system/menu', + method: 'post', + data: data + }) +} + +// 修改菜单 +export function updateMenu(data) { + return request({ + url: '/system/menu', + method: 'put', + data: data + }) +} + +// 删除菜单 +export function delMenu(menuId) { + return request({ + url: '/system/menu/' + menuId, + method: 'delete' + }) +} \ No newline at end of file diff --git a/bs-ui/src/api/system/notice.js b/bs-ui/src/api/system/notice.js new file mode 100644 index 0000000..3c5feea --- /dev/null +++ b/bs-ui/src/api/system/notice.js @@ -0,0 +1,62 @@ +import request from '@/utils/request' + +// 分页查询通知公告列表 +export function pageListNotice(query) { + return request({ + url: '/system/notice/pageList', + method: 'get', + params: query + }) +} + +// 查询通知公告列表 +export function listNotice(query) { + return request({ + url: '/system/notice/list', + method: 'get', + params: query + }) +} + +// 查询通知公告详细 +export function getNotice(noticeId) { + return request({ + url: '/system/notice/' + noticeId, + method: 'get' + }) +} + +// 新增通知公告 +export function addNotice(data) { + return request({ + url: '/system/notice', + method: 'post', + data: data + }) +} + +// 修改通知公告 +export function updateNotice(data) { + return request({ + url: '/system/notice', + method: 'put', + data: data + }) +} + +// 删除通知公告 +export function delNotice(noticeId) { + return request({ + url: '/system/notice/' + noticeId, + method: 'delete' + }) +} + +// 导出通知公告 +export function exportNotice(query) { + return request({ + url: '/system/notice/' + 'export', + method: 'post', + params: query + }) +} diff --git a/bs-ui/src/api/system/post.js b/bs-ui/src/api/system/post.js new file mode 100644 index 0000000..1a8e9ca --- /dev/null +++ b/bs-ui/src/api/system/post.js @@ -0,0 +1,44 @@ +import request from '@/utils/request' + +// 查询岗位列表 +export function listPost(query) { + return request({ + url: '/system/post/list', + method: 'get', + params: query + }) +} + +// 查询岗位详细 +export function getPost(postId) { + return request({ + url: '/system/post/' + postId, + method: 'get' + }) +} + +// 新增岗位 +export function addPost(data) { + return request({ + url: '/system/post', + method: 'post', + data: data + }) +} + +// 修改岗位 +export function updatePost(data) { + return request({ + url: '/system/post', + method: 'put', + data: data + }) +} + +// 删除岗位 +export function delPost(postId) { + return request({ + url: '/system/post/' + postId, + method: 'delete' + }) +} diff --git a/bs-ui/src/api/system/role.js b/bs-ui/src/api/system/role.js new file mode 100644 index 0000000..f13e6f4 --- /dev/null +++ b/bs-ui/src/api/system/role.js @@ -0,0 +1,119 @@ +import request from '@/utils/request' + +// 查询角色列表 +export function listRole(query) { + return request({ + url: '/system/role/list', + method: 'get', + params: query + }) +} + +// 查询角色详细 +export function getRole(roleId) { + return request({ + url: '/system/role/' + roleId, + method: 'get' + }) +} + +// 新增角色 +export function addRole(data) { + return request({ + url: '/system/role', + method: 'post', + data: data + }) +} + +// 修改角色 +export function updateRole(data) { + return request({ + url: '/system/role', + method: 'put', + data: data + }) +} + +// 角色数据权限 +export function dataScope(data) { + return request({ + url: '/system/role/dataScope', + method: 'put', + data: data + }) +} + +// 角色状态修改 +export function changeRoleStatus(roleId, status) { + const data = { + roleId, + status + } + return request({ + url: '/system/role/changeStatus', + method: 'put', + data: data + }) +} + +// 删除角色 +export function delRole(roleId) { + return request({ + url: '/system/role/' + roleId, + method: 'delete' + }) +} + +// 查询角色已授权用户列表 +export function allocatedUserList(query) { + return request({ + url: '/system/role/authUser/allocatedList', + method: 'get', + params: query + }) +} + +// 查询角色未授权用户列表 +export function unallocatedUserList(query) { + return request({ + url: '/system/role/authUser/unallocatedList', + method: 'get', + params: query + }) +} + +// 取消用户授权角色 +export function authUserCancel(data) { + return request({ + url: '/system/role/authUser/cancel', + method: 'put', + data: data + }) +} + +// 批量取消用户授权角色 +export function authUserCancelAll(data) { + return request({ + url: '/system/role/authUser/cancelAll', + method: 'put', + params: data + }) +} + +// 授权用户选择 +export function authUserSelectAll(data) { + return request({ + url: '/system/role/authUser/selectAll', + method: 'put', + params: data + }) +} + +// 根据角色ID查询部门树结构 +export function deptTreeSelect(roleId) { + return request({ + url: '/system/role/deptTree/' + roleId, + method: 'get' + }) +} diff --git a/bs-ui/src/api/system/tenant.js b/bs-ui/src/api/system/tenant.js new file mode 100644 index 0000000..adc4496 --- /dev/null +++ b/bs-ui/src/api/system/tenant.js @@ -0,0 +1,62 @@ +import request from '@/utils/request' + +// 分页查询租户信息列表 +export function pageListTenant(query) { + return request({ + url: '/system/tenant/pageList', + method: 'get', + params: query + }) +} + +// 查询租户信息列表 +export function listTenant(query) { + return request({ + url: '/system/tenant/list', + method: 'get', + params: query + }) +} + +// 查询租户信息详细 +export function getTenant(id) { + return request({ + url: '/system/tenant/' + id, + method: 'get' + }) +} + +// 新增租户信息 +export function addTenant(data) { + return request({ + url: '/system/tenant', + method: 'post', + data: data + }) +} + +// 修改租户信息 +export function updateTenant(data) { + return request({ + url: '/system/tenant', + method: 'put', + data: data + }) +} + +// 删除租户信息 +export function delTenant(id) { + return request({ + url: '/system/tenant/' + id, + method: 'delete' + }) +} + +// 导出租户信息 +export function exportTenant(query) { + return request({ + url: '/system/tenant/' + 'export', + method: 'post', + params: query + }) +} diff --git a/bs-ui/src/api/system/tenant/config.js b/bs-ui/src/api/system/tenant/config.js new file mode 100644 index 0000000..4eae3d4 --- /dev/null +++ b/bs-ui/src/api/system/tenant/config.js @@ -0,0 +1,62 @@ +import request from '@/utils/request' + +// 分页查询租户配置列表 +export function pageListConfig(query) { + return request({ + url: '/tenant/config/pageList', + method: 'get', + params: query + }) +} + +// 查询租户配置列表 +export function listConfig(query) { + return request({ + url: '/tenant/config/list', + method: 'get', + params: query + }) +} + +// 查询租户配置详细 +export function getConfig(id) { + return request({ + url: '/tenant/config/' + id, + method: 'get' + }) +} + +// 新增租户配置 +export function addConfig(data) { + return request({ + url: '/tenant/config', + method: 'post', + data: data + }) +} + +// 修改租户配置 +export function updateConfig(data) { + return request({ + url: '/tenant/config', + method: 'put', + data: data + }) +} + +// 删除租户配置 +export function delConfig(id) { + return request({ + url: '/tenant/config/' + id, + method: 'delete' + }) +} + +// 租户logo上传 +export function uploadLogo(data) { + return request({ + url: '/tenant/config/logo', + method: 'post', + data: data + }) +} \ No newline at end of file diff --git a/bs-ui/src/api/system/user.js b/bs-ui/src/api/system/user.js new file mode 100644 index 0000000..5c8c399 --- /dev/null +++ b/bs-ui/src/api/system/user.js @@ -0,0 +1,143 @@ +import request from '@/utils/request' +import { parseStrEmpty } from "@/utils/bs"; + +// 查询用户列表 +export function listUser(query) { + return request({ + url: '/system/user/list', + method: 'get', + params: query + }) +} + +// 查询用户详细 +export function getUser(userId) { + return request({ + url: '/system/user/' + parseStrEmpty(userId), + method: 'get' + }) +} + +// 查询角色列表 +export function getRoles(userId) { + return request({ + url: '/system/user/getRoles', + method: 'get' + }) +} + +// 新增用户 +export function addUser(data) { + return request({ + url: '/system/user', + method: 'post', + data: data + }) +} + +// 修改用户 +export function updateUser(data) { + return request({ + url: '/system/user', + method: 'put', + data: data + }) +} + +// 删除用户 +export function delUser(userId) { + return request({ + url: '/system/user/' + userId, + method: 'delete' + }) +} + +// 用户密码重置 +export function resetUserPwd(userId, password) { + const data = { + userId, + password + } + return request({ + url: '/system/user/resetPwd', + method: 'put', + data: data + }) +} + +// 用户状态修改 +export function changeUserStatus(userId, status) { + const data = { + userId, + status + } + return request({ + url: '/system/user/changeStatus', + method: 'put', + data: data + }) +} + +// 查询用户个人信息 +export function getUserProfile() { + return request({ + url: '/system/user/profile', + method: 'get' + }) +} + +// 修改用户个人信息 +export function updateUserProfile(data) { + return request({ + url: '/system/user/profile', + method: 'put', + data: data + }) +} + +// 用户密码重置 +export function updateUserPwd(oldPassword, newPassword) { + const data = { + oldPassword, + newPassword + } + return request({ + url: '/system/user/profile/updatePwd', + method: 'put', + params: data + }) +} + +// 用户头像上传 +export function uploadAvatar(data) { + return request({ + url: '/system/user/profile/avatar', + method: 'post', + data: data + }) +} + +// 查询授权角色 +export function getAuthRole(userId) { + return request({ + url: '/system/user/authRole/' + userId, + method: 'get' + }) +} + +// 保存授权角色 +export function updateAuthRole(data) { + return request({ + url: '/system/user/authRole', + method: 'put', + params: data + }) +} + +// 查询部门下拉树结构 +export function deptTreeSelect() { + return request({ + url: '/system/user/deptTree', + method: 'get' + }) +} diff --git a/bs-ui/src/api/tm/driver.js b/bs-ui/src/api/tm/driver.js new file mode 100644 index 0000000..972828c --- /dev/null +++ b/bs-ui/src/api/tm/driver.js @@ -0,0 +1,62 @@ +import request from '@/utils/request' + +// 分页查询驾驶员信息列表 +export function pageListDriver(query) { + return request({ + url: '/tm/driver/pageList', + method: 'get', + params: query + }) +} + +// 查询驾驶员信息列表 +export function listDriver(query) { + return request({ + url: '/tm/driver/list', + method: 'get', + params: query + }) +} + +// 查询驾驶员信息详细 +export function getDriver(driverId) { + return request({ + url: '/tm/driver/' + driverId, + method: 'get' + }) +} + +// 新增驾驶员信息 +export function addDriver(data) { + return request({ + url: '/tm/driver', + method: 'post', + data: data + }) +} + +// 修改驾驶员信息 +export function updateDriver(data) { + return request({ + url: '/tm/driver', + method: 'put', + data: data + }) +} + +// 删除驾驶员信息 +export function delDriver(driverId) { + return request({ + url: '/tm/driver/' + driverId, + method: 'delete' + }) +} + +// 导出驾驶员信息 +export function exportDriver(query) { + return request({ + url: '/tm/driver/' + 'export', + method: 'post', + params: query + }) +} diff --git a/bs-ui/src/api/tm/order.js b/bs-ui/src/api/tm/order.js new file mode 100644 index 0000000..34b62fc --- /dev/null +++ b/bs-ui/src/api/tm/order.js @@ -0,0 +1,89 @@ +import request from '@/utils/request' + +// 分页查询承运订单列表 +export function pageListOrder(query) { + return request({ + url: '/tm/order/pageList', + method: 'get', + params: query + }) +} + +// 分页查询托运和承运订单列表 +export function allPageListOrder(query) { + return request({ + url: '/tm/allOrder/pageList', + method: 'get', + params: query + }) +} + +// 查询承运订单列表 +export function listOrder(query) { + return request({ + url: '/tm/order/list', + method: 'get', + params: query + }) +} + +// 查询承运订单详细 +export function getOrder(ID) { + return request({ + url: '/tm/order/' + ID, + method: 'get' + }) +} + +// 新增承运订单 +export function addOrder(data) { + return request({ + url: '/tm/order', + method: 'post', + data: data + }) +} + +// 修改承运订单 +export function updateOrder(data) { + return request({ + url: '/tm/order', + method: 'put', + data: data + }) +} + +// 删除承运订单 +export function delOrder(ID) { + return request({ + url: '/tm/order/' + ID, + method: 'delete' + }) +} + +// 导出承运订单 +export function exportOrder(query) { + return request({ + url: '/tm/order/' + 'export', + method: 'post', + params: query + }) +} + +// 自动计算运输计划 +export function addBatchTrans(data) { + return request({ + url: '/tm/order/addBatchTrans', + method: 'post', + data: data + }) +} + +// 撤销订单到已经完成 +export function revokeOrder(data) { + return request({ + url: '/tm/order/revokeOrder', + method: 'post', + data, + }) +} \ No newline at end of file diff --git a/bs-ui/src/api/tm/vehicle.js b/bs-ui/src/api/tm/vehicle.js new file mode 100644 index 0000000..5c9e1da --- /dev/null +++ b/bs-ui/src/api/tm/vehicle.js @@ -0,0 +1,62 @@ +import request from '@/utils/request' + +// 分页查询车辆信息列表 +export function pageListVehicle(query) { + return request({ + url: '/tm/vehicle/pageList', + method: 'get', + params: query + }) +} + +// 查询车辆信息列表 +export function listVehicle(query) { + return request({ + url: '/tm/vehicle/list', + method: 'get', + params: query + }) +} + +// 查询车辆信息详细 +export function getVehicle(ID) { + return request({ + url: '/tm/vehicle/' + ID, + method: 'get' + }) +} + +// 新增车辆信息 +export function addVehicle(data) { + return request({ + url: '/tm/vehicle', + method: 'post', + data: data + }) +} + +// 修改车辆信息 +export function updateVehicle(data) { + return request({ + url: '/tm/vehicle', + method: 'put', + data: data + }) +} + +// 删除车辆信息 +export function delVehicle(ID) { + return request({ + url: '/tm/vehicle/' + ID, + method: 'delete' + }) +} + +// 导出车辆信息 +export function exportVehicle(query) { + return request({ + url: '/tm/vehicle/' + 'export', + method: 'post', + params: query + }) +} diff --git a/bs-ui/src/api/tool/gen.js b/bs-ui/src/api/tool/gen.js new file mode 100644 index 0000000..4506927 --- /dev/null +++ b/bs-ui/src/api/tool/gen.js @@ -0,0 +1,76 @@ +import request from '@/utils/request' + +// 查询生成表数据 +export function listTable(query) { + return request({ + url: '/tool/gen/list', + method: 'get', + params: query + }) +} +// 查询db数据库列表 +export function listDbTable(query) { + return request({ + url: '/tool/gen/db/list', + method: 'get', + params: query + }) +} + +// 查询表详细信息 +export function getGenTable(tableId) { + return request({ + url: '/tool/gen/' + tableId, + method: 'get' + }) +} + +// 修改代码生成信息 +export function updateGenTable(data) { + return request({ + url: '/tool/gen', + method: 'put', + data: data + }) +} + +// 导入表 +export function importTable(data) { + return request({ + url: '/tool/gen/importTable', + method: 'post', + params: data + }) +} + +// 预览生成代码 +export function previewTable(tableId) { + return request({ + url: '/tool/gen/preview/' + tableId, + method: 'get' + }) +} + +// 删除表数据 +export function delTable(tableId) { + return request({ + url: '/tool/gen/' + tableId, + method: 'delete' + }) +} + +// 生成代码(自定义路径) +export function genCode(tableName) { + return request({ + url: '/tool/gen/genCode/' + tableName, + method: 'get' + }) +} + +// 同步数据库 +export function synchDb(tableName) { + return request({ + url: '/tool/gen/synchDb/' + tableName, + method: 'get' + }) +} diff --git a/bs-ui/src/api/trans/cargo.js b/bs-ui/src/api/trans/cargo.js new file mode 100644 index 0000000..f1231d9 --- /dev/null +++ b/bs-ui/src/api/trans/cargo.js @@ -0,0 +1,71 @@ +import request from '@/utils/request' + +// 分页查询运输装载列表 +export function pageListCargo(query) { + return request({ + url: '/trans/cargo/pageList', + method: 'get', + params: query + }) +} + +// 查询运输装载列表 +export function listCargo(query) { + return request({ + url: '/trans/cargo/list', + method: 'get', + params: query + }) +} + +// 查询运输装载详细 +export function getCargo(ID) { + return request({ + url: '/trans/cargo/' + ID, + method: 'get' + }) +} + +// 新增运输装载 +export function addCargo(data) { + return request({ + url: '/trans/cargo', + method: 'post', + data: data + }) +} + +// 修改运输装载 +export function updateCargo(data) { + return request({ + url: '/trans/cargo', + method: 'put', + data: data + }) +} + +// 批量保存货物运输计划 +export function saveTransCargo(data) { + return request({ + url: '/trans/cargo/saveTransCargo', + method: 'post', + data: data + }) +} + +// 删除运输装载 +export function delCargo(ID) { + return request({ + url: '/trans/cargo/' + ID, + method: 'delete' + }) +} + +// 导出运输装载 +export function exportCargo(query) { + return request({ + url: '/trans/cargo/' + 'export', + method: 'post', + params: query + }) +} diff --git a/bs-ui/src/assets/401_images/401.gif b/bs-ui/src/assets/401_images/401.gif new file mode 100644 index 0000000000000000000000000000000000000000..cd6e0d9433421b3f29d0ec0c40f755e354728000 GIT binary patch literal 164227 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⋘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 GY5fOuZZib{ literal 0 HcmV?d00001 diff --git a/bs-ui/src/assets/404_images/404.png b/bs-ui/src/assets/404_images/404.png new file mode 100644 index 0000000000000000000000000000000000000000..3d8e2305cc973ad2121403aee4bf08728f76c461 GIT binary patch literal 98071 zcmZsD1yoe)_qGfpFmxy&-5?DTB3;rUAxKDvbVzqeiAZ-S3L@QI(jWrT-5rArH4O2c zxq5&1-u3_1I%_Gcbl>@Z)@`}0ni zgTxS1Xz2Sp5LyN$jB+`(TK2go0$*ON+wYG~Qz71pR)(>+cvvo`d01{Xdj)u2?ZXzy zmA;x1Nzp_;m7?it6=)ebdFi9=K=7-zt#9B^kGF`IzK;CC(qMy@r8#>WqG2@cS5uox zXbf0B@c&#i)!^b0Mb!?4K=50dqjrDj)8Y7T(OQwKjh4xB0;y*hgfuAsToL#vtY-x2 zcDPC4UD@TJ&X)ylS~p2s{Vm(V1wS(C*u6kTtf;l}x2;9RDSK|B+2Q|vU# z5g|>`3ves^tw-x#pW$kM%4o{)rRUjP-bFAxh4kKaDr2nlD0Ny3>QcfT2w<51UE`{O zQGN&5UTB2YKA@#pXv;7`0|{yiD)FUE4eA?4@$j%fYDMKsqFQWUi?UOjnyuv<1_{u= zug?(m3a+6reFd6hu*h(3OM4>q*mTc~Pg?D7J-n+TvnsoY9 zWoxbD->+xD=K*Q$(+jLna6%I4kA`x*GDPIgI-Zm%UVn5!@S7kc4LW0oj3yb?d`)8c z7ej523IBV$9&o#~u-m;%@UGl)D|$=WY^|@KLU`Ac)l*@|602_{T4+M7IA6dbP#2AL)Eg1u&)lV@(b^iSAa}Wv>^6+>!0CyZsvtcv1&Qq&svN z+sZThYEIutRzAD;PdEXgWle?>lIf5kVEHlvET1a{;shO{ zn-EQLhR|g}l#-=7bY$DeCw*BaO6=ZCIRr)2d3ye8*IdkaiCqEbd9ba|DSo;7ROxl@(%P?=XHjX#v%4uLDStHz#?vp;8Jp~psBrurXiozhE0`(5iED>LBhfh5__U^oInU|$yP zEjDz&{zwWAxMdUZr8h#Q=vPr46k)9@kV_jypUZrWZ3!8{4Gc-ISvP>EqE52=OPg%cn3_A1Z+SuWO*0}uNWds4s zAhHbNeJ>FWsaCAW5waW9L4FA9Wr=FLpr*j>!WUNfY>TSb`i)Yththth%76Sc@)}q} z#=A@s1{4@Z>WAs!^^cH?WYrfik`9X{fiIcaicws{R=?W(`}oTdF7Taj4mNRDu&>;I z{4zufM6pn&*L_0n^uS2Kp2m8rj=vHajm%)0ZyNTcn@wug^UjqFs9J#iwD=khPyY|B zktqP6M89)9&wx(|%4a*P;&Jc6s(^o8=aRB(4Kgwpm-fAp_?~bxq0|4UPCxmP54Nw` zf8KveXS@t^YI)NG0{})#k;X3S`owvLhXtN)LG8zL?>f|k6Y<^+zeU_~P(n_T3cesZ z8M$)|qkPrp{Yt_1HBT1+ zO$}G`mF#sBF264SZO#=YiEgoZnB0y+E+=?at|BLr{=?)Ir}<1cztP~%gOtGG__6o( zMm~b3uxF~!@$Upjl>b=+yK-RE^|!b6=#XmBAb0Kk0yP63l$@RoTOm8=ocSwp{*zOYGx+e}se(;LO3e6?ei2{2&&Vv#NqBGgg!wJ(!R2P`LBb7c^&8 z?_}TM;6eYN3D70K&z~p#{=4r}rQ6HpW`vHNQ6cYvu$FmNk@Ifi=~0v3F+WPqS*X{> z2_Nn)^R~a;O-srktbEh9S&aNYACRic7*z#8+=w0Mna;iy>`*~9X)GjuDJ%2()!vdB zZ0%@0nm{d0Hybg!I$Csmq{VC#z5?Jn182ITfa?C@E(zU!0=cu06u$Y?}# z)Q!Vd5YFX{PI!wE)k>WaaQkvEERB9y_+J|{$ekI8#RaR>HTob-4E2h#JB02*h^Df6 z+hbAf6XDe)%Bk-yG^;-KiykYn{3G^*W_{J-^WXPidjIz05b`1L?_RQm-0y&O7;DB? znhfbMQX7`Q)xWCPdi9+!bnTwM4~5>a6{jc@y+8h6f(8CFuG-$*J2Knb^#~b_$kXV(?y&%;wLJv#A=pR$wIksq9h{$)&wK4AHHGojB6 z2(7_D+CMG$3c1i4)v3GYWLSQ5Fi4E)uPOqkT_=lR{&dUcQ=+q{7G%ZnFRo#YhBB7T zpTT4KG6XDdObk4tDsUWL!nCY;*QhBHa&fhy=Rzuuu@v+LHImBfsx)g-H;d=!^}p?a zgG^77#$I}a7(~GRLzx^(#GUa*ujinA+$hxZSd|yfo)lV_E1uj==Sh=$LkwNEasOf) zT5`b0yEWGfLaG^o+eYhw|&EXwMkEM>mX1|P;97mZ;zVY)Zsr#NQ z_wXNtrD+7xw4BGGkPG2sC178@xc9VW`wjIKq1&9CoxjJoJ{NDBp#buct7%`48WHE) zC$>LXBJREU2b$<4faQak(xe%J!T?_wMX2wIi)RGlMfr1i&r78EsVhp4-iqCvF&mHG z4kS$mO(x`l|FPc44H*0NiCw@p1ufF6T1qrfZx zWV5;6dMF$~gZGYJq({OgEp7LSuk~T2jza-BbAVZV3a>nup0jCE;N8am$F1!WO{#9F z%ZtF*))3`(x4OT{&;Ibpq5mgm{eg5pR8mNE`+AdK3E!M1R^k^_?eqFd6IT^(Ix_RdbaCSknTxXyUb|;m z&nNLmSwmlEZ7K+W|5x57X?vWEy@v0lp0n|tEjaXJUEYw9gaX7 z^uv?6E_PQbj8#SqOIQ0dtdeinTHL0b>j}|=KjZ()=~AFKB8@fg?{KMr7-*`eVN9v2 z5+(3xlWu4Te*okrAKMW0)Vu@Z-fg&P#851~z%5(K3%P>WkTRft_~S4dR%F~-z-#%4erE*iyIUDsI_aw!@R(+*>ZLLojl=EX;6?#;ZLvr}?BDkWfMk8f46 zly8wLw37nqASMlS?e0US<+1v!ZuJu)o=388_yaKFMZa(&D8r_&%q$fZ3;!1>^11Gy zH&1jY#kjMB{(5BY4VdEIM{#~yf1SA&y(8`ZDF$CA#^sPyKho>0h@rMeW|863S2=5b zZI*LJ9-puF-3MKE)x!UULqU`HK!EVidubDLM*;EsR7K7@Orc9%wX6s~WvK{qfnBqS zdPL)Yb>-qs`Os_K<6M_n3M(u4Uxf>>_qOZ-@3gObHKXsUN)R2Leg&}D3?__yiWf2{ z_V(gf^NLae+P38aZ?Jgbun=?<`Y)FtSr$1)N&!<)Ij|Hl_DA<$3TbL0u@oA_Pu=53 zPo9Vv!!I_vf6b{+B`MUR`4m&}!#^f5CPR^?F3DHuO97sVgG>x75ne&Bz@{VV{7gnk zz8pm<GC_er@IEsh z=7|sF0pe@QiuD95$$$3Lq|hqpBYVqOF`P2;GOKCPD)>t;&-s!xZ6Jz5f8M#F4bB9D zOoaNMO_xXyn1JGe19K1ta!J0G{E&HVTagC;yuR9vu(I*GVb9~LyzHxGW96Qzj^QDC zE5ak9qmHPu7iTq@REe+X$-7)cl>80e4z-=L?xp<4*t2f}Kg7z~cc!4y2C3ucni?(e z75ZH8?}@;V(BeweHxn$bx($aD63nujoxUaXE=Bh5z3nT-JrVJl8`doS#?v+%74Wa9szPtaGOjx8g5fJYN_27HkJicm~v@1-<} z=W)j=oqqC*zV(;aQ(H2V33Wf}k58JCua0sVA6TvIxx@}&yk;iI5dXaG(c#y2Ia9d* z#BG`lPxe*;<8k0(!0r7>CAY`SYLb6L48Ai6O&lTPYx&rh(3%eL+-H*_-hgW~78pr{ zot~+JNFcA#<@circTpjM-F_~Dv}@90IQpwjj_|L$2aqngFHQcV>5gVpD)#EfvCH8X zJ`uyzy7SDjemiuw<618slKkzNKqLfa2n!~@1*bm+(w)%w!*Q)P|2(#-(mL}HRv4Mg zQm8<>^G3{Aw#Z$6Xm2=s|066T!!JM%k?jWis-FoDxz7xDSlmL2rBBR`P|pqRTQo>8 zL?C~^Kw^%_`UjEioZ0#v1)6#A$I|JdN)OaT__=giTkbGnlfr;+LlYC8?ae5GTDFhc zdIc)R2o+ZybDfS7&D}Drw#-E>P%E+8Y4hqD`sI6)1gJ?#q4+3$>{87bS;qMtfBFBJ z>;4i@z9z!ze@nySP$v=-d%_-N(;>EmFErFAzEQPm{Mzwm|lFqUBuc9NI-DcEi1#S=7N~U6xl7j!oQ23A>GoOCz zu0p#A=$Xd8@q5I)xv<){ovZFNrVr)1zbKQgP9@^=CvwF8IWZ zNc?lp$>(V1gmqWooCCW!CtVxP=Ce86&vh}M{{0;zP9QWnasl7{W*~V=bYa*TaUQb? zo31v}b-tP!wp&WVNC_^Rxk&M7s4NtWosm9ztiOQqHqWNR^Z9yT#Kj8fZe6_*wqfro2X#-n{{aPZ-%v-r`uHAzt5cdI zc=SZ1D4J4B_7E{?n+3yKJT|Kl^({bi|l+Q!jcn7xl}x1MqMkULV?ct=_mz zelqcVi2J`-$wF?gN9x({!1C?NARW47f7xM!DYuxa+LGXSku;(Q((ad}-*XG=87a#* z_qLd-MV`|x3T44Il;|yPMop}pTE(n_UmtLWFy}q^h4?@l)1AXwfNl#25WC-`;+|m( znBiDcJEZwd5~TSWx1Ez7uAzS@*kHymO4-ZA(Uz@rRVjc2I3hMEt zfbZ1wmLFA-VzxpnW7{5f=A%wtsm^!hv@faA{FKODZwoqK>gEtF_xvmZ?~ZxiC^YVQ z|9?JtO31xW@F`AuqX9_s9~GDLIm(Nrc*<(;$M4O6D2;k@?+ZC}ShUd-z&I`^vbp+h znB`!{hwppFhV32vHTJvcPVZUS5}=Ue|B`&%XgifJL=I$2^<$s+pbq@-*kGp%@vem^ z@pBXV)z*$R-k|9#Xs7IF>IM+?NB&!Orq(|SWY7o_up1xdwF99sfv>K!6DwU&)>7Er zx?Gv_CR-FYp_MpWvuz-8kSV~(7BC?fm2HOV$WliWir*Z+#L}PnAGc5jbd$xzv|I|nA8yRK z5ZJiJ?7XFdoubkp&CJ55^plmn;;2l3yP4a5PG{XFQwp%L(|gmbA)GwDDJ1mERH(v^ zXsDeLyvf8MB?A&m{5e*NB^`~dRE-jj(vkxmZ5rKIpqwn10gsato-wTWfN!fW*Rn;b zp{(nR|4 zt+nh1hx~ijq4^wm)4oM5mVI1RPWVUFBE=B!>t|LN4Ldb$A$x8%ATgGU^w8lhurIzd zfy@ndCcapnr4I{ycx^b4^)lrpt(xC-rJ|Kjm#Q7``M<9iq>#j8;Po7+Q-}#ij@`-h z9rf7i_ve83GwHfM>rq`RUn2jp;%NWVJK~oIO#V|!pga~qfbeZxn^tswR-;JJfj+5si4i|3iE<2-3D8F^f<b zL{D5BKg+S}W6N8Ls2gGFnsRB5KZE&f_k@`KT+q4zUc7?#}&R{u6s_{6ZX_c3;&Z_Q?#CkO)G$u%5{DcU%B zvqJE}u-y7%w0^p;8u0Pm8s5)s8qHPErTcZ_&Qwp!C}+5=s5}RJMyi04LzC)eL6rCq z^M9&WkRmcqCEhy+csh5sgzdoGgNVC&2^mV!S$1~zJ`>+dJEWpqj3zX*cE1o`ldqJP ziDC`HxME3);a|7$ep<9`X4nuW5i`a44y(0?Cy|JAQWN{t>@sImEox4X8aMP-#$J(4 zGW*-R5KdkdH0QjC7&^z#2v~aQg@z@~pPy2!NOAbL;_-oAeIY@2`;A->U@cZ!r}Mz` zgSEUx9oCttaX(H&#$%t9a44HSVg9aJUzCxGuxMOL4u$fdYwy<7$i8`sZiP92L8<3b z(IoM`%bJ!`i&9Pmy0J5-9&G6iLQG#2qU#S4tywRc^Y<`wi1o%SK13^UN)g2k+J;4 zZ|&+AVX!!f5RmK+t|DPl~W-1C^UN3iax* z=qP`5R^~UkS*aSw=<_cDB|K{~4ZlyB;7?TM9s+7gnXpFod!U1o1|Cm(Jg{*Wm=?STJhVV&FP z&R^e|g2d|gZ9!rx@z%!rD6ZFK^yjN(`t++b0s(C_0^;wcugdn5j7HKOm)|~P_=_Y2 zy}{>(SvAs1Zz%k=K{2YjZ(vRQ^gf<#17!9UQ$ls`!@jG2to6Ik37<>ukirY|pNeuS zr&RRuf8$rPX-n6NUA3Qr*rKxb!9IWYS0f@CN2OiR$~c*#b3r(8k?Wz?NvjeE@rz8< zNb=taXf_Ne#}9ZDD9|A?@7ry*zfw2T1f!O@^kr{-1ZPjyhCi>B7`t$<88ND4rNH!a ze(Xn?Y|!@Xs`PZhFU7BG(>D29lc>ApLXZW81m%$IQXM;BTNRLdGZfpc))!X$S#@D; zUltUjVE`S7r7ZyTTB!CUS4icu^B=r7MwUZNKQJwTwEQLF&fuJOX#Y~bw7n1BgX5Cv ztF#mGT3Mp07rc=&*UtNxDVA$CxmNN^jdx+Oc`4jIMx>J)#Bb4>= z@&6(|0)PU%U+d3a6Grd`EwIVDXIp*B8tHo#)S*3p#b9vkL!78~E_+|Bt>|3r9<@=w zngkXv-w*Fa9>YNF8FXG9gCqtM#l?j;0d z#97D}K;WRP$zis!I+_8|-*9*qLKR{z%j+WlvGahZjJ%>+y zSf>u!zMdsH?>94Q>?13Q!Hh);he++PhbY%{$+M>!1aP-32oMbB+IZDIwO=8gKL7)* z`AfBY#p^-gym$51z4^IqE9-gdN4&c0@}Y>v_fW|P;s;4rr3^&u!3ZQ$Q4|ix^L{LSE;(JsBjeBRuvZmC7!jovh5X{^DSijU z2D6=qm2LhNjC&-}zL#`0k2@`lIN;mEoo)f~oCy9!4&8g-a9jmYs0WB_K&__ve%BuM ztKaZtCXIt*m!Wb_O}CT-JCw(!$X-H9!FmPPenpQhS|`yT`Coz(xfWEJ>|g*$yue~L zDxcU)K4OlDpw+zW4-sxHs5v;eyem-@FAlu71YX`pyl`fl)G*U~p3e>+K}*z-(Mh>Z zQ6uKvFXF!iYd171%kiKrHOcE2EE09s`*IXm*`%U7z)n{OpsP@5c4i_w@4+oT_ocl) z+F{GQcL}GlC*hx(0|TjD-?0`61y;fjeohOW3+J>Rs+l|Z%4u+HuO9#+tC9y9>Qwa4+X3JV~6|6 zPokd>F=p$TQM*L|Xw9rBDUdl&el_~{;LB*PgRZRG1-jB3`WD@PqE|# zzWFoi-V$+R#?QAm=Pw+|9zF{D9WvJBz+&bsS%vTktsOy4&m#<)=|c5#JH}QUA5_eT z+0IS*VBp3>UySh@UY4??vP5P>k^*$F4 z+OG!t>ZuOL4u;20=a->CB(#OB{0h;AXKN5P|>PLUl5&cbh z)dfMDHw=^Z5h4V@mYRlqIqp4n$4Qm7rb=gAs%*r%ImW5)k}A*=JYxq|q+|8AYSLHN z!fmm0+zz7{OMNzgk`o~(CpwynUI>w~OlkS9!U+0!2=O~F+Q%45^xl#UhX(APlMV}`a{w|Ah zSpoMHee2Ew5@EWE1d&xmv!Pj`4{mcXzjUj`^COp03-LT#ybpkNS3BY71MTpIqd+Kh;X5VWdJMqPE!u@-gG1X z{{HjAXQwQR-Pxjm`ofy-A47qxaIb^(Ks=SIPl(B@hf~+zCXcReee3s^D&^OcvG|Mp zJCG2wTPgmOzm$`x5OVP@FEQJ_r1-zT5_Hu8-pq1!|Uvrpmz z)slQ`wlgvV@oZm+I>}tzyYW{vgT(%baHT+=vur;7dhH?;}=^>aPu4U_w3*Z3rZNq&=M z31MVj{!ukp5ho!JF^Jw@vDIC4$ezh#?i6tv@c*Q+Q>pH#h5p83%wvWtc?^sES;>+= z|NLo9ku99OuhQuCj5zk-BmDy~z|=P%kNBGdf{Kx%<3M`Z2C0gDJ>&8kZ4;&3&BaWC zg>DJlbIB1MT7o4{l=+1<{yjG1EF9f*x9x+ zEwZs*GBGcAUUr$zAJzr!*i#+4b#01=>-*kO^uJASsl0U`lv>98V})rXfkR+x_!C+` z0;NCjea32@uAMO?c`tm82A=I6B)jARGzJ5{X1<*EEZ(kNUjt$x`zgEBsKxCImP`6{ zllLW-Ae$ke#p`JOm!wp_$))%pr}~!$%VmnU7d)X8VR1x`XbI;R5Z~+%Ie%$ES@r<; z4^1Yk=)IEw_}AuO`XB3e#2efb(WPUH~2*g$9{9=RnkFxE4y2m7!e&VgbiHy_V7 z6$QZN?a(8-ugkVVEz(Y0Rz-M0RgeqyhTPP^GV387HT;k{!s2K1LHcXBQ-pYmH&yRz zsL$c;EjoQ;$rd{40A6b4KjB-`O7R=VKX1YW0+5GO{4FPf zgp+9Wrh$^~_Si=CW<^#6ZA3D^^n49y$z$py9KL!e%28V6DF=}JsY}q zL5sSP_FT%5ACN|HR^d-~{6;BbR)D(a|G?g$3yL5ZxmZ@xdDa;*T^;UFFPn0WZE!Y` zZuE9g$3mRl1L`@M;Gt^qnfwD@7qyR+&P%FQgyh2;x72!Z?CqRe2Ta4y06|fF5 z=+{@snF46c5yaZ7$*skt!o%gKyfG)rL_%D_p&gp{I3AZStia%Wi)wV9Lw=hxTy@Lb zlaP&|Dm^17QMVa=K=c;pht$|eU3#G7V-9~3hGivM>TeqLdw`z9wEW1;xi5UR-(_AS zrx#x=r{fYo@hWHaaOXUCd&wj0isGD5%<^|j(V7YHz|f~54y*T-n zfNBSF_vgj{!RMIQzpgG%^A_yzRH5``a$S+p$@_8a2lnQ(ic*Et!_va$Sd2kCoQR`uXZI1N0L-86P2}qKuXJQ$OI4IrH>i>w zcj3DZ%Y`VW@mq;AEDzEmD*-A=HDik}c%_%=p=v}&6R_68b5AGouVo$l7d|+X?`|+F z;JwSW;<=oNiccagOP`5@@&DlBu4G`_;%RQ5D>82BoX80`yUFb2^q6)tY- zhuqf%Vr7LDK4I2dPUjp}LYoezkYc=2UE^YbYsB3zA9p^6WT-{s-0p0mV{6e`cX!;AP7Kb9Sr(ZA8g_c^S+_P8og#oCu@WWAWkfxA)dh&0uZbpHG`dD>WY@ zs{-y!U{tV^Ibt^ zBkVbQLBSy+sk#F)RX5($Xo{cfmA%JyUh$YuR$vWc?G{2%jQL6&;}tL-*0WypaS5xa z)jxoAeii>#ug`Tb6sLe1?zi^KR z3~x+EucSj1m5|!#5VP^klrJppC<^!ihskN^NgNh&hP|Q`>Tu!|{@D ze;-ypIawvtpin^+Q71T`)0A!Iu;m(K6&H%fCJp`8A&P>Br_x*iG&$UiI>p{PWEXcX zTnnq81Tc%TzR-mQfV~jEIE3y1HE2w7);A>PNhDyT-e@l}U^im}KU84=nAeJ%U@tpF z$8-MVtGL^1hQje-*-nlz42B8jHkrYx{ZMh(Co)GUji#7Bf}pSC?)rErvt#zzdRiVG zR}Q`qW>~<-@|Wgkfuagh9c@(CP}R3WTz>F?{5FT$_C%mt2#|j1K&B6yPMg}m|0Rqc z>~b%ar?Ds!M9{w1+8eV?wiO^ujg`2va|=x)_O552YVnGwJ6FH?5tWwh&~hjp`yEoi zyeu5*;te#lZHA`6zUfOHUG5jJpJ$6cW+ETn)3y2Nn;7}mi&OwESrrNMX23TA)!B2^ z2R0r&x^eu-b{u^u)M%5}O0Ws85NX2GVM^Frr92Do1~O;k z$aDcGLel|3rZ};iKlp-+I_>?`I~7Je>l%q>F=WCbl>#aXS|Ujv`P>DF-5V7PsExFW zI7et1-VePW?_$7TX>+3`tM2=Vhxqd|7djc$i{yb9!K(*8tRlfpHCQM$n>m1x$MQ2N z@T2(sl%+h#Mfz1zsqG7KVQy9^&MPv7-(q&q4!}dz3Oc5cVNCC|_2W&}lXzxMU8{^M zElP!-mbgz$=6L5`&agzc5FRaWLFpF7EIVHh62AZu2@S_~PI>y0i(T6EPp$i0)+z6X zH&&1h*B_6Q=kW$>#Qv#PT>*T}84T42{IaXOY?D|wHzLPa&8cf5Ik;IB?`GMfGqo`< zqF{}|aQztZYW1sjOGjO3G~!1k-(qVE6{W*0gUcGR8ZK_+)tXW=1$9nO64xN1lT&9F zvW@bqS+;zc1Q^=#G#qw!;p0Lqk%grwq7o{MYpQ2QBi*GZpWEV}rH>Jx0;FFS6$vGi z+kx7jInK6j;BgLtgdsXjuMqzF-LBO|4jTNB8Z9EuM$HGX<6W+$(B~0#P+Y&}7N#&n z)}Y8t)xdE=ccE#cLq#9|UJXMgGZfqFcwx%yc)x;4!aiEblNS@}c@PeOnjtVsrqr4| zQN#!o@yxu(-&UO24fwaH9HV!ZX@E8TQ;q~}5?ovm*W0-N)H7mp?sa2`p55@RElDy* zP~=Gb`t?20bSdKP#b^1Q)p*u(cZ0pTl-bUGd#Dkc3qn=x`RP64rS%_7;hpJ3lh!}DnAHJ4=u zCC=L6td2M!;`rhLI{x%0&}^nz1)oSBJ_QmooU?BW7C*#OT5b8>-aQx`oc>7jT$X-q z&&mu|-nZU6*J~1mBdIBStd!#I0w;?*G{+{?X{8&Di|D@#X!{f-8zSP`fR0B?YQIf{EiyAvE)ZP@hT=07jChp+NS0 z&9Ye-A))c@R$PP%-xw1(SWvpgq@4$cS#60=>_kdiFsv=FOl{p?zuBW%Tr6{RJT&Vn zg~_y*_a@Xtb41eHeV8Qf^_cN0KMA<^Qhv(u&7Rk6LLHhY{Ptx`e^G(0sL$(nIWnMD zh3!2nVBRRbEZO%!S1xWvK`z_dRf~!D(V)=NaC|vMB_kMOfbj%;5V^@l zBcVeXQ;kS<4iN^(a5C$CqL?JveAKU#&+HYAT0dXaU!mpMlaG#@8dZy>G^&w_s-ttl ze}y)#XTTg4%o=V}7P1YRs3wi;$MtdIRTc(G=)1OgS@Kd!h||6|9v^-IW=M?TEu;H$ z8(027qt@eb%)6Q3yGsdzOO(mJd5VfHv7-;l^6_rM1Yy3TI9}j=x{7z<7_OLtMzT!Oc zRdY*nd$dOl#qwQw-*f$x#>!W(zFYmY3wpA$+Gde=oA#-q8vZ$cGrC|( zdArb@5U*|go=uC~+=i!H?-XP9bKU)<4|~fmt9idT;sxvyR}a5j@0SydWIxc@yJ{E- zC5~`8iwDSE&XVmQvyZGp>xlG%+px#P?N$nh(A!Js-|E;122wVZOxj`y!XQ$|`!(z! zh}WLxJeITqU)xzL|ITDmC^&@mtvT&ovdr$goDh;IOMFLdSJ(rV3B9FOp{P?YC;W@7 zL4%pvc|sKjE0?MY(mHT7u8#C((WEzTkcM~o8&R(#6{T$Nsp4+61R;$-P#OjRolz>m zIbeY=!R;#g#-fjkn+?f+m64&^+KhR6b69L87QRT9pN@|prw}$~oyO?NNLB7{xAT6`3nK1g&`t&bh4kA_TM7D zPNX|U4Rmj11Ca?_Z-B(_cmaMU0t{UTb+Z_q@UWca*F1_S5v(cvz@OEhSY7`$D)DG- zC&LWFpG2_1swTnlt)zOAgb`NG^11(HUuJFfV2%4nfSr=$hhf@=*^5xlNiTm$lU8#D z7G}5eB&=+pxpep`3H&>5VyN`PmK46PE4z^A&lPzzJFQsbWcDj(N_$S%(|lSW$zFH1+xuPR&DKxs113IT z_-|7z+K0HipL|5Dic*0~yXicGvHzjP%cLvdbO!Maty}m=d|79tS&*ey9V7KD%W(%z zHnyoqz@@ITs_lWt|CSR7EC-XunFLr)7{uUC(HLTiquI#yydAajSH-Dor1d7^oeYR) zP?pj1Q0$ zFqxb=UQt!^I6C>Nl;MUl%MgP*Y~-7Zb=LX$8`t~cF#wZZ^{hTb8d?H^6ov(koOY3FmJ;F~M!Hl&;$yeZe^%_*T z&nzrf>$B!Vrxm*9rbeNwllFA|QO!X=UL4oh&89u{xGrab7xW&xm~%sYN+U8t&_k!V z@i2&>lz&E+@c{~tSl;(!fV^+N7t~TDTg&-KiNNi{b=Z*J@b~l2w+a?6oZlYuWk2C^ zX7Ok#U-yt2RkL~eIwX%>F*g6Y&O5tjuAuv!$D~EMl2iJgAexZ&14imantY3~DJYxv z_V8QbM`*jWjzQtP{zG3MbFZ!XN+Uy(0Us&KO7k1uO9p?Z&&@8)Sun{qpeMqu{GP$A zBNUkmZ>2~}n}d}bXQxT*e1rTlJmJrO68Zh8rBC2+VpK{5_SIL117)~B5}nb}Z4C9W5)ZD+M)ihZ8mNid{+_H*+AWae3IGv3sZ!m9FATHZFb@SLgZf z&0&x1Ymh6`g-d`+7@SZQ)i?x;o3pS;=2sNP_9k;O_)FBN>(byi6mbJDg;KZT6yz3# z8IP9$H6kWMw1Lcv>N#9{%0?T^mJsBV#GL!EW#4gw+9>dr349L84kZb)l(~-qxq;nd4RFS_9e!~UaqLJnDNN;S82Nt zy~9%Bo82DHpA34r>ueco^zSIh3++&Tj(H+{(b#`|9{m3Z!>sg2Y))|psRK_9X9!}J z*uuSM^U8xOWHZ_|=Xx`_E?Y|F-;d=p&rw_ow2P#HHXdSSdjNPglxo)LH%J+Tyfv6 zXW>XqV`oeTX8-wfUiiz;7;KAb_cgQ+?OD#T_*DXL*+@95b@s%jGD)31JB#RBm=?#( zvtSS5dIN`siIu{lMTv$Z1fEpQ@yp4MGZW#0;1;IX-|`N34$z$694267K*_`S0(zYh zv~loLNbaY9iEEzIv()$afmPur^nj`fP{^(RaKQ-cK83ga=l2wbRMrj*yXJcL;Y96* zbtp+V-rp-GhXtLM;>DHvp@EETJ_GS(pZ9@T%cMv<9Lq~W&;>;a7@(uZe;lq2I6UtO zj6x8Q+Kxt5=(gO_&PHNpH>)SnGoMjCk7`%LjkcbuT@z7rm^A>#fF|a)E6cEh`G@u$ zUg#|?q6=*?Pyt_ZnuwTEe+8wigkM;apMXyYEi%|^L5sV^Z`>hruvrM z`8;qd42MJlb4!t)h>Y5ZlYC|U$Hgvz)1nUgEDf)Q^mAG-tA2=llTKF`6kOTjOoc<1 zeyeygaR7+2{CLu<3_^kUk~x>9-=8f;vlZoCsfv?$gwZTacbroY59OE)E5(ZQbxe}a zp+2;mZHuwQhdAM+X4JG^?|UL%9%&6@)DA%EIa?9Oug2@Fn*BD$>zV)h8fFxk!Aj)2 z+P{G(ziD_KT!x+7o>9?%c~R!}VMac82K?p`-R)6uAGHYG@%G$Mt9N~w&fB^iF-*4( zD7V9kQ)8%Q>!hcT+I`o1k^h_TgwW$E+9S4S>9szO3MtY%w<&jjjBFTg?0)M znPVAdYb|U!?e+uCjnWO*9Tb3}20mDpr}};3cmz2KTQ{ieLcuU10ZM6~@a%Pg&A$z2 zhOzKZvozG(2Rc@-a~MpfbnrSm}fBhK>yi8FSy*>#*j zohK;Pj_}2deRhpMJ_JUpXY`BDMUId=xt+3!FSg8UiKhpYA;&${|BYT;aG2`q_erMQ zwXw9re8Cot*Dacp=e#Bkp9$ms{_~q(~E~W9fsu3F@6~HIhAG1fO1t z3}*EX<+ZkeZ-20Ryma_|%8WbqPJs4M29cr+h=UP7M67Jm8A~RgisfIhPY$}Wu+J!5mp~py zvQcQdpLV2To4(=Y^s!cV6iRKbz%jO&bSx9w9g)t*&rFh2qv%) zeaWmT1{7(?7Y#>KuckPN+;PX?b&yIp93a z&!MWZ;3E%$tm7-RJApjf^&CwhDxDP*+9G(wK9hB2Y#P~bkq>x_91~70%%x!%c>?m8 z>T8VFN!_B#@DO>BhJ6@PW&#%%8koMETzJvU3%Q43P(Pon^n6Uu@!Pd}MBSE60mN1E z!C%YB248gPtEG#OKtkUKZh4)>5j0H7jD{PRgfsgupLNC6n}?KPfm=E8fK#NY3d=u4 zDIWw>F@w5L(BM>$#USr20W0%lrfAkYm{`?TSIGWdYBT0vX;vZ(Ft!dx zR8yRUFk!p2A@woKby%dC@FQXolk9g}71GYm@b5OO;~M!GfDHI;tJbi3GUM?^m?vN* zL1zb+zmCm<0V|1N@KZ^H?4|BZUIt(-cr?7~RM;{|>q8q(^>AWfa>PB}8>;sDEHX;( zw2=QPb4h9Vfu_}>tLy5M2b$e^2EQ4mHvV#gNl!c91vCKBuC|o&Dy%5VLYB6z9RzMRFNgI-pRaB&N z0HHNCC?NbuaqXv8tQCdARxo0u&54((w|8jpXi2ONM@|Zq1jt9S4|n#~&7N9RZyrt* zJMvuDy1|Ma#XZpK!;oR{O*XKtekGj?(5>BQxdnFoz>3!;ZbB~%)mHnLJ&&d@MY7cc zJg4hxq8bTT`;k2mZ%v@f95Z=IGg=?2p$>%mqCmI%tLa1Fq+$&DRD@^M9pD6Iuz_b6v|Q zmv~^7t6lHb(JB4D+hc7*wUv*{z8sU6nncMW0l~!ijjEVxPeCXccDkm6NqebVA2nX@ zdY3)F)Gao)a(bSc|NiNdmDn;Bn@n&(cd)J3(pWeT_ z(Yq#}`x5M47B%=T$+uWHqJYzfVcEM3a$H>)CXz4|<;|HkZoo{>qqKG)RKPTZWkHKf zGcMo@K7)7IbqNyW1f)Y=)KZ-J!>NxybwKK~(C#V6`s~wCKS5nxGhtBI0o5TUFB`Kf z4^#z2_gZj&I8$_uS-sWV)fT`(XGv_wy2L55GWpZOM4m|>q8r)+{&odMJK4R?sx?9V z*KjYcjG-ppWZZ0;-LQmO3OQe(zx!Uo7GmHkDK&Y{Gu-W4m0NmV_-$~RR3e0u-l!*b7ibQWDH-!|7BoPF<^duGj=nRQyjtLL{v$6VXpMCO!Z8e&Dl#r9~4Is3d)DS01NQu6)*>1lFCgd7&2Bc%$C+zcl(b z$xi@G+DDUXM2BmD%H-h2`x5$@Au5~52JWt8id5A(R7}?#ddY^WUu1hTcwB6W-SXp4 zl5=|&>@N+>X|G7y)ZyAZ(VT!8^VT-x)HNR_hwy@oH?OEFG zS6%BUOqBd@Sy~*`>|s*rac~;&PDo`sgF+Ys|(46;9gb6C2S*Ja&o( zqF?ly2HM|6roPQgMw7?anzR~>bnLcZQKpU_DG>O4u&doa-8;0u4H?QRzshQ2*HFKR zXmo&oR6%_(!lsK5>_S*RR4q0f=+tZ%Sn) z#isMc53y8KcpmH0A9p7!25sUIeuv%Eu$vzwa7KfFho6UqtMlI3jLBrsDjY! zl)7Auq_MKRfa0ZKSFMEzTj$#9LviGKRsRorZc zXaGAzgbJF5|HIZ1)Ifp{waUh&!^K9WC5U=w#=38Pt2>E(DBPm6X=6nZ_S4qjm;To5 zab`rmzQEh<2Bd=4#S^E>2cX-9x$Nr{QdFN(?ujbT#tQuV_k}r6C^wGT`j(QVdX69B z&i_++@wddENFD8tcNwPtR%ny~iBd4Mz&a_q(tJ6+QJI9K*QZG?f1`ELUu)e_iLB2R zs3re4{U4;zoYJ8(UG3iUG_+5TXylL${&y9C;ZmTi2o|c8M~$U@`z}`O@C8-KA3e5< z;R&^>3jW$+Uc(tr^BD(*Zw93q7|YFtc^Sb|b=83jR~_W}l5Opg?q2Md2`2x0OjZCW zrOBkuy$1N+ft=;3fqdFZ)*ANr@A^AXVLx@986i1oM zgSMlCh33E`>NW}LZXpA8`A4r)``QSTkoB8Vv+uRN}>4#tEW|0qi; z@A-%OwxNVw$cJ_*0+vL<*aJ@~L*$;k<5~N{P z|0nY+urvWc2AzkA&hXBQ8amu>s7_=d*hURqGC@(EWcXz);W4b$wuM;dhyKg-;0fZnD@Z9GysG$06DTq zDMdxAJBI#VHOkk=!jIu~bErD;6u;M&3M zvyXoPD4U&#HvPo#!uaRHbc0=qZ6clvUR=WHc2BRdxeyOd4w{nvrz2@iA*>LSeXe&K*h(Wx2WmCsE3$ZaX;ld3u~|nME;o?I-b_fn(GSS=888Q1W zu`7|J%{!Y;zA=rGLVQ1Y}D3XjBI;Y02fcg!|19sOvBrC1dM+0UcB7JwajRAZc-)Bs(w2!ow8$L`g`H5 z?-bdCWEE4(xt$h%eCh1#KSBPZLB`&mtYWfU=mLTt9a67E<5gMUAGzCo^$YMngzd|l zrSUL^yF;gQ`AD!s{w=keKeQ*VVJd=v$$ns_vlJGNUk5M|Cd%5GVPl{8#~HHLYo6@` zhnG$V3i^76=9F*~DFTm#VXQT@?JotI3L>*q7ChhDm0#-?5q|F-AotpS8~)Zh;MGypLSqsU4$5oHlFgVpeU|gQ)P~-Yhg)$ zh^3MHyYbm+p?Pvd77hKw&eQ(x?Ozp{(y7$rgX8*XjM6_>^o|5kAQqq*_a@Y&hThlFXD_Mes?+N<~#8LLVdkMgo% zzwnz(+(L?T2aEqS5AH+|5`DLtg??oak}aOQ>WwnRKf7%4n_M-Vp*&c6E?o4#ISx|U z&XMigzQ|+?27fs`zs6nGka0O|P-a)~&1;?TN4CHg_aW4CYbZ9oO(;Qj$5u8f>PH(l zU0f!at1u3_uQaL)W*hQ5+DWD4$&co&23G|lB8SleyriAh)jU!7(QHMMunccqwg z(ET;31Jx>IZNvS)&@@>Ehd!*7CQpGp!>yxR z0+~*xTx66s@S_hCp#I~eE8pu^#Ga7;rCmG+DvLI_WZA92zl-<4QPuY}{ado+i4~VG zzYHyy11Iu~mbBLmUqi<}Q^d*UR>zw-&QOgFEfu<)?^yLW?qt2H+_K#{$&>%Y6^pwR zJnSB(^LIzyzQPnhS#F1}YJ?S&+s6P*QL8CxUL7ZgkGKJ4i5J|>=JRa<--Tnxe`uCT z%5Sa2tkaSE9|suc$6TTCtL)O9q^Wnk(AU>t83F+Y2*O7E``5?3E#ER$W)2McOK85p z(vHJcHDJ+io0v2zVXdBt?qnk_$Y-=-m|Dj~H{1A~!bMjCHe>YGpDse11y5mZ!OvlDO!^}qtKvO8AWbHifx^S#9iv0~ z&>#!rxp9$!n`?tD*$j5wDnH@(+K&fkxs_9KWE?zGIuIH@=!pBfO*x)JAFLbJrH`nY znq>}aA{USUcSekl*(lMG{$}g`fJc2}h*4B#|M1J`+Uz;Dzv#y~5BFKSB#P3?DWc=0 z^#&wnIZo8Aw^~}?lxz-<7RxP&2=n6E2NGSUtGh}8jDl6pn}&2vcjl|@vnG23)~0RU zhUP)iVTEyJz?0+vMF#bw|F|e#0{8ubOg>h*nT3M4Q=h$-b=f*ng&-v)NVZxkH9|lPR%8g1l4)l3X2hdDr~@^JpwyBcg9J?5hR2CvFAI^`WC z7x;)ZpgVWZS%vu{3Jrg%mU{u{3;m?s{4P|T@wm7;{ZzM1(EQ8N(x6gkhOrN{YLsjn zs9FJPjnM02ClEhYoEo*V?R+RGY7-`M-~Twn54}Fn&%9h&D>K64N!T#1z^ddE8`k3? zE4nv_HU&$ab=pS4aGqD#o*wJYy6n0pzv@K;q@z8RYwGz?a1{9M?aAp+|JIo9+<)>? zek2R%@=fqPAhL%7S(W~@kIdoHymp~-`{K^4vvY*;vPenk$)<*a)kuRh_BJhvvNHxl z)aH5vfxNH0Ay1B#bIncgg|qW?tU=FG+Qcj6wRG(!lj!EN(ZcuG;h0uq3DW1x72%H0 zdzO|sT_F8(N?7QC>;3<_gJXDpX+T{HU6U)E0!5ayjQjl7T&FksfGXe7z!T>eZI*LP z>-F{7Qj1z-^^UTszCh^xHHnmb7-wdOha05kr`Cl| zoRaK{QJAPZj`bvUQ26)A0z{lqaL&?1? zF{qTscxo>bNKk7R++`F}kSGVWq%^cG`IL~&t#Y_jK>#gz0rRk?Hz zN#kvXUkdnWihj!mKlB|+(=v!Te$e}|{KAg4>bxt=gS@tIakB~3gmH^``wRa#vin(< zEUGB)F0dh9A>Eal5%fg8{L;jFALpCY_pWrEuK_He97$tbKG9?9}8$Kb@`hh<~mU2jdee{?N>=J}NJ|70xzkKL*Ca`*V;j9-+}>Hir0 zo`Hb@LH-P`|4zFe`My7A0@PkwdU#02Z~qaepqY1+!QfFHYCwsR%3g$;ve+?3QwT?vS&IU%A?En2jV= ze;KgvAE3GsCA}C?B~^O#4356;iDYBCOh&`KN^uwNaDZMPE02ouWyHp6jbzC6m9w9P zV~nl_Kt6PuqHb^QUp0%R$c5TTsmc_gEd54Hdi^ESZ11MC_|N2X{^!vpRsAL*8{c8E zw#Sm$ffh=wSdp9m@c4UR!fB1EMwkOrUHs7y%(H13$tFL)V$gL`>n8Am1rAfu zrKp5w^~go~*yq_Gp_kyurR^&zM{m+*>hBFwc}Z=)eIwORDAcB-FR=9ee%!Y?!hkpM ze`vOakKXb2bbTx*Cr9l2CuGPgV+-Eyz)$f(W=PQS-rlX7ZlgU#@z%VeLR=~ZGQ0&+ zZDQc|ixx!u5-y~MX~QU=N6#XFe)HPj9Pjkk#{LSvh7j4pTAa#(V!bebxN7~Jc8473 zWK?&2Dlqh+#REl1%nDZqWrg*px)r9%g>gO9R)A8D`jN#sAZTg%4n=Fz+gXixU83()q%hmgX<7SvF2Tpe3RA2CoY9DKD$;)MxxZ4#--G{}7uPf@ z2Wud&$e6r;oZtT|O%v!I1tIXY_P{}it~j9)@Y!dr1IS9f&79N)L<3%!c3&oYLV4QZ z<~WFcH@SGD?B7ea5u@40u&+nl%f}vr8mrms6%^e}83l(R4~D-R$$Q zx)`uulwY~CeCFzS;JXAur_w^t`)F<1xwiAOy#k93Gt1%*rGamf0Tpe?q<+>YZw>Ix77%zKgt*;E>ewVK(@21ncMBoZ?nFuzAyc zd#S4X{w$++HW=+IZ#1%L$WH+jR;<={b%<*7-)lQ}1(NK$lZi||E%XPzd!penLs0Ew* zyXHd{6wpc7Hxm0dTZLE(1uMEwC58E{30r=;mZPv)EGk(WQ1FB*E5>uh!7VihzP zO`$*X%MN%OBQ$J^&kiIo6Cw)xyF2>Ub~9X3&b9kHgx7nEv>mM9DVAei_`1IXD8fV3 z?VK|LT8xB>3*$h`m%wf_(2}ADDvSBz9HTFEex8@QKr(z(cGalPB9?F`_3i|RqvLi1 zRCYaY4uSLuZf#5G8VGZ;XC}uIt|T4l6C{Ug(wlD9**tZ>FiH45$wF^G<;~ z%tix5Yu|9AQ-J13=q#=5Xu+u813xW5P%=@@Bt-+946>oM73#oezx?wBvs7(#tubbG zeEY^$-xeB|?hQEe!fP@!Mx@lXc?%Y(hhc+omP!mazu34UV#vn1C^mIg^6~7K5f-st zBwo5~^7?$4LI{@ISvLH9U`K26QdodjN4F(L7N>8&$j829>74MQxo*48Sp|49?1%0B zEih(zm*C!c|*@!PRCPQcPwXoZAQak}H%5u&t zdGo&&@uG)?#>LySJq)~ej(^4bZ*OlQQpHFUEHZ|J5}g-6V942pg*)Ojeh12mg8|&* zqyCjbB8g_I0DCcHOVHyL$@0YJVo&zm=vh%~MRuQXU=rSpz)XVO_o@XE9!a(_^CH*sH-|4dGeeAM6Br&VJ`4 zR!qsY)0)`2lIc&3q;=SVXND>cjS+G-zudlL4;=1Dn&MW~#@vMcWUa+!OtQUBKj#<8 z^mWznj_?1&ydX%B^tEtA4_AmgiFohYe@R)T);IUOGQM+e-QOJ7h~i&F21?PuaNw0W zjuIExaiN&Du4Rnxf`e>t=AJZN+Ej6^qBlbQAN2=AakaGVdRAKRc;XH|XYGlhn;pjw*!un56VA;9tKDQak*;frJ_Sh@ka7Th)? zs#;PCH#}afKh&+7m7VKD+ZIjo1NpGBr}BdJmf?~&0i<_PQMusMcu2MzJ%j1ZkfcC6 z8?XdwBG4X$8+_oRSR3;(J0Z6mdGt!zaDVISYfnBcr;kzbFoy0iTzX{waaF+Q4OwmK_=5Ikrcc;ZYE zTCUuusO~FLJfnjg5Hb%Y4m@GNOz8x^8Nl{86FX*%A0A*UGEVH5xrt~7zIWT@p*bL+ zpQc-q_;?8Rh5X_{aU%qHie&_;Th@`kE`o03gd3X#fvW_)6^dGmchzZNuLTqdmj2d& zQ@1Zkf48kNW&oeQy6ez?@$J_~^#hsrxSCm`=$d~FLSaMZYd9 za((3{C$j2sqc42qWb^L2;{<-S{8{rU{ir~P>%5YzIkW-4SjWBm|Ir=?tWDL z=&-APb@%Pmi5^6C7UEqpMpiTheLS6dB^ON9B;qoX)K%y4oX8)&=kWvA`arjKJzSbs zZ`3s(aU63SUM= zxEo`{c`$yKOz+0Rj2(qbV3+&rXNFmUl1PV~38Y1O z-cvI5AkFXz`@fiTFqsX3(AIH&h7(cAcLLK)cz$ChCB`66R>lqkB1h3opuYO($bs)D$-9fw6j{-hc`Pek+9!G^5OPXN zUu;bz_hm_fCsP^@L;T=MXdXCO-p6H!!@TfsDj4ILC^#uqDqRzk8$~T6!3I#od4<1Y zMWWDPN${5q_xNsi4>0<7yzE}lSB*)OytfmPRMH>MK_R7^-s7%w3ae0X_ATg{ymh`W zt)a(u;*CJm1zQ9>)td2H*=i@Jq0C(iMBR(^rZU5i$_;1En_tXe&hw^Tp^rPpPXO&> z{VXuyk}~qNah6Kbs&!6v16Xl;@URCb^F)O`DbLhah(4uksa|qfM)K(vH*OXSBq<$T z40fSA+`^NdE%$_j;nzz5kBKzQo<`Q`6i_~cW872aNEH@-TI;b&b9uu;L_jvwZa((V zH2?WQTq+u%Z=C2rx=}(aCw1_j;}!r{X&8 z*YNC2<9qyK13DIGGuViP)A@cal~flzJSW5+w%d_LDeCBIlGZN%3rZKavBJ&CdB%%n zhu5cfhLJOnw_I}rqKQHnIxN=hyZ53y_xIsFMB#pa-INW}Rih*)2-Dr?XyS zBtzo;P&2Q~xK>+tbZfsJ??p`;5hkDkJ`H-JMUlw8*)=u4d)j?{`$gw4vTa|7?j_bM zwiYgqf7I4GfaXP|U3RyOL8!If4yvY+vL{D^mAA9VLkHbD=RQ8BHvZQOtCeH(ug>{Z z_S}F-^o3OirX1m*kk~Eo-S#FcWEjr7)aZcpNbGmMVIY|B5=`o}!#M;dH>6Yiif8YU zS?&D(@pJ;it+a=GE}kb|(W?tC*Kr!g^j$Q8M91tpuT8Mt^M#;^b_S1Uccap21MY(Q zL5~md4t96*#ROR;hP5+YQ)U_yV~Qd<5a)XRv)#OKHxu~jXk}&rBQM^Ye^XR;Q`U6* z>_&md{U?#cO&BkQM7hmDIzr-Lv!0{e4fKr}!tncb`O0#AWs#6Yf!;b1IVviOzn{3c zkr^6lwINAX(iw%%WzHdU#d$#elLHwYh*osl{7Yy2Ld`xRXW^5hl~*gtBOiU6W^*zsVuy&S zuaH01^5#J@3x}kbk_RB1PoP(l$khOJoZ#-srQ)-x8hHw_HSWFq%(V~i5917*-a-&3 zw+YZR6Sb2tHMNtY+qNl>ziD4K-Zoc}R5jXV?lLOaXr!)Arn&GRF}FaPxSgaj_$}rd z>=vIr0oz_qK6~=a3_*%XP$^@MiWbZXs(kT@48wQDKcF=5^P9|w z<$|iGpf~e^vx+uHLKce+CTVZfS*dYxEjfW};!yomTQB`ATI6)bEZJM3+-nW@$mTQI zuyh6J5Jd=;BOIq0>~eJEA~pm^=W5h|ig;e`&EDPJQH4w+-+sFHB;={*y{LT1rdy|{ zr&^^m%wa2g+fHL zmm{nsV62SV)0dSq4%x_<;niUF>!X(2xW`SRJJD!@HeoGGL{e9D&6kD#Of~L4dor{G zn~KQgVI1j`;EW)`4+(UaSrlg_V=f<8(FkyhsQd#FjhAPxGGB*3&QR`qJ4nD?;O5ml zhVgoNau>*xIv3gIr{omv{n2Z95IAAnlyoV#u<8P@nF}T81%1yme+Ax z^D$4a9|YZ(mCYWhFDtyhtrULMtb4Py+#vds=)K+L0)fB{e<8l+v%n6h;D^UH-cEw9 z^aJ0_^N(sNioJhXk3-*GSPxYu6_`%KLL5FU2hQ$9GoDmiBs#cU*vkh==Kj0A|BU+R z!KjaV%;`|>e)Lg#oCefe5ij7i`IXPfnQ3qN-s9)aKDnT_SOVRQg-}5`o-2`op5#!y z-$u}u@LzYp_ z0LJ~*iW{muUf^nw6>ibMe`)3_J`q z?&D?8oFm|bo#r&Sp>XqDu;i*qwCF8Gn8Hah_N0x?p^d%1qpPV{pL$zYLJ_Y9D%e_Uox3It;I+E+lqtC z`iPman259v9u30jpV&luL;ho zu{kHD#pRLuyJHzpZLT(R>=fUqcVZ)F-$1p&P5OjS%3{AXyBVzo>BIZ54yE_+?P6Oq zu`3Z>$7AZIwffiKuTQNO-}n1g^+5O;vqX9s>)ZrleXS z;9uO)MrEV?dgwsP`=4V~aRF{s88QCrHYx*zfRb>msE?*!{jky2HH^$Mko&B?4+yyO zXQVQHKn%|3;lK+i)^07bhL%&WhDq-=zko=7-<5b?hzo-7p(bw2PW>Q7`s*u(KfLR_ z9+GBYvQo2WbN1%FA@kG6hYpVB1vSVX0gl0BY2-(>}1T>7*CXiYOiv?!1J>!>wd zvg|^TP+9Q=@{v~9$n!};qSl$e2PxNHKmm~b6QZ6OJ zqxi@qOVZ3xsGWaN`p$svhukY|H{})Ubmb5>_qa*|B8HvI2>Obw(c^nB z9c4vuDH)5pC=i+-4j@SBFMgz37RI5$>`*9IrlEvw-Rl$3THAVsi!!#-*wADAiz4^O(^qa}0P8NLGEDyldQ_VdyKvbb3e7ikAA;=q+wgLTs~v*(mumVG%{e}gH-u1MCk+o) z#?Bqi##51Pwx?&DfJmSRo>LOX2CWxJv_QmM(~I00!bj>}>+tS*P(b;03Sn+tWb(8Z zWPWp`C3P zMZF^`16hL8D8*FM7WpGY&RZZ0XQzw^wen5tir5KA$Oz~Wv^{3blUTD4>qvS>=71lz z*FG~{nfTieB9<#G`1xi?)=azd|nJS?6YNe_|J- z_#rCfw%s#-Sjt=Yb1MkuyzAKb3Z<$Yhu<#ZW+oiovhDjw(sAwESeg2D*01D6C(p7` zG2dcc6^tt^jIS?HMS_AnjEawz*rAS42|3>ebFhmwnRN{*8mx=G6q5u9-T#F;HXzK+ zNq4zsu(^Dd{AodK#DoT#;U?r}|18mm z?rzZviNOpt3wsPeSTwZ7r~bl|_ueH1eEof11Zsq)jbUU}`qxX!W@1P5RSgx5C{kJV zgseT!{?#IEQ4cOKA^w2VF}{7?7465<@9l`x=4+o`xMpobW>(8m-i}h>fM6U+-**QY zv%E3;=ir~n`)@e5!Es~<*YUVBI9FF!a2Q+Ta?MkjgTzk|Rx!s#rO2o{Km5VxOG z-Nuc!3_!KqLb^)J$@BV#bcW1OVv9>g!eDKR|#0#{Zr+BlsZ}FXwJXi(ZyElYISes!KO{6OlUJXs;31y!T+%A6>yn+;6Hg;`}VRrPOd)Cd)V217YwdgU|783 zO?MX!JO@=OC?R6aG?@%M8hq5lRKlf)ab6V!RR1 zaFg9k`2J$qw_n~JjsoCt*VV&Ze;eZOVS#f$mrvcuij~dBTehbAvqPYIC!O8wq{3VI z_F3srQ$@?3E+K=HTtonSiuL6eD+N2Yc1TZS>E@q z9*KM3|BX_FY|{r;^Rau>3^)-?|6j11_4k|A1!`26n;hu5nUdtsCTCF> zisFzW6#pGsYWjc-xR&S{%RZUqcaV+Y>WYs_!<^3=3xS(??oo$#%MoI0FiuEd;mss0 zQN_~NEAW40SL;K8z)(k?pQ*o1(Q;9|ZnDDP^mB7t5AB2UkQzI)`;|9bgK^i(RebVB z7nQI)9(*g)sw92TNa^|~bB>kfx=dR5^l5SegWmRKR*}s{$ z5|R~M#|@Fl4zi`Y740w^P(Ssh7-kOg^HU0g5b!L&o+h5(G}u2a+6Yo47##kSbAokX;PtNz(G8wdzJz5%+N9+x>?&z)eK^$XXR z4sOkoktYO|uIYPkCV_Dcjj6({u#N9>#0^(*EVcS$tWR zyDWNv(qQKeoLBn>Bj2HKpS!sx4s)weE+3mSj%)bb7m7lDY1@d+CClGy|G~*YVjo4X z`9hELX8hJSo}p2barB<$&7)VGV!Z&Kt1}gMelg3fyY+|bmUfaKT`Iq=n>qN7FClh9 z&G(rz(#*ij@cW)ve|3n&HvuUYm^}lkV2%S$puyoj*_Y{?#wEDLM+NPfh4|AYBOj{$^y_^1?5qJLv(Nv=P9G0`Z28{bEJ zQI&H4{!kwkMR^RgNRPg@H}_|*XhSxzI90ybGi4;B)Sy+gCS~%|&69nQ^NHFr4UOEW zna-mWS}?*E>O`DO+;g|ohY)kKN4AC$zQF!4(DVqs1sv%PaJw8w3IIKDb5QAY?Nen$W7}Ft-R_5$X zW>!v6M4u^6zvIa5bzX_eUEp6`-R+Cr5#!e}*GIGo$l&AspB4c0D7?J958u+q$A>xa z#lP%Cf~rYHV)nWl(t_9YKZqU8x;GUr4hdW`T*dlR0o9wXC9r}cPg|Gz}oNt1TLZ>gJcn(jG|SnSb{u%8QL+Md5(z7(vQ6 z*}CvK6AG&NJG16pJ$`iwalGK(tNiuL?WEZu^LD=54Xb@UmNrHA_6mqwy?h<$Q11DF zRbCkO1BUPyH*Cr5ApT&QH&Wq0(0={YLc@xZ>PFho8Y-*en_8ao*iJq3b;b#R<&(b< z4|pf`{sH)0Fs6O#P9EO+x&_*K|w^3ELP<2Ebmpoj;o>?cn4 z5X7GHF7D;w=xY}DAm_{`@4NKn4sFyA-YC@V&d41$HV+LTrFF7O<`s-N#0Gr0-1A(x zX(Qed&(6rU3&oCz*?ciNMQDPiMj?6?rQyTr~TPGlPx6LxECGG3)7xcCE-eXD8*8 zQas1M{F{M>wNK3Ri$p3YAwzoOw9keak@2%>b^;>f0F(@bk@yg#9cfDI$J=rLHH|~2Nvu2p4;#)XwZNIN5yV zMnZ6m@cBvXYFjIzu>FDSM@jf&)I*u<%&W`8Q5z@kVmQ_6@rW-pBW{(Ep*NYwumsxA z!4`#g@)$K7PtMk*Ex-5kaKD8yKbM9x{m!-SdS}~chKAO1@cMtHd>sx@R5*z1DhgkB z9v8$xGZ&*1T{C1Oe9cbIBAR6uXDAhQt~HH{sbPl|Ru$#^~xQp8gb4amCmY8rNb+Cn`71NVh1;Q zW2TobSTq`1)Ft1bT)c~0e^x3+`j=Ii(}K2JIS1g3 zcH+ryZd}=|zgqub*5hE5MTm3HPF1Fxz&nErePyI;AfVI&y3)|)>`AEEr^WWk02!X>@KKpZz8X;|1r4`}|gC0VoZWBr;6;MxzI@~6)Sn@)F&{gQrr~X1@{Jn09uj_J_ zq$=}Izs?!F&@xc+9YexCH(@AWJh(x(gXeRqmAL|;8%#2+L#I?~euR83&XpzEj_nH5 z>0dqE*+&f&8}Uw2EQwj=qcny`ZoM5r-%jg&hxHk!`t`SA$m>tun|={bxwsMZns?`3 z6Objdo>fH(sZY`Dw=*Nct&%fVo=@jrgOX~G6`l*7*HZu0j34)f>i_WpZ_eRPr#kTk z+VRVJ#rF!&X@YHh zoRwaCntEr9?LX{b`QZWP8`nl4_74rR)Z^x6&DRUA>e)-1GTn#h=glH#r^YjNW?P*o z@yPa%-GHW(+~jys9+%tZ{O!E*-_w)6?J1EroWU+GSUWpKH4S5i)kq+ z)>kiQc$s;SlGNF7Hx|CWRnBxfIhxk_WE=D@HkOP>=eM*b3y&;QcQ9=XcbL!CjxnCk zadrI9mX1(_&gd5FC(qf*@mPcZ!|)T$7-+_8`3>79@1}bX8Cf2QcD&yqENh30{*7i6yQnQ7&DG|3n@!rKp%AvfC z{(t@&puUeKCBfuU%%c~6Oc`_9Sc;1qJ7<5-rB=|B=>B%dsaNsL|L2Yr=kPsy@sfr4 zQWA~O>F&zUpFU|Rz41hL8Zeb*0JH6=hr&xr|2exHrb6_e4=UcVYo;H%#; zef@2Py)XZ6pF2B@eJShvZgy)X3Ld}m$zs8Zq(GX#ALHGkC1i5C>`K<_6k5IXDrb_Y*!J$iexkJb4ox z5=6gUWA^u#cH9P(VV(Z#JEuMUl&jpA!LnoDRCsk8m@%wX>hs+tQrBwirhhz%r#nh5 zPj3u`2TK{WYcfNXb83*R%+QptZG^)Hx(wK``nK$Al7Z{OiAp&TW2(uKxhRGc*}-u2 ziJ)VOlI^DFLH^b4QsZUo^JMdP%KT1nnca$&mEHG+a5wG#gKq)N=5Kwk3Zv5zPYyhV zlegZ>CvHiDKgiSdoLdDq@>X9#uf@v`zp-F&ZnZ2xG_FL+C2Q@ zG_BcL1+OM*jf4to(vHQ!kaeUI{W~%=yMBv2iam(P-bj+s(742j+jXO1{S}s_!!vCX ztGa1?AIKsCH1pnqVMyzRqy&LU(Of(XWdPBa6}*aYca_BU^g6f4eJ{qlIX6F&`^$mA z@RG2+(Lq_wu$e$m>~rF!sY9IliA?d^l&pa9n=D1qtJ~r!4`Pbw_@OYSp~$W0L9wyA zZW+F6FAE&Pucet11pnm+)*yfeQOK!LYNV65FBeh%H9y>}o?-lov*)ZWElsi~S^jXU zL=nq=4V0r+(!A(t887|Y_wehWkI8#x4YEeG~G9Yc3_4$?7nH%NEakl%Pe-+LVU5A1#Ib*(sKEj?;n zbek)hNB-u*Y2@1i?)D1O(r(ULFXP&qX0PPEBengGx6`ag(QUU#kebYn`mR_qTB zBd~4dnV!G>wY9cVF3`H`r@e?7IN2bm{<+|%R(KUj;Dt5v-t;UWekH7NLAYf-{Pa1p zQo;3Ia@B{RX#F$ok78vjQo40Bwr-i_l^$%zY=&PBZ{kVL$%NV&K6E3G>(dmdFj> z)TpeA+yOzTuHc~~v2_Jzp#5>*=#{R{oXwcmGnW z;u05^0>o>NS}gJ_9&&YP2I=0Tyi|sAkVdWNdwjgVyPYdg2iw0@Z2F0bd%I~Y9iDv< zc9fNsO;!$P1mvdpo^jpIh89jXc1OoV4M!u44Cyq0-?WVAJ23|3LELE5j~THZ+RFyB zem>U|@*f&;q*2@6htK1ROi_;Eh#gMiE$LzLNgP)h7iXOWRIW~d_>NX^XKtK@E@4m8 zUHG^bFKiDf#*-$RFPu58X6%YwZdjG}=N+PsDEh71-2L0I%sfDSpG5 z4IV+w!dp)iwvudlW|e+&HFzc+tVh=}&mm3jL~JW@o|p?y-YgMv_E+NhIJ494iE?u~ zW@Rw{Ookm_V3;@2&!7j4-~YaRHChzCJt6_pf}wgq)beV?{X>^E<$vks;$NJ=k2I~l zitPb-E;sJ3a$hT`DLYFf4!4Hp&nZc2tImBN0o)IjP?E{#&XS!KB8%d4QWz=oc6H&? z(s#X_A=as(d??Ge;^In)pzZK$r}$rvni6SM7<*X^u1%;nhq`IuK3V>UHE{>_q*h5I z>>PJxMPQxLG}n}&p^G?m+XrwKF-JP~D(|Dc^`6gmYF9lsECx=j4=dreF!_lX2+pW3 z$v5nhPW@I8vkM*z!)%mvIGPE6nW$}XfXZ3C;y(VKS{qHIY~dWx@&;#r+sz&4@p6m9 z7E`O_7c^U_2JmC%ExjK0xG(MdOgf#3{F}I*3X`HgQa3#QM@2A*=E)W^@d~u*_oX(9 zr>1YHBL{sghp|W6gC1jmt~Au3ZUkHZyj>e0U^vF?jq?QMGkYpZ`6Xe3dGzfoeLn^MDlbf}mAB^S)s_4NJt z0=PNC5WlS|0e-JY8fzPFQ~D4YB1fS4S#wpiwrOWDM~Ngse8;lJ%^&RSby7RoaP$XZpm9xGzJ^c_BC;KZP zD_Xb#7x9kxHEo{nJg!uzSq%#=<{>!bK74^&C0>AiLsd<2YZs!^UF#^gOo$rIYzC$? znDS_?KKzmo9o0h#VZ(eT*QY2>#Ne!cDBJZw3SY$4bGjfiN;4mTTl64OROmt3q=*eK2`L`@qCyZifShS6Wv zE?TheR-K99(*7IK`TRMA0XkkcYO_R_^g!rvQ>J(vTHWuv{#J@dM3A8Q%N+Mv`&D?u z1^?@T91zGj8a4^kyJsb8>t^~V%8C;pVyM#RB3CTmUXZ?^_%4`~SR%Y`*NTI^6V31yq_C#saqfn*F_qDAk1;cPl-;T^EwLAhT0vV-mYkE8s4}?D* zlD^GQbCy=jx3L3D@8YJ=uD@@8EVM$Ou+N^xX73hv8*^KY92~x!$a)9-q0R(hEod{N zp?fSolCpYDtH=Ras|f`}s0jPqRS^qy1VLxH+yMo6CBdv>I1D9t{sZ}O?yD)~K;cfd ztv#ol+RpIWRYltt%1!kZ0yL`Q3Gb-9V9q$eK)>e&B9_;{qw%MV*1NTk%%A@ymR5XN z&=4*>$nin9yX;z?eu_V9TCO#{)HhT$#8dP#y+p8m>C(!f z*{uNj90Pq8H*3Wxi?mL68k39Xzs%+wbe^=ezasRFbZLIOeJkESsX5?!?o`eTs;T?1&%T z5k_zDcUwged|jtc9FER*@_s6fjdyWr`92~^qB#a=29UnVnRjh?g?r>HSK44-3AwM0 zSSn{87YEPn+hhw=n%$@n?S7UuEFE6V5AyP7UAM3*9(7;%Y%?yuW<`QnwN>cY|4Gt? zL2Qk!>|w76^KOBqX3?wlY_*Y*fA4fH*;&&KZpa4rG&8I6*CiLdgw1q4CdeuOrurdb zzYNbfUz>aVNW+cVBkP+>lFWzRqNT~VbNeKQDqA>dt%G7Z|6^@jAGg!5~Rt3-XYq?Iw z9*5>(M?zc3=Uc=a^bCUNueJ5VUypGb@WRhrZTe7wn2q4oJlcr_!@$K1gK!|qGy_@>;btPXDjsGB9uTbhQh7{jZCtnB7hbGP02+JNy& zcE3hGJ%c#y8n06+io^s=0`j88E+ss2W0u{Xl$&gbP@h@;y|*Xqy{qaX7e1dM%rU@r zd0faiijMjv-w!@XdV9Y<+O!@NUX0XKu74%aQ3xOusjG6E<;bX@uV6%!)+8!SBl#n# zu^}e7xR+;Ng5W-olrZ3+vIFKl-|*dP*Kn zH(d6wHINX4VujOpC9#v2`6ylr#kO5@0rQMeRWeYtU$2CVmC>si$fof! z+=DM4Egl!k0R(R)o{6gx_GCR)rGf?+E!uwn>;5h2{*m%9z1aH+{U$ntBQMru6WFY3 z`@_#;1#`}CVZt8%hGEO(kNv_|jxYB0gXsn#Lk1F6B4llwxPqP0VPL$+cWS2kCMlK` zt>$_Crwd!x@+XP9fcWjQHD9=I*LrgIL;YP zs@{(dx$f~@>07FdU+b~2PBT8C8fYnO)nB^mn% z2l&uKO(*Tz{BF=cKvf8q%3tVyU)2uRMZJJv6frrhgiP@xj+m38#V=<>|Ja3~8Is4# z&tlQUt1MoBpLAWF=9KBeo%+!T_wd!~Q`x^i=^eXQYmU?iy_(L{s-=Ofx@r98PesXb ziJGYB4dMyT)ncDvn-h*vT0^}9!;{YeV)qSR-am(drvXv5p)NKKb0@OL78g^7)2d@i zBQJA!>WJ-;+P9pda>B0@pE_0z{SVmT?}HR~+?I%q0VSc*)WwuF)@DWN9FJHm~cJEUQH2!Y2=?P;zjO0Ha8rQ%34~}N$)JEv!B`;>5gYmDYGL4S0B{RWuXGcfJ zSqpSGov?M6Xw>(p4i4MREz^=JO54?1Mfg>1ciyTKR_hkmQR|%^H?{&)ffy|XQPWt9 zutlv^TqAjv(Z*G=PlroSq@%z}sc#3BUd$8mJ#IE;Vk4}E1a?Emeg^N*C%7JEDQ_Dl zB3Rt-@Wuy>3lb^q0A??|<>TvfVnwKh1{g8&9XfT@;58BxF^}ah(KWsmpuM$_mmQP2 z@Tp}4XkjHFcifZx1b=h-lSLOAVyZY(a|Ibze=m|E-PiLg!n16KMzNL^B0-?ors%Re zJ;-%)usFTOrvV4EeHyQ1#Rk(9#`S(Feikw6^yulUuK}HzVLme#CT*sdBJnan z9%UwoCd3m$^!|>a39uwnt4P>}a%5y#J?0kfQz&%>C0HP^om5yU#q@}u2_KYlv+-@G z<4d+fydVq&&40k^ZajRe-T|{u`YSzM2#)b?x5c{Ds6KNNJQR62o9dOt-ibdc$l0%x z%Ydy4Zo!Cs&VYc#clTs>c4afccWdr#`>2R?unI^e^iSI05#6+Px^BBlSngDSg+&Cw$q1`R*HEHUymT#Gdm_7wXwYEl`h>Bt`3q%++&UYx0whM+BZyQ zd~)86D268p9^?-v)=D2F;8O6*9BRgna zmRr^aApo{^T^u}f2cz)R6T+SRPV#KiBN$#5M06nrKfvMtx{hTI<$03Vij}#Hm?9hs zW=DGcaop|J_e8c3p zT?=`6T{|J69#~sh5hXx#60v@$7JO-i0Otq}B?}Y};U!_ULv&?TNwpJRVU_@gaIdqy zf`F$tYjPY@SVIZGkWS*K`wTb3zJV5D93Z3V*4~WtTyxw~dM|NoyVKO3XmeQ?>vFfv z@OG;0&ro2b@rkk4dXcJ?@MnI`nkJl@1^4YYoJ6_{m&}fS#n>(5{PsE5^KzN|QV2Au zzkeu)Nfo)*By`runhaXZd?w*o#mH~K9E{3$8*@DH*S^{w8Cl{mh>NE9 z*dn((iEMvJuTRJE9iO;YlXW)(n@vN@QVZ5nv#Z>|ZowDI+w@@1!It+JF%AnKzfDvv zGNciN4L>YpI~7XxdoV@tuSS%%eZw=_VaENWum!hJA4~<+g5L%BOD z#WrIC!p!P#d5UQO@nh}+Dk0t^!9S*2+BPc@Vqt3x;(HQ=etYvP;n-n=^!$Oph?|v- zI$h5Bdw~Eig3rr)%*qiH@L`m<)h<5)c?_4+j<+7V!izVm!4m3uF3eT^@*2#8(Agj4 z7l@a$5$61J>-IK>Psjm(LwMQ9qSysg4eD^;C3-D!GvIwv`2?40>>UfT2z9GqeTxpI zvA-(VMiCny|Ft_E@m993^z~zKe+FIKQ>weo5~nqOApcumT+wX$kmuyiryXxrHny9( z_F5Y?1I>g~&ZoO~@7|qpJM2&Nu@%;wn&#!@L6Sgs3pI`=6XZw}vRrr9Ce?8>AEt8= zL+oM9jz0 zF5c}{CdB<4jkBY`AEF1?%I!??Q|YH1?ZA8nDHTH?=LRXWnJ|B^%@;2plv+WxG<5Pg zuPYvHid5iCJ%L0%Fy2z8BmeeABYn@6vC<|gZ8&YT&>~`AEHR>(9wKe9PK}4X7E%9h zyJYCiZSK_e8`nZC#3V_!Vzje39b@94p-VRz+v$DO@S4(pcT2qkqf(^i$t+QeD@IVVRBI;HZT;k% z8#nq}-USB8EK_q68eE*|ouG%25i{IZ<^?25dB>E!bUwLNR=e`b(Rors8JjQuB^57* z5N6i*G+yeWbw5wODBW@t;$Jz`3mkJG9K}HT$w}S%Ut2#`X;WMfTuBV4VR&{#Q8f&F z|6HyN!86f}xevIH?2$9QqGg>}ESJT58t98iPVndHnH$N(&9xOi^+b<9f3&b4WX#zk zzmW__sACVBF|oKXa|gZmPR+UCKsJ2#MR7zRfmC9TFnWj+y^Fz@jJqX0@X}K8;&;{E zQFT?W_==x>&w+U!1NO#XetEJ4UIvNW4e@)QT6p^FVLyx_?fb7L^AmS%Zy!0hBza6WifAcgr$AOU@fjgm>Dt*P@t!$(67pSSJpev?R>p1Z3NttGml89 zfXoZawl&$5v1d@;)>+jPITmj{iH(sl2{iv`7!jlP8v8g~b?r)9v>s$F080G)&SAgv*bEX5Z7K z%2T};KRv)FQtAZh&JqiKt$;M;e*-G6ox9q}nYV=HzfuZO=3P;a^QW7V*0MidEuR}1 z)iTqOh!puq22EwpofTasHkIRp_%UC!tWgf(5zFj2c2Z(P_A+2Tt*rn)4z5ppCL#~o zjC}LSggjVsA2T|y#)=Dmh^c_imvs;wKGt|Y92D6I-@G{czGgMB`mPbCtQ!(Nx7oB` z^s`t<7`)s3SQRr+gY%>@hEh(FE8pqUQMZGPhdiSM&x~0teNA=Didii8@@2{c{Ffd6 z9}ff^$*OemiM`a|WDSML)m`(7yx(8=D? z5G*iTsq^V;E@h?YOz)!0vYUcU{REcyV8WU}p>;GzmyF*yZxoqV&pFm$8tDdJYld~W zN$Ih9vZYm9rATRojDyI>D;h+kYEV@O^e;i`O5tIfD&^Hd#i1Rf7SV%{BPTFL*L9-(S$(P zr3~}D5%I%H`Gbzzg}UehPjXLt-cBf>IfCdTjA=bSKGWGm(4D=ri26y^-u9G& zC-0{&uSLf_Y-_|#c)hBiXW%OtCkMWMGTniU1DpR)4sd=M+p$ly-%&VtQsg)x^i&Kc zwq>yNQ|E@Wk~@wj=5;$+Sy=&{@0SP8fOM_KqG4KX;QXh*{eAgSJ&<1~vEB21`AmE_PI3I;4E~htCAGyFEpY766JLK>*$?&_elER+03h`CnBx*ijXK2T{$Xk;MIAuqV?%&ipVyO8f`P#61I0l z^O3q;GLgK!J+zakt?ylWekk_9gUHl(>)ZG`*)cYTc&Vlm68Y)mYQEW!3`xd_^oL(w z%}ec+?d;hzRF08=qTwwhKNz^G^A3i)(-m^jBe|-B>iLSXv3 z4{HBvo+V3o7PdLeD2v=&(Vd~hxE}w-%k~>|ss;tm=f<)iE`uiZs&DhSrDtA?MKrb4 zj4o8S6~(ua<`$+D>lBSADlb~xzg}wI%xiN#ds%#bypx;7a<1#XY^BRi{ryKrGaT7> zxkf~m!Cq>yQStMM`}wExq>X=^I2^bKQbrj41%|XHP*;?mmm%h3h{IqB@vAbz^Pda# zS~=5^rC;sRFlJ!ac&FYwa9NXA4k6djte)usx*JeCEp)Ur`-6~wZ}{}=M~ORa-Y7mK{V5lRgxL-VUXoYl5zil7z)`A}Jm-CXB|TgzF%?ix{zCqc zWq==zd_m{~f^9Kx);SOQTG8Eb5@Pe+y*1iDt$gVwyDUH!uU}{lM+%-K>`a|?>g2kZ ztHyTH(|dx5cIG(D1~$~IEIbB~LL|RK(09`vt&cv@Wy_qaf%7Y*%Ux*2RG@4~0!z1! zI(|GRX3N{}TEgn%3w?bEG2JQdFMnC{d6$|WFq!;(ICt66Wt$@^+yu#qcZ7h4|M0y1 z>VBpTznZ#rL8^l}pczLo08k?KwzXtUhJbp`JmfaV_L`K&)~h`qT}CMb(Q$%Ed@v|&Tw!rpsua@C_W|jN%q$PZYrA~#7A@bDU}j<(+KdUVckS_EN%qo z{TDZ~X6rbmVCt&selMA7EA#wRXjnYa&WwfG!AE9$S_v>BzrqkI{j%y<|LNBFfOV_V z4!P>CjIDyqF8wq6gospe!>-rb%w;lUVcwsd<;$fZ5gwD^)kMQ2)mr}G?>b-XmBB&Y z(4c$4MvQy>6v|$(gE}i+&eZJ|mPV?`zY@*&Ea~-+eA;A~ zb!(txUEYNg&SoH1H&+mIjQyMIRx!L7r30v1BX`$;XIWo6zy~ zcKf}6EPN@JrvpUzrL+YWsk^E}(?Gza>v}&-1g|5Ok%TmC=YOR7bp)2H*;m4wHk)D( zU@fe*%Pv_@r9ieyfhNuvtcBI(GBvgM!pfRzlB=Uafr?}z0xx{4d?(9MYEaQATGU`e zu~apIN|b{k&|pfS5yTwD3RH=908v6?JS48&Ss}CV_Pzygqj?lz_DHH6Q5<7^Dc*JK zC9eCjOhq@Z5Hxj>c;T5ydbeXznYd)Z8=h2_Tu_iAB86@MUfEx+UK?z$-|~|x**EPt zU>Q7SWe?As*;QN2mK#(U&mYkn=}<)2h_p}i_q3>VrtoQ~3^THb$7&ko`a*-uk`gxu zo}rNVOK3t}B#G>;W$HE1tknA+36ZMzxjRqn8$G?A5+j{3bdaBczg>qDL&qMYxZB-1 zuy2x@s=S(x&XBjPTtt2>#axHdhYV{oY>6UK^)vw(kE^BNa6UA1%YYWH?>$Iek^FtS zVVD95tS8j+hbkG++}sWr+qoUe`NQ%nZMcP|2#^@n{=+MaG_Usy)zzdSG93sYdBa2_iOrU9p+{~4N6RYr^NsJ+Iwy#Dv@8E!GreXu4D-u*qk238HxG=t{lSel`s?1ysQvZ_>s&@88h8 z>YWXnKuP83o>fXD;Zg^TK+bOg44kB&%!k%j3__Tz1{32fEch$x01a;r%q`G0tIy4+ zFAf%-ckxVCe;B^9^@!YE`inT9+_oQ8*t4HOYr@>G7i-(Tw>2h%^h-dAY;9^rJn8Q= zm}qu$8eYSLyl5r1ao&UuiFeS*&-P0v5cD#tAJ)W1O^o*Lvk9B%Jd zqsAFkqKDA6zA0fLfj$b4VvX+V$aKRTni4sZrj;Rjxvh+vSm{j@L$iykvo~j9P6MIN z?A2oqR!D*8flQ}qwjF5Znfy&fuMU0ZeI_Mq?qLNr`3UA3%C3rVY*sov>ujYX&y-+m zTqHk@oY73KBRb=uhBr{;zu^-3j`~LXfh!%$>dzS59Ft=e+bt)>E__|z8x?Ai+&BsL zQ4#n=ZKK>~L&WMBH^2M(c6WmQLev0Ifk_?gti!83Jhc~c0KUh2D`1|X96pZmxVQa>~;1ESu8XqERMM%WdBvK!1OR?{JDU|KpC;F7@L3H_f*tqgQGA2xqZ* zRCRQHMDACo7FB@Oeql^+$7!}BA{Ari>#w7@O&#IWimP9nJ? z$MVOg4e&|C*%oDkW5Xu~0r>H61?yQ7Ab9yUCw?6S+|-qkWrqyMKSp=&f(*x=v<)P z$C!1^nzQ~-R)%Y2RX%^*(2J?s-P{f7Rx`;@a8fgc(tz$6S%=?hL0*~j?|_hjibepi zafu4wYh(Jdud2+JBnR=7x9cT6iKo(H*8zKseg^|5V7^D z5APUe6ybBCgH{luWd+@4MUsDSn7$&Z1;+&6-vp-JLXcUk33u)*n1)Q>Rs!W?mDFNYAZq}st( z3a#g{2NfJ6>O2V?WeD{*;WbyDnNP#XB+(6hs+jdYagwM3Ylm;~s)1BJuU<;i#2zOF*xKxe8hT&nj-!a^-t);&2qmh z9|!GTtPc6wm0C)UzNR4&)(*W-If^_tKK@YSNW|2vwCJxXpv!_Wp=w=IKTioJXkXeh zXOU`pX}=j7jharEh@OVP5SvBr)#9iIDP}G!OtF*sLDcJ8G!bk5>3X2IzkS?o*hct1 zzk8R>=EA{q0nrhM@3-S<5M8P=^h_{~KlJbg1uy*yZcE&1;Y~yi=g|Btds5x*d^?1(jf1XSVC}4yls_|q~-j5;Qdiwl_aCD#%tfRaJd;uk2Y#H zRJ;}A-)tW#Sz0LyKsnvL`74n*e6grkxgASLiDE-tO@l4;l6<-Upo|hv;e=|vmkg<) z?KQBXH1B-YNb zZ4Mt9kQ0y=R(6$=l-PY^W(C@T@$e;K{5y)~aZ8Vhm@U2HyzWTy%I+Z^t?Ij8i#~<3 zS4w%cR9VZ)mvs9*_`%(lCORqXpc``&daDP8OS|ro)c?~4l+0+w4d4$vWqdUqb&4RCC zh?9>1^~uRr#aDe$iNg_A!~XOva$iN;$2bj$WG?J}jrHK$TndR^j$$tb(#USI9u2m2 zWes*5`>>SNjYMk)Y=iEEU-jh|Z5B;L1{TnpjRdX0&b0 zvfu>IpBqBZ3K~^2yNeN;C3MaC{yz-SjivQ-!QR@IU*cG=F^JW>o`W}EUR%6l@QxBg zUw`6jmVPOd$8roYo;gV%D-!2l;U9^)l;ck+OlBQ?bB2=GY>nb25{=V#wC@6`Vh-Ld zBz_UTR5m{=qK|}Yk2NK9%2s&~W5RQlQsI34sDX0x*1 zNOj92z3loP5Q=?DlYDKeI6#x-qR;Pms9AVFkYsBU!U6?H1n~KJY71e0424;~ym>2u z?FO9~95$o`Vm=3scidSFbhHd8w>BfqF59%o}4>{>X4=E^@>y zF4E>hX@~e36Q2wCdqx>m#J#aFCfpvI-|GbElXtwITWKS%LC$md(_Ph^nEXGmgjoTK z#GWUwWoJGIs}D&-w#2QO8byR8F^8*rE`zH5c5S<;$(EnV+RuSNE#S>n3scDmM93U4@EmPGf$Cc#8_DDe)c~FD z*i7sb6*M|>VlPjch+nQY&6g|;(9~^jzm>6AB1oIXF4Z10EGAoWulFap~bR7Zdr`04na7yU$7UY`c=n4fO`-Nt+B zXWBU!G_Ycc8*u3MY!_Il*jb&i?zS?`vo1%l?!S}s2}T0wK>WsMJ<49bWiUrOk-iO+Ms(0SW?Q}6Q;7)7f=G?%mSvKMi&vwH2hGQv|opqFiR~i zoT5US&dH~#c{ox#36ig+HI54wQm->~*`SXWlX}ZU>sZ=}J+;YUAKp{Y|1ctui%o3& zGTI~PM%xVN1VnSXkCjR#_C*|SR?T$ndwt`S=Q6eoBcoVWA>mA~&lJZUcj{}RKcr%F zs{wX@#!bt}J{CPI@!J&td@9ilbb2F;yNuYNt&W>-1T9?p7?jD=F6alSo9)`#TNXT^ zj}dQ*U?1sGQk2=bMTqZX`FOeckb*4rK4!taoGm!^9`)_H2$g`Ii>}NGNpyg@Wc>Qf z69ZSp21pL+i=Aew)n`G)jR$;D9cWk9_C0iH7^SEmkZ3>YQiHCY0UC-P=uq5hI$7gQ zy?GCkb$+(e)L+*g-404F1K4yMK%f-8FexL5L*vpRpRrIvrF;iXQH}K2d z;X~Yhbfrn#i|nZ(kphRrNj$Fn(D;?#rN+!{t3INCJuyuzLIeg~eBhE}g$B5Js(Xfr zL-a}L>1K;&&V*97Gkci#HS%IeWKEFxG_hq`aC07?>~>_Po3>n}3AkS_-Z7QiRUR2D zZK7bdG$yDX5%HTo=H>(Av9?*wF*1o3E;Z zRAinm8uKl3> zO}QS9XFLqZYH^_*zKa+i8Ax`*w#VCY*_Z-*TDKA+dKY23A2}QnWa`Qj5$IGBk7N;P zj#Uvm>%fqQSFhv8>bC0tsL*8s*-40DE3mn#gX=P#g6S$L0nNd^xx`gNy+$t|1(ZB7 z)0#Qab5^lO;%|0nhRW28={ADfk(nF=%8&Y`7pzmQ?2$g2GptHP<2ZJw(u+tAai>w?G+y_ws%Q;M`D?{5aF ze}u#k&{rW-;1!sP8r8-@WHxrxW-1?OQ?jr@0u{YFDNTG5KC zlXd24MLA;&xTmG{4H?>5vI6;>+%UU=#6{~`bSidRwjO4i8(sd>DA2}Nk5A} zw)UZrDld@-?!{uSMFbCXO-=A00YNNINP89se3S~=Z8&|K1*zSg?e{~^c_!N4;|Z4H z!|-h>BVZ9L{PYWA2!{wFol<53gA1eSdp{ zTFFMUk|z=*+j)zpLp#AXjv9K@E=0A1!V`&+;2hvoc0I5O8FW@W3l@MNUn2`EP;TL8p93vMKk`2E5hZI&>{}D4{9Zb3v6un*U@S;xy zTBV<~O^i2ee^{g(6SXi$yi(!t43RlqD%)Dve{{&$5tT7!Xk{=4X5w%0cx9-z?5-^p^NBHO z=d7ciCO<5A2lScTte?(smUHjh&=sic{rcc*SVlkDnJ){}^a#)YoCFTs9g8;>Y4j>G zv=SVe)(IE-z^44f`n7K&!2i2ng(MM3kT&E}1?mB1IP4}Fw$w`UDKWUUXc8T>y5PEx zZ>D}De4X0$JwrluJoGy=VlyR}k@qv5k8JaNiU`hy)bVt5)S#n=3lxIhJLpU-$Vd}w zQDf=UCl_0fE+f0U2-Kp!BmiEoK=1Kfw=y9 zt!Y(_ZaZ#Ja+u^^+V)5HZIT=OskX?^B!9d#J(+~||53jy5Df!V303#s(fR?(-r7Fw z04=5%Fy!nnmw2qArc8yCXH|Rchu%s^CA2aH4&G|Zn|G6?_fFc>Ejv{Z?wbiLmo0{( zvMW>*?N)2ReADc#EfN0NFv?v~x%(R2u=|r*e}^YZ&NQT@wk|lcNx=9yV))}JOzDC@ ze!Nhwtk3SrgM4dxNA%cyr0XNobgqTW<0ay$NH8XRw8`u`n0zh={&~;Or7d#gWV9o zr~%9G7Qz-aWB2yY3bWbH;Oc}&JL>>3oz1mynCiEv@!4(`?ewj0(oX?UOy878tjEb< zrJh(DAu2UYqc~GZH3@NA!b3VWr0A}RwMuUy1A2yhQuwo~d0F{E;=wqb=sEWB@F-)k zMac*_<*|5>^qJaswEKEax zaa!H42~~B}*zJYBPQ7xjWv&_qG5GQCwu_|ksIk8ZaOFvII#?KCoy=BzgipT|I_%Kf zYQ^6A_6GlVD1X4>ru$TRyP>qbz)c*rUjcHK8A9%Y@CdA+KmRiTFC_g43HNcmWVefs zmVG0Q)PW2ii5IjD!s(}0@!(QtdNK@1jD8Q#b3aw5`Q0Tirz#Vg`fYGt7We*p0>-Q- zW;o{|Ao-|(=cCyr_o5JKYO!>iMZXraowae}lw#^P;XtH0s9X}`s0{db&+X7-9%Af3 zf2zPK`==weo$IHoaT`!Z#*FNZRH}g#C!`*S0xusf@^6Fol9@)|Hy8=aaCBODtf7G;~C4nIMZ0M#KJ9G^(*dx*r-}k(Xg6E zu(QDV##SZOLCEihdGa^S^mr}IwAI$^r_t+(p-?SiC@aR>*hjnml-EeGtR(ZFDg#kst#3G??FL{6DJRfxD8f z3m1)@j%^zq+qP|VY-`81JGRxaZQJVDHafZc{m#APj`I_$YRy%1KAN#Mc>C)iU{=(A z_10U9$E^U9{)FF?87Vc)?$b3?aaMVSjCzq%l|d)|kc{tO%0q+Qd7&a>eI}DvRpy*?ylVaF4GadkqLz z1Pi#aH`qbsAz~9BorMG%j?@M0Amh~08&0CZ3Zfw(J0>Z~()u&c-+9ZhUCF8mB|{=` z($~qs)NxhMyoiGeHs_ruUUkGLOLgB9<6HeP&Qn=#mJ6gK{dix84Wao0EC~Ip%99Qk zNKbKx9o(rIJ}iY-y?$+v)W&=v+n!aNni*9MZeJhI;q_3s^QC?Z%Tl0tUUyk@?Bn3+ zZ*OnENS{nraI)nVY=4-laOlSQ5WW<){hu*5nk@g$+P$_TDl^fy!fh4sOScPm5>s)o z@RExkl4XA~U9~rdae7wm*{7ma0t={lc`Cn@Wp-gNs(*M6%--Z4QyHj&v`6tzed8%@ zGB@-na>24d^FXKhN-n?h@D{X6q%7~nc4Z_G#QLar`FE#@V_Jbo_J0`ScUNNhn19VT znN%(kkBg3Q#^B@wK49qkoCtyj_JuV<7hZI}S&Hcu`xkVjn#c;Itvv;DI!I^1>QUVn z%TmnJCtmF(vA=n6tk~CEL{JRt1W{b)l@h(L{d~9DiSYohC;y%x)e%&X!B@oHz=H6y zt5tu;n`mpp4mJZRVrmr~0E?;ud0Fw_KRf!yPEFFVsYIgN(i}C_;>;&a)Ex?wNvOWM zJo#HRy<=SI$VUI;hvV500sk*Qyw#Q23DaY3m9;CZ+C8)bQxV#z#^No#WxFrbxenjB zRKCNv+G0RJ#ni5uQGJ*qOX5}|BAWWoEd0psHyBDLR0~&-;c~FcW%r#Kw`#j4YDM@F zqX($bA+AcDq3J~m&c2KFmKj3G@?^l#WZz|}jaZhY;%jY?74smo@)gqv=4 z0~5X2^F>Bq`v&d@!xXBtjDNFZ&5uW5#%}jMu7!L4+Ih*<&V7Yp7Upe7Sn1?J*<*Ur ziciolGLM}YiTgJj6;r&?3%80@YE##?+-@G}2`+F0XC%R+Vz7E_;nbP)&XI$4xRQ9*0*fjD6IBfZcAE&JNwz z99kKe%k!+T$l@s82M&Qul;ROK|b z{S|G16Su0~avvvhQSE`4rVJAnvolBa4xK!KuSmXD0cUFE3ZZi$S+Lc;`DlWftr-|g zNd*X7;j-1!$=*A>I44gTjzU_L@);8LHTEh=xj(UDmphitzs5 zy~r!b=Va`(I_$C`$;sHY=(t_@XnvRvmMtLGyKU0z zNCb3bHF1JXC%m?xl9Dz7r9#2B%bc55{;<=V8no{nlO|}mG2ZX5wD93_s-nr)w_xR9yicPDyZIAfGD1_=E|Mrd#L zr=lx}>D0|hg_7WfkDxaFdv9`V5`52s(~&yPC(U{gDW(LH8o8fD(kF60zEXCyy~wQo zNzeZcdS`RYU|1DRTO{{X1PfQuX|do!w(e=7_CuKFGqsnAlU$GXxjJ$6rD~${sA2&a zVIuSEjvZx8yk*4TYMg-`Sp#!t>F9`&8hOs=JQwa?cjs_D5Yw>RFJtS@N!oF)GdMTuAa3lyLjwOft3X=3lVy`d5KP`xm0l4Tp!lZHx2$){>l}gRyguUdE2f zX%;S#^WthDh|*$wWZ_w`kq$xN9tNBz{X>zY-sqE}aW8aL-2dXR=K5hyNepH7=_(wG zRva8Cecyu`(lf7^>zplLQxbg>|0-})+O*(i*CGuE)KRN2nZdF|1&mPSjCE%K* zH^HYFzjAkB8A%xx6w4ADc}21ukox#O+?xu!jSg-sl-)Wa*ST2 zsxnGqZRXj5P-1Mz=HFoHHa{*%VlTe(dN8PZv>m@2dEUP4dRK|-<4_~{1z9NinP2aW z(Z{Q!6@SyPGf3iDYK9+zhIR@pP<^6jql$^n;7>=#fYosLT>hM;ydyg@=EfvZH+&8O zvf#PS+w671^cm&Fnomr61=9_~5xtdxKv>bfpp3%c$9uQ#QajNp#o;s=R}VsVFcFEH zY0YVyYTt2GBvp2IXu zeC!a97UMd_V^=2G9!=kOWI7T61x+cZFI0E~q4ECc19ELhO?9FmyFKf1tQYZ$hl0%y zru0k7b=z~%Xd!$N*`ZTeP)ckxk%u3%>x-|797#esX6``JKkhJ#bCpUnB_y0!NYLb! zY~P}eXzhnDz8pcj1e+p;79xv4F#CX0QLohKPm_UT(0zG3Y}iJbM(-j-?7ic|bD5r@ zIV&(0`VN|73G^XTC(`E8X+RtELJX(kII(;IXuIRPTSj9<*RKE;Yp;@2YFI=B>Qc-K zk9ivi5$*cl&D(@la1eO>x8MpgJIr7au(&|5(76;yDL*YM!$1bUJ7kGgQjw&~2imistlOBhMsEyPZ-j+>bNVcQyV&Lh(O0_4L8)j@IZ_H3dfNTp4-y+&H5Vgmzwo|>jX zbN4;*93;B=6Mpb&NMd4ejNSsz#vb%_fUVqE0LE-^x9N#gw`Xm4r`Tf!A(tC+DqXQu z>07F3@)~ZViyPccig5;HgwJi2&a{e^3v(8cN0tAlFk@nX>1cQMRdpQ{qWJd;A#r5? zUrn5W0T><}W$cR9EUKtNsT4x#_V$N1-bM1KYYpL)xCPBH{h9jkEo%@Vjx_(#67xE8 zlGVbkC`F5O2gYRpfpKc*;QXc5(RQMb^9AA{cHALtz7)Hd#$BRA^zw|%VgejEOaX+i zEP-M3T8f|vxFCw1QoZ^eWWetdp9sA!0XqsKHf^hvql%dT$n@fh!PL#q4T0xC9!^o0 zewDlXNiJloiVzczN^`!FT{j%#E{U~)XVhv}8R>(Luj#KOKGNl6K*52qGt8A~ zS%uyQO9V~|o^hN0)Xs2a@;Ku+XU*(3G}v9Yx1}$BdMb8z{#Wn-TXo*Lp$1dyGA27i zYY>M9=IzBdPa_BvzOzMqHze!+?<|mlc|m~T9L6f9lO%iwA3K~JV4v9VAo1c)kauHD z;I%9rh-<5fLT7+xV=?}j5eO#8SfL&(UY~Q^K;&_W_XA!!2SNb=#?PyA@Td`y(-Zff z&hvt<@G2(|f9^NBN;~U%n#2Q$))Ft}Xd`411hGGja0k?3cxP(fE#i3D7?$v552MjV zEIpapJ2Q6Cj2Wl#?;m;2ZM9~Qzf`G~L80Yr172y!G*hYwIv4H%gI11|XZ7+cP&HJ|0 zA38W|Qu63+uq71IbaaI)D8rpH43%hMJgE@|uNiZaL`jUpSg`u+DW{F-M#GUhJ)V2%;bhKYk|)GBls; z7j9DYvaj$ZBwBZuFumZ=iL!nlR;8%ZRi?O&AFV2+ovf~`)H>+3IT|M?bZ1Ik`iP%n zfBGHZ?fzbM_dr@y*qF|i>(uXx2VM%KV9+EWI0z4|cX(0)Nx)S=$N5?#t2wLYs+oq% zWt#sYh3;Kc=SN#XB*$>*c3rZqb(!P65kqk#$@&{7K$Fp(LrQgKHRjPl#VRISMX^Z-WPC&tZf@`7RYu zeX4wFhhH}`K}9)wk}ssn1jLe3e848ad~@efp$8#(l!GbPHHUc$Wir)@mRoA;5n;~= zEQ)jbK@{6kONoT?L7Tdq?Ic=O*yLFIsOuB0Ra!tus%oVKXfPCGHceFDC2ZyC`k8Vq zjK_PMB~s%nnUysD+*wslacq$wwd8i+AI2`DBz>=#xW;LbP5y$A5Z3E~&BxQNFc4=etchoi z8)8_hK}ay043DCMuR$}ieq-cb*A^I~`x;J=#$u_#qx#wU_Tal4%m2}YC(+>tg>Mxu zM^@qSmMkb~Nt&)Emhuchg7%u7o!pBz*dcpZ;_h)5-RjKA z3PQqLH*0O~5mv=n=xf{$3{8gB2+i~jhR?en^>&=kI&Dt>)WqGefsKVzC}Qd2xa|3H zfuV7x9UBScpl==JJs-v%RBt6 zHTnqT5REkr?O5p_YK83F3wr6O9y6b{ZX<(^!Q{Vs`A+bNwHtV|Vw8I1XqXxGcCNL^)jZRAm{tD7z@ zTbap~URg5GCwp{4JXe!45u|pEArQ$3DINmtrbjp)i=#y~>!H?*P$CQ(dT zPnrk1Gc8Kkl53~ZCaUmwN$*Y+YYn6p5l?K`dc`T8HLQvP9d9d62Zz2w^9*!!-ruAy zq2nE5ev%@iaAAWQ6uvF5kpO+Hb&b+}NO30Besgw~y9!82@nS>;17iMSPyxOv_edZ^ z*u#tvMmtSagN{D%qWR!4gchb?wvAAUDlm|C`UeW=YZn+{GcDtB+ue|{d!e($w`iqH zfzpb4S=x(s7dj3|F+@njcI zSy7O~yJx2L1*7Cymr`k@7cs`#x(iqH5ZS0v$LogM82rF!h|(mn_*aS*?Zt{~#FJwP zj)zO)n+Qy5V@`?K!ClCiWYFayMt<-yNi5Ww`Qb?vGI^AekEI8QVGy}tHKKzpylCv$5Qtyv8#NIlEoy4wzU@$Nw+8Tqx(MI`9v}6E8tqcR&dfiPCTcXv- za461f6QahALJw^1Kq6z+2-;5ZvDr!lH-{Ok)Oj~;Pf~Kt0y-uS0-9Gd%X?RNm)5;R zn>u>(=Z6#AumiwWX#mybC5>tr2TEovpw`dV5=>}s9_+8#!)(TTf;F$~o6}oZz=3sn zM1ts42CfnlP6em0Z6;_gxfgU~0+Ezw+XxOg1OoC}0H|2j;}a_#O-K4ZYn$;7dg@jx zRzn5;UOa-MY%T@_8u_KyG`OJz)=p3|<{@FKI75`?^aT5va`ke!LQi3ohLh0lY~iLO=}Hp06IY ze32Si0C zBPzz(78}IMJU&}XLh=~9KB;uzKa4`8w9n{NJxT2DPwo}RvXxyWB#!1c!y317xm(9C z1`HEfK|tnLVZ!#RJ-rnA#)#)i23*b_q`Op@l(>$_k{7Vb$!XoFytJ*I=W%&D*}&?`cbS}CNXF(TQnk7g5nD5f{{9%p?TnxvOb z`i@rc6Qd_r-VokabB-1uNgCw`EUdJ-Q_@6eBO=E!AQi$YnuSe>A?u&?-!z>kdY#P% zl{u6^$}90*501OogNgo0{XWL`t_eE(+0r&0jfjh#+;ST- z(&qg8801IPtb@0R?^ zKyQ}x+9ld%9~aiMZfE}Pm(wDuH1%+jWC6XO3W;m+ZG=x}Tt(#mI-`nbT5C+e*5yT% zszV$iDjWp9nHcAI5s!Qz*s9S!snlo+^03lPS4TI z4||obKaKtMzZfY2W)S3&7~{emZJe|_f#K{!ltrsi^`O`V!_`Dobm%#W2%J(j!&5O^ zbU5jO*k7kWk2RRe#ey=HH*1s#R0#j}%aa|dx8LRA<}w=T$+1*?EkUAtGZ+%beHC_M zk7{z^ItM05V2h(nl5ozPz3Y5en80R`Cr5rhR|Js;!^dCQT>W3*_xM83P8k@pS5eX|aZrA1L4XxVqTlmr1KEw1VA zbiuabZx5gpUcyK&5|hY8=e(%pX0Z_4{UD1#!G80ApbjI#22_Gs(xqDG(cjrE|Ebu2 zC>>SMNYJem-eoU-BK0##{o}EEhat+YVhyp<94DkB-xA9d8r~u@S5T1P9YN=0;#y$l zx{&8`LT4(rTKs)n#tl-?iCN{=zs={fK^Z#%)8yGO+lxv@A%1dyG#P5By^$Y6wM^T& z@Dkb#BF1E@y(a=YNsSU3x)B{hN4SoQvs&^OMZkC?u*6vSQgZy&IS^+xN{6ek`}#G( zF_2wW?3(jzA;RP3T+E+W9^y{y~c%@LbotcnVF2i(nRsLk^$jbfa z)PVEVR%EAx?4q4lhP5hiq_bzQEc=E|Ei+uXbFK5b;ONc0RmSMmL@(-%=<_6-i<~=g zksBpJ95y=|N!fb73MnlB&R&qkSsxmW6Ayy`1A4r$ zy5_SWh>ox&HQ-*pMslkF0bBnwsm|~+2Fr*B07_$2%dZ!^G$o&|HFO(1Fx$N#ytcGu z7uTs7jCH)D-efSN7M*|;WOE|n7ctaO%wx844jr^(jdD*VgX7saFVl$n-E2((Ww=Y4 zIdvt0VJM*t#Da#>K|!^(Ka25QKeEoWWa}N_s2M=f{vM!J%43fAF7(5R?$e`EnL^;0 z*Z`IY*-Pi}tM9*3DLBgyZ{|gmjNlb3IsO!|Lg++NOH(y9wV#ultSf0$&oQVdo+o%q zaal+=-N`}0l=zVC+0O-Q9gcQM4d;NuI#Ac$7u{2XRK5bLc!$q4hN(c8bNMx2$LU^l z*>L5Q?kM!JGN=fp_!Bp?J?Kc*%-~db z6`3kPrF(y7x%efG$&R7OBX3oQJ)v8K*582Sj_h@39fKYFg`O=+RvJne24Mq*=`)K|i zjHt{Y+l}>0b6Gl=@mFE|MEj!w^1meVxIt2s!pp!Vu;jA{_-#JvF71`V=d;+pE(w9h zrbVa#qrUF$Cs@k7lr@QHSBGK)0rrjj0{Hg8$S!I7D}gn!!*&jHN0f`8R7i9z2|dDJ z*N00>aV4U)j%wL~Kj=W*52e@DgTOS34Gh43a!R*9EDp`?H_l@zTey&c%8K?j{9%E$ zJes|tniUO}=_*m&9s{9xO%@2etMaWPv9jW^6{Xal0^IRWW`s&M%42bi_V6XE%UZqF zCh1wLRmr+&H$1)`SX>{SM?n;>LkEhWe)vuBqEaW7SRHF%SRl6 zn6`Mnp~x=H>SJJZ#|=++_A}(Gt$mL-GJ?HaM*(k0KoUyZ}p5S=EQgeEgMRp4!$j;F!U<= zl*|8?@zO1<>XbB$2puqx*^gsX!s5bi!Q=pXeHn8zIZ-_1XkNwHzDIvdK)zB*+4Pjd zxwItS1#6yK#vIs{1boXXFG=26=Ox0R4HAc>|2M<>y38$B4w6=?r=O(^(8s?w!PjD( znb%3`4CbQ4-7epLYr@!?I3Z0^W%a`+eg`U(Z-w6;y^6X%v!K~E`iR{JIvomu_G#9% znX&CIWcrkx%XS+$Qh&3#qv@^>5XPS@!9*D=`(DB(H*<{}O}7(-MItf_P-I*AAyWL# zK58G+)Hf8WgPO21;~j)goh2Jn+Y%LBt{qLjCj(?y966(}n@nJdYcJ7y;f|z_xQ2?r ziYar&hutiX+6DbnrfI><; zBWqSTe5Av?Xksj3f##lgI)ON=)>7PSCRggxQ-ki&R=x2sP3j9V@ssx)Dod>zBqG0Z ztC%R9I{w{&lqYWKPDV*-mX@HdpHZrC*cgA@LrPvZ|W;VzP3WMNG!4F}4-Fvm&ifY3z2l90KaCNqkW$VR}_ zHX_6;9v_a?NS1nUNkQ>Id4OylTS|lYAv<`A@+2KX77A#!OYzP^5|U2Qa5c`6nGo^X zsc>|0=Or2rE#gprp+`qE_XQ@>28=ulV?}o@BHl#hJzK*2g_AJ~x9+64MJQ*{t(e>b zIk|4}R|+Z&f>2bcF+BHX0OX;5O13vM0}LmeFaSmpN_=6PqBn>9xuM0Ejy<02989N^ z5Sr$r%<3(d@g_xPxn#oq>G~M$7G5R&yJ=thCedQC>JT%prp}SNRKXT(1ZZp<>D~S!j}ESBI7ht^zB=%F{c*g zKrX-vkN~xJRP8PK)*l;5J%-E*iwS?;oqq>X0oiE9LiKC$FcKP-SIIDZOY}bR*a6Av z*3sa(%|6iVgjrt`GAUod*ISl|&X%QxcGB$}}@NvOq?|>CwZEzfAsw znaW4&*Ls_S=gDjXR2zmBz)T97vur(@s(9iZ&dDdFi4MeS!%K(t^vz!;spUbDy`Gq?Jg@oLGNj|-!sH%!VZ)%Ot|5U}@jIQ14>Ufmy5+ln zuMr|i{yCMnwD|Swa@sYd+;r|gjA;x8LPYS#!{FN`rkA}(^6j||)OFw?R_LuVC6wj! zWm0}!{Kepp_Mh=qkJH|oU*$GXjh;JwHkkoYNjWb=}K{yH(g!xNDt z&q<?eQt^qb0)7m^t;d}O@yUnnr)uQ zVx}Q^IjeDpgdHZ^G!%+z)^NfW+SQwCn^q(Kj5B&Tpvh~bicZl9(KjG4*3g5yAb+mC z%3#(5ND*1JAI+13xGDZkMMIQitN*hdG( z0UE<69T~O%Q({OILA zeYL{5Q~bswnnJlv3~NHyZMCN0Ae*|J?Of1t;H?wO&{gg&nH+3^Tu3A(Uj1r=3aCsGhpXFDq0cGN?q}Tnu7|=T1E!%f#sA7 zCtp^XTn$S;HVkIqx{?Rf8nHklCa&uWn2cMe z(atlHI(EUt@D|*J{n&jY_~G@p2DTl^`a{$w(tUCY`H}`6dSom&1VQStf@wF^H4g24 z6Zj!MvFg9xD=?uvxXL}$T~w0jq`*=KAnp3G9AA0mDU(|*Lun&*M18mm1kulAA@ z_LhK-k>bQ_BybEa46C2c6G)_B|#}Y=&7FxWE zS_);oN9+H^e2sBhKPG$xgzk-lfE#HAOx4gTdTljzeqrwl_^f z-o|I4&AmPUdYa?h?xf2PMlgO=M#Sx>xyI86gEFl}2K)ko2t(qhOtd@y!)9JbJ+Nsi z4z#a&a>Y{Ckf0y1ZN&14Ac!N%rA0BRa;TI1F<%ahJl6gY;FAlzd5JUi<%KRkCesuM)y^+5WT?Y@tct^2%BdBWB_+w0tJsZ{jIf zbU@|yM`~wIp8Q!foQo1j6QP2MlRoAIEL3Wag86^Y-Lh>r3kOoMrs+BMfD*$Eo_x7-vg{*8DuXm9LWvmJlE zv9%i(>CI-FI;vD%M*rPS5d&U8Z+!5{ztmzSF4le_-q&)}{@U#r$zd_B+b?JYrUAJ- z2%CEDvBG?Y{B#Qd>zp?=;0E>Agsf%kVy`1ptuG5|b29M?gE&NLiK8Ywg41e1*;pA% zPt+qFtM|^VW7}t-m0isYmQ{WEk6dDKfnedOJGD#W*G@p91X*M8U7OCEMJ*AFB8n31uP3R!Dg?xDn_#KOBSw7mR#!MVj6BX% zZ8*@@PLN=%AqMDQjKp3@cZvTIO9|Z`Ix3X*{02;zJ6OkP3vBxQdE2wBXV_tNJAv6XV}v&J5>WBi>z zYGKx}9v|UbgFP5X?J9isLSZdq*?y<2&D1yE)^4D0>34Nb)%2jFq59aUu1&g=lk8*A zhODEPBx~hwS^mxViAJZbdhFVR_m$5Dyjg6-4u>)TUzY5#xaeqj)?6!9knOC_5(mUt zwSRV5yj#S_f4uI68Ee#pRc_SpQnOjekp@Jb|qQ&FE>0|!T&3z7>8%)DUDn^eL}$HJ|hchkEpCGj1>0 zgx`uKcbZ>jbXSDgVu~DEAW1~G#I*o~h3RSS=M1YIG7%$6S2=QN)J^w9DkyX+IMghd z&jh-G96!-F#6%Xo{wiNPo^+A7Y%M4IA>ct@k?&9T3u;{%QlQkOi(Bo>=wyd^$p_ML zwIrZDZ%AOKp2*8>2!agE2YHQRZ&{N!;nNs3kUs+(ExK!>HBszIH)!MQx7nT4I?M(v z!l}?D_&8Cs*^5-@8kJ)whlGoL&w1i|wuGr$ZBSz;*pnPy*$y=OpWx@AtfU18g@Bn4 ztBOlOhSYy$L}E6Qv>yq+1i&>0(gF3%FgD9-PekM`arv|^O-5v&30}oD`|^kFR-^2o zZgG3iVMNIA|A#?o@g$r@jv?x>7jbt9>=zlggAuYIo3AZQNGJQpnM4O=TeU&w8=?9z zmsO*b$l`f`sy0+Uc#(Vcj2`|UfuefZGC}r37jg%(0Y9WK&D>Wy-_ifYSqOPVe9L(X5n zWI1J;FOL_dHe%D643?C1fw;{!@Q!BUd!+T0DD%%hKNUOJ`RE9WGh2NKyu5EJqq#>5$Xoiw!7OwH4u{o&#I-$0%*J1aMKW z40{wP&g?7Ke_>v4OT67q=R8ZCo&+mfiyZE&Yu=ItLN)r~{>h)ne46~aNze(p+apJZFm!gV;w#<+RPoRvb=+`tu-+(i zFiP0n;k>m}t;CP9poBqCtRN}ovqMkDi_jt6kKnsgn5;j*fgI)ug8&7xW2zsk{6jUD zS!l)E#h-^kG>i*jP5`MS=&?(E-}4PRK(`BC#mHoXZl;F6Xx8xVZzgtoJ^zEx8chRZ z=}k+ZR*g(a&EzKc8hoN|^;Pu#-h~Gs0_}1>I^at7tgIu5xs1k&g0hAcC=}F`+T=z+ z42mpN40yyX9adW5lMXoyMm(R zBe>GvyAetOn4a`igWFmv?Jh^er?y=xczse}*tq>wXg_#z{kfz$XaT8y()a02FnNT* ziFnKLuW4i#)*Z|uIWc)89>X%u2SV=|jdq7SZ*vX^{;r=0a-hI;vv#sxz(xnY8aSUw z?gA|Xb*C=b?76fYHdKt_Pd&;M(PI4?3&2)>R9!ec7XRyjcPFJk0h7aFAocFENN8;X**lt%v%w!rblS ze=~ozw;)H@&jX#Bhdw>>XH!-ApJXV3xyY93w@^t)psoi`{Nk!Gio)iCim1VCT&~%a z?fE_}i>lwTUT-O#FmCc5E$uBqw3XaSWYW(~_GMU5cb2Uje~LP;)pjpPyERL^4H-m4 zPwx|QGi8%oW%culXqlCkC6oMh$^A!d0$gEvkZoXy#kSiDqm|8M>Eqm1@qtOMH~;nq zVSaxO7AEYB-hvMxfidwx)+9h%O1F}9llFEY#(ri#ZuP#(>(p@{#WY1Y@n$lp*y2|9 zphiN^AiZ#|bM&C+>LwrJb+!oOVG%kYyS=u2*%JD%(Z*wcf`DBOA_^fV;z!Kkgf?_l zVjs#vs(hvN%=UWn(~S2{rZZsy%&me^)3ooE9a5A_W|J30xna({gj0*7OY(J*!;_3F0pboHQ|0AC*Q9--C&JLi}uMNln zqp2sx#j@el31VX8$b-yGdHo5}oaiJ>>m>jhCU9QlUee#kLa`$S6@$d%WrXlbq2aZK z`3*!Z3-E4$y+G~3lY)=Q@rIVh&Q@(%jgmM+|c;0kdbm+MuL->uv1;Wn16N6 zZDL8VCFh8hKk=kj>k>JR`qt9iK-|n1d>#%%YJmt{)Gkn$**EKCip;_80lO)_k%QZX z{9H@=?M%td`6xo+NjgPg{c5rccN`%A(fwqgj6Zhar&gNcpwaRHECHvdX`=wJq9`UZ zEVX;-3Cx|riSxYjAbWpS0vnp^&>CUbrtc&8JZo_T17=Gh9!4U}W&tx^+S?kH3SWll z^VP}N$M>AF8AE@H*viKN+DsH;X7(Y2y0~~4Ma&T&Cy2J^95EoUP8x&y(PJD7N(N>c z4g!%j+|I=ucqsY>N5AG0I{i=NepAy5Dam)t1SKX>;Jdkm3R_CRP5zB)TPciLDcQ2t z4ZAPsQ1#i0m2VTj@ts@RG|lU@$$yR?`@-begH!CW^?bbBj)3%^4R4&7CsQa_{|;eF zhrp;y=4V^vL=V-QhuAChUF}2h&a|?9lDDa?bta`PMp|49N%u>9w#VRbqMYRBK)w(H zlivFP(jST~%v6hck3A$hhvr|gEp58Aa!bJRV8P*BywHK4qw6PmSaQi&>-g{!L4x7s zU5(N;H>}HgeL6$KOF|6M5XzYbBevFDk)?f#bdPkD4AK|7oDn$m_0ExAt#!^jE7UH& zS^nEvd59kF1#Vxbfr3SCMZ#*!Le2$K@730oUY8j|W<;M93N?BC>YzOnNWzlO5kJqr zsJNRGz}7TiNI>RtwENlQixli1*&O3u=wm^HpxuHm&pW}1TQnBC;pM+U-%Ao2Q2?kw zmBlhUIIjWkA%s*;B9L%k$Eue6sewdazU7~o><-MWb{TNOh$hRFwJG6w~4 z!}wGu*3prK{ROZ+2WI||J`QyqteG88Jp`tJ_faHQI|?5zW|f=L0uGR^b)4OkZfNCj zI=pM=L2V{c)nO`#nC%*U=#N&6Yam=srCG7g>Rm+VK?)PL)Lpy-mC&^kpobnVeJS2w z0eGk+Ds1v}4GaS%L)w~@j@(iHTs=I{(NL^oSi*Jaxg8j^Zl4!}7=aI5!7}fFF3 zWsnZas=9_#-rzmJw4e~w^&vbV(A`=J+Z;%k4$)nv&L~2o9hI_Jx?f`nf_V;%0%$g9gFzc&&0`?cot9Ce^+1|llBw@@_lSQ?_zsC}=W4L>5 z)Bch?aj>*6$PU&DWQJiIX72Tb$nW@zNGOz`_Ry4TtZu%_N|HrUH(WjoUru(Fe zyTYY6LT63K*-#B=PE4zt(V$yBpA~R^Dq-V4_9Ghe0Cqyb{~b9&kL#`8n!@kOADH7= z)Q!MC6ZIpqa^m-TM4u3Het3gqCR1TZNGtV2vkxTg)P=oFkoavsl(QZL@I3*Q9i^7& z#zNr&9v@B7Lif=s;e(dpWkAq4<@j9iONj27c-v5-gNf!l3g$a%290hT3yZgk5N{OR zg>}5-$ou|1$*EbRpi_^;-K|NUer|e=Lxe^ae+Xmy>&ZaJL2oD0dLAzPCS%D!!1T3f z|HN?EzG*0cUEP<^PcSUVy9-e%`c#!4p$!5EB@5xU9&7%PTCSP+ADC=VHLiAnA%9z? z97NAhMG&!%HuQOJd;Vz`C4We4J_GG3J>E;pj*&g$G}Q_mXydb<0on z2y49c?SqFk&mVOMQC7#rNH*3Nlhh-^Bf}!b`@Fz|;jHTqR=-PI!Ep~@0=3ny2(go{PdJj9sb*RrbM zYZK(fp(0^yR~Aoi{Ce>d8$QLvNdgx(tkP<`^5jD25xI|Q)j}^#YZcG`!_-^GHTl2q z!<2%85(=n*q#!v21nH1YrF*0_6A(rZM5P-fCFFCdKzQyTv{r||Q&QaxIsYoaQavq7gYD;484HQ1VG;a{ARY#wv%tB|7uB=E&)(`7o5YR&9g}=4l58{%!B$p+ z#J-Ty8|LA_l>_SP1e19tGh{1#9<6aMdou=J9@3fwTzn{5Jn1bk zAvym2j>12zlLP-Iw(Q`|Pidu>nxpG8Uaq5yVJTw{!~^X z`eZ14a>6h-p{>~7kH7R2Xe4P!uYD_h$N61g+p8B4COoa+4p|Bxam;8dYQOY*Dc97= z^E9|sPIo&tL+iXizAL+X{_Eu3J$AE?)WD%6AxOFUcm{U1`KCsy0CYFJfzr=gzHsLq z$qc16dCyIaXo-Vvk!0~T93(!u|B#Qj8_!RLChi37bme#?0a(OMZeBNBt~hm8uk-DY zB4POu-28#dY(;xRo&v^#F~+cU!XvYupYFgaM!>WRuWLyoNGqkLZq zCbv{xqqt`Jmi+3s`1kx*CUIxEeA}61fU&H@43BCxqU+mw=ROTj9Y^jqRJgFI5s6ib z#VW?rwfGRf=pxRPUS(4)#{V>p?J=}j6}&N_{N_;e6I^H!O*lVQ?Ttxc?FFhIL=NSD zpV%s&*iO{T@YVETm3=}ULWB*LWyyTVy>%PzYNIlzUGAj6r)VRc&kxu&SP=1srEg$C zvj3IMNn?yee#x2omTNUt<({v!qeKYE4)1?XrkYe*7A-oQT;%#XK)Tyu-1&k;?)g}@ zYPta5YjDCgX~n(FgbJ~~mwOU!NXDDEBjzpOw0mLV^{hYxc94DG_#+<6uuvPFZ)1X{ zdJpAaSH1ZPiZfSWa35V9o;uu$hCu$^ z=$jo)@xqI|nDV(WS+a4Rqjy=k(scKQS(oSB{?@>UI&ps19eypZC;M9>8aOn-*&Y0H?pmp^6|T(?(1G4GmcaCSG2G-k)>fQ;&GCn3SsD`g z6)hs%u!rYVLe zLwrjoARZ)}(PMy;>|MtgyLx^;G(Wo%!Cg@( zQ8ElmiX_M61kdiun=Ez%^^mS_h6a-^%#2qQCsiPO;?a)p^w&ZEUf&22Elt(zP+X$! zZ9!D#?CIFMAc2zBba5X+15;B$icF0f)#w^K$56c%OYK(8@`W{2PH~>ytN88Q=IC#b zPkM8oSWcOkc&Ug8il4KXXG*N;Z(e4pZVpIe0dtWwNa+=%$Z}Lc1`3=$a;?FoGr#Zr zEX0K28k^%1n4SAzuK$_Lb(DcBbMoEMhW)dL5F@MG8GE%9(WOJsQPPXQ*YW%V>BF~m zwa-6$^)+dpUE$N!a`b<#OcP+AE{!Z>lI}|@Q{P>N4~XJxIe!%QN{Uz7;XWtx+&2{3 z?l#6I6o!;eQt@#I?^mJ+NHY@!CpA3``nf;Fb=uVISzyvhfnKk+h^f^6ZA2&$EpgQ> z@dY8l4B)`?6NNO5ZU(@(F-GjHpLt+^->|x=sra$h`}8o)>fZrrvRJWNcZPFcaO2}% z)`)AG&M7d*fO?PMscU+i)S38rG{+5Ylcxj^L742WsCmETi+>fb*!!Ahn^J9^IW#Nk z*KJdMu{UxulD~9`=GQw;+-1(3v;-dV>f2arW~WTtlyEvQTu+uP2R4h_BPmT?gLxGX z(Ts>z4W6*Sk{Gjr`)eYsb|yIjleMu<>?5OjcJIHfY-z{>A+J}$2PPw3$#>y-=gkdA zlpC7TOqIKiydBq!t|n@qJt=*Z=BYzLTqSAYZjlq~ge#bn;V6Cip?_A*g8UhK)vO94 zNM_$n#56;{`$w9KA`+i8ttu$*idU!fE!}jUVW~1D^c96mW=agBgidwU6B`K~-w;jW z=ofcUNKM@ruN2$aP>P6i{CkYOo>4?3__$b&fj1&4yS2~m^Km2?-Fr+S6_2MLO7JeQ6m8q zf~2Eo1^Xd92>1dM9tLB3C%^W_gWp^^J7|lyE^;+Zh{~_}-*^>_IPCR`S7)$08 zJ6U*d39xr1JB~x^;l;4z=2qhoqx+u1i}^anFZMD*sr}QgrswvGl`2YmKm_bSN1BIv z!9Wwj#w)Z$NfTr=^=4H3a_NTW5lj9?=r_JE3vYt>sFhMi zm65YY({Xi&xuda=Gq|Hhw?DSm40=x`jZBz&j1?KwNOEjdUKqtaJZd0%4spF|Q8mGSf ztKv=Sgr{GD0KuU|T(bwg3Qe7Q?OiDy6`?jTD$iOLxGtE7UQ&2M{)_;xg{9FxJaBXJ z6uew4oyYgwW%E@)K{e^~GkbLW$FI3td@+(14>my`N|stTBJ|~DAhpUbq-+;F&;e26 z$n~%(bRNx$kzA_3R;(%7ogC$}5S`K9%|N1w4%QfDX_#qII;;y$nIg^<%Y7Tv>@M7| zY-k@cc3f1szB7KXG2W9E25|XNJikcY+bqXgyhE8i2TxIK;`=DBlo~X`bV>0&s~!OJ z=aSlcNIv|B{-dWI-BNtTR!*L9_~6cZYXuCs^j-)%!kqG-1tBBnCHNr&zr@x50MDE` ztq~c~S3b3QO(fMSO!e&@y=jQVChasjM*B?PgtSo#Nw`* zVSS$lWc#sI^uYaqnB)bTp$=4OvnzBKMEH1)Ug@{J0|NrbemEBfh<-iAY3MCD(<9wy zIy>i;@5feGxV1)=cTVtNmYD=l7j)4a(psOWLOsMkV8P67f*P@bRo4Tb=NkRDA2@-5 z6h3VfUPw$))SXP99Nl;X8Lpz3&yt(jhea?2CZ#-$)PVFp^v~z5B2htZADaO}4WP(z z*L@P#_L%h~hHLCp|QjdY%o6l8yuQ` z+}TO96esD*TGIur(-l9@;iz!WuK4f4s*%+Tnp!_{)qTGSHFV8ivnLMX-w@(FTg;ga zvfBoG8G#t{WG%P+P42h_*qESKox#MybWzd^s6>5<7 zk@58=G2l0?3O42R&&?PkB8iv_7x0%Yz6*;&z7(N;)A4~U;LGS9{va(T-cX}}#~od; z-_C+UBu`L(ucQR>+jP=pzLRiAjoNv?d57cDNB!du{`P^2B!d#?oK4i`dqf+`UwaL# z-vjGn9#i^i#B#aZ#XzBr06z^;n8cc6!txy??;G`>Fw6qpaqjEv%rX@Gr_lnR`#|6u zyY_$0NXL$BXzG#HT#e7S29H@XJ^X36kL1OhvcI2};7H&FP2J9j9NZ|n`b#BG?-c3P zwp8{Xx32i1AK`xa+vGt_;WFzPaB2Hx%ZFEfMF}X*0HS8O`0R(0ma5 zmi#o4m9K>KI0u%8o9~NmN~H_Ze`@ec-`shzGf=zW2ce8Q3H-GO{oKaS!j2_j_KN@=d4N7YFe8ZPiDz<3+l7DZ{yAeUX_;|Q zcLp!RU}0j{*d?{P4tk*^ zZIOvyNf2Z&<%e90!0A*TaHDA3=d%(D84EeMpjROgJ|g-snm)6!n%q#e=K_!-y*?;P z&V5OR4-RtNNu>w`w&xz<=;D%`CauKVtLQw1Rp(X0sa{~6$C!g#@~2&MoedlHs@gr#i% z?jGnLvV0)(p`pGZQmk1RrWkQ4GQ*ixL#|EqNkEOD!^*>B<}ugu4c1jGWplqw!E@Oe zy6?J191Lq?y*lIZeTlJt_IZui(1wh$n9bahs$cx_N&QNVbU<6ILTZSV0s*4vxCGgI zb72?14c0pU4iDb>%^Wb!$HZ$+Bv2=q09x>i*>pRKCyt`TOJH=2OeV2)P|aJP&3A=p zP@H{C{_&7cG@g~s=GBMa?Q<&$dvWQLFOf*@zg)`=AKF???OLx;%gUkN;$^WOW*E4P zE9O+IPV%*N-3tN}?i{7nk8MdhF{_K~9|m*Ee;jYmPWGJUt!$E!a0|?^3_U8ut4`cKdsBL1d*@81tkXEDu|>Mv%$7K}vCfWdb7 zc2;Xb#;PW?c>B@P*5;ZUfmWl#!>`=haiXyEzW6nO!PyULh4qatuqw&<_aR7-|DOh> zBQT*5ci<1yi{f>gt!IZ=5_403`=UK5l-d_fsR_cz;yM;x~L@p=1N zVZQG7-ar2G!X-<_<$hkJajow`708S+DI8+B$t<2v@Ear`L6;|E(Em=h*jq!%Az!?i zp}-%MUqFrPRcOR?=^t(g^$!>QAlt{=l3yz4F3w~3zNN>}27Lx@yXrnOKO@J;W8>lf z1cVyq0_Eug>0=5ZMehMir@Yu|fzrE}k)7ea$-;QIoza%^xxd-LObac>8Samh6jABk zSI+E^XJq|_!jZED^`Hsg!g?6frIYQ6PSS%$5s0sRs$RwW^{PHVrXh8hC`3*S#l?R; z%z|dZ1n%~U;1=3?%VmXxyIdL~S|vk1{7NEy6T-^$L7RX9fu%)%3<@5#Y;YHRjpmNs zSaf*ti++tLSYrHztx~*~(jF-vQqTctveG|-?Mawl1C zwoW#OjO3KL!%f_E6KS_JR;jP4iPz?EwjoOeROo>VqLWUgGVS#GAItUF3xx~3*em$R$d}NdZlI;NQ``-7`wiC)w*3Z@;>F#_$Rm=KIX; zUJWVQ%?al9X*2ZVAN>#4o-6`Cu#@-r?1>J*4Y@!jN8#RW+=7F9>&9N6PB9vio@$uy zK?;vjgrlhcgK)D}^4+Ty$~QjB^S7_)Bn4LHkJCg$to4)A9U9hsY@mp(wbZ2dUsY@p zYaB^ezC3KFTO;Y77~V^wvx?u{6V?cIIX_QdkO<#4H{KK1jRDO+@5QBZwnB7niW3k{ z7n;vU3^wK3+f?mSr6P(cC%-{)pF>bGI6AXZXH6Np_yfVK`~Z3-Gwk8yFvZNS25tsd z?J^}GSLC@3X1;#O|=AX-~K-3i2Vii4JYsNG-1_rm_a4mY@MORcHs9fhwFX=^xS!g4lgDkS|$-a)p;j| zOW2WkwSL!INdRX$)}!5jd2?(4cn^0&iphv80txwpiJ&5Pu+01LVJFz=Zw8rgxH0dJFf|jI+6W2GTqY^al4~F^3@~XsdU#K&wb-+ScO+Ua?`juC66>x@>lSCt+jVC zv1r%#3c8M{RX+FfXdd25M@DY`KgR8dn_NA~Ircb)iAaxNg}__M&w3I~DQ<>vCA=Tk>pStnjxBsS-Z4_BBF zEpOb`(rhxng*e8*MWNS?=WnPkU({(6iO21?;_7MF1bHKzS9X(51$$lBMq)ukPALK<7TeX%P`;yv8+|NcB=QlDejFzvU8<-M;a@q-jTww==T|$pb1*7Q*A1P}1pAISr zl8qs1(%5=8T|B~1#=UaB@#)TaP{0Zd*4E%SjO4qYJMJ%~G35xv_sCBE{ay@FMJQg8*|I|+cnEsM?V?7f0Qf9FRFE$ zKA(5-1R&XVGJIT>`m`cycoIa zgdDW*xjO{nm*w}lrJ{sZ}t0LG3bZ;=d>o#~d?QM^wElapV3*Lfu*a~hd#gIN4(D_V8udf|#NA1>xIW|)@ypJE z+~*@rfP5&+OB=eSuXkq0BWj>#Cn4u7X-%ha5R(N?QUHqHdjvl`!(0pgrc787THBW# ztH%mt+T`_SAK&kOsYy2A_tCJCQ(eyU+64wVFXe>~}}>A$8M zw}Sj>LFt(}aq?G1XX$Y(%1uU1hv~8minohWM5-u5>S+g_S8HxMp&>;952>k0k?5Gmvb7H1r_n3qQ zHdS*erpj6MK0Yu=a3~!umNN9*OrSRs+NnSRr$hEb&d!pHeL z)AQYf8ao6e%`pwN2oO(SnTLVD{Nv*O+eLMv-Rbh!IeFKDN_GnaS4dli?`%Q)j@_^} z;x19bHr3Snu1fuZdMX`3wD|O!>q--b{Gyci_;hb-Ra#R5?PUs+l~xAGz&1&%Gv}qO z|Eu$7cEt)$y6_3E8acZ+0+?%UF3r+E1#*)^{eT~8Sc4X#lP}y_KRN|U?OnY;Oc^S{ z%^%}CGWC(1$N1 z5{6|4HR5pyN8gLpgfNsnz@i<23YDmA+|#qCgGc9;yt=G>sug}2>@UX;1@(V{N|`H6 zuG8pl!QaoRvhRcY-lnuj?J`Df9=?0Dr?S}hI4ir0_XbHuUd+nzJM!`P zgOcOy-}372@m?P@m~X2)Dv`1c9L7GSM{LK}W_MR}%jS#k4Z-wcHPsShLx*Y{I*Z#SeDV4FixIie}YxU}_vCOA_UJ5?JZH+MI+`X_09_J!$MdDS!zFjcyp zF%+XS&a9WvE4txaJ?gb?jM8QE)KL-^N^yreY_RMXh1&HQQCCHSv|U@Zlw)u6AG!?J zxwIi$MqV-&NpXCWLpTTO+$~;C`Q9qe{lU;xhr=}NfSL=ak1wJd*5>(Ud0!~w8P9*d zqAY<2^Qr_pe$3o)RQ(~3$`Mv*-3AqPjB5Sz4`QR5JLg#72~le%WT+R%A8#C4 z!^A@F{vA&x$)7ZtjUJaYP$unLbxkE<#qjEk^N#Tkl;{z*(|K*}LA_L=7*6)^ke-{u zLpb>%Rc#C+;d$rZKQ_QK??ggm{;(?%v7Y9qQGfrC>|_(VH8`67k4%!A0roSyAr;l=q=SqWxK`gs)$D zM1PCPIRfhhoDI-JMi(c99xL-V{~x$^tdV{0_J2l!=D8-DHD^3Ue%C=vt4LYjrDBKX zuq9%4o^qAI!GC!4Tc+*6lXQw!?@o5!<+GJam=Oh*lWT&Y$b@tDXx|8M-&2`Y4IZ91 z%#DBY8)}G;gOKFy4ca2te06@5Tx6JlbWu*(fGly|lBV-Bls(>PV zl$yP#x5tG_jFhZTHR7z!ooDqdgq{}o;kG$9Uf7SKqwu@XbaA8DkG?&5aeEwc-mQ8Kg5C{$hwU;B@4ouKOM{Z?2x;4%y8}G*F$5ff zyA)6%g?9`sI*8dGb%r-AZ!tZF`&LF+mS6p0vsY$7HoMkLLL0sU=3PCs>gj73J{Pw{{o^$X?OW=h!#3$yePr%8=j z;>;gRKg1$(AG{NW_nZ3|m^}B`G5PLt*HTXC*;nsgW*$oqer9%INw33@N~X^8!E(V@ zKFl%(evfh`w>~n!h2?^|ymy?Hs=hK+)K0W9TL z?#u;pehg68%uIg3xT90Sn&DpYjgBW4sSDd!XMUUY$c znSu44bY*p=%Z_bSm=r^K_eKck6kSb=-Pj+P%Kqtw-K7EK+ zYsfr#A=Q1xx{rx=v^%DRB=UapI?F8AOxP-NH7v@D;i~9}UcS1|jpXOw?BiJCS~j|4 zHk`l(y*pT*wtSiMU?-Magrb1Qj4U}`1DEwi{MXw+qL)4F6;b*Z|A8{E zD}lGytWm*?NA*sv=U}v=)7{3yiyR^~U~VHmyLpOZ(eW+Y{+FM5Khcl3cCrJzX_)Pp zRu$Ww@9~tLf!W{!*=^nR&p*x*cQys$^t&LhTI6|kAOE1?UCyhMm*DZ(Rm%M_n81eEx+w`-3 zgl=3l{Yvs9o4D4)wAatRiuKQdf9mMZu}QlL&9T7pJC7EB)=z^2$AYR`25-Eaf`Ef6Ikl-7=lCMfL>}R#ofpuZn zbISNol=BMH#Rdnhee!WY_a#^>{^_50m{OsIIh2W~G zqe_Ul9T&h}z~;9-(nss3hpMquvP!o1Le~i!L`0%i) zR)(v;^O@X9x>OSv^uA~Kp8-WIm%aQz#M^`r=ywm2*afV{R}@ zCYE*GA_MTI z!n*bL=OrafOs}Fh5biCjkwX8=a5<9g9^aD;fLA)&jD`$jLVns{evQC5sw;Ue-Xsgm zTP6BAV`0MG()dKXSwy6J(F?2XN&YxY1js(wg z_SGf!ZdJ-;Ro}fy2fQqh3PNxORH#_rIbfYMW~`G&dDodW8FDH|z)FrAzpWBSkC4mk z<|APmErMfHb04iCWFfupyyX~-py^Z4TO;}1>t8|~G)k9Yx-Bq~m)P5N{on1f_Vies zhC5U)7guOIL?V&t$|=tIc8Dgo`A$I3;Q>ni&Hae~B3@<%GkA!fC?2xDrZBJMZgxWc z%q1PFW(6r&9_>Gxv{J!qhG74zyA%$!wzBK{#)M}X5ukJ~KA@0Nx$}i1lDnhu`U?Jl zbRe4eM9rH2nSXZb;;fxt+*#S7*gE!+zCK*5^nm=rYrc2kf5|JI1Ct;d^M0+8bfn#$ zl^$w3PUBf0{hBLe>gaBC{_IAh{WD|R5{UMV@qf`JmTydoXQ=@{|E-t;fnp=@k1g_!0`OLBD z0CeLYw_=HIo}_X)T$#@E-*A|K!k#vl~rG$d4x8eN-4W1FnYTVu3>- z`u2OfmSTL1UEHnBvDd*3{-v5kR#67(4dq&Pq)*43%DI91(sMtk$n8#E~ ztjJM4>aYm@FGjDG^1mo@={?zq#5o@Z+pAx`nCK-}vmwCyvm;hM;j1-28_xK5IGO{U zzNlPFiKpWPMD9zf3}XG4T5a`e`L1#gKyjNhD_%}xz=~OEv8DzO)TIzLT&|4qK}8uX z&MKXsLNnEN?j{@kOkl5j1O8_%%E(@mRE_3x*xmX$Om7lS-(CNbFs7&45y`|JX`RR^ zgySo;Y$HeHL?c=R^K0b_r!>yW{UemvyIvXjQJ||J<#1RKk~n9Uh;G+M);_tUXm7Px|Oty zVocT%?&ystCjT93M;_A$&-UzSU~_f6Z{@>5U2pnHU2l-&$e^Z#v$FMF={fec32$v} zx@@x*EYssH6ZtjFts`ugW9FUc^R7t}q)>(9-=wp%>Va2D7XrGjq}D69>7%TXqLpmt zARkEFNTyPG7AH*yI*fPmyboE1qYgbQsHPZzgiM(Oqu`qrk>>r!W8Ok zGI0Yg=3Ckv*ckkvio|vusO*Z$g)F##_!BiTuTCT^8X|7AH!XYi$M40?_WLt~FVP4Y zqfp`#cMw3%%>bQwYdE3bR(vhKWpz6a-gV3W!TW>N@5E`~Z@6Sk!b{gd+xfw|yfaZ~ zPH=rQXM+oFo5|-3-x`DA_8ZjUzHa%7XYr2I;Y%z$9ENoNlU8P6`k+Wq>$3PI`H5X~ z5yc%}aNczxmdSx-sY-FRBf}cs-*FBiaC1WjzY+}%{pDZLrB_V90@N47qir-QqN~-t zW2DJY0l44la;~o^4W79S6`S`p&EURjFbxziqIet;>#K25D3>y7CLj5J>&G0xb}L5l z$i(OMMWv!ky~hw`)klr$bf@@*Xq{vms<`Bxc1d>0bLBW4!FW`@r1Bs&RIL;SeWj$4 zu2MZs(^8$v4d_ig1v6IPMYan!z#2_3lb6aHJ_03su&?Ogy-kifG^FJ4z@NhzIQt;o zmij+v4*T9QMUM8p+zV=`K;I?eCt@xSH!15UCdD}qMNi*Lbi`C9Za4hKp$UG5;l{#_ zbwxtjPuWZzMDE~i%<1t{aROJP%W;X|_IQ{-JfgA6qBS#@zCqz2im7CeHgv_1r1sas z?Ni0`$g$GD*z!yPe&7$P-btZigSm)ucwUsGI;*$~MAIJuu>0o9TKh4?bZ7G71Sv`BGk3%`4+#U~pGnpB>IC~jvMDo9a4eK*pcj{bR z+*n`lk9V1p{;vE(JSBk3E+!B9B<)KKs$*mWq%EK9rEe9@tmH5db#_7+x1C#k*Q$8e z^l{75aPqkzR%VHFfreJFF*oe-c^M=4qhId#7n%-_e3Jz-35BqUO1aqWTr69inF6KT zrZJ?0Pm#tSx!{pg@cBmGZLdrDW`5f>t{kR55l^bz)(d`Bt1KCZa&&5_&4>{C35ZsB z9!1|%A*?@Na(B>^zkrF9NBEhD(`~NSSE3`ZA85Mr^nEYky|APIi~l|l5HM98YlgE; zCS*+Sykij--qS%y7NC#GV?9-p%-&ah`XJpmw8+GbP3=0wtpk(7&h8aEL*IwWj|eer z;%5glJUq92n^)-+3Fl4pn|A$`O0R=3(s{oDQa*RbcE_&$*q6BUTDqJYv;*nM?_Pe2 z;y|{o>Bs^v1uZglux*d>@jUPLeD~JCERhGm353sG!*I5Zgr7Gmn?>ABn&8e+(|gEG zY2%1SY42uIX=7#xwUq05=f>0Sdgb&q88qXI&^nO}tAc#XyuQRb(!$P31 z@2v`^m%K~ve$-KvpIverq38J{#piaKBx&5+|2C3ysLfre(9xC=7Lqb_pciDx}fCYQOO@3WDhVB zlyA4x4=H?B`%6R()0}G^iV6zp1us!3y<4w1Zj*@)eQ|auMl^n+iS4qQ{nh-Sdtn^F z&KCoas60@PQ%cFK7P;*jWf^#B0kPhv9$PH3g507GmD^VOC6>VaqaYwszj+!g_Qvf0 z{IjPIu?jMT`ss1o=Ybd)wp&oQ=2%;DcO&ja_28`=zG_KfQNp%pe#L0u;H?vM@b&@u zL*04FWi6I_=h`eXuwr|LYiVnG@b)^^xmCQ(wPR$krQnvgBdiZxb$j_!K+;x^Yj>Dt zR>^i+uGO9~#;KAuvOMwUcc^{HT+$C!xWTkU>g2G zv63LSeJ9+uNKqy4JLb4C6*=H0)MckGkHrGmex<2-*L%GG$Kou8f3h_oV})G^2-Wg) zubJ?alL=^t_3qo;OuE|LvcWLF%JH9OMeh9HLkl7L?V>HvC9`@ve*xrhj>=r=uO`-< zzhgY*sh{*Qh=(XNgJUQB6x|}Bi#!c; z)kri$fVhnfcxQKG3w@9=pKb!j;}=&LJ@u11{(Et8fLtlG@kT8|VQ9?C^`E~=GA4&X z5*scek6 zy|+X1ZjVb+csHs7sbA1>#^F4Okt!t1`VAV3HMKWL8k>U5-UA=_XnN_Ni32w!@gBKo z1vRe;;m1xyZYhQi-TM4q2flWhCv{S@-F(O4q#~C%@*Y$#Jd+s33`cONhx4GH8-q$! zyj@Hsn17Gvm&{yzFS{Ppkb^YI-D~5U$?~inOHwJXX-JiXwky8pM$`d*>SI!0xvV~+ zSi~vhTk_L=OAqr62Ef&vCqNU1f~iEksvQ{rE(!hfpt4f??|Q^-b>4;j13P}%pgRId z_up5efOIM;(!B#yG5+;3>|_(l>s@OCh0wi&ZOE^y6avKn0>#xAcux_t48?a38z+iE z>)?ms&2V~3!XwmAdTR&-g-+2x&6nvgDWKM>LkR=+EZz+NMm-p?!sx!|?pFCijL4we(>u>3!lN zm#mrpWAwV9duRk~Iou2k4QxUW_4w~C{!)M#Hov@OInk}O)n017##-v+hR@7d%gh@)#^-+qI0ZjV_#i3!Oir06XLTYXDF3Z5 zYx2Q|IiWvnI6P=T7ESX_i;|^ak)-g*nX>qWU1Wx`OzTl!fNJw81}zk~^sN_dHr*6*sB9y9vcjn-uLtGtl}gwot7Kg@ zjfcGAfV%*{eJ7B4qW{;TQdAp!<4M`MvVVx2oZed&-6@CuxVIuN)yhbOytKG1Bm0wc zzOzi~|Kb7&Vr7WQpr-|4OkLJ~fXbH-!*4A(M1eO4YJq$zsrSduD+-n~ecw4BcL@jV z9Sq)ZedhnS9EQLJimcz2+@mQ+kHClSog2u9;dy7Uu4Um7DAUpfcjI28Sm@@eQW z0a81867Zn=)~aDz*wfT8M<*N@SnFJXHL<675d5+Hy1ifFMBLADm+<$!tat@t+C0|d z975u&oSufC!HTwD0nWZ?@=$uu`_4#dKhQ;)CpGX%d^<-qxzM49WP}$&@fY5KpD#>H zA0pRUdK?Pgq6_`g`4Wb1ylZ#fXh(yk+vG%>uV@abq(FQ&rsCph8Vr8RUE$HF`^UB@ zkvCANp?7=p_q_vWoN!P)){@{n;F1sM^nb&r*4SRTh`QIDKa@1lTXv3@gu&hYYspJ# zp=q`8aKX4OV95XRM+Er&(kfq7n{u&^?svcO%Y`1dy3b(c@hU3(lWQI{#|7irbc#k2 zM*aHf=d??vEDMyk+n)Glc;9S!j>YAL()tnPbyXzV7wl!(gOT#0nwSiIh*l!$ ze`<`Fr8Guxwoy4*Avv8@?r{|`Uxn-Pg!w+|oK>3frM!;fdDb8wq|Nj0sQncX^zAox zqqODCs;)14+I}fBZLpES)uDOfLk#=KuCv>EN$M5DCY|QDcz>uRLg$Mjgt2?@9_A>>_H&{zS=!N}>oQ zmh0UM>_EQVK1Z8_O`b$zI1KR+8tXhmJTEY|2!_|m&e^WW3Sdrr+|x=X#&A=Q_NMVJRg}b-0gx>go{(T;MLg7{ zcYU)se`$M!s(ER(@nBa3Ug_7NUgC@kX@1a~i@S^M(+N1Fur#nLCfBjX^N}~R3SDHglG%A()6y!t65f* z<<)~J9z9jM2KdL)xQ~MuBK;5Vviu}{lWI~~H3c~-ZOcsj3d!6JG z*w0C#;&=Ht64tuQvVmuJ8{1W#8)6pxIqLdpFjckU28GHK{@BdZ70}nMzP!z!!@B!* z^`NG`am+r~sD#w0gi7gyyCHX?SK{I7D5@ag!mF-uj^p{c|xV8C#TRO zTiRf}H@{1@r07PAjkNCxNrDAUGLiIkE7$GgZeKva^aTB~dHbb|bO?l3Ua>ycHVUBQ zB_=OX{E=Vm&Vlb+O?$dDs4{NUH=o6Gu`|c7+aeE!I+BWxUnMF*Smrw*S(|8_Gv@N~ z9l}mCoZuqtHeaII>VlWpP3`RLGRD{|EtMS0ofKpXRMBOm?)H!}P=GYJ(~B&(Xq1)C z6v3KF9jj>x2o68qBAwssQlo+ah?hEXN6EQD`Ef=)%5#tT#Mh$BWs(HuDVvAEVlDfI zL8TT~x?qRNrJe@Bwd8-6%z_UEH{YDh%HHfMf3H<@eq-A=|72ZGj=X|r4_i1&suP=! z4Xl5L09PT*y~;wlH#VFRsrhxew4Fe+IbYsX!4rlJOh)A+B<%Rj+Wqv)}DK^}`9;tQxyVYI%wndKHvhP2H8jHU4wc zaoek^VnNxLDa7vM7=NTc=|fZH=n?+IT>7Tk*WY`U(3;?~t+-SZgXp=pJDnKOH9E*+ z)bOn`n(n9b164+vRlO+&huO>`GrUi}!lih0NqxckeS0rztmOW#go;S;@>(u;}+8BYI77GtSh^C;8*ZQcnb!B5+MIN8$9 zn$Unv#TLuxa?kR^N9R;eX3Vcy1dJlMo9|~oWXKNZ`d~D#oskuHvqrnY+JQo-35vDZ zuVxuA3;oSjv%Nv&acDt0?NBEZE2U9~?{(W#j6W3x+%{UA3|Zh$NhX|8bQL5DOA;ih z$FZez1`RL-r{{Q57(P!u_CxtSP6l+7ROi^IM_GaY(X4m#xe*aw)b?Miy4x8?w#}Ie=2?uc` zu^*VR#@Kh4G$~YOauLU`Ec!h8dPg=cb8$I$kN%VKA7bN6j+m5_*yR%oW#Sn{dl=7P zY@m(6JRQfGrt&$8KDj$)Z#oo`8o|Wv_%_J1X1b5x$$>cS?3w6pYxD)^OXTNbjE;t= zMj=L|t;*+?W0}wTkLSiEiwkwTQy&Cu!tnP#;x|Lv)5hr~7~SP4uv8wS17j?Ac@RmUdLE6Kh9-e!ffpxtXu7XCwcCf9XJr-#jx{ z(t+a*8)911k|k9oq5LI^*x#hGgGAvD%~m+k3=M~*gB$T^XHN$?*35g0L-7JgH!pOh}(yP=p>t0@K}ZM3uIQJl?<<2?CE8vCkD|U zzEs;}`*m@?ZY1{tjzbiURk^=@!spPI`fKBTf9hUY9I+d*RlKxVRdwUYk%htJ+nomC z-#arDw3W}KQuX$SUTcZ^Gr4UMKrRqpxd*Al&rF}%ES`o86KUeV29!*Xn-NNt;hzcw6q4glC>>>(*hmhgUecuy;B~)Eswh2pDC*!Gj3t%ao}VI8qRn-kF{g$r?84;>73?tR|McWt2P~`I|Lr_lUqFjUkB`; zP&w1|`8hQ!==g@8c+G2-`}VHBubs^FROYU(TUYIj`I7FKb9MgqvFv1zjzuHWO-}dc zS4@7^ODxw!nr%R3;TFax@4o)y{*=_NRUlyXum;Itq@1v_^kJ8+PWzrpE{JDvptkNk zPbm4)uEOAh=YE2gP?U*v7_6L|?u)KoD{M8b>%P&37-R*QVrL z-vOEi-Z{Op;09FW>wdr&NemV?WI|sMwOjWHf?|^T#&f9@S)asdh6DhLZ+{4a3$8fdCP0oZOY`2 z3+e0f{cu`;$IYbFS3zyn0hNwV&exisjaH_@xi^t)G^Pk*V;$Pc9&s6*W^?tcDAuSZ(Mu*`)9HFYq@D_-pP=2OjEfV^v?oqL(AhO zT>JaAq!fBxPZ41tk}*rF_lqmO;6P~7R7&2vv|#z6yQB}C1h4DtI9|l+T(}t9_Kmj= z!zu#0CXtB?>dy`w8~I>*z#bR{xRn^p0Mv5|6_x;u)I!2lqE7Vz(KfSo2C2wFiDleIDE2eyXM85YyoKYK~m$q&nFp}`1RT5{>oe8pR8ZU z8Qg!REWXdPUsO=LV9)FLwr@B4+PdNV&iis`a~)c)jE8;Wd6nzqFUMv_2DtN<8JUs} z>w$-qO(p&D5D6_10P~J>D)|dip(b=~(;z?dCXk0g4*ZEcxhvB)Zac9{{TuMl;bM2H z-kgH*_LqZvjue6=joddbcT}E&vwz%EQD{8*aqrAyp!99$!UJ=%vkabKQW{fh-ylEG0dr_5K!G7s0m@YWXLX>C`D(|K5u(6JGzMi}(t$P#kgtSiKwqVG`} z&{hK#Rm?Vx8M`&0g54wfx@^C`cAEacHTBgztT2s+*G2#QDYi~LB48e;Ba?hWDy_Lg zQKdY0qAAbYk9~f>#B8g4te&xt+T_Wh3iN=^d@lrj%Q|O%AXNS`%<^dp-G(uox#_l)sZa9F-h_87G&2i|-wW%0ISv%YMX z1MzCJx8pGD^|JxA9=1sg&R1{93<`>wZe1U%5Iz!|)n?axa(-x60P1h}V)s3+rjPTa z?}sP-A8*Y6q$}TYDOI&i+mST5mubfq{uy31CDCGw*abl3=;w# zM-vY#B~kUCzds+rRRL|r0>2YB<`xmP6nZpNX&EWy&d;j-iii>qr$;l@IGQID>vMl& zg<2ZR`>O*jCQj@ZST{|e@MmzxS(ED{>!&}N;LKjQ`6qsyK%S8ZM+O^^|6q5 z{kY>mbB>UkZ7P3Y^&I}|WB)d3%B3)04KdW&9e%=HX5M==IyuLHc|fYSfA9WY_#f|0 zpnpc1ToKYa>tM&4a`_?9t*14N=I6$lC%H39D;^w8LiSG}aX@|ITE5$TH$3x=aPU{Q z`q8Gy!*zwCv0vj=mXX3ugYxG&Na??}-0E=QC>*Z(dVB2D>$Q8ccRzLPE8bDx zS1jElk~#nfw7whLb;w!JTXgkrdR{K9W_mERF*7z4Lm{d5^CX_z;wTXEE}&MJ>tA9p z@r~OScr9n`Gb;Ld`JC;^Q*OQ`6UY+y;^PO10YD|yyr_%kf#ho@^?{fbKgsUj9dXpp z;?Aiqc&2`F(T#zY3Fj=-CU3+~3=N^!B2us&E;To^oV&T`fo}DAaa!=#&DPZX5@$HT%u%>7PTF0E$oLto3a6k~)O|wB$YXyf_B%WqsGdLm|sTxx-V% z7F?o5J+ITw_CvS)5Ted)T{TlvUs5puT9$i6IDp1{?%YHy6jkA~F8OH(t|95HKwC+$ zIf}~7?(c~1I+Bxxy9-}cZ8x*s77rgL%CZdyzK!`fDN@^L;v zbw%!Alp3gQYuTlj{~Yu%IB1s|&2~z;sCqVRbwmZ}7N^-;KM^2})*68PX*<%sd|)C* z+$%QV>Sj}8YMf`+hT>I{4iI>fnhV@i!2WqskNAFA`_|__vr%lI^R9+D}K zNB!X9s+?`-Oc&GG6Win}+qNX)urFa^dGcxNAD2YY%lFf<7v`(5kLO>c?0)KYl7?G6 z^8Bm1bdLeo9wzL%dol?GMNb_|-M6%kXBZw4d4B8($1`;N5vHZE@tEorO}4YCIOI5Y z0*r+KpmeyE1U^=hFF2IpiEVJRPtfZ`buN2YKnrE!rAyLJcSvcGs>3yLM!o%aH#&BaGZ@H#OKj*E z^Y1DfS;|WTvXD#f5v;YAu9a5uwt!zYHu+u5-~tf&kD!DQ6dH)@g8t!`?JV%zudj92 zaayIr7jZWG5xYgjy(xEElEB>MFb5@e%;HboPudMJ^+}ctSHI?6;dmF{+ zgb91R-dKZgNmNK6?c#EUP@L%}E)(J3$|_%Q#kpIx8jqIM-Cc#c#i=Kd;|ZPEmPu&{ zUuM8D;!$3P>UQ-xVMg;$IbjDGW1 zXIR2Zalr$o@g*ULej2=%nnv^2GB{gg)(o$9GUE83ZF$)=qo1_Qy`{Yf1Ay{Z5k5{y zBt9hLON5%J%NnaGZB8lOFPQRM=Pgz*EiMvE{~GQK3~>R-K$?&*&==Zr^cA{P5;xQ& z=8Rr1z7|gFU|-qE%eAD-&!@MLH@_UP8&Y(}*Ven4DHFC|f&HnH^(B*P-SXsmwH@>u zXA``K8-vQYY%yXouB$QQWPM@Zgm^oL_uyH{S-AOS%YC=OSLvCF?&}kfolv-8ZSuY4oUtRz zby5e6HkMh_Z?p5xuNnVxFpLiDygYx+L*)YVCpuzO@vp*x zu7{fnDo?&E!L_{8_aQLZ^{MMsuKg~weZD_#yWtQyjB7jSP#);kgf0(is;hRRpAPpv z+s8sy`eiI;SqEpKAn_~?mA|;GcTh%G>8)alS3~jt&F5a!AEUHP@5%!m%WJ#n_t_kj`yOAoH^03XV+^h2bo*L17aLRNncp-;+z)(z8yuGK9@FQ%U|Mnk z;Ll3~)XJGDV~utAZcsh8?W?-tOA8%SSD00$P8dbD?w>%dV2&pfm4RVh%W{q?l5$L; zR!mVNm0$!O+CMO)^4>XmdU*fE1Cy~S!tk!iUT(G&you+|w`t}kCDP=gV~~mkcS4NQ znC`59jZj~?Z4a%>7Hx0;Xavi+$X}0)qMr~+14?1GF+)8J!zD>rDu7I!_N9s&&OOVh z>=6e}CPI>6$U{>x8cCg=1-BSsF6p4PD?-J%D2soH-OUWAXy+ECw>W#(1wk(wR>7E1(QtU{Vzc<`B7< zDDR{A)gVtk!eLu!63H9b>5wSy>Rtt^eLhwlrpZL&fQ4rRMd4Y-LSRWJT*nVQ+(7q2 zy7SHL)mJ?d%uyLDS%M?m;n2{4QfiZ3EAF`=&f=p~IZy?7Q_LoY5H{%EZ?EAt?% zPa0Wk{dRACy?Uh`7-x;Hfrjxdl);sbYSal)@C0t#Su96S1v;M$D4%e!QjYMK z&4{a$UX&cQYMxrwWCrDEjW@Rc$>Zmf!6sC_MR7BHzDNm_as8PY!(-MgCI{-u&d=Qy zx{rxWAQ3cx`20FB*$SP{JfJqpih`W|ge4gRJ7jVQ1R5)(+A3((7j>oJIG@#h^RSZigbN9; z^dtp&LY&|Kw7|Xo5Co#clRJZ!-z-X&cdiF%jCt|*CA)vhuIu;XR>d@tp8$(ixITN&te-Y8G6^ki-d-1VUN-rpRv zo%q!J<#-eNHM)4{NZbD3H@|fbC^|CgZnA6()Ks7f6fSMz1(Y1yw}$u}`LPgoz~ITX zSV2bG0fv?=TSq9>uCwOIyl~pnR@0m~?Uu~|!z|f#pLZkZF*9)<5}|X;Yn3oL+4{%1 z?}dPa)jfO8`z3WQ|HXJ&|4GnEG~1Bs(x%c4F3|DIm28rE=4jy}Z2M9iwW7^&?4l^G zV=}eCwF{!2A6wo~#CVc){A=%@qWw~zw2 z`j@yG@PsG~^7=)FLcCLCffN|)UM$7C@wlwhpFq*<33EhBaW~O!zq)(DEdDP5+3SOJ zvF~aXgl&O>%5_=)t^0;yy4qj;Ey8_(W#2_}2D)~mb?BM!ndUSy5&(QIqOJv`sY>jE z9i-N!FKkWde`>Zux1>Oe#kK&J_)?9IHKjFmlpbyBIf&uR;398WwUF40W$kESnzL=OeZ^*zCLvvV%->p`vP{*wsfu} z#{Nm^%>1WXS_jf4s$Z*3n;#9gLxFXiq~0jLuPpaU>2*2N$XelfP$i^M{zpOfL8e&( zv8_;};s(MkMD=wd9pi^BTB|n9l^ds6@Hn*@1bs454p>8L2<5f5V5dq5rCxknIg83Qh8@?(3#>q4{l^s5sA7fGtjBeR9HXff)75|k{Pp_$U25E!pjI@q1|(pjSoCf# zFR*7w@OeNHOV--p#%nKsUeCTjA9J$?g1NZlh>u~wO`pufwWv5nqdV&xCh7<=V zro1t%UXg#M%*CKtFDK*YHxLMy3E%QcA+bH=4dnixVy+IKJvehiUdjpsDj`><;Ps-x z$N;adCpvlI2|s!wEb!WsNJK5bF)_tqgnoEc2=IuBfE4#kOsea3f-NiX<>x z9pt<=SVCvFw)vI%_Gw&V*&Dn}m#n{Y?Y37%X%SAyrmc&2;6Vna(&Qf2=sW!OI}j^Z!3Zyo&%Ql zO*SW&MegZ3M4&g8>OX203d&|+)5^X7TobI z<_&P62+7=BSo8+6vo`!U*4k~qWPEf2XBDmOKyoYj|aLxKV?J!P@=T?O6ZgsHO5Dxp9KJe@^3fwoOYUzZ#aUXBpF&>_<-EQyGw%?)6XP4FsT8Xf}{WT>8V<0az-ZlGE z&jAc219(FruR1;pur^7uJG|_~PG`RRzBxlyTFsKf+6OL(?>Pe*`K$nf>ptEm$uKtU zk~C#kYtw61g6U$64`gJmG5_&{{pxe7?JH;gV#1~8VBBf5GGVZf9KzX>gcB8K!)kdh zfr3`f`S9CQ$Z=={5;RbqXV!r^r4>Hj*<)^5RYBeTj7Am+n*&5-IHvlSQBi`-bl&ba z$rTm42>YhLgp50}K+!a)EiI3!{9^IL*+cg>fUG^_+vg92$q>xhq*WzruV4=Clu(A<1cUl{Qqr=2|m& zy(~|qc{6KvOO^b8M%JRg>fKPKgFyXm9UTg*e=E(Eo~|5wVwLaeSYzpeRHUOT*kCu* z3YXdDPOgE2z_KpgC1u4`($qmpS;Lcu{&J1YZu@0VYUdg0F5jIm9AsYpGf6Pd&+>r2 z;8oFQxdAXHumm+%&`A>Fl0eU5WP!uxeS9TZ8hgM0-Ffw)6KM9d_W$Nx+h`mc`@c=| zF)&S~)d-JTV4C{sRv^Lkj5!t&UbUAr!k&j!9fHuA5{=qY#C4ly`6zl|m@ftl-}_^; zcq*X!^R>1%$23ldiKn7Fk>~(dqYZQVm-AsGjD^5${**vGPk}ieSDH8rLXX-eNB~KG zQe1Dpi=kGeqKlG~^qM5DjInc8P9QOtk?7CY8pmc|Z63^iF5@+l_+sEtbP5vL;$#>P3h?2)k@EZ-+I$V25xj)Dr&pv_-)IOn zP#!c=;+eB~+gkV8tQ&nzB{R=-X0*+9^b}M#YW#YRr*0_$%^LwF*gYaaKI= z-D7lm(EgS1RN`Nd3r-RQrtcme!+nm7dcnn)MuB*D-t3WRoe2Mi&(&s7u0Wg(-U&-^ z8>DW)h!miI6pl__-wBPL#$SG-=UDuX>0klq)^Zeg|E=3f9ZZ$cX7UDk?vEs>60UgE z2e(#&Y|CHJYml>wBL0x_K0X<+0RMZ@bB->uzME?wto?_)>y#e$hduea<;9=<>FD2c zd7)MXj0h{-yh48D7ls3ifkV_Y6K?A9huf-=|65e|m$UFRIE)ePqTHT)|IKx!H8bgvayg9lxinH7nDqPv2unEV(QF z9k6j(887D_B$)kBO;-d1P9kW_E6EJgUs*+PP!bm#zRY{{__O~^I~xXKSmn1I8|~j) z=tg}GdCjO#g=t+WsA`=zxZB`T@phHOWcbo;Wl3CPD!D5dmr`&g)( zQxVGhI?Wb9j2lmWUHEr2m%!1ynd~(AJuZwsMld2hF*%NLZWc73HPR&(djCk$1HXFw zCQDqRgR^(WYQ5~w<4~DBSBR60AX~6&N&QO@$ng-IjK|xN-@43aDN3)wtZ(ha%-Q_! zTtUtLK6l=PiUfmpY{1CHKzyTUK#1)lCvd6LZN@Wi5b_B-&uxx<>V`l3UwMsAb|5uJ zEkyy;V?_4%wAGYYbzmJ5yZooON+;GyfRaL)SA{h75@iPwjwymH39r|ZgfIoeZu(OopF)z_jntdSv0!H;=EAv`-=0$-*fn_sL zIow|?tlG|$Rw`Vi``%A%mFb&5?xfFC@(@y_`&X(1Yu^?CtCm8JNRfvE$#2BL?pr}^ zi?`p6qE*HB{JCO}6z}gDnU;;_4FBBnVj~>nNVMTX$LRi(f5{5)5i-Z5kV*S((>Fyf zX3EtB1oNU+c%OFT3gi>IzkrUaCHNy0;vYbrA!k3*x7MEjHj;^bGJP;4v*{$zS3^o& z?x){zK4l%ps|CC#JguDU&c9y*AjRS354fyPUO>i8HNhYG+*Ms3#0mc;B&NhfPm~Q0 zY+7t(g!!M5Py-_o4C*}hhY)j+DKPh*hNz0;I^VOvg)18{27l03w5#SS@$X-B$;E&V zjm@3EA0(M)36ewXJ+M@r^OcD(gfJu%%M)Wr)#OEqs<%1)8J7&S>43N-@bY=b{hlnv z>4hTz#hT;QyIxXC=lU*{m~)%}v-7cV3`qFr8#Lsq$b`CW@^2gNWq1%XnAD{{A=s{( z6h48>O7D7rF0E`*JYslA^R6V#Agbiw+x<`e6$COqG7JCi>-!CWT_z5Rv5fyl4;Hrk z%YZ%{BtyR=%PR11G%-$E`*%ktw9bRs_-DKfpDDa8Zw65J{Jv*-Wq dMholi;b+%;xa{z=N(%6GUF+u6VhyX1{{!?kDDwaS literal 0 HcmV?d00001 diff --git a/bs-ui/src/assets/404_images/404_cloud.png b/bs-ui/src/assets/404_images/404_cloud.png new file mode 100644 index 0000000000000000000000000000000000000000..c6281d09013e0a2c5f8e699a0a6038d9480291e5 GIT binary patch literal 4766 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 literal 0 HcmV?d00001 diff --git a/bs-ui/src/assets/icons/index.js b/bs-ui/src/assets/icons/index.js new file mode 100644 index 0000000..2c6b309 --- /dev/null +++ b/bs-ui/src/assets/icons/index.js @@ -0,0 +1,9 @@ +import Vue from 'vue' +import SvgIcon from '@/components/SvgIcon'// svg component + +// register globally +Vue.component('svg-icon', SvgIcon) + +const req = require.context('./svg', false, /\.svg$/) +const requireAll = requireContext => requireContext.keys().map(requireContext) +requireAll(req) diff --git a/bs-ui/src/assets/icons/svg/404.svg b/bs-ui/src/assets/icons/svg/404.svg new file mode 100644 index 0000000..6df5019 --- /dev/null +++ b/bs-ui/src/assets/icons/svg/404.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/bs-ui/src/assets/icons/svg/bug.svg b/bs-ui/src/assets/icons/svg/bug.svg new file mode 100644 index 0000000..05a150d --- /dev/null +++ b/bs-ui/src/assets/icons/svg/bug.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/bs-ui/src/assets/icons/svg/build.svg b/bs-ui/src/assets/icons/svg/build.svg new file mode 100644 index 0000000..97c4688 --- /dev/null +++ b/bs-ui/src/assets/icons/svg/build.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/bs-ui/src/assets/icons/svg/button.svg b/bs-ui/src/assets/icons/svg/button.svg new file mode 100644 index 0000000..904fddc --- /dev/null +++ b/bs-ui/src/assets/icons/svg/button.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/bs-ui/src/assets/icons/svg/cascader.svg b/bs-ui/src/assets/icons/svg/cascader.svg new file mode 100644 index 0000000..e256024 --- /dev/null +++ b/bs-ui/src/assets/icons/svg/cascader.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/bs-ui/src/assets/icons/svg/chart.svg b/bs-ui/src/assets/icons/svg/chart.svg new file mode 100644 index 0000000..27728fb --- /dev/null +++ b/bs-ui/src/assets/icons/svg/chart.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/bs-ui/src/assets/icons/svg/checkbox.svg b/bs-ui/src/assets/icons/svg/checkbox.svg new file mode 100644 index 0000000..013fd3a --- /dev/null +++ b/bs-ui/src/assets/icons/svg/checkbox.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/bs-ui/src/assets/icons/svg/clipboard.svg b/bs-ui/src/assets/icons/svg/clipboard.svg new file mode 100644 index 0000000..90923ff --- /dev/null +++ b/bs-ui/src/assets/icons/svg/clipboard.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/bs-ui/src/assets/icons/svg/code.svg b/bs-ui/src/assets/icons/svg/code.svg new file mode 100644 index 0000000..5f9c5ab --- /dev/null +++ b/bs-ui/src/assets/icons/svg/code.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/bs-ui/src/assets/icons/svg/color.svg b/bs-ui/src/assets/icons/svg/color.svg new file mode 100644 index 0000000..44a81aa --- /dev/null +++ b/bs-ui/src/assets/icons/svg/color.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/bs-ui/src/assets/icons/svg/component.svg b/bs-ui/src/assets/icons/svg/component.svg new file mode 100644 index 0000000..29c3458 --- /dev/null +++ b/bs-ui/src/assets/icons/svg/component.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/bs-ui/src/assets/icons/svg/dashboard.svg b/bs-ui/src/assets/icons/svg/dashboard.svg new file mode 100644 index 0000000..5317d37 --- /dev/null +++ b/bs-ui/src/assets/icons/svg/dashboard.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/bs-ui/src/assets/icons/svg/date-range.svg b/bs-ui/src/assets/icons/svg/date-range.svg new file mode 100644 index 0000000..fda571e --- /dev/null +++ b/bs-ui/src/assets/icons/svg/date-range.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/bs-ui/src/assets/icons/svg/date.svg b/bs-ui/src/assets/icons/svg/date.svg new file mode 100644 index 0000000..52dc73e --- /dev/null +++ b/bs-ui/src/assets/icons/svg/date.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/bs-ui/src/assets/icons/svg/dict.svg b/bs-ui/src/assets/icons/svg/dict.svg new file mode 100644 index 0000000..4849377 --- /dev/null +++ b/bs-ui/src/assets/icons/svg/dict.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/bs-ui/src/assets/icons/svg/documentation.svg b/bs-ui/src/assets/icons/svg/documentation.svg new file mode 100644 index 0000000..7043122 --- /dev/null +++ b/bs-ui/src/assets/icons/svg/documentation.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/bs-ui/src/assets/icons/svg/download.svg b/bs-ui/src/assets/icons/svg/download.svg new file mode 100644 index 0000000..c896951 --- /dev/null +++ b/bs-ui/src/assets/icons/svg/download.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/bs-ui/src/assets/icons/svg/drag.svg b/bs-ui/src/assets/icons/svg/drag.svg new file mode 100644 index 0000000..4185d3c --- /dev/null +++ b/bs-ui/src/assets/icons/svg/drag.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/bs-ui/src/assets/icons/svg/druid.svg b/bs-ui/src/assets/icons/svg/druid.svg new file mode 100644 index 0000000..a2b4b4e --- /dev/null +++ b/bs-ui/src/assets/icons/svg/druid.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/bs-ui/src/assets/icons/svg/edit.svg b/bs-ui/src/assets/icons/svg/edit.svg new file mode 100644 index 0000000..d26101f --- /dev/null +++ b/bs-ui/src/assets/icons/svg/edit.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/bs-ui/src/assets/icons/svg/education.svg b/bs-ui/src/assets/icons/svg/education.svg new file mode 100644 index 0000000..7bfb01d --- /dev/null +++ b/bs-ui/src/assets/icons/svg/education.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/bs-ui/src/assets/icons/svg/email.svg b/bs-ui/src/assets/icons/svg/email.svg new file mode 100644 index 0000000..74d25e2 --- /dev/null +++ b/bs-ui/src/assets/icons/svg/email.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/bs-ui/src/assets/icons/svg/example.svg b/bs-ui/src/assets/icons/svg/example.svg new file mode 100644 index 0000000..46f42b5 --- /dev/null +++ b/bs-ui/src/assets/icons/svg/example.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/bs-ui/src/assets/icons/svg/excel.svg b/bs-ui/src/assets/icons/svg/excel.svg new file mode 100644 index 0000000..74d97b8 --- /dev/null +++ b/bs-ui/src/assets/icons/svg/excel.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/bs-ui/src/assets/icons/svg/exit-fullscreen.svg b/bs-ui/src/assets/icons/svg/exit-fullscreen.svg new file mode 100644 index 0000000..485c128 --- /dev/null +++ b/bs-ui/src/assets/icons/svg/exit-fullscreen.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/bs-ui/src/assets/icons/svg/eye-open.svg b/bs-ui/src/assets/icons/svg/eye-open.svg new file mode 100644 index 0000000..88dcc98 --- /dev/null +++ b/bs-ui/src/assets/icons/svg/eye-open.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/bs-ui/src/assets/icons/svg/eye.svg b/bs-ui/src/assets/icons/svg/eye.svg new file mode 100644 index 0000000..16ed2d8 --- /dev/null +++ b/bs-ui/src/assets/icons/svg/eye.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/bs-ui/src/assets/icons/svg/form.svg b/bs-ui/src/assets/icons/svg/form.svg new file mode 100644 index 0000000..dcbaa18 --- /dev/null +++ b/bs-ui/src/assets/icons/svg/form.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/bs-ui/src/assets/icons/svg/fullscreen.svg b/bs-ui/src/assets/icons/svg/fullscreen.svg new file mode 100644 index 0000000..0e86b6f --- /dev/null +++ b/bs-ui/src/assets/icons/svg/fullscreen.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/bs-ui/src/assets/icons/svg/github.svg b/bs-ui/src/assets/icons/svg/github.svg new file mode 100644 index 0000000..db0a0d4 --- /dev/null +++ b/bs-ui/src/assets/icons/svg/github.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/bs-ui/src/assets/icons/svg/guide.svg b/bs-ui/src/assets/icons/svg/guide.svg new file mode 100644 index 0000000..b271001 --- /dev/null +++ b/bs-ui/src/assets/icons/svg/guide.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/bs-ui/src/assets/icons/svg/icon.svg b/bs-ui/src/assets/icons/svg/icon.svg new file mode 100644 index 0000000..82be8ee --- /dev/null +++ b/bs-ui/src/assets/icons/svg/icon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/bs-ui/src/assets/icons/svg/input.svg b/bs-ui/src/assets/icons/svg/input.svg new file mode 100644 index 0000000..ab91381 --- /dev/null +++ b/bs-ui/src/assets/icons/svg/input.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/bs-ui/src/assets/icons/svg/international.svg b/bs-ui/src/assets/icons/svg/international.svg new file mode 100644 index 0000000..e9b56ee --- /dev/null +++ b/bs-ui/src/assets/icons/svg/international.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/bs-ui/src/assets/icons/svg/job.svg b/bs-ui/src/assets/icons/svg/job.svg new file mode 100644 index 0000000..2a93a25 --- /dev/null +++ b/bs-ui/src/assets/icons/svg/job.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/bs-ui/src/assets/icons/svg/language.svg b/bs-ui/src/assets/icons/svg/language.svg new file mode 100644 index 0000000..0082b57 --- /dev/null +++ b/bs-ui/src/assets/icons/svg/language.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/bs-ui/src/assets/icons/svg/link.svg b/bs-ui/src/assets/icons/svg/link.svg new file mode 100644 index 0000000..48197ba --- /dev/null +++ b/bs-ui/src/assets/icons/svg/link.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/bs-ui/src/assets/icons/svg/list.svg b/bs-ui/src/assets/icons/svg/list.svg new file mode 100644 index 0000000..20259ed --- /dev/null +++ b/bs-ui/src/assets/icons/svg/list.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/bs-ui/src/assets/icons/svg/lock.svg b/bs-ui/src/assets/icons/svg/lock.svg new file mode 100644 index 0000000..74fee54 --- /dev/null +++ b/bs-ui/src/assets/icons/svg/lock.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/bs-ui/src/assets/icons/svg/log.svg b/bs-ui/src/assets/icons/svg/log.svg new file mode 100644 index 0000000..d879d33 --- /dev/null +++ b/bs-ui/src/assets/icons/svg/log.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/bs-ui/src/assets/icons/svg/logininfor.svg b/bs-ui/src/assets/icons/svg/logininfor.svg new file mode 100644 index 0000000..267f844 --- /dev/null +++ b/bs-ui/src/assets/icons/svg/logininfor.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/bs-ui/src/assets/icons/svg/message.svg b/bs-ui/src/assets/icons/svg/message.svg new file mode 100644 index 0000000..14ca817 --- /dev/null +++ b/bs-ui/src/assets/icons/svg/message.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/bs-ui/src/assets/icons/svg/money.svg b/bs-ui/src/assets/icons/svg/money.svg new file mode 100644 index 0000000..c1580de --- /dev/null +++ b/bs-ui/src/assets/icons/svg/money.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/bs-ui/src/assets/icons/svg/monitor.svg b/bs-ui/src/assets/icons/svg/monitor.svg new file mode 100644 index 0000000..bc308cb --- /dev/null +++ b/bs-ui/src/assets/icons/svg/monitor.svg @@ -0,0 +1,2 @@ + \ No newline at end of file diff --git a/bs-ui/src/assets/icons/svg/nested.svg b/bs-ui/src/assets/icons/svg/nested.svg new file mode 100644 index 0000000..06713a8 --- /dev/null +++ b/bs-ui/src/assets/icons/svg/nested.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/bs-ui/src/assets/icons/svg/number.svg b/bs-ui/src/assets/icons/svg/number.svg new file mode 100644 index 0000000..ad5ce9a --- /dev/null +++ b/bs-ui/src/assets/icons/svg/number.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/bs-ui/src/assets/icons/svg/online.svg b/bs-ui/src/assets/icons/svg/online.svg new file mode 100644 index 0000000..330a202 --- /dev/null +++ b/bs-ui/src/assets/icons/svg/online.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/bs-ui/src/assets/icons/svg/password.svg b/bs-ui/src/assets/icons/svg/password.svg new file mode 100644 index 0000000..6c64def --- /dev/null +++ b/bs-ui/src/assets/icons/svg/password.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/bs-ui/src/assets/icons/svg/pdf.svg b/bs-ui/src/assets/icons/svg/pdf.svg new file mode 100644 index 0000000..957aa0c --- /dev/null +++ b/bs-ui/src/assets/icons/svg/pdf.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/bs-ui/src/assets/icons/svg/people.svg b/bs-ui/src/assets/icons/svg/people.svg new file mode 100644 index 0000000..2bd54ae --- /dev/null +++ b/bs-ui/src/assets/icons/svg/people.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/bs-ui/src/assets/icons/svg/peoples.svg b/bs-ui/src/assets/icons/svg/peoples.svg new file mode 100644 index 0000000..aab852e --- /dev/null +++ b/bs-ui/src/assets/icons/svg/peoples.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/bs-ui/src/assets/icons/svg/phone.svg b/bs-ui/src/assets/icons/svg/phone.svg new file mode 100644 index 0000000..ab8e8c4 --- /dev/null +++ b/bs-ui/src/assets/icons/svg/phone.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/bs-ui/src/assets/icons/svg/post.svg b/bs-ui/src/assets/icons/svg/post.svg new file mode 100644 index 0000000..2922c61 --- /dev/null +++ b/bs-ui/src/assets/icons/svg/post.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/bs-ui/src/assets/icons/svg/qq.svg b/bs-ui/src/assets/icons/svg/qq.svg new file mode 100644 index 0000000..ee13d4e --- /dev/null +++ b/bs-ui/src/assets/icons/svg/qq.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/bs-ui/src/assets/icons/svg/question.svg b/bs-ui/src/assets/icons/svg/question.svg new file mode 100644 index 0000000..cf75bd4 --- /dev/null +++ b/bs-ui/src/assets/icons/svg/question.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/bs-ui/src/assets/icons/svg/radio.svg b/bs-ui/src/assets/icons/svg/radio.svg new file mode 100644 index 0000000..0cde345 --- /dev/null +++ b/bs-ui/src/assets/icons/svg/radio.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/bs-ui/src/assets/icons/svg/rate.svg b/bs-ui/src/assets/icons/svg/rate.svg new file mode 100644 index 0000000..aa3b14d --- /dev/null +++ b/bs-ui/src/assets/icons/svg/rate.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/bs-ui/src/assets/icons/svg/redis-list.svg b/bs-ui/src/assets/icons/svg/redis-list.svg new file mode 100644 index 0000000..98a15b2 --- /dev/null +++ b/bs-ui/src/assets/icons/svg/redis-list.svg @@ -0,0 +1,2 @@ + \ No newline at end of file diff --git a/bs-ui/src/assets/icons/svg/redis.svg b/bs-ui/src/assets/icons/svg/redis.svg new file mode 100644 index 0000000..2f1d62d --- /dev/null +++ b/bs-ui/src/assets/icons/svg/redis.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/bs-ui/src/assets/icons/svg/row.svg b/bs-ui/src/assets/icons/svg/row.svg new file mode 100644 index 0000000..0780992 --- /dev/null +++ b/bs-ui/src/assets/icons/svg/row.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/bs-ui/src/assets/icons/svg/search.svg b/bs-ui/src/assets/icons/svg/search.svg new file mode 100644 index 0000000..84233dd --- /dev/null +++ b/bs-ui/src/assets/icons/svg/search.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/bs-ui/src/assets/icons/svg/select.svg b/bs-ui/src/assets/icons/svg/select.svg new file mode 100644 index 0000000..d628382 --- /dev/null +++ b/bs-ui/src/assets/icons/svg/select.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/bs-ui/src/assets/icons/svg/server.svg b/bs-ui/src/assets/icons/svg/server.svg new file mode 100644 index 0000000..eb287e3 --- /dev/null +++ b/bs-ui/src/assets/icons/svg/server.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/bs-ui/src/assets/icons/svg/shopping.svg b/bs-ui/src/assets/icons/svg/shopping.svg new file mode 100644 index 0000000..87513e7 --- /dev/null +++ b/bs-ui/src/assets/icons/svg/shopping.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/bs-ui/src/assets/icons/svg/size.svg b/bs-ui/src/assets/icons/svg/size.svg new file mode 100644 index 0000000..ddb25b8 --- /dev/null +++ b/bs-ui/src/assets/icons/svg/size.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/bs-ui/src/assets/icons/svg/skill.svg b/bs-ui/src/assets/icons/svg/skill.svg new file mode 100644 index 0000000..a3b7312 --- /dev/null +++ b/bs-ui/src/assets/icons/svg/skill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/bs-ui/src/assets/icons/svg/slider.svg b/bs-ui/src/assets/icons/svg/slider.svg new file mode 100644 index 0000000..fbe4f39 --- /dev/null +++ b/bs-ui/src/assets/icons/svg/slider.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/bs-ui/src/assets/icons/svg/star.svg b/bs-ui/src/assets/icons/svg/star.svg new file mode 100644 index 0000000..6cf86e6 --- /dev/null +++ b/bs-ui/src/assets/icons/svg/star.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/bs-ui/src/assets/icons/svg/swagger.svg b/bs-ui/src/assets/icons/svg/swagger.svg new file mode 100644 index 0000000..05d4e7b --- /dev/null +++ b/bs-ui/src/assets/icons/svg/swagger.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/bs-ui/src/assets/icons/svg/switch.svg b/bs-ui/src/assets/icons/svg/switch.svg new file mode 100644 index 0000000..0ba61e3 --- /dev/null +++ b/bs-ui/src/assets/icons/svg/switch.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/bs-ui/src/assets/icons/svg/system.svg b/bs-ui/src/assets/icons/svg/system.svg new file mode 100644 index 0000000..5992593 --- /dev/null +++ b/bs-ui/src/assets/icons/svg/system.svg @@ -0,0 +1,2 @@ + \ No newline at end of file diff --git a/bs-ui/src/assets/icons/svg/tab.svg b/bs-ui/src/assets/icons/svg/tab.svg new file mode 100644 index 0000000..b4b48e4 --- /dev/null +++ b/bs-ui/src/assets/icons/svg/tab.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/bs-ui/src/assets/icons/svg/table.svg b/bs-ui/src/assets/icons/svg/table.svg new file mode 100644 index 0000000..0e3dc9d --- /dev/null +++ b/bs-ui/src/assets/icons/svg/table.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/bs-ui/src/assets/icons/svg/textarea.svg b/bs-ui/src/assets/icons/svg/textarea.svg new file mode 100644 index 0000000..2709f29 --- /dev/null +++ b/bs-ui/src/assets/icons/svg/textarea.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/bs-ui/src/assets/icons/svg/theme.svg b/bs-ui/src/assets/icons/svg/theme.svg new file mode 100644 index 0000000..5982a2f --- /dev/null +++ b/bs-ui/src/assets/icons/svg/theme.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/bs-ui/src/assets/icons/svg/time-range.svg b/bs-ui/src/assets/icons/svg/time-range.svg new file mode 100644 index 0000000..13c1202 --- /dev/null +++ b/bs-ui/src/assets/icons/svg/time-range.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/bs-ui/src/assets/icons/svg/time.svg b/bs-ui/src/assets/icons/svg/time.svg new file mode 100644 index 0000000..b376e32 --- /dev/null +++ b/bs-ui/src/assets/icons/svg/time.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/bs-ui/src/assets/icons/svg/tool.svg b/bs-ui/src/assets/icons/svg/tool.svg new file mode 100644 index 0000000..48e0e35 --- /dev/null +++ b/bs-ui/src/assets/icons/svg/tool.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/bs-ui/src/assets/icons/svg/tree-table.svg b/bs-ui/src/assets/icons/svg/tree-table.svg new file mode 100644 index 0000000..8aafdb8 --- /dev/null +++ b/bs-ui/src/assets/icons/svg/tree-table.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/bs-ui/src/assets/icons/svg/tree.svg b/bs-ui/src/assets/icons/svg/tree.svg new file mode 100644 index 0000000..dd4b7dd --- /dev/null +++ b/bs-ui/src/assets/icons/svg/tree.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/bs-ui/src/assets/icons/svg/upload.svg b/bs-ui/src/assets/icons/svg/upload.svg new file mode 100644 index 0000000..bae49c0 --- /dev/null +++ b/bs-ui/src/assets/icons/svg/upload.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/bs-ui/src/assets/icons/svg/user.svg b/bs-ui/src/assets/icons/svg/user.svg new file mode 100644 index 0000000..0ba0716 --- /dev/null +++ b/bs-ui/src/assets/icons/svg/user.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/bs-ui/src/assets/icons/svg/validCode.svg b/bs-ui/src/assets/icons/svg/validCode.svg new file mode 100644 index 0000000..cfb1021 --- /dev/null +++ b/bs-ui/src/assets/icons/svg/validCode.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/bs-ui/src/assets/icons/svg/wechat.svg b/bs-ui/src/assets/icons/svg/wechat.svg new file mode 100644 index 0000000..c586e55 --- /dev/null +++ b/bs-ui/src/assets/icons/svg/wechat.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/bs-ui/src/assets/icons/svg/zip.svg b/bs-ui/src/assets/icons/svg/zip.svg new file mode 100644 index 0000000..f806fc4 --- /dev/null +++ b/bs-ui/src/assets/icons/svg/zip.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/bs-ui/src/assets/icons/svgo.yml b/bs-ui/src/assets/icons/svgo.yml new file mode 100644 index 0000000..d11906a --- /dev/null +++ b/bs-ui/src/assets/icons/svgo.yml @@ -0,0 +1,22 @@ +# replace default config + +# multipass: true +# full: true + +plugins: + + # - name + # + # or: + # - name: false + # - name: true + # + # or: + # - name: + # param1: 1 + # param2: 2 + +- removeAttrs: + attrs: + - 'fill' + - 'fill-rule' diff --git a/bs-ui/src/assets/images/dark.svg b/bs-ui/src/assets/images/dark.svg new file mode 100644 index 0000000..f646bd7 --- /dev/null +++ b/bs-ui/src/assets/images/dark.svg @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/bs-ui/src/assets/images/light.svg b/bs-ui/src/assets/images/light.svg new file mode 100644 index 0000000..ab7cc08 --- /dev/null +++ b/bs-ui/src/assets/images/light.svg @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/bs-ui/src/assets/images/login-backgroun2.jpg b/bs-ui/src/assets/images/login-backgroun2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c52672a9c6d7fdd7bd650ee418150be727d83c1f GIT binary patch literal 1933103 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%0D^G{;0Iw2TAXg`OU9xpRvkgWwaGH^q~ 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≶}WOmvJnB$pe`z7;#8~^m>uDgd}(A#fRPVQw& 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

128k$zK6(B>1Jx7_fXr1^wiVd| zGOTYVzXu5NzNcJ;eRP#dT^j=~3d5v%%Cd_BpqF^+JCS(O1wDxN&HcXBP_kDfvCODgQ-V&n-1Pi99;a|8w8ao)iw0K(()~a2T3c zH#j-R$?||Jzm0JEdCzeQBtel==zM}Zp=w6l+D8<2!28ZBGsc$&wK+--e?2J<>3U8J z6uIUmaF=&Oj`^G;-PL5;UR`*chQ?wis=jR;^XF=v9iV!(u(UR-uu3pXYt-1){s~vs z??svFqRCQO?Lh5Ym0U#rVyQ?;bPc?d;6I6ossmAL>8w9MgyM4^ z>k1OLLq*Xs?k}&gl^O7+w4DuRvkJy*u)P!**sY~ z?;fzfF$Y37@_hTxfgkp@B0T8D9@~eFbjaJ*J%PxLKER}u#SGQE3s}Re%;}9Rm!pKv z15nV{3hdlCN*|pmzeaAX>q|Er7_MUlO6bARi4^QMdTP@L_xWBt<1wJ#n|z~XUmrJ^ zJOLiwkPy}G;B%8{)0P*fBcE&hI6Z{fx|@LqffRoMM%(#;1~dyn3~s#Ne-3CBUGi-H zPWAbR?Lx8qc(*AmzIAA8n3EwEK&TXP7JM2Aa!slm2Ixh;LPhv50eCaHqgEd)*u?z{ zpf+O$kV2x?5|^JDbe`4T^SBU+r8GPd-@kOU1VBunF?i>-40ukp=Q*2UQLiau_VLtW zbl3e0{u4f5R%QgsP@M6#VfY4-Ik##s-XRX1kxRBoj&339OSEiMP^9Zi z3}nHD(Kaz>&yXmW4lK4cZ}4RzR;$s&VH@t4Dj~coQ_%kJ8w%(h1@n)>-c+i-e^~VE z;u+ItKhew;tP~vj^phBSF>gm8^{vg+@kYdY0}h4juHUuP@#fdR7Xl63H%`Dmr(veq zXDyAy{bxSj&E5B-yJ;)T|UHV)cjq9Zle(y zM1^r>zu$a*X%J!&lxNQY0!C4TlYmv!3CuZVQGh_c#$D&}CL0*i?t5W^>f@swxHT3ED=2iPnl2mN0769fbo91sT(U0 zu*Zvl1*o>t8;@1KU!i{lBO@G-n-<_jTW{xSK?i%yu5HEG$PW}cJn%zccv$m*u0MAO zSlcyAMOyA4edu(`89t3cA$*6nHvx@B&>D-PU;hs{%Gqr0ya8jlxC2nv)SA0|?82|& zn>|q2pd1H0=>iV;H_w(#Je-N)S=lSVeDCCj#fL(4gaGNtYXhLHMby;|DI!121BEUS z+noI%0xFoiVOZG(d2H6+0P}Wt%whm`M>PLUe(&Ej)i=YOM4*YkM<%B({rs`j;jyR% zdiwM=};y7cQVhz8vZrM@F&v2)nP8vzI_pG2UExy+UD|y5C;ve2_fH`&CWC8u^{= zsYMcR+_Z}Y4<6JK*o{b^vwxqRifkBG*}9tqOAeoHMxj!v4Q^L|nfp;TZdN!zev3r4 z{PR!M4@5|^_$GRd7UBDX(Z|2sj1a&82y^daI%SP#@i9kej{Ik zh$@mU2ez*2W>rUgp_EG2cFTr?A_(^i# znv|yg3wrVm{?7(<`fIK{<`tYt9tVK3Wj3&UG}-kFh;G^RLu@ z>LB$R;J|D0-I&{FhrsmvIgleFIZPa)r?}|YExz!_m127Kf!Ln$;_X~)BhepMiN3Nd zuePlle1(+-@EW#ODsKJxGqL0W0!jR0V1Y;VJf8q56YLi;qI76!7=T9`GL}%`k>dOL zr7YID^qMmFQG6T{wTDMZaZVD3JN8BA%M~E}U*fiQWhR@}Z%W1=qqb|PoS>eo zm$OmyR&`KV|9n3QRMWvex^g-*EFjlP()4q37N6B#!NO`V6BRrQB(AdZ{~}iHHvwQW zW#^y(xIM1FwnlSvQ1?e%wMx#}&wD*1+f0B83-Gzr|Ep$$bdsK6OK0EKWV`+u4dR=~ z9+Sg^P8%OfG+CRho;JU}T>z3Mx#3?6HqvvJ@!z;dl>cAb1td*dR%xNb zz&{887*qLLp&y{4_Du;S#OzSYMw;7LwPNJC#bkh{2jS(wy80a}nR2paMFr3VZUBmW z8-Ds5fGg5#@K(MZpP=Qba$`S!UpP>LlmH0~2<&m7ot4)M&a+wA$PJm{dlNxq7!y47 zzZz`!TIS!==1S78f3at^-u@JNDTrkKu9`B7=JfbRJV`7Zb;9n-L!b4Y2Z&ni1LT(H zaXUiVLe9G*sy11dV;N3ny~#nZo=91I_8aOpfJpqiE9f@N3=j*TwuoK#MHctvqn!XD z>cWq1h8mSzH%`tzLGq`mb{l4lp*bKbH0m5k?$!SsU70b0o6_lowlboqy6g+)rW=KH zo`WYu2~XQFRhNb2F}*2T{u*$7l|r;l2->+bD>Xu`T$rJwm)3)zxJ!n}BFxSZdup<4 zX*_O;oXW#htGVdNueOFtoO-`qzprw;i(CENP1{}TU-J#HH#j~CGg>pwI5!xmLSj_( zfZiuVythE#2Z^6m*x=7@M3aif6Kb=B^l>FFLCOwj6naPX>fTxv7Q6fNNtGZJ7W;X#VMQy9_xO zj_=NF2u)NaHEf|kS*`EY^_9MHY}eLj0e8R&@)G}_rQ}N@q$|eDNK~ew+2!t%q2}P1 zvVK+*@Q=tiJK8YsiF)^y@b*mg*{KgTdJ<_+V0)~Uu=OE7L&E8>__RLWbgClTp7wL` zGi}eaCi5H8aH{%pHcuP1iKBKykqreCMf=uE>EH$ttool!>@3gIy@tHMNdK>(?*9b0fB={+Fk-TC;ko-q}p0deB!{cfhlF z24skaAaeeA6yVG%Yw14P#-zDK1}+cJ2Z?F!}Xlc*yWybV_rQtFe`l1!-LTC2^+o zi|dYCZkKo=!=z^tHkv(?Ahj8<7@Tbgt18Lz%0mp)cIxe%49fZ1@7GJHWL%m`R03 z_+18DBA}ImHBg3#h8GO5Xi`Y8=2DBWkfk=0^o}pAO>&O={@0*a1Q+EgRV+y5}(i?ql!mlNEseE zMfU|;U&HQM1cfTBvSG>uGiu`XqWNNo>0;2<(n^Z(5UJUOp9F)KpKIuG-#6YCjkUB^ zXS348f{^94!`#$ZEd0;Ahq=ss3*Fs46`kHpa-kgrtCj66vjX9mrbM6-6n%yuq&`q# zZFUAn*S(OjNbM1VSZih{4TO?I#mv)TL%stm&!SS;cBLZfu|ygAf+K_?B50w;%KwcM zi!S{(^8wqxlZUx=3+S`vRJRDs>=Mxw6LSjaZ!<3`Id1#X8)?CEg47h7hdIHMAEUdMG7by;!+k0fJa1H^X z2x0Vwh8RdhJ!J>0o*$DCVKJrho0@_J?GLDIw%D}{r5*wJsB;)gkIa}BD1`K3r;7v% zW0gIBm5`hL=mM6sgKmET^QBxVgS4vcq1&6dWQ!LC>qR%wLK{CV2g(Y^?D6N{GD6OY zT-=>#h>33WKJZpqt0rYc?mMSNi)@{=-Ad7o<+uum9r4?rp2+p9Y&}}U5kIQqlRT)G zTio^uoy;7G+$*0H9H^N_ZefA_5E(N{+}C$HK|_JKqz-iFI7k; zL?j_a!U;@gFF|_nBI(jdbL{-G0`RW)gt|kwf%{K5A8}%XZwf>TTYNxa{lOYi=yl{< zc@{`R{z7n5ARn`LcIMWWhTmg}3pC=v07oe#NRTE;F@&YyKw-cL1|qWQ7wOv}lCa7U zMhADeE&`8US?wv%_P!6}9N^_=tJo*3LXL*0cX4H#C42z#gjaiW()=;ufJ8Z@H@ZH6 z2bB1L*4tYH97lo5s|Q!U5RIrq+W@HIHmx@3p!j z$`byb`9(I4S@|i_h`O&4#Kv)_d@4-bx{avRefsK{B1^vF5gcxv(n3AaKk*)w)ZR!( zJeLfS07p>b9&7X1N60yZHrjKr@jzIO;l|=Luu$PDny)bhBIQ9eIMR)Rq0XM6JiE5J zQxEU-n-5x)Ox@#%F04(H?yZx`F=qtevL!#4N|8ECL{QEjOsZBrOrAmoHTFDc587Zl zNjYl4Cns>;6(STPD9-fJZ)J8(OK00GffT-b4n)a=C3A3)MEs_hR8Ig&w%aqIsLA;8 zSDveo+c84iPcG}<)ZJ=yd%EEJI=hew_E~Q+g{J5nut~KrLADG}X=5Bj7yGl$WFYRRh0g)@@rA1MJ9P-P!?fK$QfuC&2Ay(gQ~Y zSD_>Kq6CrVK;9>3&cbk%V{3&-oNFL`uLNI*EQ|4^X^&`>bM0S<`^?vW3rkk-A9YQsFyGKz5Zt+9 z^!A?6*pk&qwSN|yx668kefpZ?@*aO+@V_iV;0fXM3C)}_c)hBg)ro_w10lDH0fZ^) zJfBYtB9fE{RI1R((ulLSLWD>af+XNV$EOKEeB8dwkT)lR^H#Wqbs3CR&#>;F(C3{X;5q7+ik%e}$;@-!Rd??F4DX$QVP51P36w&Z-NQXO$s8M{-@-V8v$|4;66UUm? z6s+4-Rw~S2Ys?S;LEMI=1-Vb@Z{YgKSIa|eW6E~%4BHmZ&fdUfryYf zzgLZc@MK;7`n(8eqydC2T94tkJqj zi-n)1iBs{<@+b62S8gFRzsW*g?ODN`VF~HFn^kIUCm0l=Toqg-oM$axbvWGQ^HP$x zS3{qhB=2ch=ZKl5fipmy6zcLS{1;xL zz`ylZmqQD!fQfugh7MXC1^rHnBVh}O;3%jSE+n})_O4>%fmdpRO55^rmGTm$y!R)^ zGotpYRm~%ZD3t$Y+`+0T4mN?4Z{-XQyF;`rH~bW@HW-vwJ9g&@fnvaLC%>bQJ&%57 z5n%T0wXQm?ZS!i)^&p8tt@vk_g}&szrl+WxAI$;~LLoDixBE(gW}97% zyPlOxL&|eY*w8y(5b&1FAb*on&iS>d2zyohsILcvhiupQ!giQ4Omu{XoMt8sx{w%f zZvW;vG=W}^jx-*12P6Su6o@sJjL`@o%_wKHHMJAsg{;V5clw6!wXL}z_3VU0*1w}= zt00_auxMlYvDk{O4*2^{vgITlcA;a#HrO3u#HymisdUs7tVw#aQkugp5*AZOyK@x8 z6@ep7a8*(fNb|H8ABj&R^+`Z}TdOmW|8~HS>%#-ALW1YM5=)xy%8O`45Z+} zQRi@C_n++o5y=R^G7A;%0KO+)84>6JQSw=Ri-Aid9(74Y`17Zg%UWpdFPeYq&FAn- zGQw&Jwib33_PEo!?r>C;kjJn&{@N%U6{~fH53G4Eki8%I9riK) zo_~@53mxAk{At=of9>I8wZ`|G7YVKz{BKGsQn63EbdM_)O{0_EaO&2{qQ2VtC6v(`wsglEis<4D|^~fgR$@Zpyli?okJtK3K zWc~GH+7?PKYHGtsABplUg`C^VPd zfeGD2Z`k7`1e%y^#n|-2^zLT@J;wHXond`rYzm-6!Ff3>B!3qQYC=Z{8i~T|*2;b< z65WZtwmz!E{)7@sYuzaigl^R@WcUlqAgeXnh#~_wFf0>H52MJs#j^?PNKFu;`Xgi8 zo{K^WlNwi0LJ%W6d!R1uggQjR2corKarl8zD~u86+<##GvU*Z;<}X>DxHELygcybL?@#zX~kb zpF7zHfRglGNzGNJru20?1;c%VrsSnc6eh~*$*#>j%JtKV8#4Sp2Tf&+PbiMp(z?ijFPPYB}6 z&tQgX`6qsv2*K6n-;~PUo^IU+A3db-k<>omH7&cpf(e%3gjd!vrG(x}eP_TW>e>US zzre9Bj%u`NwnXb&=x?I-rCB^lTz3g1ESM5Md=(nG@i}{xGcDH7);$a~zsIq8X-lSi z>>|Gn>K*OheNY`jH}f`x)Z^Ze96QsNla~l0C9)bzM;_7O#KmUK;U&zgzZO%|c)=f=`cDOhjzsrmdEOwbu41Mh6Mk5OX_1jXH>(WAuXQ7m)S-_7r(Mcs96<+;NP zRYLIk@QQbcTp~At60G+F2fUoxM-o1YC`?&aaWB$6T=hpjs^^O!m-&J)`_f_H z5$l#$5e<5jV0C{ADWW|S)!=^fn0gnoIu@PK6JIk zFAs3wjk(7G^)nS>&i>eU8OpUf95p>zJYRFbb6Dd&^vfWmFXUG&R(wO+%P)FD5*)lL zAER8aD-fvQLZZ9e^j$V@<&Walat@`zLY&@uza0kh#$V8WR^g=PQFQB>8MTYkzPw_kt za`)3hcZcuOTz=AYMS-{6(@&g925@uEY-;Ei37SFAWGeql?ZvMZbg0Ec)=@yoIVK5y zm@#}I)6^kPjy)OEfMR04s zQPnLorKp}-L03CjM}GhjRwHpzC1n)^Ls^s4i9ip0EP3ESj5#)H4j;n;sN8mXLYL$K z(1Dz452$}Y{Sa7bg#untO})_E0sVnuvHGs}kq#LU1#i0WP1$6}vu3<6(cyAK&wu$( zl(L-5-B3RzcG+m;!w1uQ!3<*Ibtg{fQEqof1W4M_7;f}v>hstj^$-4>MtcFohIzFw zCsqX6aj_)@jXBdHv5|oT@|=&f)^kQ&KcouPMHBjmolHe!lY>YbHG;-lOn*yNDoBH? z{B}_fk|(9Q4>X$jlc+BO&762YsV-v^1>HCOY|?hJkH4ay@OPC7wQ4OeuM{%VuL|`% zcoN`Ti>gL9JNViNbhC{8Dk>b$0WEm9{%$H(!60bl3cs|~#p5|lN0IfqBTDK(mg83YdtBp*_+LosfE~)CXJ*OHnDKWIRqD%tcIvAJcxOnw=MvdI z|5Btg3y^ef4if zP0)c&z5{6GJA?|(@pj`8-IENX!Tfde7lPefXv({&7?xsUR66aI&olmerG)qh8g)_* zoEOahB{q*PWlB*P3Cn1MY}HzgkDdsV)LA>B3Qjc@bD)aozV0^bH9;l$`L zgSPWCx|-V&6CpaQt=3kD_nIn_bY{*DHzJLp}^)1w!5a&ca-U9=ZDO#y{T9+w<3}`Dhj& zE0d<{3R}V)Cmy!zP(dW^duMKngSE{rI4p=D8dAT3caU2){|S* zfm8f18f6&*V@|jzvA~|E0F}mreyvhgr`7 z1t~i-zfcU?7m6*vetJQjd`6crHi+>@OBT~iaZ0hTJQO7At3N3G^?98(;=;}4zWyOj z7`;BacSmwP^O&{^o1|O!{)2`U_*s$RZOCpe{KSK=7xNuY zsEfTul|-r>gru0XNm!lB83V|_s+xPL0#cL{de9qzZm5uVVk{D zDlsDj_dze-h%^fS@+yAJ!xEFpifp%xt-kBHo^w-kx!YP@>w=3%Goj!pYv?)-YnC^| z9X|4cCSd_FWaEyASSI=4J`{o{dfLGOH_|1teoJ}z*Fl<@Y-K3hf#z1qLVan)oo&w7 z04gBsZR%FSSFIN3Yx15JftLWGsYY%H+-B|fv?+}Vg9ZikeYHyH-I0reqjHdX2x)z) z!0%4~q8X#2-wZw~_}rtaa02qK?Mr?LeCfXx$=-9gMW~X{crS>GsZo*i3P>Ht@LmCZRlH+awH{QE#JRxO(t4P@lpMsJ@(QzL9e{-eE12+LE{StqK9icfpBBhy0s9X)_Y@jlO)CgCx+>>{dC(!Vxg(GI=PnP%W}V;zr+W^#D4LIYQ^jjgNna!?c7lMl z%M(CHJy?SZ{#!zI7w3W{8#dybpfIAoTEJ6&G70fvI#i3HdDRj$cL-DgV~={LnxFy| zkoikOf)~=JS1W4`x$lmJmWz?|bJ^etRFqsy~pLvPuE8*P6 zyDhRepb(un3Mi}PxhB)SGRLKtb=O^5a!@&)r(B>SE0IBC7&~_V8wKGcF=PS+>n~ot zCH5~xa9(8KmrmjqCqk@SL2+lc~@rBF)K_ILD2M#vae+lA2T4=QTs=;wy|L^x9+f%Igr!ji?h?X)h*0PMS`$z9 zpPxoOO&6um6w+>pX$w; zO~{^41JBoXDM`=lli{hS{{c8SS8rtLH*RKYP1hguz2;+w;-B0@=7>^M9S zNf~@tV^}D&&!|p}J{Ab}Ka_Da%Q;@gm}?ZuZAQ{ep1%e?;A?ontCX1sRsDkZ*8E6q zZb3`=F?@xmQ{;W~c9FA06(phD@mzoV0`;E-_4f9;yl7P6yabnUpeMOJi2@9}8#Sb> zOpe-g{ZOPfI&QgBl5f$7Ih@Rw^|FBMD{3m0BlKWHo{7PiX1SHQ*xhRMRfp@4Up%Az zdRMRxXyi6tIDvj*8?{yJvW$k@kuL`45v05QsNM_r5bUaDIfr?;pxMr;d?uMAsh0sr z9xQYlWi>_Nx5dqGj+oJryvNc|f1Mc_v$JT+b_do1=9)HL$JDs9RWq18EO0Wp`<@Q| zxMBJ0(#C(DOxasO<|_XXqK4Zq_ZrmlrS%8Zxvi#rk(Ide%p13LVR9!`Toev`iH$f= z$vFqF|C_aEBJqfI+};|oXXrf>kOKbj7WAOk3bo`M9Vm=C?>$#mB>C#scsfdMe@d|nZ zus*{%M&T4&(ibB9cP&3zXfs_)&&WMN*n?ga z14h(jjkZ0k^u=zXbQWlijv2TYaK>np_d*emwx+czYw)u`i)_+mmRwH^n9E5J)SAfU z!mm;#P}ftMT-3MVy9QQV}B3d(iUvs6=vr=X1tzu(aG51>)W+mrSYC zR&yHyN<1Bg-kiwNVhzBD#g~=;NoV~F>n0B=o1wU@p> z?*8}OIK`Tt6Z^mZ&GH>43$TP}I?+N#jVtNCEha`3o*2o{{E^NV2LUa&7L68IrW!Y$ zMnTY8XvMP#Yx|)c^kIJj-SgWL`^hH3>YRtXiw3A5==X>7AnGgIqIj!|Rk0*;uDwQ` zroc|URXrGiad-rwsl}eqk%BvH%!bg5=DfY%olmZ!4{N_PdgHqS-fM+{ZxZae*JBpm zW*ixZnJ3P-NDmen0#P-Z4aWSw;By5?msL!x0NSfRIM^ZsqpUma&wPZb?QgA&3}=p zGm)3C1K*<8CxY{=Xg7w0m`?pd3E+N;6jr5{Ga4jc;q=zwqDAEVgA=iS@6cg7dCeNz zlpz#|F}$+1daTw%b(iTavV{|M3{0J#c2ayw%jQ4%Dfz&d$z6tflsCJleJ@G;u1dYP zx70>)-Zztx9QXEvt;Ar=g^s(&IVH*McifQtxQ_(tId`RQC!@dN4-g7buH^wQa;VNx z*1vN;ywMr9h+M{$s}CsSx<>VSie7ZWwEa)I>c#MKMc7ib1qy52>^cQl_pN^n4N1lP zlvGRcL4d03v(z$OhlhAEe@w}U*l+aiq(Yw1m%6%R0)dfOee@|uMB76GY5Jy28a9)R zC#5{Aus%U9ZuG!^-Pa|3gfjAGx@@kxA|NEWD!)w3K8=B}^*Qz)pW4@(?~$%Wbm{x) z0!+A# zZ5&3k)Q9b$=MQbI<~DDEV>m$3%|Nwo(EH}q*p@fhHyPd)$+FVNeXf~%hm&bq@LVPM zwu9}iP`w^cS)5QBx-HNs!OC);y*eLkd4JHv*0Dx#@_s2@_k*YQx5pC1D?Cw)bk#M= z*q0V5`3M4WgkS^S)lWf{JuN)qwv6?uXtH-*!gK;gip@kKG+@a;UdCP9)p};xrQvkG zjR!63jQ8qZqKl}&gumulN<=FoPI$kL&v{f#UmtBPzCbsK9I{GyW1gP>V}3?V8rdR_ z421H}vXcHO2pb3;un5sVH9b^Ax4!i1dPfdjD|C-Sed-3!0ZIg=r!AmkI14D$XePu{ z1R?PT@sK;Tz(8DiZcX6Oc4+%RlgkU=8!R)fty+9qqU1APH=q zY3@9!D+nqEmwC7^$(g6AzW;WJ@Hf?c-`bJcH5ta8PW+fjK?W_oKSdRuorE#5MQ&+J zT+`<++(1u7ODyzcTX;V5j{=Ce+Uy#v6DG9Qu!s@ zh}UJ>wT%<$gt5D)AAXL=JJdi6SzA-=%(@?SOmhh=E<^>iSKHkl9{Hqp!SRp;sns;M zrP#Ld1Fe#6wfu&n`oOy#Yt zqI8;WiwxmlZ0d8V>Mjo^roi9skA{1>E9^G=eV?{^%ssWdfWiOxPe-!PKVn0jfg%eU zjVb~myA!&Tyl*n06umxJYnD03jR&!8<5e~dVghcjl#C4bsx6G|c8+ zYs%s`m92E|3QK!fZK4++Pq)m4Nfzd5qV#4K{gt=KLI!AVr7YvorPN4t@I#TpcnaOdQ}kF>`5hCpoJ>oSn|JMxkFl(l>IRF(aJHl`X}z(mPGzU zfeQKeF9#z@ z;~4eM?!i6g|Ha{(R8UyxxG*8|N+SyoS$YoV0GTTkFplv{aLj%-T`s>%+ihc4sN&QQ z(0^8ggkC4_Ir{4nAHGJZcrf#oZL`5QS3@}7GEp(HdWgb*7Vx8i$|}7>KN{GZBJ~X(H)@`W?n6rEGw%cnSu0ymm<-&PU4Wn; z*Au$s4ec9tm1iy~MW5JKq%lq!Pbs2yqti|BhcKo7{`e|iF z*aL~LA}85)mK>l3=vFAYfG)pRwDjYl%^1eU6mr9JVM09nA{{Laj9izBgTq^FpJ72NX*sMW>I(2FujYH}qG)nvWfh+9fi#liw!HPZzADJ!qyL z+e;=&7 zm-yJ`BA>5C(^=h-b}aYEZ#U6-7uFy5bg(>>_q6lG>iu-nnU&1+pw8iEnG(DGK|8_R zxJHe`#g3+855EnsiP0OygxdU$$`X=Q4!ZFdo>Og|(LHS3sa(y8J!hreiXb>k#fjxRtm!(UqC zrTQ)Ej?l_EkZ?$3@3NqfBr6s66y{~~J?YWY|| z?4PWyhIgtWCKO;fTZ9D z!wL;P6Ok0OdN4D`1+~)r86uNIYtvnc>G1J6Re~~ZE_QC>lR(YnU9P)ayLZBvXB!RH zBHS>e<=Wk?$$uC<18r6#Svkh>B)nI_t7^6sA^_TPIS;l-P_P-N(p(kC#Y{!dZrZ)b z0uPpVJ8JxKp7|d|XC2k#<3@3s0Ru+KXeQkwq;nu4NEyhNE4s4jDM)vW zQWzm1UBW;@LOOo$?|;tWoH5?_KKHrz^C%9)26f!L5#E`p1b|$+;xTEg?_W$l0}Eai zal+XmT2yoEPU}%xruOv(>3V6E?(+^q+lm6ezQCCv$&$e`6Z-ty6}EvD(J90cavx5^ ziO^lMXdFr_pBCX2CXRR)?uj^gZ;No^Hzh-)eIu2kl5B6N^qM%f^#yFA_`l}C%00&! zYk^T<*a;7c4Ih2B2DM?d5lN%x7e4)ue@4Wlukn_X_is=Oh=YMyrty5wf};OruNql8 z$8+kJ{>H~YS^}7WALa?vSw$Y9EdiJFq-*o||A9EH#|72DsFyi;Uwi~mK3pPhQzG53 zO82Gc1Nk9D=%0K>nqXRQw~U#rhP%`zaYun)mxjf;WG zHfMsODIkX@=~C*ynD6!GW*_F?Y@_Ajt4|h)ej>5H8S~*-eleAOHYm^v=3yOhhA>|+ zlcA}dm`EQ{eewtq#(Qj&Er7&$?ecKJ>RHZ$=#b^I<58|Jm>>JB&ul;}S8@*$<`Y#o)D}5W6H8^HTAO7++vKb)Kp|+z=6Q$-=mm#Jr ziMBF@FN|sB_MO=@+S{er52EaUjl&FZ5ZKAdStM3ztuRr?=kz&oB{=(iWb8}>o?W*y z;4`>Stm|=@bn}K%)hVeCy#!-czP8iauyo0)j~!t(p>=S$5=&xyRaW9HYv^iER&X#h z#S+SXnzEkKZ;;UlT=;xrw(brr@ob$~l=%ZL{rE2#Rj#~#6o=0U{fhr?$PFdLvE@JD zAP1us?Um+)clz83a4>f#etvWA_v;!?Olj==dHAT3j$e!9X-akA8dg<5K9XX(@601oPlS-BvLpw9Z8kR;!+aKeKOax+!R# z+hW8?>|RSAO$I(>HO~(D`$XrT@{}P9(YRWVlbfeo6WK8A(#!3bM`tQOQ?|YB%V=!% z7MlBAM_0RH$e>vJ5$=^{%^xkZx5bp_45|mlWLdQTH5kCW(*TQ!ZmkheRAi42MWlg) zWxosPd!Tpm2q);OIb1yKYM?fuVpCTYGtnyG87fy=OIA;?r?~o=cNx?Nef$VgIpUHelMWW58kai47s;Pte6h9#|(pwS=&YJ#?zAh8TOg6BY>?Y1*@ltBDDMC1ftYY z1);r+NKVR8HY%3ka@D(^f#pApSmbP(0>Q$`>{`O=`YA&ky-bN1_)@)nNI#rLK`&9! z)2fPtR>i+l&LqJ6tZe>#$Md;LyY%vdnv>O{#n8bWqWm-@^7Muf;=fLL_+UA6A%A(e z50J$`5VGB>sJ-2ACAabLGxuvI-mOnSG6YD64JEwewhW-#yUEZnjQ*s)JXF8l`TkXO zFi)gH$NL^vE1frgg#?uU3SHpNIm(>2W{lg8S+afB+#S{mtR8h|WTweS zYpFR&3TvrNiU_=J=enpogD)*GxX*ZHHy>mge`mZ0z6jf*tKy@tn4HXur?gePkF07A z^TAhZm*A}@MtjXZ7Y{b;sm(LJxgh5iRvx_gWTm|Zw8V1q0?pBlvj_HuQO0`|2>n;4Fs4T?W zQR&=zBCz8ZdHPl-Zg^ab?5i2JnzZ9#!FeQ})psbZdh6LwOPZPTXo;Y|l4oIg*5a5u;MW@fQF#v|XhP&qA;ng3#(w#UC;ZiLlbfZMbtcta}|6J=TB^kS349%fPS9g0#Io z`=3SkMV;miNG$o{UycF9k;JkZcTH6%TvAgA-q_)Be8am)tP@`e{s~}ce_O=KBKHg; zur*;HS$e77^p2u$3&@nbS=ICf=Inm^)xv&Q;)13a2HJ@ccb}AsM8r9zyiIZ2MjHY# zKKqr*)GT{N_G{->KrJwER-xr47BWZNDi{DnMZ))3tCgu1srGzFwLyDp8TxU&q=r@R zNzeo8%ie##%*2)00>9QyL|dDQ63v#A=o5)W=A+K^{_f_zbP+I*Nm`YGKJUgGWQlGo zS|&pKxd0toA7Rj*Wt_59rH({-+g1-U@`M}HK7n@vbQjXhHrv=eGrLFKWktg_C23zp zC&pBIvDsDH3776subOOb*kBlc0Sgde#~-4x2v!zxW!5&K?y(Rty1St}(|dQhA$-TT z@ptih7r#|9dMK*7yB`cpbI_7vj&~DTQpUr@i?>8K8K-7m%Xf<}@Vm&#huBsOVxSL6 zG~D{dmM?fzI+0t9x1uNx@4h#-ftxdfRM$RVExt$O#{}bET4{95DzgsH)fixv7+s+$ zN|{TGY))pgqp!5goKkm9)1EWT50nQ^5tuC`?`A(vQCg%=v)Y^@8OkHb28;iJo2`e| zjs7t-IoVj^&yM^i!9HIY)MNO$rp%_=kr6JeDMIv5-QXbnzr1L>)ZD&^(;baPN5-Nh z^3VNI4VzuZQp#ua4Pxe!B;LUmpFKM@hY+UzpY_ptm+zHJb$at5=gjO&%&qdB1Y_ZC z?y^+=%Z$%rgVL_0Ko;`k2!kpP7!lTuyDMJbmTX-{NJCm-rgiWN;j~y>JPEuI>*{z} z%sOt)e|>*>VcO3g%NER=niwc*$^UfU0Dkef-+EB(wKy~Wvh88cCntXG)(D8d{P7gI zIOhq`)90l-NDV=1^;d`iJHD=>A?rg?aF)DBIldDkb2YGTf>4wAP^*D?DUtvqS~>|P zcdmmvrUUzUiO+h{5PDOQ?z@ILF&^!`kdKLK(P|F^yvVp9PY&KU-iqG$4~lPLP1mB3 zoR#Uw<8v^%f}~1NjhN=eS_iwgZ`8TRT6VP>?l<7hm=D=7HU5h$b-OWt6mn}|zg;HQ zZyFx!%cN9u=mI7mErb3=_g&fqI!;KIURH$jD)74dBLc?BWRqX#p^5q!iGZT-D4&9K)LYPaRh@;U5{l}`ULg#JT>q5N5V?Z^9*sDKqFs;Ttq zv)WmiMOu}KgXpi1RDr6FM+hlzERbZ2!a-rL;5h};fs#XTO8slCvPAZAX1g4-yj~Ar zS#zqU1EoMHB&+oNM?4M~z0$Bv;FLR16I8A)VU&WM%(tOKgpok7F=;;gx!~m934yNSYq(k=^V=<|3Sx49~MjsOi-)Pbn&AsT|VZ z#z?o^yV%&ub|G~#5uJ+Y+^^6GVAl>^YQx>xTr*k{a-qa;`2Qqr-;XerdKtj3TXCES zNa07UZ&_aq`sh2{6?xS5jzi=@TzyI`Hv#+7P#->SeBunD`-^BCdY2p${=0|_&E>04^ytf7>bq!cfdTGY0SWrk%7l95P$*Wk^gU!w z%>Xy73*{K!^bn&S{kLw8a8ju{`%!WqtWLDOAv^Gu;=Waw1T@|OH)9S-#hCqIN;mxZ zDjjrM^1zYj!)e~54K0Mz-DUu7sCaJcu@Gyk*m(H}Emw>iYZUf9=8GM|$#GsJ791?- z7nJl*HyNIIs6wvh%{ouu@?g{tQNtp~tHtnv{{wZ#-P7c0^+WemyTtc{&m_B&MD%60zDuKh`A&-ag!l z!Wv;vmWfw(Rw{e$&5?iHb-rFT^ff5IUs(FUOj!3ZVwDAYe?4zjdMS;&;Ju(+|35noP?XEG zR+B+GK!TVT$WC;g>DD)9rgVjzd>@TGS11@Pjp$5g$`>oG*_5v843lVr+0;i&b-0(} zR>Vqum&eLLX9CRE|IyBOq=W}8k9=PbNe<6n)?Tf0w?B&QeBaZ)tZSnJZs-`}?$}bu z_TF?a^&OZouK)c+z@8OHb#m7bosuL~#(aQi3gtM$YGVU+k3eqQ_z5B~x8halK2Xwo zlXn#UBp6Br?&ezY^b@_5a`Hk(v~k8o;UAGi%v5(W-JF5;+idBCyeAD zm|DWmrXd`A)DFWdnJF_j^z!qR#L>v{3sf&^`NXyX&zpQ5+W7ECqrL5yS{$c3k|=jS zmgC>mVVKpBhCjmVP!mOWV)%j4zk`a(1c z6x9I3aHHtQWG|3V#=P7_6zq12F2qw%@xtAlcK^NQ<7v1R_9mMW2n*rxCK6pU)dJnH zwu}&ytrr+Akp|tba%I0Mxuz!?`_dKIovFZIZJze6aWkrCS8*e033Cx>8hK0a5`3TT zs`F=qT`AKI?O6h+m}s7(d#6yUxLcpI_`b<~D~7G7xSy<;S#3O*L7kzn(Z@}BA9=ks zmodRjr~+(O0L}rWNDP%GveO{C0{7EwnkSy_J|-a!hZbYW zyj4MA9V3}J+U}4&h3P;mMq02)bjLS>7PceE!`ymw^49g43oqHZgB7XCy#;wn?N9%`u z6?ou4=o0Z3Jcd7yH-np#A{r+zpzOLXQAB@ndvtm##_fN4ma=eFd5*PGe^#TFJPIlJ zBhwou`##g8+gFl^Otent>J|DMA9wenEbGGKu3AaGVbvw4=dCG#c;Hbm=f zIAl&PGtr!o`DG+zZXola6P@WDjI*961OZ}WAw&e=f~fMZDk1*w@zF}@CrI{C(WG_$ zx>`Ib2Px!Bzou=<1SwO_Iq`3PP(=gYz?V1>*R^KLivsLI;=NlHKuy!X_!E*mB$Cn& z@q76q_toPRxw7pWPH%iQuNx4a(mmv8U+{GOOHYwGK~pDPQ{*nPeuNZ$&sz9DEk~i* z)0$4GZlVyZ@zGb|8iPT(<(P zlbm3cL;IS#(wsQEgGs@Az3;F5_GI7``Z0ue^BLu2w{@$^ziR%}-8<9eJsNYBPCRU)Tk8_vO2Oaog3N$d%uz7e z5Jilq!8|2fhzn|rkX(Km$_XZ+Q9bPX>F8Fqt{4HY4 zg8)YZnUgG2d$=xD;?<-@){Z7iAd9FR{iiO$i^Onhf!H1Z?op&RPEX9y?U(7Vp?`r& zqlspGOSadVTP%fETz7a8ZZAie_~*{J>4;zDhGC*ce~iiCUO5*|pwx;qcfo&^7})$@ z=gY#}g64nnno24-DDvW-Qh-0_*hOuLD&>k>3nDkWzRNh&MYW?Bfw)%wU??^(bc!V> zm4?Kq$I)2=uIeo#IEh;bY~9Kq>;7i7n^ocJeA)#Mwf(kVhw>-TaVm{ODiFW3sFL4}3nXpQ9zC6CZ`L)3a(e;_y z@-u~jpZo$+%?;86&fx3I`W%hzS{0 zhmKDYoF~eWSo}zAmbZt??y-Qj0ugEIhvSfyrI%PHmZK6I)72! zNJ8>-=4TSHFJJ?w0YQFOqSZ3PsxJmH)u(Ca+cXvi?n9G1WNf02P^5ZKq%M>hd04Uy zGZ3>g6POskdf}1}Pd2NLt3E14IEnTRUMWm+)<>Bz!K&49C;b$1zx-rYEPXQ~eq$tR zj-u?4n^G;JN0vrhmn< zRLW`DAy-y9i=8)xWq+*h48C6XtI&sR5f35QJb2uKgE7SVL6UR*D!q8)*H1^NVNXv3 zwUfd9q~y7Fhef5>mw|>0*DCU?q?ertoF#FkP1Jf9)B(9Zi}Z#d?22FVQz_1eVrLPb zylC>O7GSW_#e|`xLuiE1=_8^&)!vCBsz8=8?WV1;^Uq^Dj3C8KGZhn=Xd77~w2dzW zvE{um{+E|#>Iv28?{F0q+mC+bXJj(4de?FNp$L4s&8>JZI7!gg$34Emwl_u(f&<}} z*F@tG=5RMC8ET$URbE}!x(R|9i#kFVV0$6*p*JfPZe;6nHvE-94WNN&7z93MEsgLj zVUo<*G6tcQ(&RK>Py^iHI=Hf<0J4KCma>FX3QYj3U$T?j|5b9v(>E>7vR6p4ihUw5 zXsB_*T0BELXA5zSUD6{O$9D;W3lje3>!>j8-`j@ZPT>pY3#6?^!HOxQL@H6?F5&LmCF4zY&F)wky@6;lH~MvW|KnSCE>wHxnj~0g3%!F9GxJ zcR~tN~Ld`oSn4*aT?0i(T;$FaZjXkk;bui*DoKNy;Jhi{F!GC3}e*4NFlr zK@Zo`w-|P#ObXL>=U99(TnX)Yb(b+3!v=Q3E$Gz;w7Kk$^k?WifegbZ$6NkX>O1E3 zAG&08vjWIqVVx5mT~L`9S@||uLTxPPf5dlXbNi3lcJ5!!k;PWZiN?O=gMHvO>GjN; zuBJ@#GIV$%_OXzpxtKGQ(ZF*2lR{a-^jI>j;(ec z^OsPNqnqKdcC+=50SKHuan-}Z`xOCnNM5YIXZ*Eb+rD-*R+B$TMhz$6xI9jmbC`G) zBFm~pJ{CK(^co06K7czOV~lP4cn0pNpF9 z%BkUtzN3j^Jl}4FvYU?01eR_SHmFw4_6tYqxjIu7!_Bo1SC@5P4>YDUUNmF4^>@!T zc?+*gFx9-FqH`xt;}i-9xs|`%)Y5-bO6fU`HpT{9#m(>Q8jUDXdZH(6L5%0R(j_<2 z%V|#ukKY)y;aKWU?;ged$Dw!^vYtTGBh#L=OZ(XlJ#0L_=)_QQ~- ziw>d|tKo_uKvfUe#oD1(WNDm>7Sj0lS)5mjKj4yZq!;FTbjGM)lc|`1!+xaypWOeK zgn-@yd~>Z7iM^)n3dfF9ZuLF$qHvI(paVLHDr#53Fu)w+H_K!E+{BOm*Tix80=gAB zvwqtYwJHmG$JJEb$}l6&N;+5dfxxwd?WQ?39$Z{#L*?M&;6xU{?R#Q?*kd|H=UyZc3A^uRs437+2& zcoy2zoJ_29c(uP%@{ajx=c~L^zAHN+1x7zhp5{Ce*&J#_HGp=h=tP0KJ+?MuFP(ov z8MvHD!%l~oS)!dUsOIs!a4%h15#z@CKKsXzK^!JCc~D*?Tqk}uH|}#hckrnGvTZhF zKU}$mLVnh5HmenV$Dv->EDZp$eG?7xeMo*b0OPSNFpAf;7T7EW7KsT(;Yl5ncur0R z^iu~Q?xaAE4;;CK(IHGOFvNGilY5KzIk3E%K^lTgy*`G4#{rK)3Ch2MN#9;)Mq;a) zu{!US{Sl~WeSsAb zlKsX9v?%gRk@Ppmmv9SUvEB$Aj~L}p&4=b88#;mAxo8aATZyn$VXQ$L!$5!3@mC|u zUtVA!nu%4PBfz4P_Aa5)(20@?($lU2lC*NZbqN?YBpojAUs}{;D z5~SNxkn2_H$RJ(2za!A!n^rtp+fiyy>)WVBqBle`zTCcVN8Qf9?RaV zOTyjcjVHb7QHxE)*4U``*hhd*RF7jgAK=ib~PGBQFUc+u!0bd=@CjJ3jk z23S$S?op+^-sks+snWxw{7KZwcc>xoCnGV_Cx*9AcDS7d?f)a(kE}2HVPB*dh}$x) z8TyLFxX8ZLn*R#pF#R~`auQw9T=Q_tJ+d8~>%Mv~tpujOu}m<&Ush9=DGsiLX=?w( zuT^&uspZ+4%SF~3c3?2xme`yX^(*SZj%_j*X#Q#_F0 zrDC>=4wYR)vF#CUw`4rU)~EGXkF;I>`|n(9$Em`o#TYL^o9dMpZDjIVa+|`K-@L8D zpIHgzlQLeXeIP~~#09t&`dd5xe)fo0spv82N6D+t^+%F8SZ3eXSS-9shbo7QP7vb^pW zkyy2(H53JdSXjv0>TnLvY{LO>gL7;bUs2|JT6-#?O`NfYl*rF@lVY zl0AP>oHRm;myo>o4eoO#j+(cD&y~0Lm zH=fN;)bpyi0E_G>hiL!FWd=h5Z86Ubl7jwd+Kfx_ZOAaL_OEm ztr_k=`J7bZqR;=Ay11=b*5)HY6adbM{Mt+2wfKh`cR`gF>$(UV5>&!hKZ>=dK{Q(Q zKH%#wA&2scEfgLW31E7VBr)vw_}>{e1RA!Wg1`k&k&hw3qe-kl2lr>~jvS4ys8qY1 z{tEU~9)*Q&)=5CuZ0W#@(?ZbD?Po_MAd82fpl7RjQQ4-B$PJ*pxsLb{PwL0MNAm+q zqt9ALr@@ub@Rf`9mAu$t2F04XsV9ww|K}^LJAc93ETWoc#Pq*6BM*}kPJc&v(uRxg zMvAkoY*iZ~7f~XSL*msZF|(J}iXG=A71sv0W}j}Z?)2|1T&EM|j>QFuU_^ms)qQ@#9NiQ8g?+z&7pyl-W!tb@jimGK7kT=gzFzSXlzFx&M~^ssi5M! z$V(&PIe4r$@R-xVexn=1`WvV&C8*uh<|}?ifJdhrnT-q8=r3CYuANy$vK*3QqZkDP z@O0Y@k7ITtdWt!-+3x}GQHDe=HiUv7Wx?40ee%;{fZ-l({%gr3tTsUild0|*+6~oY zp~ilRgUr!~y<3=uVy)VO3IvGmlfw{pC zha&ukh2;cNWt39#j&u!a$FxOZ-ph_DJAqE3dQArHd1NKP2L*>jX)qurSuT?Wh$f_aTOR;py3NvGO+}rZb5_h6 zg}Ya80KJtnPfLa{Z!-~$l9&4B&DZio9vka%Dc#oG~JQ4QL5?|Ztz}G0r z>t#83v^4Dvat&A2MxpgSi|Kq$5Pw&wTfw|8P_-_HS|5Rv%OyjP)FGLo%@6`txAk-r z9!>Yf$74Ltyj+QpK8?kNyO){(?VckXn>u!@c9dM*HVl}97^Eol+?cnM7{Q3kC}?c# z2lya&|MBkMG3=~MX3x2*;)vSIoRbUm)3#QZN78;2>IAQ=e}7BO6EaDct$5x{e{hbV zy{R@VtUhT@^$FyO2 zm&PPU8!Mitb2k^g$ghog`IX%v>5lC4PnOohD5moDhK&c3donzU$8UBF-4YtP;{tpG zEQhrKJ>CyE!K}LXRRlK6Zj?{{k{UN{qf6l`uNJ&db4AlA6Svme0;B3x&Bjlifo+iw z`wM=~Lar@@vzS=0i^UK^Cc{=X0XiJk$ksgHm= z2X@q(Wd2fiiW8BfGaPg(o2D4hX67SvtN|l^pWO2{M}K)Om`%7vBsOrL?0fs{nkmt! zDbbFZl@4qt!Rp1|7hOnf$Ab@jVTxNm%Bi4BAMmk$+Z^8C)#r4G>L{ue7a~V7>FI=+7DvGXRzL*6e{^0wR}m9U1*L!h4b>2Ob1MG?x1zsxjtv zL(IBGbOI>MH+};~3=#&ic#T}oY7<~X&?!Ipc*o3{Q}Dg}=Vs7HJEQXek%@$_&jt+kYz`{=&X29z~r57>2Na?`|lop@eHn?mn%* z%tHX`qZQ$VyZvI21z~o5C3PO<@g6~_$^w~-ZO*5ld+BBLYd@MC{gYQG8hdgYRe1#5 zul325U+dZobsHh(hz5uT5TxbE!|G))nkj;L%r;A{{GIqN3vPyLcGL8@VVD%${vz1C z7<-%tfEXyqqs*H!H&kOE}b$%|%k34yO z9_!ux02Qk!jbtYo+wQ@Zq}gQYH7&q?ajYxzGe%;+oC);31uqhwT{#JZ9?vdRTD_q~ zYysE`P0)`k03w82t6`BC54Nj+Rr`!BX#e?8RDLxDrL8XY3-YsVhP?tuq_u~2Zsh4k z*zJypioma9Pqw2QY0zUEcATs_UZrXtJ9aXsU%CHpu+PUWNqgINgykZzFlIN9?!Xu@ z0uR4qkt0zD(|$Wur|W^glnpu}gOmEW0jDz{H{N$y+xhon0aF)c^6i;`^v;UZXtGwVFowB1OhBm9Xo{DSPr zhODsQfh_C>W9nI;VC^Oat~z2ZkNWB@``m)LsDF$%T3_jS`~!~X$G2abZ+rGbD_e_L zwo8EUP{^Jos%*eU$ZMBrs)o&6CBeCiMmF`aoJT=!k)L>oJ5444A{QwanTZcpG0q$D z?^iQz`8g}P?(>D6Px4qa>;_b;-sHxjek0E*if~n&Z0$S0zg)|Dy75(c$g<_J#QRaz zfyXFy=m)r^EKC~VR#5jQ+8%9XUlqOh(?ioQD(Ij7kY&4tIYTtJp_hiz4?=zxjQME! z2k{I3Zg-;x_Ole(0H}@y%hzC&s1edLYb~@wkjMp0Xjb-bas^X&+a$~`P1t3o z1}>qY*>N5T_t*^wf7Rb@aUWE1! z{ZE#ovondq=kk*CeVY6YkaX!t_h`f9)Yr91`eO#LuM3t4*--{cM*iYc;%hv z7t~gT4yZ# zsx9|5lckash&#OrePdThLEU0VLq7)UuAA&j=uS!{;o}3ubJ0PMXI#~D=WwSPb8kyM zLH1zV&`|@iMUCTU|2FFBs*E?iCVqWp?@X%=-E}e&TYI=02z{!@6po#BjAjC!^L0S< z$3pQV1-Ha^LfDBczx=vT;vjOE3$8e--2{I0W7w6}bb>D!Y#*4~NA-JSX9!OJRktYX zSn{|LsBM%V(=qGj9n09+{t{eA!+%c$?O}h_1w&(0V*!^+Cljrn#3hGHYnMA8l6~1{ ziNlZ2+i{kLW1<|*T~q{RA16Wja3;Ke$^ZS2`1{;DBeV_J9`o+G^^cnevYK!c{}-_O zM*8997Q!Yz;NFzBQ=Pd^Hkui9N=h!*3&ER zXBe-Z-zP}bd=Gr}>(eys$XW92G)KnwH~e@v2I4Vxs?ME)YG5~ZAW)D~luH3Kmb$GY zPZJuf*^*4FU@&ZmYM55;mY{#D7>}I^a}IJ&b_b21YAa0deXk>3>uHxL0z3NjSgQs6 zL+hEJFUOE3ID;@V;y<+d@g2Su{bL3T=(lhup54CG<%7Au zs2{ZFPVvaiV)r62A=_4&(}8++(3+P3w2iByCDnGIy$P={=-#DduZ3#!o5^D)vv7M| zMds9I7V`OfddBlSMn2$Ffy-HxC?Ru5j1GfY6t;-8j(Q+Lc9fnFF`s-7xbsH)1eDOB zQlc*L@~rz@iC6CAwJFLUqm<8KJ2CKfpXmfy4xM?jpdGQ!%+-O=(_m2+7n!?UUCKd5P4ZEPmy(2p|zS^geQIPv6o!%Y6lX_)pt~kQEvabO}TeT zv@XIhL&=wrg@uP|^&zX;>;XF4v-67DqC*a}jEcC!Jh}Ka3B4r;cnMF%LR3za2AW_4 zQrUXeeFtb+%Wbm5RaO;7mp(aq4iqTlho9$+1-;3ctB#8w=XjJ5ZQlW$n;;edQ^QWw z1?JAu&sz`TJJ+i=_5yk2a+&BZ<2Ix$B-#p^yR0YQlF3-jz*%ca76^}-&Pskj*XP}J zW>1ib4VLM$RSD~?7J(p4V-g9R-iBi?%bfXHh6{R?!dc6b;avN+9ge*EK= zN!%^J-xCECXrHbK2`HY;7<-?{&~9HnEmj)iZn&r=aHLS=1K1v`CL}{5NGu$4RiH~S zufd^I>{+oD#yx&;--+-2KMX-6a}J?d)E4}78C)y^`q4E0-gwGxhESkr;Po##o%B4T zgMGAYOF4f`R4K3wu)lan=GrFWXC^K!UDPfp8_b57^!nDc^=XyN!pG8hN8s@}N;(d> z|6m7hKrT%H3!nn6q}To_%IV>wTPY?%kB!qad18Iio)9m_z}S3(1;%epj6MFEq$nN% zgU}{*O6T^c4HJtQFS1Ie#!SO(_7R;aMm6sk3cAx^G>jK2t=3-f1xmtg;j1)}uyx6N z@W=&-r3CI&mwDWY@q~;BWtT%P0lcAkw)}3Gg^L4SN1m1^#Y+T3BX|3_j9RX!o0|W zrad8@qVMa-(aY=Hlz9)*pfzbs$vmxltH{u)0(m!`NYgvID%Y0SYxHds?&Zvr!}Vs# zaTVS@)ofQFZ!(_A_g3k7j3suIaiPgzgfjNQVsaiPm)5O0-f`U$C6urXUhZia_K+lT zQWj~3+yY*4l0~v6`*3qdq6FyoZ(pa?Ipxkpa-U-Sx>9wxv zZd$x~M4OHqk(CzaE27T77qCv5jj9cW$=+u{{bf?y;2C5b^rcdFeDU`eguwB8T~-K= z@<(Q^9F(qihvuUh*uyGJavLE>I23R{tNn4%wy${#^p9Af+Z zBm)pJ`lWo{zfDWsJ8?bXLc)AtLJdh)XfNY=5uG^Z>k_rC?~C(g*DT%FUkJzyPz5EI)-`z)1v*t{I+3rqad*GPsAn8OPl57RT`U}K>$qod#iakz56Vpri}7!sE)lYfCCVugx;}Vfg;h2r<%k^R4K4R=icHL+ zDw>Sczh^V&NuK2i_5n9mJ@YPBV<}Q6AC3i z?K}#ldo519-V=Cp>iP^jFUNr^t~>dJ5>#Gp@m2`=)~iZ!XL^YC<9)m3*c`qAlctW!{vlpI{i3^c@?~J0b9kqq{0hiRR^%MZ1B^ z)Srv~GD}DEUa|h>F4p!u0is#(dbgNdoi+9Et`1`Zr#$x==Rp%|gYMCx@B~SGS6*X3 z0$1-3vL8!?ko!-h5n2yeb_3Fh+t)((#=cs!T8K_(wL@JiPh@w!QH0tbD5ZNqD~cq^ zyfN?YQ(n(4;$ahP`9^ZSC$pG)W07O!SUP!U+kAWdIew;8nPH^BTL~LMBD34)svp4L zSIqCl1alz^q;|>jUHuRS&MCtFh~5laravvl@uVKE@v`x_e+&Ffvw}#=0PKqjcksF5 zf52WOO+=1TjDeVf3-mbe8txhD9(I{X8s zQJc>+GTCBGE)~u(`3ufV&$C0tC0f_ZXMqVm+p#k;L+ zVNIQNH4Rj3C#-AQf@q$_j2Nejoi;fLt$Yiz1MT>;&t02OZ7t}ZSPTZ%UtEAWBKFKR zIlF4*_MGlMZqbCF%Cr(XBs3^|S#;@it?35jz%P#bVv8{o z+}9kHBAYNtazjkA%NzW(TzAoSIpJAjAyX zj%8&nu7Q5_m}F@9G2N|xRpy~fe9cfEN5iA%uOsYvVX^-tsP676YM6hAozyLErmtrs zu_Q6l6As$)feji-TjPIPo=P0HeLuhCppV3Af}OlcD5P_3Idp-(`_BsydXayZ2GTN! zHwG+g)5`5fT~aI3aiOSm31SAR+KCtKDf#qgFIhJ^nV&!sA~|zxf-5YCD))OWCFSZww_21k9bS|CqK~r6id2x9&qoOudIMp!Tp3ec(2Nb0pTV1}FE*N}jXhGo39T5@VlgO3?pp z1CA<4HFS9wA7ZLP5?3jR#G)d0SGKNI@X-0bqI@adcuGX*_XA{x{`83IU{X+JxMPy1 zxmu%uWfYrfV#`x^2SJ^HsV_etf)?K}(OszhTj2>UTSJ8E!BAAHug3qfI-|d1M=}n} zn_hrUBmPjS;%~gYdiu%Jt`I&O@rT}eJ&W-IA=GDXMRDd64dSbZh~Xm2LHm1Wixd=BUav%8ZXjZ)8Jq zUz97Lq(W*eFOHSn2cips@X6uck9o{zJY<%aO2Gx!h8fx;-538Q3<5!bR zS#dhLjcBNWvPQ^&vRb|WL-jy__dI~(8lmo)RVe!VvkcN=0`mrw5aSm(u2R)u4_+QnBCk@CU6zXuA|;nXv5E?>M~dr0*${p;Zrkbm)nVOBK~@WfHA?U| zFOpE>yB5(ts-VZz@!z!iFi^`yYM#b_ycm8_sJ*I_7z$?f&yQ@{dbgC3Y&d%Chh>fK zk+p`_g${3fiAvZ}Ts_|f*{%zUdsgrh+qP@y~!AXp>Ky~vegtL7wl415L2l%{)-L@$t7c7AH)Ot)Nnva)%S zxPP~_jc+b|I6mriOf2b+|HmkQ$S^x8_ zU_6<%YLq3V^`bz71zRp-nG8oR4avRD01i+BTLt%r%m4n+iX023Q@tWX zGfsSb!0AoZ>)GY;R%FGo;UpB(9Pc4|8iX8`RY~IwW<6dj2>Yx{`{iK{2yN3hF_ObM z7ygs|di1{tf2VdKKmL;cC;a;riMV9ih)Bp!1<++#UqEQ15MZK7x1!zJc|v;-DBK)W z2#}6DFbX`##L8JQIUyTVCq6>!Is0?!gB5brw=aqOtTr)}2&bDo*1JfL#9`*}&?jqd zt$cK6fkJ*}h1$xf^S)`V6m_xFj)7!8U?IW#OF<>GC;rYbF6r)hF=3%j+Zpj_z-#29 z^|d3zt#qU%HfW5;eWi^1s*sDr;GZSgf+Y2r_O~VA${UURz%-DFz|AtF$Tn|Z;N_&4 z8;C2SOUgcK)t7`%D^#mFMf$x$fbug*(5d8TF>R-Hk&P?KNNm*E(JaJ&Vv`T}iCz{U z-(gmaH+Pa%F5_Ks6bH`>6D=}%``DNv6DeNCbT$7tv}4^X_M|;6T)i`GfeSdmA_=_I z9?Nzf<@l?yaQ+I#lF=bPymouk1Y<);p7a6DLmpsi@MqcA_P#PP_THg3ZaM%?u^c1H z-TdA9Qr()xhJG0E)B}NcpS{9iZwzYbG@X9G??Rz7EjGE>wNM8(XSXz+nX=;->#tGB zc8)M64dId0zx}pxaISfDnOqPgHK?4*-QJc9|KQV}wr0_pVn4!_5RqpV@FWGN?w;W+ z=$Cw*AVW_+Iiir{0W~9Vwz_dWboYZvzPmH0eS9Y6qVbVr%iUk_$(0HtCCvEkvm-+l z;R75-f%cCY3+C>V{KA*R4En}}_r*T-XH|?6u47`{ooDI(qFdua04q1HK6;Mb+T7oz zP4!oJL+b_2CNPI2**#4DWL7Y^0boP;M?k}Cy(OI)_eGtwY8G6O$1Aq+s0VBVO^lVD z;Q*CyQieNji%*{8(NcM|am-B{^OXCi@hGO?sGeEey|kCwRJyqK3W)!Wsb^6>eZ&0( z1{0pBTelO~iF1!#l-#dNu-E;9#h6nB=!ZD!Cj6}DrsPl2R`J2_3Z*y^%=J&czIoqe zB$lzi5r40pX|LqpdxF127`lS>s&=7^#p+MLDQ0H;lioUXixcio~YbsoVNm0$qx>?09F(?n5qlG16&6vCx88XP1BP zxJRp@O<9W(VgpF9a+$0m}2=>p)OjSv0h%( zCy_M5YD5E-34H4r)%bpVl8=|mdDX{CVDa-@A{pWCG)d>rz-CyKlqFH0R1eWO9w~=x zZt-(Bt%AHitk(Z!$6qM4{D~Z6r_-PY)@w09MEP0^lyLJsQnXFrZVo;ssdxFgj;t4L({g1lM~_D{~ke^J!dDUXb5 z+pt_-0;R-RV_#9=CX}@hk{xOB2+~d|&CbXf!4~F|*Uy-7-Q!$oB&uFp1glWrF(c0! zfN%^8Ag;jkC+h%Zq<(0@iNc#42ovkS4gE`-C|1N-=|u^0#mm0BN@ z*qv|shJE&*dr852zPTgblQIZi5+vLhSFbKHEvLfYcJCC=`z5K1-B?tFZM5rNMSmLw z%c2s;snRHyx4r>IKe@u8x~)t*x|t`ip}WDb`#^Y>+4T4lJyM{t9FYKG%Y(^*eSzaM zQ5rSCO_l`!lhsQnA8-#=e<(~DDenBm{>Ogi;nbc-hysR!<;0t1ILExN7UEa(c&vsT z63nx|GAAq>U9g43W>buppO?W0!kU95m=Q@p5URcq1z{DjEu7<&o-8r#>?qVWa3JJ- z0yU1%i|g{cPD?oIu9v^~b>i>x$DwD+|7{NU|2R6!xF+8=4AX4nBu6u8kP?utfpl7^ zbfa_%qhX91jdTqVFi4S*ZV`ncC`d|okFNLmzhC*l55~rG-`91X$I;1t{iTB#00v5d zT>Fs#Yv?`r)e_^ET8dF?L@a#Rk;3Qeliq^$0OM zwv>jikd#E1U{@h;LA8i~GunVyDTl>#c*~~m>mLO)0qsCnLLSbD?jiQ#R*eC zm+hlUy&_T%&v(1D1&*8@Oy4XujNj_<_a1Z$4zj|2-^bwHzDTv?VLF!)?dVR9@EW|w zpY|h2i@hxZCZJVkcAt}$CjEYPvS8Xlz~o}+cbS`E>63s$&zg}zy)&8!4BvQv4raM_|zLzndJ86D8C)K3}PaI?sZA;HdOqHlwgsR@+`dfM&RP4Q&ow(sKb zi(fcaklycj{p0PCwDY}JtC14`-KWitYEX_|q&SN>cUX$>IGK}Tj+05|M%5+%>K^ro z<_pK-%2!&HN+zoH_}RkR(IXj7P1F)Q7p?z+OpHN0>MKbkSQq}1z6YQGuD4FT8tvl5 zh56CSr~!;f;laFcjp*1+NKPRM1a6oW)89jq*bjYK^Mbc(nn%1}>!#u%%zo{yIKhL9Q!w~shT8HTAq4-lIX#9S{_PbQBYCD*kJdFv{$x7 zZDuUNaHkE4g<1uFmj5k3B|)a{45ji8g{pMCpa8l0>w4c&>rY*@8iGCpf}pH%_>On3^PU zpAaIX12lR2VU~hS?3FerZu;Sno?>yzp8fRG+Rv3pl~K>%g=u*XgmBtAK_rSo)rnsS ziKT<{J*oTZ7XNW42jQ}R zbe~-5@%nECX1FP5&Mi~H$VP;SOc=Kqef&SB?bT8FZ`83(v`pF4#1LykF?xZ%j0!4($OsyLRZOo0RTbxi`dki znRM`vErK;#j~R;~+v=7NFQb0-$(&rd^!+qqChD5p%(8|%RUPKWKUm74Ub$7nol=j^ zOF8&tA^=4!JQV5E-8qDrIAP@{Z`wOEyx@*d;488d@3-_|q6L8|49U0rvApByp6Am^P>` z7{j*3$%{0opHsh8peSJ?VVG9D@qU)i$bo*!Z0lB~qnJr9x}CvIu_SgO9$rhX6G&wH zl4jxzIz_Ouo%>rjgg;yfT}}~b7d3B0?KIvch72)3>nJQ@whjFAOOaUv4lw z2R}BAM}yfvb4prXbwNXDkyL1W%rz1#lT_H~Wq%D)^RW71Yc>SBAY7w@JN==D)x%%I zotWz&p|Z$>qaov@WRDdlu+28ky_ItpsHCsA3*F&=b;FFtIF-W?9o;pj6XtJ0ZA7QR zT$n0=&etInC9f>e8qF-CD?rvylXyMTzLvV(R9;wDuI6OU zue)#r#Fos%Pbh#t7_kZ4gU*p0F0vxEkL&oFcwNu)#MGTdv_Gvh02CVDG=rPB+_m~O z_h6&pj>+X^t?8c>Ep-=GLb?0OZ}@AwM3bvBlN~iGD7A`jnW|U>Jg@hNZvsWcuc%Iy z`=ks@t%kS;OEmd=hFkfN4wFV!k5m7>%-54W*A$q!CKq5nd&#?Z`Hl`3EEvn%JuywQRms!d0QJayaM>< z>clJv$~xEnyHKa5*Rtg{7#p?p)%ck--04elX_@ksFPu z1utoc498Y=$pX*%)sZz!A4*&J=_zw09yhhx%!w;PG=^j z{%%bmv@p9S(|Q&)h74>ahO^9JvpVMR;f`b4MJEau0xm}DlSF+YW?S6>K0Yv9iEV1U zWreGZpv5{=>1~OIR+q1q^su+;JXe^XN}ag-l!?{cQriZ&%?Hx)CXVfET}W_D>t9TZ zqgw!fL&?1M*$;P~=Hs{R9x*mIt5@5Rb3Z1BVIWJvmi6C>vK19Of8mTwXvG=&r3EL*e@V&npbu@BHs`+3aEO^2l z8yH1#FUaAa6@I6XbXO}1gDT_sM3DIk)s{0yDgDip(YtGT^L(_R3Lzl)?gIoIC8#c1 zRGhdhB-^s2m*#Lzb5~Qc%J-W3kyyW}zM8Z;pbS@XBDuQ7MMgb9fCX{|fJ=}WK4zMI z`4>C#*}+!;x%!e1UE;Q8lGI8y5KypkoO4`@UqtyT%14(MCb6mX^>s8Nj|NWb!UD;e z8#m>748yVie*487bM+Y*Ycd7=#^!yyBuK}&0j+^L5AOuwbXO99$E+fHk)2?DVa10g zE{G-`(Ud!T+v4qzdnlZXP$^eix5fj;VW`;}Je+dY-=f3M)GYQ_KQsn&=J=`P+!vLU zfwQZFD~c_)RhWa0w1YD%#)m;VzOq6)e1)j~aaCX1v2}bzmk&@E0Q^Cx#lkkyFrQ~B z3;Wqp&Bh8>hiR6Xzj6b-D(&<59c3;V5j1j{0ut^&K75jo) ztQ`;MAlcxs+7wKoAYT)YY|!><$=XV1Q0HwDtjUDzRGcTU-U$j;tK(<>6EX7O)HAV6 z?NrxZ;n${FyPC_l5`D!aUGB8oz5vC7OjBOkIPBc|xxw1=nK6_t6CLqf|MkXO7uA<= zyKXz;U*8HVizr-6;M*03s2$FjwZ+(z54M|k3bcz7kLuER!wd-9Gti>yrpTRP#`~>} zfOiaVSpiTySBE0Ex-@?V#X9=14mS9fXL?JaN$-Fq@9__gXQ z!!h4uLmrS^2naW|YtKCPOxh4mes+Kn4-jv<5TCqoq}4I)_Q&#u^@kwN5^C)vk$!+5 z?}^MD0jBcWXVjbF<)I&_Qrrd5x@MJTxVkB4k<3Ju|1rXz=hp$d8}( zM9Rn_x!+$R-D7z+0=o%D`&@t}Yu#0y*xyvy>#g=IipT@!u7tlp2lD)h=&ODSUiFpc zCdM9jrx@xO6keA*f^d>A!#i z6WIrOKG{Hv*tWgeCh6Hf;9Mbk;8`7~sph4U@^~dM{ofoNp;m4L!bbKiix2qd^)oN{ z%OR<%G_te47ZPKdi>2RMop2C1B`l%qJW5>ViQ%+zz&9XUkbu>jDi%}cthFj5d0ET% z9~+P=h5?7nm({w-{jNWW^Vbz6rg&sZdXlr(CnTo(Mhxq*C%6^7!-XmTXWPP=JVuoE zbQ_CtEoL*rQsmc}?y?)i370Z}%Hr6QdP)w4Gp^s`AjF7MRoW;+AuM#sV54I1X?GnM zcc%EnC_}!{uUWBslN^K;n9nXPA~;#o!S)pN-J1S4@Zlfo%)!mxtM zH1KH0QynM2!Ual2Mtl9qxK`Bq-!=-@0P%$KYq6UoErX2%n4uGD*@~Zvc=V|w_wy)E z8e1O4lJgg~c$W(o@r%w){KI}wck?>p}-Ro_V)XpyH1s@#QCVXH0y)rzVThDLaw1 z1&urJ)LV9ei~Fbs`qj@0u5nsMHuM9_RIQ_j;4fyWR>0Nejnxlm5YOX_0qrC%r;DT{Qsz@x8=Yquqbr z0jKA8%OupkCbX2ROB^mStJW^QPFy}!NN;T~rmJrv)(2UV;-|`PV(x4is#wjjP)b zO^$y92E%(fXC|Oy)!@CzBf%=I)}7krH`xE$gPNQSNGi8r!E;hDCiE2m1AMNDXKsz> zL|~6FTzhtx@~H`raj-f3_)YT3$h(?T@2IM3LZAxzb+5X*MziH7I@aUQf|UWgVc20D70nn`SUZ`E7UQf9F2c5uwU3kK2V^BWOJ&-AB6w`-KD>nu696P%LYr4k!5KQ1VNqTF8x{nI9#*J7V~ zM6;p)?>Uv4y^rGC@rDt*%^Lu7_pdy49T6jYA+oHrni!Zm?W2qD&ANdu5>ePOwEI3> z?a6_gCK>m>_8sI4>i33j@=kd?wZV#}LK_dIXD34PhXQM_ABYX;n0zSzq<|+h{8Bx@yY10Wx%4 zFp7h$s`pqp>B|qmFNM~mFlVqIfUr^Fm_m%jS^JIe)9B$8K2L zo;CNiU16&MPH@}=9YX!`J*{=s>IJ2e97ctjW#P_G$pxlRFHoCHd4yeD@F3Nsy-dR~Hh$?zvhhrz#2A*5I%%^M zaAjj}`>jxH{zc_7Exg36Bx@ov{!M59w1^V$UPpZ<#>CGP!cF)862k!c!2qihU$#>@ z65Gs+{IkzOmrl)Qagz?@ssj&heGWt(Dlwj@-9}a_7FvFVA+*Z#Z~Yd|fh6%)6ritmK;|E;MPqZhy_IkaKE|YGUWoeb6Oba~xh69(lKRZ|4E_N&6UqTeaQqLn zWytIJF>`w(;XV*!VDX+JLMuj@?shRKx*(^8D`;9oUYcM`11;X|KCXMblA5oX{7UD8 z&V91i+_Wp(kw3G{pYvrmo6RKt^NS>FOK_DL$$(#gU;R8AP^cn5xK7?@rj?oIJVC<# zT)Q^UtQ}DdCbGbUq4Qb5n5Lgc%Ouv0Ti0&p$1`;PbkqSbxO@!C0A7>#K;7Pi4^!pQ zHpkbfH&*GH3r-p!_;#hw`P1jl{k5eK;;4myu%p`J$mu`-gW(`}Qm`QDWgq!L(0ExqEsYATdW-RfEzp7l zF5VOwL29opvE)3~9o)>->!$8}ybld5-1N-Ip6F}OHv%2LFl^g5p{0u}D5&jp2l90l zjRg3XBwnE$AXm+tn_s|czsa1Ov{(CGbYaPz&OZfFU2k4=f0MUmqqU(?GNtJhN1z`q zjAMzNF}?d^(jmnrRDJcVIvhQASnnnZGMKd&Sdsoj$i?A|(s`6ZFvLLO3O{m~R>d2m z7AinDa%_Y=u!M||Ee3`7Y4m*~UKx+u+eS`4+eyF2@AUUc%$s1r#2Y@EsS7;RqAdRl zqCO)66DI7-F5jHz7#WTDJtt8dQRe3|0o)hNjku_vQTrNxl`k8ZQ2=(0dv+TxKr6fxA4Ne#E= zfD~43lSktF4mv|cB5P}2W$k|?6A^=kS+hLa6NLJHqh;&>|H(`9pHTa6F>CV!oQcg+ zl^>8Yi!JaZRoqI7`@HyxyJc5*CIY+82%G^KDW2b~y>E^QPM1R8XEr-|I>1dmaLy#M zq%OZo$*CXB)0Ih32$VkKF8gn$zS)&hkd686aX;li1+yyx{ML~T+>NOI6 zvv=_DZgJY`s!z~LEERIZvH}bJx~Y>skMHhG^hKS}@3lL_*S%%t0Vuo4j{N~}9B4JS zj43}V@XvAA-fdU|z_{{6m=b+Pso~(5gGlS`)qe%eI}_Z0{GJvkd#q6&6kRXxUYYT_ zc6Uc+{wX48M7Pc)5OjrAH75$lHLwc`iim!M=-@*M+4Z@|od!T4?gw zKgQHvaboN%_{jPMtRBDoahoAe^;!zIshc*{_vBhj@Fz(MyoQ4>6eE$>zh`a_AX8-a zK)`Ky+UgtNt{7iQ7a@l)P2E>0+0G+a2bkq++~te+rz(Njmzhh=6-|M!aW@kCvysOd zzTO(CoCyRR!Mfy{s_SO;(`FItAB31+F9vh^ur7XR5ngZwJQsuW0?6UL5W%!*_E-Gm z1T+5f6auV#08!BA_2opWBYgd8r%?B%Q>dPaP@NH{@>Th5US+l9FfKi~BQGA<@Y*%1e$i5v^L)_YLk_e}UL3Gao^gOL$)`FsS^LYn_nsfW=^HzEQdZnb)`AVq zaofE0yy9?eO1zvMkMaN)Jq`kog=l)Mt0r9bG9R?0VC1tb$3>?pr^SGqVxr2T(^fik z%9Czq(%f4u?kpmb+{z};%FOYE-f-}tb`jf3$?YAuCbRhJT|*d(OYk9!0~9=?+?ohs zzUa;2V*a|Od=II_8~#NTQ|?tsauqFpFT6REa|$%%N#QNE`<4pRQn(dQETW|)x?BMm z=aE?9(*(I!y$W?V-2DSRG-lyPFU1(7X8-i1sJ&W{q0xWSH+){V@fEeSFB+}X5c3aE zbjno%S#4;K8gjU)oY8)5qUi=3YC^OAYmjhBdRm2TwZ>PIPHBvx2pxv~2)wVIKdsUS z(vy&$J%zeZh|oFBxVwPzMR4dcO`i%fdoUPs1s5e-ym%9i-Hg4a<*fHUpsE#SMgCOZ zTVT7O*z^vG!a~-+02Xieb|=2naUGg%7YHNMOKc0s(;P7euVct2y;sSvkBeBacnJQ7T zqMD=xOO(yMQvl!Y+qB0*eE$6gvT+64$Q`}gu+d|AR6YbjHZYtn9c<{|xAx1m ztJ;2Rbz}_oQ!|+gGDtn1v<(0HkjcMXD%RVp4WO6fxz4Utiep0Y;4QpgVsrJJZ9c=D zP)lc?kgprU5attF{G0K9WlCfL`dWbh^DFfGA6}8J=mQ)ft~_FQ8me}x{Y?Bje}_)q zdmT@1p(keV1!t#dS8Q1DV}zdEfAl+5)ii$x7zQ9HXfJ@$+tska-5o^8d%KT}B8_`g z7;s@U_qiX)HO6;FE@|YR>Pt#cWdYVq3v$~=376-^Y}3IdI7k#GyvI0w{y?!Asg&Za z)kF3{*1)M}oj&ldF&aN#24FXS>&e2KA{zjz-4o6Q*d>pjqyhBI7Cc;0uILFB4+D}h z%})1-b>McRIFwyBI&y{26bIgcFL@r&MoNQ$t%k_3?Y%so8odBY_|YV=?E+LJNC!QD zwEbgIaL|sl+n35GuJe;0*fxwjbduMYg1uckVNujANEDEA?2JoG9#4%z!*UDl?8L2P zNOkp|f%#c(q6qyRJ|oQJ%g49Ex(_+i%RP)W$g%RqB*WRli=A!TTDd^MSgtu{0i>!X zMnqVx!*~K)*UIY!*??~r6O29;Jr{F{LL6@XYq9^v@^ayI&VCcIITK1P%9Rb?!Q|*@EfULsZd7OV zGt=rT<~Z$DNt6_yOK(}EOXq=(J7fM;i7ONlI)e&f&Ic@TcjE{>xRx|=TtQ*se5RUe z6(g7j2ZcN8OER{~5_FnH5!f6n2pQvo!0>6w zHkdl0j{?*5o->~gN6y!a3ba2W*50G7bqCC%!lzQJLYSuN0ztQ`C|E0zm}P zC=SiOL$AmTcUIVv{O_GG$+yfKQ_d&Z=0tce^EaA4#LOk1n&+<<<;0ags1h&7l>aGN zUhS7f_?FVJel!+9DgbReTYm{0ibtajrf>A!Tq}~YU(IjB7+i0b;(tpUd#sdkRV6RB ze4rYMypq~z8J{TF}tjs{h8v{y=9}c>Td^pEYs#0=KO?>d!Nrj{yMcD`I?d2?A#6Sct59dri+(1azY8UZi|Qr=zL zV8B<~ZzkF7YSr88tD837k_IbD;D>_q>5uFqFsQlUH)`v8;uL{!VyChAlkUlmB8%5% z|B^h5uj9oHXw-A#X)iq3@NtFga28YeIyMV(QLi_LdtPk6*4KQ|#FV(ib9nua62g3K z1A_0-QV!NG7WHP7h)Uce?Q&ar0hX{ML;5C9M|jQn7#2g=B|Os%f`Ge zu+i;LYah^%Nx;9k)w8)4?Q6eu769z&0%gv0$OZ+>QmZJjZD8@~d+tVs47yF(KmO+3 z?E#CK6o6F?(I|>f@}iR;Pal>gVFNdXTx2hQnRyCSh(>@D?*?VQzq{dj z%l+n|uuS0KyCJI&0QnAX9zG^pVxv*!UpUtEgr6n|FE&*YbInT8Bau zp!`p*++boXFVG_U1d%g(V|thZB+4*CJ%(7*oHb@I?bO!xMZrTq{h4phKKr@?3dey0 zb~1^(<&S0(gPvNZ@gFkG`kT*OSC^h`h6+BWx_w3ih!1+Js(CD7ILB0Ge*v?sn&f!? z`>dL$y0NMN1ULPCOM9Bf5G}Y-Nwwp~AnuJfrsEQtw5wge)Vxf6WA=#h6u8vJ!5+S@ z60~C1g%Zj=4KxQn46~1aYv{Re}rt&r( zUYMGunMT*YDKh`#0aI6qwhrI)EX)|V-#j0N4R9jG0o(igPe?XPk7Ab_F&qsufHX!} zTXHtTZi!7>YA))ZbX!~PZx7aQYd)prK$r|2*od8T*Up=3a8hn|x{Y;9*Cd@{TFsXU z_xp@rv_yt+*Z#19T2`AM>B;-%|C3@UCG0sw&W6m|$3<~kZpw*i)o^@Ey{v6Br&kB6 z%Y02b5uiJ2A;)2>@W2MXCOH>buuowtbD=Mw7NpYA*TzML0UR(|K2o*-LZ4HzpZ3RZ zGyV)~DNw{b35JO;2a;pySs{(PSW4{-D(IByhp?fUeiDP2G;?4jtm~hx#{*hd@8itZ zq0ZS4dRV3+y|>pj$KHer5r1+nqh7KNvy87-`1KWC6>(ETfnZ3K0N7#LpdI(Gi4Wdr zLrn|Gu_WSuNW_L|)V(}kBsP!!zB=6F_IX+Q_Gs&Vh^o3#t7YB6w#;-tP?5-p#}5?# zrwghSZ8lLg?0vo`ZVTV)MwZyZf%G}tM${B0-4DOd z4xLj>DpJtaLHrh4Ej)oH{8k1wRB7Ax%3*uqK-ZWAxW(ff$>A-)WI`8&aXl(3|D|mw zAuHwk z=#5?nE?!AROmo&O0h+u<+NZW@aZ0?)`zsLoaPSnhImaj@lK|%>X}gRWflQ$MgIt0Aq6zd(h zm~t)EvJE6Nry2jDcuFHt^aZ~j{2`kPp;0nJ1}fHvA^#Y$DwDu(<8L+0{EJ8_zfpRs zvX1FxCu*eeQuHl|5!RKzxv%@Fk5r)K_A|FP;v=GhWL-%K%tpu7V-b`1I3_VnSe}~Y zfjmH$jXW!tjBRY{dY-kP&xzwCVfJyE85pLDryA%QI1(oz_pw2(e9If<&2~P~R$U^7 zHfM34^@H+9A3}b1ISL*Qb-iXjN>GrPr=zk7N_!9);aFkSne`X_y|g}tab(}th^jPd z7c1?6{LT7lgYBov*3cWRh(gC|dCscyTnxyn+Z0R4gM>p}I|2MnC1;KY@QRoNnhgNR zAsuq`Gq-WGbkey=Y$0SY%%%sG*OBruLM^~F4(xmIj6bJsl7j^ftVJ@jfVo{d(ZnN| zs$8-`nKS@J0%1J2%i&J&wb7OCha;_7tqM4lMz#!t^`ny1$03i}VhD+4X6Uv@02&>He=kV`1H~zdQf*2R$XIWULMNH#^o6m6P{m_V=?PLG`jOf(gA!*$PZi{xam$2kmrz!Id^3N0=!wich{}&_3hZBU;fCGD-ZCe3$6E z5yiO|azC4$6jywVDYVNdNZ#HZNPXRcA*<%|Eep0+a(XGE>VOT3k9r26eFrU-BI8~i)AEst}LEryE(og=vT~!E25ng78C;A zps4-H$%eBT?Dn^fOwH#HUy$Xn9nnK={VR@IKjQT%BdteRE-AYu%=02GLX2qM4bXc9 zdhU7J5AZys-W@hIA{e=A$!~JJ8Ww@RsR*VCo@fk$yqXKYX)xRZpj9o*E0kP(pdRTM zFHngYbR^3{GMpJYghN&-lq`jXe28s5@HQNg+Xfm)8y^2&!fWlegrQN<+z}1>h8_qW z*`eV$4w6bjlHA<#bXUEihU|Z^jguy4wgpT{A$L@U%cMO8)Os}H`OiMKQC-s)T_QupbL zeO`K}P6xN_Is?E>Rzvm&Mb*Sp)w%|xXjO!Xt+D}>5-fE@d$iR(iJ9wjQbrDtZ{RCd z0F4|WR#I5K_ozkf(@qt)cG&0&po@#(RqxLNQcgqU7bC{C@3S9t4ZIh{Ho{%K zn8OW_5ev1GJyFy*kG!ZuMbiv#RS)Iamu5barO?uoJmGzkkPE;slfjsyhM=+*nalpk*URCud5|SUr{wweU>^X_Tc)lwrdD~tVsPD z`?mWULBy#&Kb__m;=F3K0MSq8+vd2=+4R@n>0@oTRA08?kaGvZK0l^u)UuJzRk|T- zwAnMaIyPURT+jVhD$=~_X~(@?j)VlPC|qWwE#l?=`aiwvOEGZpg!cqcikXk_jC$y% z3crzT@F`|{1zf2Ga2>6G0#jWcSc?y1xS2=&Ui#m-qP{puWa{*B3Z=i#D&F`t`JY_F z!DpxPwZ3>n{`fJ0y|;exx~(zJv)kSz8y^$jphRoQb79q^C@_VixaK&00FbE}PbDrE z?+m^m4)*x%dGOB+Wje^SY>}jNz{Tm~*W;Vrbk1~f=X>G4Kbz`j;v!8oC$pg_Vwjng z7*af56d@b(P>jRt&KUoNIVgau;#txLFg%&zr>#^*4S%$>;_=q?&%LZrdZP{a%(LK4jkw3Qb@>beK@x8EB%7Z*aM0}a26%MYw2`SYqJsRg_b4Rg=zgE z-OWI#RmNM{Dmf2YcO)|Q zdAT_8IRpXJen^$QHP0P0U~Tn31+jibp_(w+n#U1W-G&RN#!M!@7A}M%+yTobPPw8f ze3JrMnb$;B@g!1yM@dmw_EG@zL{|K2!dmxiYamo)T;Fd)pw^l~|3pDW`5_xERS!GU z4tVG3K1FblmXTl0i?c5_kPD^L=6^*9xvgg8ukpcij%~_%zSH|xjT93iT-bRLgAkZ* z^GjQJ$6ftHgr1$_uf_GsfZb?e3|}PChBh6pBGzS3#KV zHAZ~bFAU_;A&Y8~tfbq*92eR7m?!%bsE6;;V3?-w1E@*R06n}hHaKU2`1%=09~O9* z9Dbo(G0i8NX{mj#d?{UbFn=xj>&pGM@X^u0?W5KFbGn8d)CU!G{`&{p{O4Sz=vwGi=M&iQShTMT4DRes@y`+z@iuzH;uk}D(vGTx$xSuS65>FpPdPrJx;0hf9I&x&`0T$VI zec+-4g>72ECB>l$fTQ=^dn3yn4-vJ-_aF(j9Hr3efHrhb24pJbv+8y&4O7w~Yf^1D zO1A6VI2XPS)=TQP?Y55t2OnpFG1iTM&0fy^3*g#af)3jPX-BbT(hx^g^lfDzB$dnj z6JegSs90}VJnTNlYQP>p2~xw_pLZfQ@KD1Oz6}|m`}Tw`L%@#=AIA-n8(U92sY;ct zB<{ZjP?()6ks90gJ|V|BX}{R?Jea;#FdU5haMw$7W5#vEe_+Ucf~+d`89CA)>nj z5OyVniO8~dN+KV8RCYn^l6^gytq1Q!63y%B$r^W zePNO`O^IJX3(pVTAk2hwhpvn7*}<5dcbcVm8*x?9hw9ZsJZ&_c$L;o6XLI!MrRFP& z*jEjB^*e@u`Qosqm-Jybwe>v_!e6!oODqrh4GO%V>{5=sB@hOk(eG?DoM?;BEZ-&Q zDk+UbCb-y);+{NUrK9FWD62X!(H-9B{{V3ppi}7w0eAZEwu?f_yu-(&eN^wp{|jXQ z4BrA5oeP-ZP52*B5ICKB@%uq~xR~PZ^!D@-q_A^fYHv_*kY~xg9iz?Qwxr%a2JWRo zMlqNlpWc;A(d`_n3En&^rSC9zE~2|@=r~I zKJofbYefZp;(Ve@_q~GSI|Y8NGoq!b+}12>l$VO%=IVYJu&X}E>nzJ%tW-$6kHSRD zO&Hzdr&hjk%r;$o_@Ze)h#7n?w(O)b>G-c5BFbw3+<6uw&m4W=Mf<@-Q4}Q1^ty=G zq?|A4`FJ{RYkN(riifSAa~dk~``$!dFWOGBBOHH3?!P1NCs0n`2BjZ;do9x46WEEp zryMPeeujXG{~*~NY3e~wZ+uXQuX|Yd@SFxNG0dr!jqUV=zw+qp9N8KoHi``f+!}b$1~}6d%>|q!WV%+$DzTI<{=BEloi$87`GZuoKzH+m<+=a)3THSC~tvb zM737^MqPghRlOO*nF`WfB-Qz!+)$wE5^^g!3|xu-a+ z^W=CI?APa$_aR7wQ`DT0HS_}3uF&}>;ukuN+00iRE<~*x^xJxHh2Z7K#JG-=)a4U} z)Nc)piwgUdbcN@U%Xi@Jfr5bIBLXW9V&tuV&xe~IDy8knoNO489M|}?m%=R;Vw#F9 zZ78yIU9@qP7QZo%ND0-ri))f>E7T-!D@sUaE#t$zwDs(^hA2Lwpnio*^5suTJ)+t5 zzdP7J-EV`;m~hJRxFby<%WhZ(gjG|$$&x66A0HoMyi0}w-vU8nYG4sLh7Xute~;xr zzS5oE>$ulk2}psen|KAf0YQg6n5(fZm6P#`3#o)_(~~fmO8u5$~tq_wg;U8`G(2W z&R-`j4SqiL#3^J(#NTScd~Sx_dE7}E`L5t(V9cfEdT~$yFH&S(oy94H6TIyFXr7VA zIpFRnNj+gH-{|!d8rL^G090V#8DKlIpiilJo<+8s>NmOIt(s+Q@N18oJy4Y#>Dq(A z0A3jG>4C4}+oZ-&p;$STe>3+&4om99`4isLwr+1Xr@wdL1Dvp{L|2U$;vKD`Qx18M zuQwU$Qw2H)4b?o&=gqxhAq;*>y#Yzwnb4@MjXjABrf8K z+_@XzU=xMe5&Mg|y;2XMRXY)bm`jMtnkS}bbsBIu3wZwEI_TeG7R@dAtxyoQ&mK_O z$kVZtSPJdOWQa1a*P?HL3=}Bbha#A>A;Yx6^~Yd^3Bq&jnPr;RhQKj{{go~0v;p7L z>@$S2?F=_kRwdDQNRaJ9=Ze+b76|;K)oc!GV5P53HPwO; z6GE<@09y^)xBWg3qQtVjTSEz}1k`SXj2OOILY9KVtRQj_#_R-N#k7c*>yk2=*7ZJj zlz&VYq>e5AJ$%Gla^3Hl-(J+?zhMe)t6sUY*|iUJY}>Ainx0qTkPfZBh=h`a{f7mG z)`{Q6%S`e|iLGVl`u*AZ=kfZ5MfV!*s{O_Oe1vG&TqVM8DK-|mWb`;~d%aON1TZwO zf?pMqD&}DF%l9y>0oRtLxFiD*w=WI)f)bC6tIw|%$cvZ6Tw z&I6SQ?{w+XC45eMR%}+uI8;N}L_(sLArOOtF36%_I7p0!1qdUN(oVO!qqQQieu!Lp z1wkC&IS@c9iBc{9R>d3f78`j5rTQ^sv7X`vUyqvZBf0#RxTT1-Jn!RRBY9Hv+0&KU z@Eklo$TaALWFHIv`l_9K^y_D+vLWYBEk>Lg$M@O9<{iTIiod~zJOO8c>;9s>33bQT z7AIW}erh2!$o}A8uzDV#MS1dPEp-wwg9D8WgbdZB;+0N%q6~1@G@8<#j-vwHg>M6m zs(6vl#DS3ywJD<|oU=_t4krB2qRAk617F|Y8QE6KhkM`&PvS*32ydrR-vd#yWvirH z0Dxl?4j^!aIe+?@*q2^oB-~BMNx}WI-Pl&WSI4sDh1rMOv0H=hA;%;3zvcpKDvcg& zrd+T?m=Qv-`gqHeZj0|#_hFLx8i2@B<6@5VzbGgT@d$@6ni6y1!f}BIt4)Ys&7MFb zv8X18o-*s_i7!mK2@!Q{$LudYKdxKzQTh60ol=niUNXGSx~d-f*;6qOSgHS2tp>)k z$&LXs9vstrvzuoCaW)-%<2}5oK9xn?|Bl@h5Ua>R+6j@*NWZ;LSj?M--4?Bc(Y2pd zj$cjR8o$123>8(pZPB{yxab(HYnhKPr`tK9P2Z{K^~8#gE!!ZdWBOWwq?81&R9qzF z0?1>ma-0jh(FNlFdj7;6P#Vut(5ELTKt#O7(sI_Mw2v!F$3A|78-xiBZ&VMYrH0%zD z`ciz5yV0!2A1|z0uh^B$TCM9qwh<-FW_8*11rhS$$+lTh(!R_K-WNnzw53b;s~#>n zHp!0ae+5K8n$v02#^tjuI&nJv2e3|xSQd+4*-dUUdbn8omcIV44ZCUlnR-!JtxVwb z25e<%MHW6I9?`1U=4w+r&@KW&354R(-=$QFx3w1i=EYE%Rb3UZszVm+4 z%VQGUUz3 z&3OmB#PP~bjTLhFJc7VhjeYdRnA}wEJ3l0_*y`2Bqx>6z9VW;#?QB#)$&CJ+X_`9% z3J<|Lv~pa#k!$upU1-}Y?;=m`NZQu?b0p)is)?7%kE}%vIy-#y7hi|Kot z>j}&U;BXiGiX_9BdVE5HA=-WA|(uYT_Qy|8VkD=IA;g<5zn^@|%`P zr>uLu%a|aF@|JYJkcI4H2@z2Gw5|1>$uQcI(kEAy=<$Ha1+Mp*Bk)FKxnU@BRV6e2 zzyZM?TExBoR<^Vm&Uu@@q`g$chK!GpkG?V9bwfCaag)L%zem92fN1zUf`9*Pghmwj z!cf$S0t2!vT0GQrQ8+y1k+0b*wGt8&>I;HPWHc;Lwpnfib_G%jR$%Taq1Hd^VE%4C zNt93q&$IwW#s3=V+uWAKQ^!Q&z9kG+{Y&{nb-rtIA!{lwWCpMm)MC#2^DO!fbfAF= zjJ?xAF9<4@w9bv8?=<_85DkmrEOYxPO$AE|e@@vij-?d~f>W~wwWB=XdWeCTE^_!BAH>!_nJ+;G2M9!_BHAC$KP*d`zvbQq>gZoe z+#)9XjTnPu7Ym~g>~9{>b09f$=CHO1xHLeEd`E=kU+aT9>fv24DPWrS|I=tf3+dp6 zz_tEyVn`Q+J{Ma}4_8Kscw7iW0Ffv)a%U0`Ypg|e6JI5Vo=;b!88{b@p}s6Qlt{HQ z!?}v~hU}XP$X${S&L1@6V@N50;8FhAt@>SHka+!;&hi5A%PuyiO6=>{m~yDGYXt%B z-Y9NZfH`u6eycqhZE2Vd%D>=q4j9>Wt!BlSk`fbt_bQ0}HmB!wNg8$2T0P=&LILw~q{5!k_ zRO<_JQ?tKID@FnH>Gyvwckgxn>ek;^vduFgiYnr;q^vQv9O~26&mZ~Q&KValjRFOFO7XNcHSaiP1L=~iCv-D9?o3nx|4SAy zDyp-1XD?4ftGTKeqMcXQV`cxJSENRMmzG=SLEP`5R`6HlzLB53Wb4yEC4zL2mGi1H zk?a+7&#&N@0hq{2ySNoA5aSjghBZ8me{kcEH;D`Zbj5#Ut;9Djn1sHtGlQvEv67Sa=n-&maqo=crOmHQ-Nywz zyCeS-@1!k=NGb z#+{^)DkJohVf1MHk07AJl0aWUTq)Cf_~K85FQsE37X8}K;s}MbUs)`#ycf;7`8Cd+ z(n;j|_zzE_$bZSKcDq#pY`?oHi}zH3Y~K}Y^+)kd+#zge9&H}o>nJ!c1NUc^dh1oS z7keR6I1piP2v)%3)j7q*teG1@JHs^zoHBvpL>y$MEd`{EOoqY|0;;&Pg9!_5X?J>DLW7W3Ck^9IT0 zTf~o3WX2Y6-Kso>;{r`;07A(4-a z3Z3@U_GAv`_@v+$pJE`#0{exy(UlI}Wc+Mn0~Hr& z=TRvAf#+Y$XNiTaW1vr@gW6;P z-&LycMF`3iFEgS12DU)m`9HQWHTFc^AH-YE32O9FYZz*^~}&2=mvQS;O~Be#@` z=A{l^xBZ1Vml?Dh0O<>F3IBAoq8TW~sJI|_f8tbBw9p9)>rTKn)RFDMD4Vl=wr7m{ z$E7FqmY@gD@c898nia#YZf^6^9pSecfNAd&uJKu4j^3SdTHFTj&_8TIUikG|@1KCA1?&Fjx1jCjIkgQ#9 zzn7+i`0i91{1LX%7v1TxDY@MwiFGyN>dY50J)NI4om}ZR zTfcKpHs77u)kq(<);3>chCGeNL4U@1gJK7YmE^#RvKD#)Kz@z@i7+da<6r*P2nZBnrlgBZ{*)^l$IBSq4OEeMw@^ND zn>Jj`HF^Xjruh~w%EBxcZ*-OHNhu9*j-0uEHWG8PD}tNWFxu*9zfVYWu8~Jjrryg2 z-CKc8)>KY*(*Ou$cKl{8iv;dOn6LH1@?7|zF8#djDDS{_d+DPeRW~*N+`?Xb(-22a z^R3TH#sC$BC~$jqT~>_G_r-qloz*fY+Ok~Y`HW$9d^QpUu zHhTRzkQV~PLrm!I-cfS|GlPcxk!>n}prL*s#t4CE2P7p9W$MNwC`tY>dA+g~Sy{PE z9LgSr0Oen(s$)M!mF4}q^`=7gvw9pp7|X(me1rK2KOqG$KJOqvpH!;*3emvw)pyFA z2a^|a*G>c5L3}Z}DnN^B<-ewt6q!K3>2ck(M{JwwkPSVRvx!i?uWy=DNz$TiXo0Q! zsvocllhbg9bL2+}gz~-Wp-m^t1b~blALPP+OruZOy)+&J61Jz^A6~3sGOS)mbB_H- zlr-b1!r>?X9-PS|%^mQ)gxx4`Xh6J}Mb1zjL~1C+zl z27brjC%UYh(UoL5>NTJhg~X3zG4sWD@MnaahL%3A@18e#CKN$l(Gr2`YoP{-=S!d< z!g43X9&5K?Yly{-iqP5M%HSjr3Rxb(A15)qVZfHKWz(>n*1Ih~I9b>Qc%xQSyDQzs z_yDs<;BLVWQ~hlBAh zit-{Py0)FO#<-paLD5R?&=Yv^43OKjiYQC+=_QH5_^c zytVLf@R24C8}wrNF)2;}V~JO#Y(`FoUWPa~cizvzz@KgM-e+CH*LTAWe!U4`g}>QZ z8BM1>{^!e1{L(Wb*6mK^EA1`~CS5h(vSdMKGr!Lo?LGUYHTzp#SKKOm55=de&xB`u zzt5OBUU0VQ$Ks)wx6RLR#S7+*=TymN(%9N z+o*J8)F(*^_KvU3k)~@(B^;JuGfHeFp0t)@M}hA!FRy?6q)sJri4EkYBk8sFip z#*P|UP7yn;wpxJTekls}^N27~GAV8syX&)h4i?)E2@Z6&iRyw)uomjnF`MTT5@*yS z__3nBOR{OupYesx+HaFHi(pU=+F$wVF@)Lo9=^tw(hfa z>Gs42j_Nin=9ELa#<5NYXmQwtlB}YA$5RR`i@|6ZgNhzA^!{%=^Wa}S3w~X(x*`!A zFAHqQg$;zFzeVmI>n3FdA-IKF;O`|hR?bUs({)rG)E08BZI(M;qqux4WFxn$82AC- zy3~12HP}owo55@DZ{!%$FTP0UkXqiYryKY0c}_*(UP(x=jo;16Lsb11CuMsJm1BK; zZ9-mTfpRGJt*Tw$4FMw5M1+~5eJH^esJE7+)8$DXZ(P_*EXKWN`_S7jzdB1`50~_a z{eZuBJ^ejR6#4OQx6(bD$n#dkFMUI0c_^R(a^)2Phb&`*VuB>mxx2!V;56} zbg4Bkrg4kK`>BF7Xt+anQ745PqmGbxR1=e>aGS~^vc+n)v)#rp^hBe(pOqy3O`Fkp z{B6m=Aznc$A+H9S86QrxYCy61!W_`27O^uM2hi-FABB`Hhar-N1HVRfy;|Izrr_ek znxk15{fzuxZ6w5i8%nd67KvPA0egoE`q<1RD^HJjvHFvd&lHMn&u zrJ1X7!#j7y*saTP*^P>MsrudM{qpin-UENoL)d-TLOth$J+TR&PSX$Ow|pP-#+CVY z*hp=y<%uD68qCmQt)ho_*)Q*G`ccv0qpyPKpq1JmY_TDqzrc$o%AKe$yaJKd9bSxs zY#s05PLmDPLiyhx$_JQoI+k5GObZF%K^578s$_wa)TEHzuED3-79AW-iHw7uZR0(g4a4ns_?Uq^#!KDzoK+2sL7#~^FLJ0+gX^pC zAWpRc#8OmlJE`IN;@>P&68O(un?Ciwn3&7*uU?NQp%=3$`My1?i}1)qa}}ayOwhy; z_H^+ERo1rv-1<+tei+Y2dEyQGu_Ak^KOzb_6*xGOU*)`whhSS_i3r=){6xod!?B#j zH<7=ck=({*_z^^;+o;I%%g;tr#dcqy3lKXQHr~A)=~tn){dG1vw<`k2bsAZy#%DIU zN-Cr_eA`mlwhFH2fFyT%1&{DCK!Lvxcf`R7iUg8|`WQf#IVzdm!!u&kKSN>pC@^j5 zjz|&BA_}kJvUv|hh7!O%^!2kFp3H0sh1(s9X)ru}8tg|mc4J!X4xyla{Ohr;&g;x{ zZ4Lq6zw{=rjd=P?P5M03h|AQ`x+BjeqTn0-rjLA-we`n|Q*tpO|$P`BG&d|SW61n&|j*g-k7_p>j>mTTV3XsCHU83@F~OPZSw0i;$~1TIgvx>CZe z{yasLOT5K;&iRbVjaUL*aZc z#@xcdzmY_s$duCgfQfZp146l$hvY_MOuTEX<(jxSHI|5&`H6%q9_u1^YDRtmM>vYf z&Vb2}Y~I0xNI{n%DWxi_S|>259A)uIcrsw@wM&qtp3}(F@O^RdZ_9Yubz8M?@ibb^ zeiI4fQ@I+M2=yl_+%g_@cbjJO&#*rR%bj^VyYPLSaAG1MP2#N96IjSTn`Xx}bg;0c zoN&{~r2dY^!#gFSAZU9lw1sZ2Nv78F^b-!$HUsC`qe>tFRP}lSDh^$pd061;<-B-a0e;Skt7j=>@z8=gjNR?Djqn;&6)csLM zhm!4QFm?WM7qDUSr+#xFj=g_E$E-tO&IoC<@wD_n-{IYh?)z2z+*T)q%6;&`YpOAt z9Q%EK+|(pX02f^=0DFIYe77A8OSk>JmVz-3uD(^T!gQA zQ!vfVPU{ZX`whjXN;{)1s-L1`~RA&#?u%cLx>bOiw`frnD^IT z=}mw6Y{FqQB!`ee-L zohBN)-ajR%7sB^S{v>NBPYSVvnb)gd=#~|ZI6ZHC4&}3rCkaR1@-sSAY+(wnhInP& zN=0WFi=It+PIM@)a)?gi+0?VxDA^g9dKy(*2j(_ES=0fU;f*L6J%t!}#ND27>rb7{ zJ`>lj392>C?=tW%=ujk{EyOa_BPa$gmu{Q0%@Qvg6 z(3NO(Azii~+8bK6nzmRyS!^e^jtZ+DlkTh;%aZrf?$SJADXTK>Z25W@C%HN#WTVig zh3&xG^Gx5&gLI{B%9uwBo1jp{Y+@HKtEN{IsERkY$Gzn~* zMPP$`<*q_Q>Yh~0^MVHUE$;WD?!8cu8S7Po7%4=JqV?x#LR|raN(GkpmJ6a`$(zjB zrMxw@)=*8dy!CI#cfNNeoKG~Ou-xl85D{}Y%A%z5irP|Q6h`E&y zx5>=1I*~rujDqiZJWPSpC#%^d9C(rQ=bD^+hji zQBfWpNf*d=oG}PTJqPDxFLY|ZX$cqaE@Ak$3T$i!@f=4a4qx&5Xtf=sDfV1}k>udM zB7Xj!vg&nMD#OA)z94oY>@?nhc&;Y*3k@)~=GTc!?n z*e^`RdXqYZlyn%#f@|P1!#JQXzAzJNX!JMab#T6m?tG|VULcnOT^Ym6ZQR|qLuBY^ z=0B~Z$hGV=aDAdvqOPBl37<4zHJ6v2OiTHa{PdmviO4!dh|u)g0@g2Ag3Q)Gv`DXy z7a+rvHRrL^hn=?HT>N-}vJ=?D5s?~ZvEU%bSH~lhmF;IQ&0uYk$3a7C8c%-b4tgbn zLz8%yrCVM0y?&#>J@zyKoUSZ6uAxwD(Zf0;G3Ysnmq?ukDz^>xrm~^hl8-+f41^KN z^lt{EdCUa};0{4l3%N#9u$xJ$+y1#;DJ2DT=%uNMqWwMhN2N3f`in3xw}L(Pwq!3} zww60b%?3vHQoc9s@G1REB4dw+*orG&1&zfY;=Uo}!lu8Ny7-!QWM=-#rpGZG;lPu< z&JEKIS)hl;DeGTf&>L$T3P`KRZJXRi=#}RW(Gd0?)(=fG!ZHiko(5Y*d~mkEG_4N> z@ha?sMM8_g7_|+Fqb$a7rYAWB4}7!y`0yJc_;DWMDETfDsn*;jeAMy6Y2YhfiGLpU zHW?~RzuH0({e`L5Jsx|f9jo3VnNoAfCet0Mb#?QCh*ZJt7|bJPIyY9|M8*L!dz=$X z7Rcq5`6p`4Ypk!HTA{wb5ht>oLVDlev~jk|xH+%w3rpfs-Ow=s^|qwa;_JJ$R`%nc z0pkosRQbHl4{yn?i5(zKy7wmKwRjMM-j-)`w#u=oq>;#RXI~jt5bz{#vC%pp*^K?y z6+S{t8>|K4UA!M0`F0+}ZVm~i*Z%u6=b%{^^sM`-IqNxrpEP)S@1Kl0iYOz}>aMb6YdJ@1x zh=*@E({Dxz;He#ZzdTbFgjOV1tWe@c;rCmdz%P2rCfUxjHP~L8C%a9YQJe5toaYn^ z)2;!V_nrTFZu;RC&iq|#lHrjDdkYYkUL^YndxaTDpyt#-d+tPW7?%(6`+~1OgE6Cm zoc%y&Z@ms$1}QR@H`DyKf>NOCzf?jpBFO0cuB?j=uKmXqM{g2{t}4Aj&>WI=26$0C zeP(AF2gcYwHYdAoz2X?N@Ap1aMCXGsmwc!3Zhlfj9#T78j9)p-o=h0MNhmyt*Q6g= zEil+m_J$2?FYt&t6ux>3uCLDtdjZ<#;O`CI>yd{~yyU2~LoV1(jnikf%-r6Rbg>WH zOO2^|r+bS9uJ1g`jBMd-e&Q*FJu{05jUAcQv_oZhf9Mg$FYq<_fdv#)khP*}9cr;V ze*Q~ShI%8WO{>==)TnS&Bn((ZzUe26wE3F2pYvt^&XEuf=2t-X!c-1Y>r8jq2aoXL zUGq{=M<7TEHG*(eZpb!2{m-!^Gbxi>9rFD%rj^gpNFh?82g=yN$N6#+$x?!`5iSRc zL=`elnP8r13fiYfREGTF_7N7GiGs{3Z>s&rSST!~lwHRqeKQJh@(}KxW}CYnoZV|+ z5!`xP9qRhY2`|nu_(N($^%3iq$g8EIs9c_CHo;%`;yCe^b zDPXhry)VU=YtYwO65aib%CO3M+`-^MyaM(K7FzBY5^-U%t#9TLUhVHQs&N`_M*|Pe z#292Xin%l-ZG7;!XcSE}gwl}>yNezeHufaP6CpSPhLV9PpyjaQRmZy>Ap9G*#(ai_ zV9bA8ESOkzx-q_+7E4X??^wlmY98|h3idWx4Au2Q4XN8^>3_QumA3oGk_$`a@;zVr zSX5~>n$}$YRKrVMEQ^tdMTtq#B_Okw>NPT$t_AGh*jovCd4i9`WP0vtGD$7CKJ4z5)8bk9uXt;Z@D6n@qxSxfLF{hT)E-(>cI5@^6Tz~UXk-|9nDaXvXI60RDR)t*3 z@r${DDWOaWG8LY#fzkfOWrHbNJ8x1MK=76 zUdUzWpT2?Zx4H&2;1j^B+CJ+h?Ue2`e;~$`T>Zh&34F!=;Z=#R|M zb0IiNm+Gi?>4ZqX?jU+YG-lHKTKSw4OICuSl?!$J0i&{nt^5?vO0;3)7tf*k)2G2U*UW28mh~_MiHTiX=+zqed6#ndLAgWH-|K`RvEr@L7hV^7EcO57081(7 zboFtmWWbYq8a7|D%vwLPz=cz?z+NHjU4%Y&wW)w2dWXuu(09ty$#sFt#)Ak_1%zDh z{C^$XrNsy3SSW^=1x$1|>>V7IuibXljB!4Uy>_e}FvlL;g_#5_)t0#$UiEz@fpmHN zV=ni2IILMQ?qS;LODNHAo654UZru`2V=-MhM%MCPln36~W%rB2Tqb&AZp0vTqmeCx zntB`}GfUMEqxuNZDK~#h)@}ONzDsrU)brro6bSlSbf!GCL4BNFXuzFP7>-|1WgNe} zXBe_XzNEFE(-8*fMl2q~{dAa|+>Ci|N=-BZDq7T6l$h(x$gWGL8XiL?N!@KF9l2w88t}Zhn1m<35q!pd?UHS2iYqfc9M!7+oY{F7*CK?yAPK&o+PyC%# z4|<@94}H%Xqa9_IN{v| zUVbUck=}@)-U17r7DQ%jJO>a+H~2tjZ9{hLJx!i>KbiaaFRxNU2u)K7^V4wi;6)?q zQ=uQSYP^!FA;otUot7=PnDO z-k0b7_1S~NxeCmEew_BMGSAa3Acne(-Qe{NKJN<0&`@~zYksy(= zj!EPWUt5;XIznqbF{k%X!j&+>PCePH?a(-H*Czu>lyV#=|0i8Xv7>Y)yh>5h>G|st zAD+K&Gu~^%;M6-z)*VIizfG%3(&9%)n`tbaN!CwaRU;=mdc`go;#xw>lLYI@SC&2> z(mB9gU3+O}JrN%|{CL`&E$)6-M_V4TU0n-O< zeHKMqMRe&U{N&XN>+6FkOf6j(tm)Ng;0aDLavy0smi3>_bSRk>gyUbWq>^XZ3pl zH`t)zlKeW{(W$+vOw^9_1F+;R7Tf?gS3|BH!g&^SPmcwc&0i`ZjMoDxNS_MjbDzYz z_@8~aIs0OBUIz3?8SaK=-Oa5S?dClg1lcW!&M$E4H$>MQ<+z?-0pU)sLgA@;{55N5 z+&Oz{l3Rxf7JtH=Q4u>9%b{m^4~U1ENIu4g&%AF~UpDA8%cKypkv7(fx0ZWO6Tl{* z*lyb28V8+MR5^LhbYS zIQx*al+VBF&EZ_1MxtB*(p$YMqS-+4BSmX@@Oofbk*+4uqy(tr+v&!$%Tb^7aS6|= zCT+N&&n?_9cG`Mv;7PbHEoOPQfr~n$amwgT-UOXxOYT>!dMtqzR^cX;0&Q#$ z^!oGL16 z%l;kvm$1K8?s|cX(?&#MXqRe~Scr~TgR^+sf8Ym&98APV-XN189aR)G6y#$r`3BURX_@yjL~Zy2RjZS>s|2(s96p zYvOaz57hYPcfa(a^3)KEmXr34ASN>Ca_!Jw6ztEt(Y5SdpZ+7E0Zr4Q`_R3}0e8iR z>em8#q_))V{0;oqU!EP9`0wx$qfArzCV zDFMlx=ZCuE41&|K$8=QCTyU49huqWs{OIQ4dm9sI1R+;)Wq zw%>7R>C>oogAszW?z%~QG1JIf{&kG^mVEJMR%GWp2VPO)2*n!}LRGWkEmebVQXreEh74G^B`(GR`>|+NsdG844JwasyBdi;*(GP#OqaAf15v$p_ zYATP7i_Lw#qYsS~*RKLsUp*9-PsAt62(%s*eW%$@y_&$hz>pe#IDWxx5is}6H`t*8 zGxhE|lXl_zte-K5`$i`X7Fn@#@46i|;6H$8#EP_r@8TaS3}!M1|DvXX|k;C+fLoh zd$P?Ljlig8yIt6kKxT*_x_mDjEZqK?A6)g-Ry38vtY<3EK8lYgCC{EoAE1N@x_0qX zX2u?>y4|3YwUZEHAnKJfDJg5JI>7{)WYkcf ztws?MaeH;1GstTtd*(ID>`T?9i&dka?B7G3dL$cmFSLyF<9(V!T>=uG8lPCR zh&=F0BIGI;W^?-|yHA1>XRiQM0wxj?&U~KMXD(Gb;VTV?_41D4Ur4 zDVz0?;sk^INbQ$-ai6wYKv#F=yw_@gRziQKO%_i7_ZKgqj%T8!Z<1ywdt0}oN%u$? zD5vOaO)$}KI{J8YuzWXGD>^(On98yIb%3qC-;h1a(+K@9>wWsMxXfwz#9tC#Y0Vrtmu|6x<4t6-z!IFXV zFPj200MjDQh^x+ToN(9+4;8maSSGkW-0RCMdqh{o<#$S8UQ)}LSh8hK!rqSMKJLj; zFA@HrOi<7fL&!d{rif;w=88a$>ytX+Y`s|E{Xc@;oAS-?KewH=HgW<=#p>E5_NJ#a z{?|q-t{v*F!r)Mp`sADde z57D|1oZPD^-(N;&VUD3>-HL}U)P@;GYV6nAh=~#PNE@HtS+K7XQ zg4!mc5gd(1bN+XnZvdDAui0rf;jnNzkgn}*B~Q9g@>$p)E@$;NJ?$novqI~%c!xrs z7X5YjvVwG4GHXGObLzhe2HV9!L7CDGw`kav`C6e zT0`M-zL!_OFa0QM(@U&?X5~LIlWwWh_+itTx2IDy;nkfp1J~Fdc{T0r--LqjLA;U) z1`$a9`sV-{a$1|G*5x(yY{VizD-((+tPRbn4vbk>T8vI5I>*pJFRchT4eBgK>$xP zq}$q5+&73qQt?y`@z$OMC#O0T^uN2UB4qW#S-Um(9*2GvM#Zgw-oif7Em0!@ECD%asMkYMw2{Q)lgA|NQEmu^o(=e5+u@m<0CzxedalWBkn{Woo0OwP?RK zBh7mfNH9HeAr=crwxEw_HfV9i;LKQKqx3n0S!Ns|_AyP|x@{kJ^a-fh2br}WVW1>Z zYKo3hx<1+75+OMu-I(4Q`!zXhaC&*UgOv4L(33a1bieSnQ$mJ(UJ0zIKQeuEWZG{- zH1hBlC$K|}ERY?ScthgJRz+ll;(ROX!pPWm$j8*Wi`sgnc_K%v$;-8!;Hf+n?g}ZKS~tA2ci(EkH1|b!e^K`wgDWrU$-j zfXd;UrCD(&8qpH)*Y9z0^k1gD@&MU<6D{GbUx$9ev!Pi91M49pzk)SEA^x}2ZiF8} z-c=VR1Q8MY*c25Ggv0sCiH2Rss`(P*!wE8z=eg1ozI$m?dpl+n;o=o;s3QjYUYJ3n z1}@kb4V1}@wF6lcvAR+LFBeWPi4eb}^9FYcVa1G_8}Kkgb`Fw&atQ(!0}7UO=^@H)Ij-%@nEKu0Kw-t= z^H*(jDx5=Dw7*!0QO&OmvhAct?4Iv`yp4`@@lG&^l%mV~JRzIsxzS0KLZF{l_hw5& z&3#xisSqnQS=dk7fthhe9(&7{e1C5#$NOJ>JXL>%Ey5+XN_q?IoyvqYRP5Taw^5)f zrG)j&j*>`y-jV8XRej`c_C!MWn_rU@$ZVu`PYB1d(j;T8Rh}?`VoDi`A&NvMZ6M{8 zaL@S{oX48nBRz~$tQf}VsWA?nO--%k8+*kj)Q)lppO@S_)^T@U&NfQi62ztLRKL#2 z7JZi7=i3QwVzjpZNUlqzYBcDOdSm9xz?i3HtEOc$6#sPe2OW`4o~1A~{n*o|e_AF3 zW)cn?T0J`SMa?OATpI*5UA~OI!KUqhG^Y)$&WXf%tt%qfI->j6k|5dM(3FV%dw{wL zUMQLT^c>nZmg6<6XkTI=$p)RSX_Agb-%#%4BEBsDxw}IOjoYU1jP3|i>oQMxE`Qi9 zIt(8BY0PKh@;U!lw2U0ep*_@O(V)CbMF8Jzlxq}Op{PjXo%0y3rFS)~JdJ*}P-z1F zRdwCNZ**AssWf(~O}@#SG{KZcG0(Q^@Po7*>+biaz#c~_J|oopDNGN{^Vw&ffI7W& z#$nW$D#Ft_lOR8q?Ef-8a|HQfv0ibe^EDn@bAS>v#Ez1 z-dN)x=OSOI8IP;f=%u+sD@|Odt<**>Wzto%p65^Pb`X|>0M(1(J{IT>F1&5|(pu_{ z0V-!2j{Kg1Oyuc`4-dSfh$W&-RX}@V11$gVJ%*4I=HdYmdj|{Gx==Esq11;LkwF^K zsnlOK+Xe*-Yl9ztTxC`ncW_uyIA?|pot(0jb{}6=KG|Z^Z`q3!bq(6&*pAiiO1Vq> zxDq+UFJ#01R_XoLyD2-Bip+f(X*neIxsrVvOZ*0PV8%GpSH2p2P6y63o(W)WwChl} z#kK?RII(ia;}`046L)0B;q%+8VyU(ei;KpoYg3EVM!UR7WCP=cbMIyeY-8Dg7bT&F z|D)6oI7l3lJc3QxL59Pvk;n|HG~S7`*`1V-mXq2k5Lw*{C4v#Ud=`&@0**i$7EJVW zXy>|(7>&AiHK?G@$#p)xB98(~wrtfo)MBqA5&tS-@B3SWsBQB~aaT;H zGQwO$3A&o*m-(I9e7NiWt5Kj}tj%?kMpWMM^HH?gj{50$Y|)p^Uk&}VM~IsIV3j4U zsNAX%bq@UyzgwE;vfK+LfmF4*&B5Blk`B-4TbA_)>o=k|#6xXaFGAcz7fbdW=P%}+ zDnsHHG04|0&2~P!uEtb|vSu14@6Nsay4AXHudy9{(*hZ^-<7(EMV-h^NYLnEg)i~l zi07?{BKn|2>;wPSc;JE~UM7%>wR^<-W97=MtFCW(w8C+pn6m<2zO}=v#oKl2M9=Hr zeoBAwOEF(^SZWTY#oHrkP!aaG#VfB`s$&g#_sdcIap#JM+XPpX70YGg2t)`EY=m+q`a4su`C`fV4=H_^Hn>Cgu7 z@R~Ug!0|sj9M(5|1U3PeyZL?jAL0bf(T;;hdcts7P)LvY%E^~j&92|+F9L|~E*Qf3 z42_Kj(k<(lLbt7c0&qR3g6ALVc2o{FE@v>_NZTLcRB7~E*034UUKF?4!;w*Y?XuXk zG|JPtD_vHiSwc5KahX*Ma$(h6GMM}5fRKtFvd(=uYkOBq1rU} z5g|VkOo(B&SIjtRFBgUEk*=6`_Pqtg(N#;|bwZXa39b!kza0uC5Na>;1@Rv#hiIsJ z|L5$hnybta6aNKql0{B53TLrrjNU;v#ln*$l;y5Hyb6<_YQ?Rv{g0k)>C>UENQV`S z_P2>B4({>$#aa(KrF!oEU0>+DLihfj1DDTKg5W9fd`XJGS;lZMHMf@C+oOnKo| zteFUKk>6qXZUzIdtGK^wuJWTqyY=l8`Q8HG$0Cavx&#IRoen;hoqLd7k-9sDXO znLtit9r(sfHRtSXoVsbTB-GuaS>-#{^(%e65fTW67akFru@1wvd`xManWR^+YV4bF zHj&iXN>T+H77>s2_kf;TksE72L<%J9RP_fY)VD7FitA=FWgqquVt-vwME-MmyIU)z zw}b#5JBPeZkvxhcd`mi#0)u`I_jsyIN}PAY%SI;|tnpAgp`VcV3mKFZT3jyg8PVRCYGNM%k0I` z?ey!i_d~CEP+7B@&NEg$%Nq<|EGXNWo%q8yX#l|dlCLaS$q0#4e1{bXtUMwF=Be1X zfw6j>ov?kA%aM}Wul?oS?ONR%IuuBsj6WoMJGxRscbgmsy7UGoYr7Rn|v|9qf06^L2flvwP=QW=D0x)aq zE7D7QpEu&m%GHx+<6R4bMaNhL(Qhi>4dM#UhOTKyA2<~RV;nm2%aPd~HkU}_K0o+G%8&S#>LQNuQZH0STk z+a}FfNl3@}x4WSuT0p#uDYsg{?3XFc^VdE<3iPXuPUzLjW%z0L6z%PJ0JOf0dZGH7 zBgkd%<;~f`5u zV^^QDclq4_x}|F<8afgc?=!eU3xda1@#8hyyX634qYy_$G#RlGAlF8wT1%Dh4Krou z6iUD&kOh{Nc+4>V)P zTB0RO(7UxHv8pg!T`|n)C*+!V+iYX3OG{{|f%?*Vc&de#H9ow*$;cAYhQIwLYDZ?< z9mo4uAdVpvX_d1=rhmHvKgN zCUv~#d{;@hL(NqG&Be~WQ?B;ExuA-1plym+F2t)t9nBR{8ijO8Gkfj+M}`!_Ig?xG zOfm8Y3}WOr^yENr9oAkko5a`tp!@P$*l@;1eD`!poy>UED4Fl=NzXv2`yqbH(xIfZ zdm!zeyJj%Adx2!ta{yf@YMrzV(oaDnll^S8B?wX!`8t)WsruiM0s9g+UcP7q>RoKP zoXs)yU{z{&;JyPtg|Q_}D6WRN+lDja9ZocUlG$q!L_r`Zd|Majwa-jppX?1#ODN33 zsyv0Up^%^m1f_^Zom|1D=rA5#tjdBtpjh_=2)RV=P%qRPBDa{R}gjR$Ik-tN?slfbBpAx=AY$mt_2< z<4?_tv?C~A_5^SJni6cu9icHH+A*mo5Ik~ig3B<8(;)V+jv{zpF>C9S*QVij3S2}Z;h?652$+s$lRRA)uj9^|En-Vai4vs3WhsOCGV9;t!&76HNa1Q$7%*tx84P6_G=+&M zdIb*PBV2E@gCq?Tl&~^`0DmlS*dFp4WFEMQ-skg;6*UF%87m#K(wD{@8IIZ*dxgyR zIc)H?SvKtBgDPguZonAHYYmNpqJbxQpOKNjrZ9-Xx6^n~$pfpqz7jr)d7BqBU~g^X zo;G}V7Y2-3lV3>JeHeWG#;yemo_cIN1odr2-ol1n`wsiiBV_3sHexpPbvcc4y>?AM zE)ls#s%<~$>(0=WX4|{2xVU8P`5{0?I_qw0@5HrUfN_Q^=i*kTu) zQjuNqP6sV>kP?c{G< z7Ihe1&N>rOs(MLXF%`_M`6ciHtR*Fr0HRL+pu@`TK7X$mR%(-c+;VrT{By^8DWwaRkKJxrqD^!O|T?B9i7KbD7(*8^RKStgh4@rG4*ng0W^5^p_7#5 zqXB6}B;RYs#B^HAAY?#gjITlC+Apq4!N1TSOM%*FYKZao(R@DHe4?x0iSz8uqAKZ7 zedhUQ+#9}xQ3F$|Tc+W++-iY>t)`<~N#o`5K0gPAxMn}M=!nAAdBV$wJzi-dym%?8 zo#~>-LwzCGG&=&!aJpwavp_3@$O^5lGeY@QA&LAzFS!70Lut+OCbBdyh`_}3h<*X@`H#f);vqQ99E~Sr z$z|zMABthXX8zq*-86HXpIM3fiT*EY3WHW%47hm3;a++!w|+6gQML4=_1bT}mZJ(? zvU<*GrDF}%V=(7>!AJ@_w^m3t;tdlpqJb?xp$U8^*oDmA5z(o!Y%GaB6djA%SKVRq zZ3MNvrf$F*cC;<&KgVAt5cNdz^AQgyrGQXgOYt;;LrAqa?rH{hV+g&xV9>@ju49z0z@TC}3^ zj4S3)++`|9Aisadjl{>1@eOaSnsfhQA3o+;i-(A+ z>2i|Yv!cW8aysj>%^T9LB#JH>aMQPj7ltt_cb&R=a=(CkkU!3I|NH+>2`~NaL8$qx z^hhqTvXnl!V#|=8LD}6@l-_`NOUi_0J0MOVo<#DDR2hQKBqLf#!%9sr2Psj+$q|69 ztaAHiCNLvEe(C9K=>r(wv_U*ml7fvK@KIisX;3$mcAGI*{|S(Fs>a#PJln(BF^gBU z`-z+zd2hNzVa(EhhjUBZBvYcU(HZKF&)wM^ibbHbSBa0RAho8DM(^b;W5l(~0w4m7MxrIbBP5W|u~Hc?YR{%C{I{YXcgmVEnRY6;z1%fIam zy6llSAl*)Fgm;x3j*0Vr3fp+k9=4afa_}LSacJ@Wfr(viXz+@34r@-^i;Q~ygFUOF zpXh$S{pFLY^jePKmQ3{amyZ^gjOxYpAKTa2t4O6t@BR>uPx$l@q4=zK#pDUy-ixnF z`IZr{KQ~x_a{C|+xF}!M;Ck@D83t}i3n#09?zNGyTs|g@m&^D9HsU4q-_0`)spyw^ z`)92lBtZh7F#<)OV$i7bpH!gIxMSL|7&VZgE9p(ysm!rLm2mdyX7GkTTL&EXpF;8f z>w5{l4^1Dn*P8_ZX>%JgMO-)^k%&H|W-tA-UWR+TDrZtf|1Twh<4Id_OCUpy`1R*; zP-ZVjwuVhpX6MmA;MnP#it)PUsLBUHwn6=ZmDJl?by|X{$22Fp;_hF!RV9#BEbDx% zHu%;Oj3|Y}Ke3Y91E%Nk+ex~`P|H;!4N91_YIJCkFfVZ7v{y4h8XK7VXP+gTY~j}L z%gmQ!S$*b#j05~cf3vHh@QDK(Vn0V&7h9SK-tRJmp!T!FqStqXzv2TgA} z>|vVN6ILfE0_Qc98a(V$Yi_E>LunhDF*zr=#JTlo?gz zTv%+63#yYLs^9-pc=V;clspcqn2OHH4P>JWGxKjlLn(A;B_Lh?g`Fskfey7l!TR?! zoCVI^wR>j;lv&>K7}g zV*K=moVFU|J&s-;RZ3O_x+v7||L*iYq=`c)zOYi{ixbnPX#kCx0`zV|9ht0Gex@7 zl}}**$>82LYALl8N$@u%8DRY=O%`PsCgPSk3{#bx{1HY)jPeh`Y_l6C#t7--O#xo` zCl!MTIf^0!pE)LQ>9(|dE|uhmigR8!YbC;sUutodKzK-KPJT_pl_i%$s>PWD_}#OG z=_x;6J`Nw0)wF?2s>dj&3{Xn>;u*c348`<>02~}qXD*321J~57^SCj`PY&OPxvf%8 zY`JtezC*wnCO&O;q$!yC#AH*eN)C4hR@vYYVO_4pr3^a;yozsP8UB<03z?x#ZdCh0v!13I& zX#3M2hJ$~FzL}HT*8zxc0@-IttI)D{+mK##?9RQb0*Lm-K57inun$)#TbHr{N#bva zBkq7oIRxoT-4GE_hKI@}G|gYGb`#jmq^s(K%knj*;vPJzs>(7aLS1vI3mEH)oTvDt z8M_R@CqYI|#_j4H?yMf1swrH?`vx9>ee97<1e7#}xG(nRq_Q0IF9g7|<+wB?2?~LG z3YO&{OWnrE(6fC%L&rX(+HA}bBFbBi(l+994S1?`}o}9~F4H&`Ev|d1)gpnssWb=;9@{2;1 zA4AiZWsVck8}i_TxiSZbb3#9lt5xFsl8WP)T&QwL#X#B(AhywT!qsH!G$xUFz;pej zCD~#7f#&Kpsgymd1kD`5jV+D`+;jlG?hNecf#xgsGnOBbulHPVx0uDx3EjIaV1EfN z**Or!X1wFB@T0zr6^ZOkfJiB+iLx90wB*)vYcUouAT<|i9_|g-qV0lD9aNlf=W$Es z$Z=ho(|+M0{&l#`mAIZm1YpGXpBc+lV{Ydka-7hT36FDG?FCT6$hfJ(F+RSY&%*{b z9ra{q0Ea#9&&7HOW@=6?;Jwz~3%n`#ciQz$H#|RqDWK#9NO#7WgFwo2>EJCM+^67zico+F);>35<-wGlCymHL4$x)0|6z`w@`yab|BE+O=l~ z@DHcQZf{@0Hkc6XEr15~wDdpTAe&}@EphA*?KLlIXG)qZV@})Ar%>O~k6T|bSUoY1 z`|}{}fTQaDaSJsV_p2L(B4@fUBYG?mHcn!V5a~oA9bV%R{O)IAO zAwmQWyTbxJmFpkCnEo68C6jilYL>;3UeV9c>~d0&_cO|_kEO;61o>jvM(S0d7eFyg#>@)BKn%uv}Bp)dGVi5CeP|a zmFSGTTSIpEa`-ohq1wXD^dBmEzv_v*0%!*)7LWA;4*&o&tiQOFrk14^Z|O^rg;2A8 zyi=SC=Ux~g4DTz9*Q-8@&IPLRjI=#^dU@#h4QImNcrq=-sAOafS~HafiAT%>34bC` zzSHdhv?79CSqLz~_`ul}xWG!2X}aXUhDjzaGxtr9qElRfOK45!gT&8|DVmwijIl6< zNJ83iB8Dm?#=FfL5U#l-MM?hSaQ{RS7DLq&=80hX*EwRXF&f5FMa6>G#P)D#C6RB? z=+|i>JUO%cSxiQUVrubrVX z1=Ek?i9*yBPQ0hKp&6i<%yddw2b+2uOCK;g4eU9$S-prrNNlnJ>CM|)Mfwg-1G?oK zpmw9m?#Bj3Esv0RGptxZo!?-S7i0!*g3uh`pTX@CpYs3C>-f&B6XZM(PTkAp=6V=5 za6VV*cdps%99u}wT3$%(qx$Q#F1gASPQWKp9~Y1l7o^YFQt)uS*mY5efC8AQYVO%~ z(PC_tsM&YrW?tddUMIa2&lG79?&YlocrPq$4kqp2sjr&+vX zvB^cHVnW&kKVyK7OuJ<-M8>f|5@~SjAA(3CQ;>!X)5C0T+lkT=Sq(-*1;)aXY=8Yh zak$6$tL|Aok7Og2Nd{)aeEN*anQ-gz^1YZblEM#h4Ad`@ij`?#jcOG1nJ!7$ER|6S zA3pWO85p4N$s#2oODrw39k%K+;0#08@Z0NOx`2|ROl{=+sQ`@{H1>$+s0tvHqSvIo z4{$$1$E;cZ6>a(Ka5EPhKl)kRO)6*r!y8iED1$Vfl1;TEOYZsNR?JPpkN)LGH)PR z?(&;lPLU2fi!Bw0pj#UX>1Ons^mbLbY<7Rdsl+Wk^Am8>vVGC)A=mCtoQU}Nt8f_Y zSEpejFCbHiQv#LQi_2EN867F~45&Q{+?UXjue0jcrHY{!L5;1YZi+m0!}kZBUYd>h zv@;dxQ}nzxQ#2%5p)bt^XGhJOG9K`PGb~yVyO*+-H;`U2^NP_a?UI0LeetUWcK&&_ zyAhw>oC5x=G-v9obG?>hV^Ah@jZ9_gH>x_p%=CW@NfPdXYn(FZbT^+_NIqln7aUXV z+kIkWV#!PlZ|J1I4=s30WX`keu`F_$8Pr^Ruco`kK2BTFd64r?r`J==pt@${3`m#S z_@)d28&AbtEIp3lMSAQx5o8IW0J+W{F&&v{os{nY45ii6a<$)kiccxAx8&wF)L~Yp zaOHJ+*8GwMEKWZHb8(OIgu3($K63=K; zw>8Ov+-8Wn^yPW(IF#=muBIoFu$pWrZgAqt2}?qLoTT{RJvLp*xq1Wok2v$ZvEs#Y za+>P7tVIXVO$x!Bs0RZMH&DU4*klWH+PHWScq%&0X0g*+3sJD?mao&Wxg5E059w42 zUVjTv^+|5DQ}C*8Uh`lpA_LNo+|VpH`I5pG#3Me>0^v%aOS76C^4-Kl~&D>^CaAz%0XsH;nxMm~qmMN2bUO#Kjhz(vSczrO1QIa%C?1m3Xot4ou= ziV5|86_6T=IRY*rm84`F02y3ArBd8@(Dg37v2*_?-(7GDW)8uKI4~h#(#Ww4mb>P*ysQv+z+~!q98w)$c(M~|dIzDykd@f*D4zPsH$>6$LZ7mpdX%Xy9Qo8I>`fANaPXdENNEu zL+zb%v=>x=Dq>FWtVrhJ@^3tteG2!6&e;L5-6&WHGGPSz6%jYb(BqeV;YR|r-rN|m zOgXccTm^3kP#N5!9{kUfyw6@z`{anCu#<>9XUEwt$D`!C9`4(-d4t(J5v?aicn!Z? zswv`k?qQjINW#WHMy`H?=nY}|T=XcyFbx4hl`h1W6n`gX2>q{~*4{d724e-U*{QF} zz$km-Uy~7X73RI}Wn)gaxr#RZ_qUk1ADYpgB&OO|y^F*Ty42l?;1In7*;Ju95+&c2 zm*a`jd5XAu8eHb|Ck@l~#`J1+$YrHyb2SDpqrQw1k^S<4XDY7*Rz`Jl{x`Gt9u0(3 z+@j% z^nBU2`@@^a4?2g`-9)}L(l)fhz3g@T?NCrkM&~364<75{9|scZxx8H+r0LjP@}CLn z?ldvnbR+A3fFzG$xaF!0oD3qK4LgUHHI-9|dSRb*6L@oq?H7A~6T|HRZf|dPqtEZ-ST= zM*_^&^|o>HJcq#~3OvMFToh=HlwpP#TNvZS=T-$nKJ-Z8;5a`VPAOb>If+ceI1dBoAr`Ch*ixzWkciRfCbq~2 zGY`Y8q`Qs5&#xIj^6{J)e9jWldI!O>q}0TE_&}s8rXSNvNHMUwNMU+@jm!Pt`szR* zdHL>E8(xF&2^#og;ZcL@0Yc9ye61VF9uv1EJbaQbCGJv0IFL&{6*_DdUM+$HfbHCp zRFY9NS5$CIbs*MS^DNEG(J18~<(}OVZIjxs2#o~aAm43c|F*)~x!SG0G$)HRyY%j@ zzaWwhxjf2D&VTZ|94IymU5!agI9ZI5CZJ@La4c|gl#KGVLFgUB*zla$r1bvAQ91N= z4?4CX?&3A;aS};;GEwaU|B50$8{aWXWGj{ zMyl5#ldf%Xj`SrBxUZoYf<6+K-K&125vwB<>)MUK{x9!Zi*`zLXT+7bvF~hDSFXJ$ zeD1cRlMOew)I`NU_SmB=_lze#)@bf8n(gSm+zKRE^zd~^LyGq54^Vr`HVEUyEPN&;Q z1Eb&%_kZ^>p3U0coII=fF@YBS+e*gig zxueqaIGi_L4!yImEW@ezE?>w`rA6G0Z+QkD%vTw?RHfC1a)ZVa?-IsPj9Lzzs9@FugTb z3hoSRp2{|V8%)!}|Buvf`CuD$9Pa1VXXA772Ab2XQ=Bc>*$N}Y4Z^^3ziZhdL*Mvi z^NOu;=A?}}M2cxkZMc6+wz^Z97$Ub0hGxSFI}AXn0|zxRn1u3wvS zJ?_~HcLZ)$QF`tBcDL#Pe!&NX+DEhRl~m^8rW4xR14>) z_w&4FBSIDFyRjyu;Z=oVMzdM`&BL##johY{U3Q*nj;m($ioQW4r(XlBKF(E^MkR9wD`-%IUPu1AhMN#!NL~sG#cu{|=xB$HXLt^*}8)uct-xld5pu#IhjO03B z;ckT&$7&sNxI0VT9$54gpOZ0*fMND=fBw1O1aDqcI}x<_cQ8bE6H`Ngae8O{Ei)-> zyHPk(3=}S0$kq76=<6W=LGPW@{g=0H+tedZ`Jhz?w0!w8Dj53FQmK7B&$x*vYjfT* zHgetis^=N5<6*%ZYZ;CaK-g1{=7U74yNH1cz7 zuQ%V_Yi^Dbp~kohsc80@R{ua6Ae+chH6Z^7=Y~`Q=ow1%Vko{%K{25ZM_klWQvWg| zFedpHjJIwLBk3(8L3ClA5y?&Du!y`Qf(-!rB)}mEZrb5*rh-Em%~|BV>O@gw)KXd+ z8Qxu?m|;aWauf)*61;|2b=-Bia{YRnT$Bn1imWC^Df#@o7zAvFKtMGSZkjbzpE6j0J%M?)cb@9Q3?9L#AytRNIg9$e!tdB?eF@vny zPB=Orveh4x46|uc8$f@R2w($lOD9YchYP)Zny(Fj)&VdOUH+%X7Z}^1=0MLdZP%^> z2)v02DJ{>176DE|Xkx5Gh48>GcHeWdytG|>=@1DyzMMBGKAwmT#}KYS6G(P}Ke(AK zQKYE@yj77qahv3Ik37*LHEh`2@*hAZhNgZl5>(zZ0hDio-Q0DfwC;1FBiGGN}_{X z%k*~`Bai#L484${kdT*ep4E*gC4Ri8WnFmPtSe4aT-sza45kYk&k6StMm{viXo}xu zoB&cd;!(Q^CB@h)>%FQ)av5Dm=s$J2Hp7{AS1M=wC4#|GwSB8gw)CG(gDHgAkbYu- zMUoP~>`e(ncD?C9rL>Vww+WT`B#`o*w$)#w5oj#@B{gL7fo(RuqWgpa&3WjXPPE`YRgS?!?Q~rr2avp>C zNZboab_v5rUD0m1VLeLAfPj47dH!{JU+c8^ITxyL2|rBmFqs}hPUr{C$55wAz~>5^RQ3;bj}d#5F%O5G zH)w1ag%D_>85bsc67-lUpL1;1veZ#uQ`-J{amK|M`|7G(n5B#~_-V-3NUI&ImUc;} zxGad|Id#l5TRJ-9gsO>S??n8P zpf}eK5-3}8N%U$K6%hFun~J@U_9owuEr^afH6e7LXXpzx%l9jKF`0IEp4q+{u55 z!`)=^{q_dgsY2N*`jX_Py@|?k<%hh1U6*B)SD>ATZ;LCnk%IK(D1FzuLXX>Ceq~D=^;Fwl$fmE^g7SNxwhC06+ZQz*qw>B`4A2Iq+4Wu|>9mSIc6(m`evC|8 zYC-Swst~@Y?LuC;>ai|Q*X!D~)K$6>kf79F&BKIVegGcR0S&-1NywtBT9LxYy!G}ql1$05LCJF=bVCwXZp2WLehHX#d?cgq!Vps0Z zk=u0MonKvf;b+QSP$k zC&BWQ44Mk6hFEZ>*G#3xG;6QBTse(zb7g7?(%2L$%lx-mtZ+uWTuTC5@xwlspE!%v z-72tWZaiPX#ba9&gvwy)0(2a0h^&3zZg&|~K zukVFmMstzCK8*D1iT>F1uy0kHm7nikVIir>B&NW#nM|2ygY50eBi?3v6Ad*|b;e=M zD)UasKoLu7k6Nc?*52X$f9KkzGEsq^ijEB(~mWGZ%f8@u6p9^ z1*B|PfAkS9zr|&iL7G>|il)z1n5(zdi?&v7OB+8*-fW+|>apWpSLS~dG8m=iDXDx50wxeH{O9h=onN_#Rmtehn0?s^sBl>S8hIlpMeI41h`7JSD&K(Nvegxlq7Bf7rZO~f^*v4)(yXrxJFP? zQSj<&a?pkGe8rfS_BsjqSG(Q`Mc7ikH4^B8dmHKYr6O~jqKA}PO7vK%Xdz&uq_xxO zDhMF=Eh`;c9vu^*XbJX<%UtGqU$B#-PSY-k?y}+<4C}wuOk4*^sY{YQ8@UsxQLXx{!FU>+2Za1}oZwU~PvE!~n`jZXZ15R=Zz5@$`!~u`MB@+q@ zhIG7sQed1@tggni;tilvD|I|vtc7z?H@v@M^T7hyH6BmFC(Y3iIaU7Z_K*>%zS@E2 z?5mw%_Wl4qgZwz(lz7pn9@FMQ<*%MT_;>auCUFYMDM|X>7*G5nX|2`}0gvZ(<0>!U zcgJ-Yg#zN3Ablt=w_g*KcQG~su*vrTx9UAXKMwOLD^XgK5;#ec(b7^fPueM(9)Ik9 zxVIIG3HFIGt?h(AOV*rK;SU(~qs2;lL;cg2BXGcv^|PNU zGbCo!|4gXu9@b-K^rGv<`c{sFfjPC5255ytG~*ixH5n0#asTN4m7qQDI8tMii+XOL z6+M*j(v%bxdUdPAA-b&$&BOyjh2!3n)c?DI0Ir|H_q76T1 z3PsP8oW8zC3vNR>t0qJk;6s)WLW!chsDd!A-e$xwK3XY2m|mQehV;lS`^EOnMvc@_ zb?xKD^n8fozwQX(i!t!#8sL~$;*WnxtjGF3v9Ci2;7-DeNyyp>YNMR3=t&xuS_Lk_ z`J_CPj04Y-?$`b8K3Tls@uJ~y46xb!<^}od0S<|HI*(eYOzI{=5oZzq0>bM!Xp3u* z%f=-n7H?&!QXF!)BWeAr-A(;C03U%AQbLI^U?W=Sqx3+o$+*fXnO0L z7%fzQ7J#RP29xVOL?E&S--UC>NDREQc?(1-NC@hnT8)S)w)L=Z?j<7E+mPuWBymfv zon)`vw1Ak~Jrk6gzjl{pu1Gu!!7-d|%a*2!8+BPlb4;jyHK!;4 z?bx#%G_cvi=8rf;&x@=sX}sXGik;d9f;N0b%^L6xmu5q|-mfN`5oiF-pZ?SU~YU3?#5Doi}#MJ%o608`kg4E=f$h#QEn165h{LWeq*$WEzHcNZ40abT&YnRI}EU9$_P-2 zxoZldNpOF|5RX4@l#*c6>azy8^-!!P&wuGI3oVS`U4@hMScvZPWD41RT2O)rrN(*t z`Y*Mz(Uv8&m<>VA=X{nhtwFedjryRkWSG`7LL*mZ^#dIumvQrool;-DCR}OJlj@U# zv8v-|HDyc$Fe*6PPr68fe@_3ggg>W(>Cj{4EAPQm1uRVQ*Ix3l?i?w&evwqzg{uK# zvi)BfFs^>Athv)CcbXK~VnTBDR-edJr&rL(vs-eiNmv?g4QW}4UQN5;53&KF;D8`c zxb0+oI#33wTpa^8l?|&WnJXLHH9KYd$n)U&gv+~)pnGit`N}Z2{~^?30hue$W!l==e;I6H13;5mV?&YpDpcOsw97xA#I$Ma z6`%x+*Yso$CecUl6P8ZHGs!f}oe#v&TZMlCtlpRFTro&wj)bsWbt;f!Ik}ZLu*%?8 z{M{yLQZduOOoxK#x-^vqo><#YoOBctWnpJg+6|UpC}JH}B23Qr5EuJDzD-4WSuT6ec9fe5|voM zFMDQA08_D{Zyw(k_o4NGIlfNe+Ew8^6{bZ-&#!q&byMn!KH*P*y^LU1E;#%}C6et%kWpViz|-ev^w z{@o>o2&duV@@NHm5BPNLc=@h~dhMIFZ2`$5Thwl8uADfsvQT&Z5MNUH_$3)c|C3vc ziKT0>aAa&_w88B1vpwU4W$sxe*_(OElX`-o5vup>!s9IED-M3^DeRT~lR&TAAIL`J z-FN#Pp?%HfLTHIXzh8~|Y%R3+l(qr@Ff1fmsjD1j{5h8U zQ+qoBhsAE8sBD^F2VtT=yD{>tvsQ7yS!|oE3_JH)XOyBxF1Dgw7C%Sx6>ZWUqTGtK z8jI~ObqJV*Zr1#cdHoKxC&FFs&l@7DiPu=sE3SL8a8?87KTDN|Prhu<{C;?m_r{{` zL03$Ve7+gEvF~33P;>Q`NT3UCQRjamE}H3)yyBzvFF3zFKUU(?_mr|ss44+E8lUk* zxfzKSZEQb)4COoOAe!54)J7>iZ~9^bvudq@w(nJtlt!_ZhByPP_a2Z1B$4A|bD_=G zp?uS=?%I4*HtXL7_}}-*EJEk2AYvfY7ir?1;}hB`^ZWCHpXKHJ;MNPj41 zx+HxfJKbC7i|*~_H1D~if#7*i9Z``Vq9{?DtJ5N5XR1=m6(j%o;-hO>=)_T_habSS z6AoN7!BHxg@nlZDhsR5@H+@q#RNdSEOr3h6g=q7|yW)Xu4B1~fJa=I20ah^j;rTh$ z2wSs-v6cF~B7esVmMt7>`cS}`d}P>IY;i?-4D2u7#-_H^JbhVIZ^@$7m}A(?@Gi6qPBiUGeRzpwec?a#a3`IQj8 zOXiZbD!Ejy6xc4(xHbNaQQEbC$_z$VR z!-|9oUAAl^&8dCT^GTMMKk^B+T+eFZ4}${;!U85c!a^`kkN*&OQ|j2ZTN-b0{vM>J zc##rA36o&$x@>ZKxOHKmrv_qtd@!=jD(9hWWR5+&4~Fz(|1*1t$|n6ixtd9?Y~@&c z;VVnG$^;;XYjBd(Qa!hD0`tTW%n0Lx9t%4Yj4Tq+RW+!kVC&b%00$AJy;QYWEL2V; zD#SeSf`KP@r^$@WF0M7j*I7y{Mf)wjd(7Oz)-F%$0`o6RHEI^}u9WD~cbz*tdg6}x zx|oCed?aSXa`obhp0bzZ&#CJ*toenrzmxR0>Y4rviy5GCp3^k|se~-IkSp{8%NlT$ zFgI-%hI>}9UY8HoikSM*$8IjL@_#e4J8qzX5z45+CAT%tiq$qdLm?aG9s}zPAxo zPgrs#B!*ppoIXQRB+-kn@+!hinvw9m{l}~&4|;lCf>%r z^EtVq^y@FHQwZw!W-cl6hI_hWM^A{#iIjKgA=QV4xz23yL@(RcM)c+YN|^6{J@%dd z2_IYss$Wx-7ah01gC5Pl>={P3`set?Bbr{&Gw~4*1wz24fU@OC z12Ra#C@I=Ve%X?bSX8)6ZAKNZ{--H}tFFGgyt8EuylQbc8EDkX*21?X=#rf+#5M{V z731PwN|;n?Q0?X|Kf`T(QZGB?IQjPo*tg?OUSnGOdeFZ}@+9MBt!&lkc!c=T0s=DT zHmK-m`%2wR)sXX2ESbM)Ard|}4Oa_EBtp6n9O{Q-448U19+4nXw(QOK!;*3@%Af@w z9GC{8Mdi~34Rw1xdIwhKw0XR55f5NIWO{vH0T^egiAy(A!(P3{;tI=^`&Klb=U308 zw_pff)5XuRGN@yAeJuqj({N<{ZZb*siif#^Fh5;Rw+xeSAQ3hHxK-wXw?H*e$y0SA z?4<-G{?L(h9lJKQ-qO21+dDn=-cO6RRGi!WQJ?3w?-&Qfc!P2^RQVe(st9c+iSso% zq#BM2#~cEzDEhIQKEtW$C16ywQ`~kbs&v##-r4XRuqL>neS&iBrK{iCY)K%6jE_ApjF?oE&6K*!0kWsqi41GTXa%~qBI5fP|xCyMK}0-RRLaXY8Yc!tIqQ;xyayo*>Ty!`DVgqdA}W=G~gl|EZJ#VY%6; z$6-lf+7Gdr*i(CU)>?qESE^e(&xV%;5O_m2>-HvwA^CSMaV(=x5?}gsen)Ecw#U3TDiwa&YGq(yod7Y zbq`0$t|Z8??#uD?(dX4#nQHfANxyoLlWm`Q9U z(fhi^I{kIY$p~#E{dS#JQ=^6CRm09(wMdrrsn`+oVfqq%*@l?APcs%PaX^Ra&}MN>c}yzu^E^UWHT)@@-YyT@x7A=wJg^ z6qL1cxiN!(Rc4LstOZb$03uaqkZBWSrzfJfOwT!Qo!(BRJz%M!do*A)b(%s6+z;JD8r#%{qb?e{yl%G6mMPtxJO~NGM3f5(4^Jdj->l#Z@5W1 zF$~SG-hFo`y}y*TN?djGJ%uSi)HDNNkbMAv$R z-r0RHYX^*sF&^kWgkai|6@U#d1VHEK9N%%ZOKIb|OZ;5YXinIp0exZi)acg-m&sum z$vx!RD#wX5A+Rd?r{w0%-dpfD+`~uiKhJ>O4dys?*oIRLdmp(BEzvkpXdISYXTIGZ zTi9o7@%2#+35mPboD;mNanVOX!H*Zr`m^ET^b%0<0=i^;HdOUVm7{zXPc2ejZ598Y zmSYsh!qDZ0eRiQ~!u2Iac&lb^F2+I-KoTn?%4AOr0C{qAtCx7!mXA&j-mu)MC~RPr zORMMKm$?+9C5#R)eTzM7=B9ShUx&;rHpm{GfCu0!c6`iAlFk}jkMxdaxdOMO%+`J8 zA6Oo9RNWWJc!pO|-SZ0bZgTLieUe5uU^(6q!tPA2$L_AoZxJ9=F4-=}u3O3=Fd=Bu zujMOlu*WTfT`f)M-0@|4i4xjH>;5r|GBBw~vfActLbXZ(>ged<^9$8MUF`_};pp68 zAYAh@3xK4I0okaZCn%Hkj?=;+&1tL66ls3th;wx%8&D%r_vi<$d8?E}9y4;(B|pqY zm*4RFDNHG7qm3}c`fuC+lUZ6oRAEjC57rp7Ws11Q>!Mj8U3l>qTobV@xFmzGphr%FH z9x-Y}UG9S{3+A(dNQ@)B;;U&%LG?7Zf5lQCY>VUY@_w)X7zsN|M=09tWi;xY1uN|+ zZjeDsfNvqh39aPSj9W0|J}?o*B|V4;ax1W1qPL~CPjZ|09VJUoCC7eez*_!rnRQRE zA_Qe3B{ZQ1k9LJwPN0hKc*FFPs@N>LSF&ty04t&1-zg{K#E6)(h{HX|@^Y@Dt&Q>9 z;>j~+=~sqo+%MuS{(U)X?E67g{MGe~W;>(R0Y$fAD(63q=dGV?luyaqUMOQbrBaJu zAF(CI`}C_|xc*ChKZ`Loc9=+L%46Jo_#*r?DDtd8Ba^7>)m#0y!acC0RTI~l{NkQ( z@7p&Y^r9Bi38ZRPq&n4^eWFGvO1V@Mf%nH~EJ5Ynf{`Ihl|7H(k@&zP{0y_nZ~W3~ zcjW+B+LM~x$*b)}`g@UFjhTl;y`Mc-^R=R<4*v=B7jbehk$nBI;=iFRB^U>H{|T!Xp`QdIOW7nY>Cw>aR}$$ z=Eto`>GYyAv41DewP+iYn(_mj@-I`tw^D;fPV10fM2p&j_a9+`!XEHi=H|EWFM2;k zd74yI;hp5ACE3OA9ZRa0N}dBQgI$Z$B7~}V4O2_UZ4l+qY@aQ6)wEhGi+<54EGZ~8 z87l)vKKZW?;NDpr0Z)vPTA)iRprr++hOu8Lf?2yBC7D^r4Fdn@r_wyuFQs)!YI$Ad zE}GgX6$3c#=kS-(*}qBG)LhF4X0-dX(`+|>$ z*Bu7<4a!hwwC6<4)UBqB zoy%1+tpD8nZC#zlZdkH#TxzYyHGNp$`)+{j`TkXBT>f3P?mTYZVP!QC@kH)Yn%Vb2 zyZEkp%=yM{Jc{imTg(g>D}L09EdJ_PSW{l+q`BaQwHvo&-UG5r5lKI4T-n2#_c=}? z=McqCz}bc_(yqQu3ON}`2xPRj*^MY#GW0}OA>iE{2~zCY?`BW=$UVYg0~#2QxO{c3 z+yRHXPd_}0p5tWOH$a=YNoBsR!nnRnmWsb+-M$F7fyg+C6wazNh&k?d@`2r*<$go$ z*w+MnND;r1ZnNaadUkbtj=IlogW5tDoHaiH#6gg_EU@q3bXI%we9w8eC+s1(rMupw zatFvJC+FPT#(K?GNWqKBn88`*4`Enn(EeCx>sH!$Rs=qPnp{W)0(OPEF8&_U&8=Sb zHWgwfSZV+@p_ZxK&I}yUNNf5IagMC>SEl2D z4yBG(%oAni|F-HjgIvufG12U{wqPBthZ(Vu+QToo$%RcL^e${PXUw_%>kaIcg4Kt# zbmm&-zoOT7kwCi<{c&F(*gBH=_fp&EyyCOUfl}-O6`Cq3_Y0W?F$tBXr$PIK-dK+d z)~p=d{PAxpS<<}UV0UpxT@utkuIktnS$NBYe7emkNl7iT02+{TNYq>}juV&gJXX4y z1g1Uj@PLJwkuXa8rUIhTXlvm388q%Ko>B2#h*OyUt`09r>`T^38vM&=;eg&5*FiH< z)M>ZtCa{z5xia}Oq>ElpTr@zN__R1vsQGKNF11wC0!Q<7MAEpA&v%9CL077rP$q|l zT6(aUa{+q;4ht>_Mb4-zS;~dCR-gNQTR`pe2d)X~HC-EnP?bHcomjfjvFS2-5X`Hl$bmSIi5Z5SqHh`ja!4zPq@uuR!O=BR zx+bWU(v3qxr9)CmN@@&{?j8-&qu%HLe)2f{Aa1Z9&vW0`b)L40{J~1t6Ei+kG}bx+ zlq~RBgh~Jd*MG9iT6xtVXh25 z)003MgiY&{3|VHE%KBVT(8T?h49~E!<#HbYPr6;Kf{tA%8A<=IU=8A&0BTA!(f|*R`SlvO zhQyY=&&u~t7Oug99inMnps5%$=sjz`u(*32(ljT0oycbr^8ywA$yCZEhc?iGBN&;c z#2go6a$R3o|JfM8G%hsr(cZI0RLxa@0y8qP%fbyDk4U2;RtRmnpS#rYbk3WXu^!kS zU;j09k3lKgaxS3qLZ~|C0SI?iFFq}!I_{Q_yRe(>J~0i^t^M0`BuH8mQbYAvxLw3d zNM@Z2?Vi%EDb*OURLES}Y>be3OW!jnHMGR=oN~-XP zNK=d0eU~e5C@k{!yj${yaAHCzmXqtLFq3=(*WKTQ`)a>Q)ul$T-o^&qmKHyR7 zhmZGUg6l^XP;Aoch<~#nX01FsV699KekPrp`t1{8yS#1Ole|U07p7Vg@5;4YGkG;0 zX6j#GU+~ix%r)UTNvRpX-;L^6(s^^E{7FKrHSF47OGTmJmKnRNb5vRWZIMytgbo93F;1LQre+9ncCKzSItVXh zH>qhBAYz$ls65GW{x&|=L(a1yN&8Je=5@jWVJj~&LP?+I6X#6FXQrm%o3vF6LEEL> zr&Fp#VL$c&L$r8wkk&^KQ%gyjrLM_}&sV_lj4o}0ty)|nZDh6(Du1);I^nT&c#&1R zbVT1vF0l)0%ircuK`Ap7*6A|X_JFc-91u~*fBrpPSxn5I+8@FhNjG6NCb$-L9F}?U zUHplYKAkV7M+Fs|xn$>-QvZY1bN#ZQ(bSWID5?6e7z(ynyzTL)a60*Wk1D`=SSHKB zv!Qtau}-G=t9(L_c8tQ}x{_PdV!UJI8NZ`Opdu|E94PV}a3D<7wE2Ps6|J4i0s@}3 z9gkbURD1mIz)ArLog^Mm2BfA?y7Kpw_D?~);VSk6xf!X_ajVV9Z9k!VThHNxfN|Fm z6Lwh5gaU?iz|*$$N%)n$#u$C1YmfW2#Tv>r8GB3BlWogwO^udWjjDx+Y+vla^oA1={MQ|xhOwRjWjL-16SEi-eRgT zeQGY4Jd7N&tCjgq-?oJjm@y@3eFYzoQEYX0t`kV8Wht&t^%abfRo-u`)cthd2?#7$^ zkUA#RWj9CXfXl9LkLA~xi_j=2i9_8cYvr6n(~;PjU0t)cNu|xcICu5)id6>n108)I z`HG3H?tlQh(~wurqXqL>Mz416&`q5FY}dYQ|G|j5q^44ekv_2I9)8|;^=h)Q@{b~@ z)v7Y=%^y4L=PvtZ8YU29yuO8d75TKv7QD(62SiM2fuHkbugYdW*EjyuIP;&V2dh0a z%fi*SBI9Zh79V*#=Uf=DXjx$2v=uxoJ}TH0D`K9~>`Dl$-`slvH6hsrkXButjZT0@-iN(_HQS`EbR*A>E@uu7@3Mb|xg05Mcl*kv zF6=p%Q@?DFxX+YVzLDAu{}(AK?l}6LdbH?Q9A2$q=yLEsq{dxjx1!Hl$hgm^#CW}f z)Cj!>%E0);hm%cZD(l`#6GIURp9N*sHFRJt-r=XhQ-z*SXYbLrnE2pS|ZUM^va+f7b%$V_w?C>IgQd8?(03+&fGp7tC*$E z+jY4cEG%(ZUma{fSxO(8ZFWZ?@meJp^wy&&a9WLUVExpQZ|!TVAj3;-p{hp1l^VU5 zMNmnGR`%290=&WlzAoegy7}t--G+qu&HO@+&d)nvwsq;EKzl@ynk*5jZ7X!ML+-Sg z{3s)qgsicuJeSm%-}+{pVB(uuZsUH!;|}xaJ>G93HuokqER8#W2&GGN9FrV13(G+I zhkg0idBotCfem&pTtAS<9{X#u_(s=ZYJSU2r?ZBHSBNLFl!|t%r(!9my*^|;f^1oO zbDn{UceLScIrVfH`yZy2CXfyxQ?_C8ccQ$EQvY-E8EROE-QIeNdH98cw+n;J3PeIQ z8Nk6~mHa>W3nGpqv4oUB50=*i;^Uaro-W3a&r_}l>47;lt%lJsLg z&fKJaJzs5h1D(5S9L6H;7oD_pE4ivKZbIk9gs&_qe=yd*|E6jnaK;~e$km-nBJcZo z2-tE4Zc{vj{rzRXG;o#x|Ls9dh;IKt+-p z{Eq%09lGF}kPiO%Ix^uh!W;NCwDEIIpCZmfPue0XfkG$7F~83y1e3ACGC5y7^nX>m z;~XVtw%vUt;kYU8kxp<36Eb#Q6Q{1aj+vKiOKPo=e*(z>iB$YhL9dy-7?ioYn}N3< z1S@arJy(^kIKLB)m474N14f}AClFV!SP$$E3ml{zg`dtsQ^wj)OQSdM1Yv^%F&el} z_ZHJ$YVqywLsPFszKTAU3%rT4l2yc&6QMAo?`y~j*X|No{*-slx-1hTxu>kKTWd~) zeXfX;goitJb2}nSyoPB@&mfn0DbZx3&lYt-s)gk^I8Vd#1!FOAU<>q3tN)PSt}4|`ou+=^|ke``mAfcl)l123v~ijU0=wUxqYmsTOY z30r*ARXkLBFYh@?5ymdQ@0*yk4kfJAprz$=0}i!K`q7s`Lu{ISe|DPFsrzE$5^Za3 z$QhHzru^yBDtv=#9e)ZdS`~gX+gehtQH@>D@qZ8d{;5GK)VEi7%dBCAtF*o?v=IG{ zMf#~RNkK?)Yz{S3azOt`M^Zv?|z`1sw`4f`gCmIgEU;)rjeEtk2$imeQHO=AG?e_A*uIV^F7 zbc!>hr~ot|ktDqE#ApR!atG+Qgs&(RD6;X~qPq{0)vmF#cUt`t1vq3Trs~fU%WKjF zj$nSCRSKX1WI%ae<3sF#WYA7jc4o&?*>a~A!6*8H$))tba2=zDBGb#CX zHjn!}ln)i3t-B;_Q+p_j-l3Vu56liaqT8lfEsJk{eM%ETlWxmc3K_k{9Ahc*;pj79(YB=j#W|@Yk!h-^^t@QI*hPB z*7+uR(}Kh-B=$3T<=KbHsmtaavfzC^QsJLNcT1(;6LErB?VBcb}Qlp2>o#;>9QEdlXUGupLXwvehvkHFUgHT zO!%KLI>56K=z~d5q%Lvgk|BQd9}sq}oeA_Et$C4KxZKT+xoiBm{>$`B=LXBQC=zgW zQjZP|h#~liy`iKv1dNNwhYh zt8CsU$Fpl{dHx>s(=L0|Ri;a7kZ9oE4Y*2%ChoBThXNP zM-tr07DAcg>3-T(xjII4d#V}_Mqc#?A;Z_##WTKA*W1Wp8h${~)aL{L$gXU_0kA>* zx{`3MgLp*4jrr_t_r|qfq1ZJpycU9X=XB(r+-2PIQGnyAiJ3uPbbk?;$CYn=s92xr zFZ^-*ec4yOx;eT;AmASh6Uyn=KbFG1KeOZCLI(q^CX37roFdYw+6sDOm4q z@8K|Cy?632e_lo}OaAj8B9>z@(1Q8^PqMy*)v*^C^;B#(MvdW%Lb1bwv1GNj<9*tW zZ7of?=~*?Kv-i|=3hNQP-H!y5>s~sZ6jtzU>(e~ms7Q5n)gu_p=C_UW9D#4VFWm?Xp$wo3`6D4& z6rE&NZrtvYcS*JlFEsgHJ>qD{uh{r*Z~$ zQ45fJ-aks%sOga%CJ6*F^25KLzXcDFK00V=UOa)jJn9I!J&3{xfv>W-T@yR~R8)oY z`U)4D@o!grM7((!L8Y&5cg3wlfu~4d81eXzI#{-x->W*#Q5}dlG^x%w*S={cRS@2B z64&J+Sy;YNHta5+M^$FroL2Uz18Gs|4Ja>}3sbxM()qjH`-zkP+K7PQ6)o-MrQt_; ztkQYk_E~`+$=8@6?nP>(BasdHLWoqOn(^HG{p*E|Zzw0fA2-BIC$Dx?3`a)6j=2u) zPXHh%pI%vM=p?;pbHPndk%6%x1rOW#2Ij*CY&OiP(L0Z#q_PQsz9;IcB!|GF4{G_; zMIxX?6qvg8f(ByedEWJbekX}i&ojWL<>;b;|KXO4^_xeX3z22ZcX-J=Ag1Cb?gPRE zcV{rmU88T|sn*jqrcH6>W`R*K_rWxrr^KS*>fM_-Q!SI`@R3Ih&ric5W7sq$dfz4+ zD4s%46iROA0vjY_Bb{SK)p4;Wd|G*q-JTr>CXuc6yjj%mYvs$$ngSW+FDVLOmtJ}m z%Wms14+b+qb;fk#w$mo<(^50SGuH(9RpIf3mp!+W#<0}rJ=*tIu8#WS+sXX1pNO$w z9Y&U2768#?(P;XrfxEkhF(=saGqN@nSfWP+@tzr7y6eCv+bm*#Z-iqrL10tNZ!6my zihlx#ENk?gHAy~0ti5t^ZH-#AKFr9Q7g|1C%j0C|Gwyx2Pn8@i7t4`%QTq__jLPnW zJAzohaYbD7EkEa^%Iu{`)BXASvzhyuZ#kiY1Q*w#J`+^xH|5Ed>btJ4Pd<~xdu!sH zz!q*VD%_2_dx?Q|LrNOMd$O(T(`)vi!QW($`BG}n$*GTi;T`pEiS)6T&$Rd}i)Vc9 z1crL9GeG9JNM2*hT)bf2LV|zOvzS9q7e7qx z7Xcj!*CNWmhE}D)CA~av%lcPh#fOP8Xk#41{h{y2&hE7vNfSXDahyNWjcdC)s-y|F z;;F%F-4*Y7RD@gD(L19QSuEvL-IVNGEkgFl;sx+jN3X_9yZsJHPtLB>LI6_#b!hH^ zmF%hzh}R1$;3jgJZ|HGV_9}u+UrMseX^ceHCTMyEt{ezoM^kV?WFtidb&a2;>HM=p zIO>w4R_d#|gsViso>mF!vjnn~yY~T5(>8eO=DsvR6eZy&GaI6j5*t%4G0D*`El7Iw zjypFU&rjqQ9b?H2TfTh2!g@f7BV(()Y~`pxcd(5Wg*|Wi5}*0*>x0G!OIKrr*~VHA z!{#yNy_U30Qc#Haw*rgct$<(2K&E@G7Q)y~GM|OV#B^vRZ9bJ?MPSRjJ^PC0qqLkVG;AIvxew7vh2G8>rL=MJy_JG(*2y zZF{&xU>>pFWj|?J&#C<&Gqc@~@`U>EG1YT%rI&RM79cmRw%rK03iH2g^DbFYJUqd# zowR0DZ%Mj}A@42jQ&;RTNpZ8xy}5aVLa9DDB{+1^Ztz;LiwCOsp`SA-O}Kp`#HF{p z2!y!a$`?Ix(@Gte4yk~)vbp3HK9|j4cIall!y!aEP(f1SW#k~yvwB@+2YINN;;@!T zAr&HJ5PO^)6=!HMm=*mr+>n|$om`^lC0#uE@%NV{hF_jjQ~5bC_?b0RhJPZIY&&lL zO?)Fdq)^JGJXb0gXxD8>5ducuZTEZR_sa9{_%CrGAR>49iP;JZZT#~qsD541P^GaR z=t`==vp4Pqw?8M#N)VsUlHJl&`DWQO)rRtW#y+w3xW`?KR7w!S)Zy+lkeg-Ta7a#3 z)G^>Fjriah^1aF}@piJFr`U3?gN^(uylUkasb`=qdzCz^0U)I5s3rAz7@^AMsTRSp#`f_!&>TwAaCw(&Da89)%x5O2*zy z4E`-5fmL!|^OyZgj{APz=EPl#hPN}J@*1yk4+x2~v7WuSNV?|r(Y0GhMhO~Gfib5^ ze_WqFr-*w%2=;5c)290Q{E+v98^s28TcrDfGOrssr7}q5TzdhKgPcjXVL;YUad-3? zKuDhDf1rU&{>>p{;%;zo#qf(FBv+rZsItc1L1l&vZHc9<$vn`skP82=W2Ad!k@p{MKTn(Sh*R2kPsa$dB%I8YTTuVDM zTl`%w!+73XHOtog1=FM~?dH_F!sr<%&SiCT3c}h1ur&_k=J*@`WO`x9bVo#^I@u#3 z-W&L4lC#L?Gu<86dEYw7S^p&JWGJrHut7Z77#m3j52#oAw7ecTk(Y%bcn;k}a4VQTcxa5#)*S}4EO=$`aZZ0>6@mu&7UJ{!j z>Ot%D>bfVYniKs*fTPS>{ziIXXCRB_4?dA!ce`r2wq)TkJia2Xp7hQFq7A2bV$w-B9pQLxZh@?&>C{I7r8EQYIQ0nLSmPj+kr)#!xT>%U@ zsV8^aR~_At*~!qvJ1iAb9pQw(0^RlrLCr!ZK( z{l`PS>iH_-yfwfHdp6$RJ(BiSV7)al`Rv0h0XfSk*_fiTEv}1E5wfg@`(k@+j&P_q zT7gt?D4RWTF5o3ivwgXO=CkAs)h5=(GX+Z);=&r^GkK@)$Jz$QanE1#3Urk(5hYr7 zduj=R&_z+XJ}LSR1-SdA6I2r;4rnwFm>8UmJkQucCT&c`bGG{YV+56+y6%Lnk~3H< zrBfPQLFM#%GkQ0 z{7;%zT7IrS1`#0hfvWpiR>;6B<3Oz-k7dq?V?QhBz}<%7!o``w#*ftQL-znApZ)j( zW9O6kpIDZc0)yO_#i#WbhS@U}T}eRXW~(9<-frY4uKPH!dm=B>&3vXc3kJO{Q=+wt zoMbOvo|z;sD&Kp?^YLpOGVazo}#+IBNV@aB@lYg;XvKkV=S!)mL zhO1_?uh5t(zQxqWoaI!qY|=~+5<4le| zG7Iq;F}_CiYS7dR{_l_d{|*k(O&`4T{gVX$v0+6&%481cuZsA|%4W}F;`3h=jJlmN zUDE64ye!sj*NmOh<=DE#d5rYT;pGf$jq0?proG}}r<&GeBqp|Cmqo84utQz;OI+5A zcl~*m+`I)G7as%LNhvnZ!PWoI`B%NF_nyF=3_2stlAx$+%=Zqf*deI)Sn4Ssu*9Ql zCEkd1Sd)DvL&$7+0XA`J=n&p)qs-*)6<;<&bIMsZ$eJ-4^rusuI_$f-s}wfeG)AbA zn!!TrJD+FAlZnj?D^DYP9z@rZWj;GM*Pw}~3!-yaF&Kc8rJujc+7l`4s^Ych9uAgI zHu8==!pNP165$j2oIPR7)LEshoh|cCuIQA;nB=oB7h%YUHD})uR96FbRgV@;bvt+W z2itwKE(a&t=U;Q7af}Y= zC~-As;=K4nlEZ}JYNTD=lO;p9qpoL__!3Mg;zHCsvu`~YvEe6&#f-LK8g zx^;Zk1tW={(K~nS)-`tgTPFuGiKe_WlpS!E0G}zvgklZls^WYrdVW9jGzz+FsFoa1 zEc2ecTLw;j41a(GG%_+%`}Vv2eB$8JEw*w|jWK1v#!|IJdvg^k{8?BvKjn*sRQ?UPY4zXpL-q0g7X{ypwCKzHiSw@B zC~vMJBn+GuRpANE|6B{^e7*Z#_&Pp1bfLP~dsUJyVk`0m($gI>;>F{m2{p#TK z5o$)E_JxqRCe_EJ5M23>c0W4N|5gBruU78BrB_7@qstj<6DSPS-Tz6c3_g2qO|%n<=fC;ZP!PD-`59Yy`X5VIb*KE zP6?eVB9oUlWs8!_C_8tPPpt;&fBghghpRR!7#7V|NtV6#;9%Cs9WM%7;R#g&u84@d z{7M>_r)E_y+%fbNA!FOxNJsM z##Q|i=5QW$+js5afMBfG8S$%tuyXWwob1ps>k2KZ0}X1Ay7Ph5+#k;FAWEY|casbs z>$wPh3 z4gOEapo?i(Xx&0-D7Fk?dabPIhUpjX^NVPGC`Chm)!&_^Vr!?^@&lES56h~jO)PSE zG|gcTn#|8j9CUZ&{VhWNwrdydH*$$DC2NKY*66j|RP2QHmv3O|G;F%up9;gGzuq+t z(d|=s@twdl1#5q>zKY})xoL!KBlJM%f`>NNHMn`&*6z1xc;K^{gYrr{soR!*|v$Mp=Sb4yvsOkGgy<(J$htF=N)l z*Qo%&vDwpSEXMK@*Xg?K6B8eX`5&F`r>2W@H@Kn*{Ob}=2ggf^pNzi7O; zCmm8x;3zH@{Vzo!YaUQ!k$K$S(24NSmpiOtinpmu<2STjrk~>}5Dc7S+Cqais zCS6jGj2b^I4kX^X@e<~EvZxpJkj2{zaEDdLF^Y`+QjYAQU$f@$mb5;lf^d%U= zUIoCQPYSzT2^|vRNV0(UQZ)tJRPnYSoQyY){GGmMg5^k!)2j_)3Mal2}N9G@n5zej`mhhSP=16otoEP=SAm$)1%!3r0}n@o@#A zAzuP&-~JdC4|#X!#4H)QNlcBbjr7CVF-Uz~&W1Wv5rFtc=d*cj2p}st%)I7zmQ&91 zoa{nML1e=f{I@$R1r=@N;9$Oyy;>G!(`4I4s(L1xe5Ns1y;Qv<{su2pnw}Zx4jFP4 zPMdh>-0=6@GTD4Y&1?F(z+NN4o?5gZE093Znqe~e1fU^)7xS ztQ;VPOyicM05z;OFCy{fHHT3X27k~<>0N6w0GENp+0%DJmA8Y6}&?a6BJ4t3^}?+O~iLcpd-MOoxlm&&f=9A02{HSF(;r z*}wSeuU*}a(N7MT#G|Us6>gBbQ}^}1+7W2Fq;Wh_Bvh&}4r)m7{B`<}p#{1Atv|$W z93zuB#zVY`eC%#ENQhU^x3nWUL%6t%! zcL>}a0oE7p-|m=pTf+(*MpJur%H`m)*oCG_{H0G~h&`;~Yj!V~_)G>mh@``xa4Rpj5 zjsAJKmUspL@bBLW1Y^Mlp?@1KS&duw0%H0TGpj@H%!5WCI`CD0Jx}h}Iz(sSHL0@J zM|HfrfkoHfx*1 zW3T=z8rOhq%QLNaZr|({#z;z$iZ;=ACP4tckX3Ay*5sSyGzOjtgD%Ng@kk!ds}&3W zBx*tq!wY^Nc>XBQrad53E9UL`$&u)yfp3cs63u#DnC_EqX@2z6O;3Aw!ckYj<|B^g8Q4zEZHxn%g~FD0hc+SmE2Uzq6)lIkWIw@cbLsYAazm+?zA08bk;;#Ee zj9r!#*|oACwOro1gT(y1L)rp7-6!M$Jjb@Tw?afDgZp1dlg$R5d~>aP^8m4%8C+1L{Z=Hd?@Z_;)AzFkM!jXl5%aU)BefiN*H#w*$MQM0?O zv1gSJ#N@y9ck9=Bt9KPMH41GtFx|aEPsOgO*Jehzx91sHEf#Z+xGk5p_)a@ zQoTT{g%H=Jy^_tjX*3hZwIdpCzED#r3=}3}-K%K04~^y=Enbo3arT3v#vM(1EHN-W z>G5@$jm8_P|OZ7IlT$lGN8(O zLLj(n*c%C=X{7Fmgz^D-bEk%%dh>t@2*gxe*9Fe$P(m!@^Q`XQAZXR9`cs?pxDU_Y zyY;NK`mtY!)>&mFjQ%tlkEh0^y)Pq0Go%$+Jg%T*sRbKFA9b$|EpV5FDkVjk+9RAR zha@3Ny3vP%dU8tie+4DdYsUK}7U(bcKIY3@N4yXq)>Puz6(EoP{qvA;C14{IJN5~h zDsjnRu}jmCwII1;X;S?C^A&?0{7Hsbe3B7j+O^=@anON|gmI9ElFVM8O0hQ7a8fL# zWTxUH9-%i=I>>iV-<#D?qAeh^;{M|i>0RjuMyILO(v$na!d^J+-n7 zwiwvcCr9@oCh%24{KwSaNYcCnHrY2^2lo@nC4}9_2U`!!&6n)F9D{p_s(-~^g_B^E z;UaGM+l~Y%Dpw`+hm5-kuCb!dhzx;z^!Za@yOvqHB8bvnVHpP>UrAVz1(jl+`3y?v zNKM&0&fnEX{H={P~4ZMxQGOh1avwZey73tlnb1@5+1UXS%o!FM} z4j2cjsgKa!6AmKg$rOut5sxY761){$eq3ZaK`#fAaCO@$sH;MUme(j0@zpgPdO2C50ph*EKJoD;xg!No@Z7}F6@u>8&}Z~ ztmv{D!2fi^M%sdDB!lM^$&AE5yw-qD1moBDP>RYv;~)a52s#fqmW=!nm4VMTbARoC{j0^h?-R&no#N{CZ80XIbitA% zU^Kf?kN*)2g$3_R0Gm?n;m;!LClIE$5uRUItwIz84`;UOlWn({S{vpSW;u16Xww^K zZKr;ika8DQOPxI{)$}9MV%iemAdt!MEZ(8D^`f<*U92wOqT1&_yV)rjshpAAFzQDl zI9|1pXd`DGoXZW;MmKdnh3sb}p9SaE1_F!EI}$};Q5iHmC?5)qph}CW+PnkJHz~Lw z=B?=>6dWDGNThNVFH1*1YFUPyrsD^&?{vsD;G7e8RJr$VuiDEX#PzA>8>Y($a=n|o zYm_vO45>AJeEHk#&}`-nNHcUFIyakXj6I)I_7e*WoSmtyG5VzzsiKG z=*=cB)KTIgfIzg9qW_z>j9beH^u4{6uYI5^@qF9)qk<;w0AkeGJudiN^`pvlCThV+ z@9~?CNdmd%m|z?~oe)@tDT5=fGmVmbg+{*#*^h@Al7&8B39ybm10|d!JYcMFl9=<%2|lfaRS?o zaa8?#1Pe^xhR9`H8ZL8v>P4@dbcX00!Pt!1QHc)0VyN^AjWj%-%7OXf; z5obP$Tc!$dW(Of!@n0mM)}cJHR92KV{%t6*OeFu(;+1dX&mWFimfD435}X7k)u)6< ze}bPP*vY&C5M4u8-9L6NStJ(z1y*)wU$&^QoV&50Mo9e8p@Cq7CU4kRm9M8MQ?w2S z*qN>ZO1P;!G7vFN+++^EZ0d@S>yNm8Df$H@MR-@UpWX@kUdZ;Roxz<$x_{85b20T)KR1D}@Y5NKoR>2E!p zmL)|_h7hqH?vQaZnhrbD`&z9|@*d8Wyve1PW2z_V7MQxGuBR(s%hFh-?YNmKTvQe3 zY5^BKtfDH=JNgI8MEPcgPEEEyxg-1!9m1=MGlw1?N; zi~i8&^fZLA^I-wJPcFgZ{5l}gKhJS4h6$=gGdi}Xo$ucbFdQ{~Xl$`&KiD#uyN*0u8&Wx@(dV3}3AyVO zyQ}p43!4wiPAS%R*eBvx#R5o1nHFHc>QRQP)BfIbT(cu-!sS@FMsoJGkmM`pVy+wZ z(q@O841F3SC!*Q(HQa!vFa&XmnbfP_u6x2enr!|}^v@k#mB@tHUY#RXb1FHi#i}># zA^$#rOit9O9LTz3yUR3F_vl&NJ3ebnfr>cz@U2*7w|I48~DU=Ldar z|2XYMU-tB|9>KtW;Bp;7+ER~k?1}NQ#*c%wB>d{0`1 zFqa!jHm9XNZiA|kFWDds|FX%@d%Eg`2O#<1j~fLwNR4mR=!{6!54PJ3T@m;XzIcdn zGOjySkH5seqP(jTEeC1n=2I!GEdR{!Ft$;2fNW!Y=vmu!4ZzV|MSiUPrB;JKB{nd} zdtB<4Cs^KXQ*8U*h-8X?Zp5|^A7segtp!LW+zZ{jnx4BXwG(`*mB1xmUu41CC?ayg zkajoRYTKe|GmvCM@@eZS0AQV>s>~Rbs7YGoTLWwXJznSh(SLzrh?0z>L&Ccp?Rch{ zn)F$iHk0L^I@^K$RMK@!*`wJvii)@&$3^8nE!bvnNWq`7CYINvkcJNN#~|b@N5(Z^ z&h3#BXp#R=aqR(}Yb>MaPS=MaEc&<1_oxtQ^62}KR!sqXh@kGT+D-RbYJ>{X)m>of z<6$AN%*rQoeMc-PtRn1lw`85e35r==NH&`G7+)}YVbb+UGC;Y zjRVKXLXOa~lTS~Q<{k^S4;X=J-aB#%+SF!e8m;P_hhuUN()=rgyZAW77*4s;$G0b) z{z=;^++lMYhz~ZgYhV5>&5Rncp7px)3aTeS(-x74B3Xnl@h3YL9TcpE+V7=fw75dl&Hq(ZC{bGtLgW)gFQKs)L!dZCsC& znp)tftx^*VMYRBVf;=ZhvoDgO;X-RMAlOX}#?Ovo7zyy1*^}}(cojPfS$y;EggH~e zh_U||X@q2^PhNGoa6PY;S7WT`K9)y9VU6oR(YbprWpv5*Uo$6!pPaxDV{pT|7|`7+ zm!XPZDrc5;R3XVqB+?*dJXP28*LGWemFAxQ-{I}5y9h?B6t3XH^zzPsB(dW+K@Yp8 zYr(lInET}U2u*bUQ2$8VN8RJv!nK^x&D3Ac)f8g;J1kZ2&9_(~f>FO&DA3aYJ~#pD zh5?fBcR33>@md-lC3(l7G7 z0MWnQ@5}KBp1aTdqngys+V)7k1PY-rS2v+PsbuJ(p<}pS>bPGFMxYxxRpz5;(-C<; zXoTcFz+Jb*rmMOfbxJtwr2x!a<8rnC>sK2)&-=B@w-tNLQ*VhZN7i*X_wz*jJ_g^d z8Po?KkF!!rXF11VqR2rtI#lLXgPbe}%G7K61yRp_&8UM+^9m(pUZ4Y4WsX$*DdX2i zV6RYtFV+_9s^whSINYL5^a*4|6+712p1w28Dl=TJ+Wodn_qODcJ6@!2tytW_-^Lpw z`(N97NQ*ArJ(dwvs=#Lwa&eSLHsX0Ce5A6fsckrCt$@Q*Cy-w>L`faR=*?a>-%B#i zo|O)#_8R$@Ui~m2KUJuvck*wsu)|;aXn(vJyf4$asO~srnX?65Rec&f>{J(n?A26O z#?gd>Oo9Fooqas7wr}A$j~ZEGnHfUKT0*|;(c;P&^_BT)l(s-82(?letQZx`6fG9A z9<<1pv2>h{FdPt83p|q-4|eQ0aG63FbC2qgU|;!-{No+Jnes;Sml_Lcc0X*|5uwEG z<@Y)+=BoW4L*@gOsVeh39?M^M9M5Y5?J48K*X>P49eX@ys>VP7cXHpzUWcAMvKn$= zTCK6+2w2MHA~H>jsbeviYJ!l5Ox3vXZJ918LZo0?eX{l$9#d}R7ra7|Xy)-*AUwX26dwBk|{e`*5ouzVOC{o~#F(TGnTsz$Z-$OOH;> z25-@H>0r(DF(-e{-KdN>kHssms*gH=FSqvJFH%G2iLq%j14ptmRyvJ2YrZ}998|RQ ziPXvNzh(9cdG~U^*XP`l#~%sYX&(3g*3Ro6&GDh>a(ke{4eEWoSvQ*2a)BHUE=PyV z0dJcXb!nf=wz_7&KN%X-W08eqeoaKyf)eNS0#oPuq|jrt!1 zj$h2`932a4jjtC8Hgs`&-`trXMT^Ju*%oYqU*>0jUoee6g7gJ2o_j!34bY2u%N$)i z3WYT>|8A^T5PS(FhZNO1=a4dC8Tw-n=X}K3&;;(eK}>ST!qn&(I^a|Re%-Sxc`&6y zQ-H^R4>ny#v1%(E{Shd`}W$?851&OKYBNO$H1orksz z3mlg5xLQni=TCU8Lc`3qP%!vC?((R3ns9Z%!AQ#4-wRN2wiw1YQ&{)@3>#Y(P-cxe zvVol`yXB;?k>>%VbfO34`5?LfiV%GTgTkJAKk2M8xDnCRlFyatV9*k%DUt5; zj}JP5P?CW}QHJyhm!lQ-d%#N|>i8-RwjvaOTn84evQZ0KLKxzKOqKr@oYOJ`rWAz2mb2ymKy|O@)rd#_qTynx_Zt%qw@2#WS@4>TH0e(!RCj$ zYGPqILT8ztI&L!z2kTNvFciH zw(|?-P=(4+UAvQzeq$q=mrrU|z*84Q(F+uDEv$yH%J#@*&~C4WL6|biI&H-P<|mS{ ztY#LvVIPZnv&zH}t^A*~V_d|$I)Oq-xV>ubi~p0|!_gD$#-~Q1 z5qDd~Ggoyn!vE$c|CFjdCuUE#7b>+RwM-#p?Qp_JG)W8+Ak=c)Pvv@Q=XEOlU2d;7 z9o2A-&S@0FG_h`7uG6Ce<@lWXs-+)`bVkU^C0NXnt(v`(>Y76S9hTBwzi!iqJlf6A zzc7KfFob@BMZ97VRL3Vzql`b4{b@G>K%%bBl! zrdLd@?7lc)x7yqG9oe0C7G#r-rt}gJhD^JSik>IgHdqY%>6IWZa;JRN z)S#&AN}UvNY#=2hgX7ODy^6*wC`wCPe(oqOrK*WqDIc8Dkj>pQtCvWYbzBl@rtGA% z$mOUtjneUCI0@eq$i){>h-rE|xteGem?T#K{L@clm3QILItai`fe5$!HGqXp^C4I* zH~B7~A{`Fjfg-ea`{yKys9m zfm{1bw$P}A*+~i%&$~76+rxYwC(e8pG5pis;q5wlKRJM|u>*fFYtM*lU zhh2G#iP@dXEa{F!GQ9#xN|NkaYav>no`)3WS_=nFRqMW2xu3`Zt_6>sH5kT}fD@uO zhTZ)SXhu@`&1R7|WQx87o@%dIM4-Ur0rnpQvyt6CZO``Qpb9^&&ya49mu%JZ`hZR! zZGo?a3wnrqa#b|pmkwI$J{boy&hVT?U50)MOH%D5lXAo2qSW#pz~OAv*Yym+QYlaa zl-TV%0>4iiJU(uWw|F@EIqYSmcYbIZYkPPF0(MQMc79U9voAM1D7>bAZWcQiMT@@h z^nA4;p5K&ie^E(*ZpvjYrB1Z2%}*I7NnnyJ@|5)-tDB^{eysTbw^_dYKaS4Boz3@c zyMy+V5UDS$A5qnd6#i&`WSu+&1i`X?=qZG0CE@JP!-skuJ0XdEw z$&)+ReVym|Iq{Kt!}YHGhgP&@)t60iD{y-QJu+Dl*Mf{Pw`reJi`&O?ST8w*hN;9P zA*wOe;rQNizb*e?U){~CAB%o(C>NSzPl)sgavvngb@=TIhp2wYI9Tx8*F0FDdbqaT z=v(+`ngdpyF;4{>Mnrsjqd8W#TqX*46MhU)&hH|(u|4x|b7vP~rzFx__x!jca~2)N zFq!H1SK2SgdojR-8oIHb?aj?sU88R3G$;-v8Op9Nl36`kSkVjrfx(6GfI&E0;Z~G0 zm=7e?B1{1XOT0s3N{5F-dvP0MsR>b&z)w$$RuuwT%#WRK|LixRu_>{hFKnx~_QgvR z!=yQo)ow7t1f_l2e{%}Nd5Z+B>H@4h`<tyUOz_j$JC5j@RACjl=A!WJ zBUcg9;PKQ>5`QXo6&ya?d?&s!(6%PL-K=iQ5pTG*6Eo3p#ul*rq$zaOhPe)K!*zG7 zT3Qws5;NxKR|O@_Kv{+PdOt$w86pLi^1KQ1sGsf@Y`=Yn9&rZ=5zDrbKxx@C3G$NT z1u$E$mSYKi?p>5(21zip(AR=J)9XEO}vjaF09gm_9E7s84IjycnkVgDmzc87ywvvt%QiSe(NdhS(8n5z?UAI$0jVwnrWU{4pxk!LNM$XLy zcqUYf>+~%Iv z%b~u8#Wo~nD3zH_WaB_|5amd_>{rogYG_%kY0oF@R?eLf-geH&JK7mW0OUn7oVq+1 zNTIw^N;uGK_fSkFGr?|YwsrEQjofj}H$3R|CK_HYd@w4pxw2w^)G`Z$uECpwrOdUrXfb)pN2v*H{=m(;d@aLUdk3#VHj$z*&BbxHtNZ= zSBL|)j6|&JD3(X=s}oqFTM7pDmMZ$h^)iezR16!BAXf}Q$YHg> zyEJT6$j42cK(h#TG6ci6RZl5$j-S^IMSP^uri{Hi1N(k~DL4tPk@fSxvh0gvw4qRK z&~p`;9ti=KdmnKOLgcbKFFY^zpIh(iAt5tkOl(2=Oy?#r}V>|-8s^~xV%zF@LYWg39@?3zQqC` zi6ND1rx!_4Rxf{yWSA{y1Z{xJ$qQOd=6q7iRqrN(H45!BLEDF~S$_1Yl1v(mUGLyV zO>oXW89g&_q4+Y&5nF+aBwd<%mf}lH*c62^Cit@n=Z$Z@udW z4zao&cM~o5-~y!54b=MQWrj`UfE@hV^P3 zIQjhFJYhy!zj_Fzl|{EIE`Bz1X(^vW5c2i>OYFex1!KgnKl<2g@{aL#>k2YO0_EDR zDA)^X6tiP@h~ewS?nEUjRx}Ogn0+;Ot4(3429pH|W1-sMlFN$hipv(YYI$b%+bbfH zsROg_#JsP`Ci#S*EavJN3T$XE=;|u1r4VM2)Gfa$hRg0{D0RJ#VZa>^#F=se!@=TM z))P6x(tO;Zk;%^}+~KVDMow4oPT;T415+7qb0?@)W-=SFk>HE2S- z)Hq5w`d8{#WLQ`jb7x50rnyExK;vz)Z#lo28`(|Zt33i3}SL63ala=cTOeL5IfV+-jwL`EXgC6e&x4%*HpF46Q&mMSaCdprUKSDhn zf+DUiFYt8vd(k`bYektm!I+P(SeiRZq`I0|s5}r4R!EIs6$gKHT^K$4`x<8*_yP2| zzEN+Ge%EF~95Zi23Os^$U;c5j)bia*)!fLJ+K+c4Ir*e?igDEs7RmPrq-6Ggjyw7| zJZhG%D;!8DbDH)Xg}%piQtmk{0fhQtNU5pkP&Lp~2vmyN_77Mvtg19Rwmm`)mit)5 zH3!-1TnAdUBmkE&8!`S-w{f?VxIoT3%oX!JUcd9@UpcJZmdd7>-K5|1rj)}1f~Jy} zfp&>Zrtqt|#UD+C_n0fATlejNlS=(I`8H?K+176)IR*n00(`y)dJ`W27tmsBWx3a= zHm%OC)@oU!rKmkY?!JNAH9(ey=>{N*&&VM4x5D*7YS-GO#s%RAf#&18EC%B%4E(nd zM+)as2MnbJ&XS;(e<|TrmH!FdU6)_>+F6^RXKa;gTxX8PY)x`P>qpfkLB>Txo!;Y- zTLL1HP5Cls8w>8uL3Wq(GBq=|riS= zpP))lg2SbYU=M3$&9tw#8O7@rj;r4hwh`0E>*Zu?J|4nOM}ZqVa8OLTWr{OkExOCi3I7AE~--NY%lS#7A^!C zmv`hqB`J#g+^8>Mm+~7)dbz2=t`I=y1vtIDr?Ah0Ii{BwH!LD#i0+)y8+=t2BRdf` zJX2?%lBAy2DTq5$fp&xbnh=%Tz+m`dyOE)DwW1O3MkHoHw z0$=~v!e&+(wMpfxNp{g`NoHQd{6gj&I~hiGDu0rjP_^)5hu?k9*1^@|RDZ{KCm*>p zX^UN>k1UQ^Jt3@+io8zy<5R@aRVVe2)!YB4**-II!mn)pKlDuLtY*6q`1f!e?HN-u z8cnB-J=U4EzdC`4Jwsxlo*%P*D8tgpg^dLQ)S)1^HohO9^gfz^#t4lbmGg!)VKWO- zhn-W66(+OMpMqalff71Q6hm=!k_0>F5__DKgf_VDYfQb8judNxNLZeU_-90Up8S@Lrt=IYcr(BaQ~jsdl=WW}qIDZ#`}i$1}M^nZ8B$8g&vT(stH z9e@JdO1W%I$?<*ow(x+zT#N?A25K&&E9KZb# zwU+M<#pXUKsG27*s@XbLt~`3g=J8&l3BS2n66uwQA(a-`{j~JpV_t~ls4JD6hc_^8 zP{AffnMB&&1R{U|Mc`{@a9hF2w~IcYn0W9kc;Se-XG*iV#N>NeUmzTV2^;Dn0LQG+ zJP)7-mERJG1s&1cns-X`_9#?z)hl84N?0JOSRf2qwd79Dc+PcPUgj;lc1uPGZL2uJ zM|oBpEx7L}?nA1MrY}$`hr%gL9VVTeIq2z7JlYXc?Cgc5Mde)+Ju_0F?`X7~cI`w| z6!_U1tl?n$Zr+uC|9Yl8LWu}W^iY7F8(?8qq$gTV7lZ;eOG{5KjGX$&ndq8G4wuj| z67OZ3EgMi^Ccd#E))w(pH)st+6&88T?u>>bZ=2<@X-~?;CjlgI9xCij6b^6^56rx3 zN^ze+@046FE`A)Dc94cmc*-K=)?oZs;uqaQeLtr1cr1f7mQRx6*`q&?tRN*6fKCD* z`CIa2mXEA*d+fb0U@D5-F?rvp$+L2AlupVXT|Rhlf1>nS?%m!~?g!zoi*xvojO7q= z)lMTg--;()l$7IB7A#%wrL86ZYhyi8C)Bl24gHGvr5f9Dp1$*3 zpOSY^Kb&N{aU<)H?(qT<>h!CjY-LD*BDkp;(LCas)VaYL0c#KFInbgPy%c2ouYprW z!R+A%{Bk^reIR2=DlvpccPw~Ni9Sj4MYJ64mj>8lK@0F&x-LGNMp|{ahXQwCHSr^z z6Q!5gPhZU;lfiZ4F?Uy2`HDZtGQ_{MyNo=LZb7FkJ?QmNcYAgWD(>|(!ea1L-N}EGI<@W>49Z?rOjn})Jl8l$mYm<4TEJ0J^F6-B-$P?!mj4clZVeFWe+9A0*YUG48oED$XpY@Impzj@Ee|ycvje6bH zSoB>cpuCj^^D_){{er|i#`rx7iDDbBi9DaDBVE%-SLqn5x6-eRhagy**mOA+NH7rGVWJ%Hk702SEMpwPXL0Q}i&{YuxHL&7LpE8n&SMqa>I&1b|^mSRHdFD_UG$gSe z?2hz{vt`uUAgbLx2@`WTDPI>(F%9@~Rg~rW%#AL{pxe%uFFvyUhw%CfGgim*BMFNg zg-9niZrJC!AQHTnd~dlT6C~6T!`&#xRn`;N{yrR@5R4CFx`jIS04xQbQEtndS9Giq z>n>cX2^+3_Of+!XudtIR!(8*z4PVHsU{bwXS;((smyxW0gw3}~`q&h}DlQ-7&#GQcD&Et=#{ky&X z+H<~^o5FF2Td?9mp$_Ed`|;yJgOsbdggG@o3{45;iEgxX#tL&bA?nMGDUVZ7?DEM$ z*3CU1axi}SS0mb(?Bm1Xp_AkIeV{I>RNUDEeYa>u-$#|@(s{+#>KF$oq(qsvAqb5N z$cFo0oNduv^r=C(rOb92!84}XxxVX^*@Lm8{x${>MDw*rF~{><-gPd;Gvm^){+|y+ z@7###@(j@**eqX)-+j_i2eA5pk=uC&0-OCdT`@OY@Y(f26Q|g~ha8uG^uuR1=aP2m zA7l4%fz5fKC9q()hbDQ@kR!Z&tW#y`t|l1xIX%2)4Eoi?mucSo)sS}jlU`KrG!EIW zxvV-h_FmkY;m=Spf360;8V7EAs0`itd>PRVtn z1uvGNa{OxOvAC5g{bP&XX8vprEsU*jUpI9bD0vw)f`d8+2C#tmdun^Yb|XP(LtrY! z4aJWAB;%XDYj}XV$H0UqE3SLDUiiPsN)ATI-8{!NLVl3LZN;7O zw)aiKZrm?`#O1L&Az);(IkjwRxX%z|9YA{1X9u8kH;QdyC+Zh#W@^353vXL>+!uHT zGfb}&4G${qHZ~>_Zc7{02WE;U(8si-QIlNff~$OscfYTgZpuZu!Xs($jeTc3dH1K< zTiSly?U+hwi=!m>wTZ#Hni^N{zQ+50OS$8GV?4+CYWpX_B&I^~zI_Ckz|iZ(pL6+iZnY_D>}N2)I8Ofd(?OE&Q#) zQe)gs-sFS0f8T`q7~0m498U*z5a>ma?856$Xsjex7v2FjtLLXSr+Jk)9q(L;0Zk0g^ccRUuq_CV->f!ihc81Eyff>g?NPEmw8{R z6AM}DmG^2Mvp^H~hc`JP5(YRlit}?7FrotaFJHu1Bm`d3G?U%Z=b9u572U(hpw~q? z^$}Lyd~)+V#;^|@FJ8JQF1&yDI3DC)tfk6Tu8_U0w;f00AP4kyY0Yb<{PS?ItDvMS zqGAT+L`P3_hHn!6C8B^4rpnrcU{_X5xn@u7Gi{~GZV2=#{4&q)*zYX z{p*Wpesnq^#Hx=yLA~86_U|i;jz5Ha&vEFRhhWemj49EK zHWB)k|FzAydFVoIS%1A3x}gOCaQ zMAoJdtmjfgj0~g=T5lO2q^P{q-r40^hiq zFUDIYvfv|~tW{CJikMtgYx8`YlF5wB+Fp|7TwZu?ACH?>b(r4jFdQt|mrA-2GPq_~ zMoRnt>@~Xz55tU>3CVQzl@uCOZcVRGiu)lkqiyb+fTZR&jn_pA9bGPP!52$T`L!0s zPoAnACRg5d$JnqtX}ye#^vcOpA^#0~Fpq((Z{UjOf23V>%SB!$V^OFGDc=Op2&M06XrNx0*-+zO@7U8WSS< z83s9CJS=$a^SNA1NcBcAems!v*~cY6|M;o*II;B?(apLBxF|gKx>1y1N~nRsHaF=Y~!fhot8(AIZw{Y}$^8Oi5~9Ss*oR&?@gt)+GZAWz*w^@Zgk|WlB^}*@qCtVY9u7nYoAk}<~)e(&8Wnq{NzNkd%PQjQZP*?Z<*@)|RwZai=w48q+C(s-A zD%#wuw_J!NF<(WJho$lCcvP2dD=)e=>C~49$ya<5a)lDUhSeHpIb$~-bD^`0wlmtoLBw{qCcGBtQo7kf`#v&dq!f+yK_u*25U@L zGN9OH$@vu}pFTq)z5?wbU~~hDUhbsX&`T{#HD5Z?p44EzPblNgj~bv=kfi!F^batC9H96lNw+-zI@cryA{_&{gWCI|1-f= z+3)GFJ9owEh#SV6I^?zlECKAu)g(C=ivGvXd@VCN^hGR8sqazMEdU z%+c~dw=Vq5sdcG9;O)1<2O{TJaKN66kN>5JvHoVvQdf8y@9#KZ@oaV)FfJ{)pICm) z>-m~owiz_K8HzbC3;f86c4Op)!^wsR(-T_XwQN%Mmj?n1vOwE$zaXoCWJ=#*Jo~R_ ze8`IRw7FPfv7uDHpDWp?GM9=I8y74FCg7%9_N`K0WW{v*d0b9I67?_zX#O0qQ!Tza z0swfoyrnuKXx5X&Mg7qMnfe7_B=R(rsr8MoH1tcoZeE?YybeGfSFHZDm#N;l0?>rV z#D4OarUxhnue(r*0E^maG2Q>YJ_K-E+r=CDkA`7N_ood3+HC7iPKHm2#Nl4$!aTcU zcfdMR)Y+1I;Ea-Va$(r*_vYTe$29QUsVkPd@`A?m5@2<=o1J60A27DKXR1#PfTug(A|!Gq{ES`ZiU*+>rUeC+}Q6}{i27C}Q<*BP42E{=vHGibWn z{rkDk#$^Q~CdvEGNBSvHKANi?dhDzpl+|`A6tJD-S0kGjn4+1Jwpy_EHv5|Kv+Jiz zA*;i0CHTVQED}!HLMD)gBTv;^;fN3e?DHwmD@U8OP8z?M7)i|4z#AUNBG@ zkg?xPIi5139f-_UbH3`_!fbG#=}807;En>W-4#P%S6hOMq>*wn(j;?hVeW|lTNz;&l8Q~eIxA#EoTXMc!d@`RIl;gcGIrcXIpy7ykahts`?-6P4D#5-w}RpLMg&G?j>dJ#&w zcESi1(`_sWhR;FnN=ZI2Sp(;;t|WE&jco2Vf-HG)j`1XJNrri8ycP+a;Xy*9cKOE{ zD$c*ZozN^GZwK$*m5^kqXpS_Qu6>GkAHtnB=lJbhzNXdqK&pN(#PACTvYaL}dbfm? z!r`9@TEk=1a=Urka_g??DeaM8{MIItH)kRq*wEu3V9$6L-BPalU71q9hFvQSid*X( zPvu++UffwbJamZbyrJ(djQttM6gp2$A9{Oo_TNr)77d+udmm!9Jq565+srzB06&)G zUJ3PnDE+t<&M2c%tb!Xu&z`|zm<(v`WXl4)8?`}C+_SHQeB~1{xOWfXzD%Gj9~^+C zK7xn8$CC3jYX6_N<`8pmARBV;Nk)}8&zY4``oNFe2t)z$Fv)4stXw@3RE5RlLsIifYhH(P>a@b(jllM1E z=aW8x5}x#*H0~DQ$1RgiYc~~)^>LTW9JhEmQ1K$}jK1?YnrDp4)0YBMIH+V_i$h^8 zd`v-}<6aw1Rw9N8+!VxV7D#zOmXP*guuMP9MH4%_N`Le36*`V9 zY^_}wXZ3fUw`rp}KAmXHXog}J7Njn&L9e}AOdZ|rTYzMEZe_ew0@+fpE}YbEWy5xSfQdb5;**bdu0moHd=o5C1SkJm$=aCbEw+f04tM<@XQM|RiL zaw>2y@Z#$JDyY8dzUaO$;`T;kC+pGFHT!TJ_B|O?!#lSz54fBsX@9M|i3!D^UW#&2 z6Se$&fYNKgw(f!9Z^v4`4z?<*ExYlb+q;Lgci0f-&hq^>)8&cBWc*L8hNz}Jt{InO zOSOl)V5!;AL7?c*N`=06-1hoz(>MDoE^P&G5LEQhKm#i;q`S2es9(oRZKFZz_K_Bx zV_KW`#m)u5S+A9TGwJU?8(ZatLCI416o2~e6F~{nLB14B`9^P+>(jxlL`Ypu=5Rq_ zr%2fBpn(gc!kph2_mc-qm?9Iy&QEcxpWdlU?H%nWLlN|SZImG6UZQfM3NGePXRIEw z8b;ieIROOF+FU@RLVnaarLffUS^;#=Qv6T&D5<62qEw=BRj8t0P4^?)L?0s2pp~g| zx{_I=ucU-o1c97B8vFS-@zk#uPlG^VeJ~DUW)1DvBFeJl7{JAsUQWeC=PN9Dvc7`v zc-I@s>ug{>O*pno9=jw(_bbzs)ptueW{WX&f#AT1XGj(i2-wJiIWrO@L0N0UgQx7r zq=rq8IIZHJ$WwX7nt{91U$4ZDD<@?HjZ2l9`VwqFyDy}lb={_Z<{eT0#}$)&u^_vge^gRG#1L{bY^@JA{JS644(D_*HT&C ziX7Tc|FH25c9+zQ2zdJa$T@g?;yf5-L_k@;4>YtZsP6rW#eSmYmd{`0bEfHi0#5>e z28P2*TN#nqQuH?0R+6RBpx;@dAY44!3nA_7DJfI)yJR-S_$EZOZn0`BJe5vZY&)MW zl^s8_zFFjr@2SWiF=fE=Ib7gcL0@zq=nQm+xA7op^hx9Atz@#%lpUW6?|(nb`q3KW zY>=OK)Q#Ct-1h>s^?RTvsVkGL%xg1%(8ki}<;QQ&o}WET#K1uF=slDuq;XwVwfpuw zKo%>XVjToDWGPbp*?t0Gq_gBpK0TKDXJ+U$ZD|kxFmFfgBLGsH1~LioWZB04U%qn% z54qOM##d}ZC%N}TZy$r3%)6xeX@Kuhx-2`-L$;{g_tMjT>Ix<55M-g2!EBIEQ~lMa zJ0^nvo8mK)dDc`i24Ou-NxT0iUO}z(bjx`rl^0r97~*%?*0cFd)nG_ z*M60G!QStDHz#KfllD96wZlifl&*qj1&wadEL>{$8(k!noh{2$OHbZaoQmJ|Ox*Xf z007@gBlXRjIsra^te&p-t%mVC*WDD2GIg-uu5qcUd(UINMbFE|jEPr2BF5*oOE`6F z&WO(M8XwI8B~}$ckIdw&+HOY~_ve+?%c25nU0Xd9-iwvxfolP!#vWg)yk|S@S*8pl zgI3+>Z6pD)v%7jr5quS@Gkk|z;)A1lQhCG+Osf4XGr=vUhF+(UDF*TeKmnB+Ac6*X z-FKGIFV+%(jK{sYv|@Xj;!NSryOVCyIPW1_sfEmz1C!<1*P5i;V#mt9O~FrB9~lbp zepkt`!pbWPqp0XE#TPm~KHK2{Wwt)4d^2vN3l8^D?xtP=fOu*Y&CpuP@-I2he2<`X z7#faS17XpxFd(1E=9;;(0ymWyfNy@{t%YKAGW#d}$L;h25jw{ehIZYyeHuCWdz}C- z0)46-GguTP&@_vKs@3>>t(0e99lGkjP7sv7No9KvkCq9|&l$uZx?V5VbTJU05rJ#sbmCD?(lXjKM z8iHsKQYprSL5by1+)i}zQMJ7spe<6YzH;4R-lT;=dAop2J+=z8L8Q@n_j?k=L*Y9h zPX^_sfH$=fg647Z(zTOJ4T}Hbi~X9Cl-qf;)~Hiqy;h~myn!C^T+&e1a=(-&3=q>^ z1A}_3yG%bmA%FdR2C~xA0+{Tbh=G_2T2^)~R7JP#u&RL8$b^&3-;jhg zH_Tu7o^YY3j_XzLqqf~?qeIjbwfv6|d{p{Iz+W4yF&(pQb`_W1ojiuWv(0>A_w15C zu{nPhV^$Oi6rAfH1QZ9Z0^P7azo0b<2CumntylIny`>B4416N6VP*tB zbOSK*ERsU|33bz-n)eBaeHY1IuGjN({=pV`CPVRBNaKy_b7rZd*zppX(ah#~pm*589RWsK17UWA3DnAyeM1mtVOIf8kya2UF`x+g2vW&DxKXLM!i7 zK)e60!!ZWkMsBjat(^*`4e`cD8u#vg_d%C0UmPvo8D^Zw+*ZC=mbuk?u{mYAElk}O zk}tR7A!$vOky?uW@P-g%%$Jl=t{?)d>bof|&Z=rN<5#Lpu%jrsS~ z_B|*2(Hu!)(hmJ}j)KkC$wK3-#TJ-y@ zv5~XPoG4;Ka+XiTg)*8FR*2nlHN0%;d=mQmanx-p{5u2k?2-Ni0koO1hV+}jo*4hg zBU#|UAaN@=k2>H!)cWv&TOw~xG4q-{b}xy#_n6H?zmIVZ%oUDddUCOYgCP8xj&C%Z z^yba%g~r3Fmj z{@Gd{T4VEkXv;OJ|eerhlE{Z&u5&CjrVbiPAxXA~p8 z;)#)n@s46SwbR}KwZd%{Q&hPw#fVpcamvofjH;jL6W%Z-QXy&m$%5POh^*T=h3u=} zLNOZpE=MN)e|rqBX}}T{2vfq()Z_#D-&BoZ5z~MV{z;Tq8)3yiefoC{V=8_n2agrLNM6L%V*SO(dh1Bi0Y!mlaG^{PT z-;R``FNtD!Zo3bRQ>bE#va-X0HW4hx-L(m;$MR@E5HOz7HTU;zu+(nJv%qtHu^8?b z=wWk;%FkB}b!E0=pQZ@|swY5s!^LWWj9=`=rpDuKOctzOM1Ze6Ii&Y;lZP(bOH$p8 zE6CFnrd@y9H%3ye>bd|;m@iua%lh$V!3J08+CC{%PwnJe9pK)|a{FqTpzkyy*S&7u zFR0)?!!K+6=`Yov!^wDH<%#86qd@-eZ^|>tIAHW>mf3K?t3c|5#jW0aEnKd}`622& z(D62&hV2Aanl(d|DK$_Rt?Z-NiykZq=(QC>3AI9akYtHqI*-pL^zPP|T z?>_3w${0w?+xO#ERoAw$;Tw=@0?nkT=&~P3WZV}!-10|8Ipn4=}*rgEhiy5 zj#qzUkPFu;r6z9ucCQ9{5Ef85X{jpH^FgCEy22W7FP|JASP=^}Slxcd3t2(F zt=hJ#2ql?b{vt>yot9C|DTU`6jfRV`03?H}g%y~s-VorAkoEG~BRH-#s-4kcu_(1; zliJZXP6%YMHsXC^3_PifpmHi9ZatQQi> zXfSKkt=)tja~GXm4VAebsujHiHh?n)0Cscq-c6W(A8@MyXi0VfCc;*^8+uT{y#Z*T z2;j038W~*4NBb$$$a;O)GABNy@032=W((JImWJtXfqWUT1|7Ly8H)(z;853 zK#G{@4FivgzY9zQW zw-zhAIL zDGM8`WtIq{1;g#9drco=A4w&5{V{!j>>j*12f{`E@G`Bs>ZxGP3w2-lcOCXo7oiKX z<-aG3&13*v_F3Q(_iZyo&m18jMkPhCf6_YPLND`Dt*=PUt^9 z*X`cl2NalhFZPy!xt4SDf7#W&`yf8hZjj~2@M~J_K{r!iyF}62{$b`d*!THtB>!eG z=1y}P^4yHuidHpH3ItKtM*>F|FlSs09>%$s|E%Z=JXv?+%|Q?O#?3m5V&l@7WpAD$ z6ypM#>o0vKxtaXGeXPi-K`RXwmOA_}T>+&!91rn!q>~$uIC4%GvYW=LaAknW1A^X^=DyG#-0w6!2iq zzJG83d`rv@An947h*kqSMlSzDy)%BjMML}uxc})tM0U_`%>tu_{rFh4H$WttM2ZHx z2?rCPn2gpN_Wma_*27hEXLcubqKAk1VSj?3(olY4Mw6iCqG&WIpPzY#VaT~pI=DLP zlODpj@qXTlaQ`f!0{Wk>9_1y;<4SRP;vm#gn2`&+*?H&qsD6UCKnxMcD}4MD()143 zkA=zb)8r8T>SU=U-Bj}E`)|f(Bhu>tgfLBt6k23L3>EGO0A{%dBHdp&Z@hf68%^Z^ zGZP_7(4U%!i5h8rq{C6j(T!wsXZ?EALO#huCrM^y^PJ%RKyHG+bBetY1ytV<8>C2F>JdErP4VJ)TYeN>kRDwNF=)M7YON zJR2V|!pyUIAbw;Ijy^k~h2`Q$zCFilE?A{Q&)}?1U8%gd)C(H24md5E@ZMk|R-Jd& zId+|4L`s_kV`9rYMU~mmG*oIo#~(q-c9EFSfexG`C0{66*+YuQ-(T6%`2hYHDa}T~ zizH#<)hcLA=JHKf52)R-M)}z;mAW?tq3}1Q(0izuv?~sl`K1Fia*yj@p)VSS zZm(uJng6}KU5FdDH2xhn(vz4Cd{4&xf)NBL;iurH>=!P?B*2?UPkzbQ2EftxE_$yV z11y~Rw3~ARxRDh=%o#BDbyt9!_J?KA-LUg=*DV47&{#yXRQe>OD63}1cB9<)%7?h# z$h|SckL4P#f7p6_J6nIDV?&YO**)-={QqhgDN7e_8pFMP{(l*CeZgYb_AAJ294NFb z8OSjhPZ@%I2o^HBrL>ngv5)t$tKDYy*%Xub7osve+#d93CujbucnxS}xFz*hqnEDw zdsQ^iunGj_E~iRpxi*e;`YU|ix18ViZDD7Xdr;U;3^2#M0sC&JrsSN5G=|ga2#o1{ zy;d7+Lg)}z>ferRpEQ>8--gQ;%6dYs#XxE~Oh0yc`|B2}RT+GpZ+rM(ddkQlDzr!a zr$>(QI|ci}u(RhuXl@<{F@$h=)_1j|&d8YO8 zx2{a>SDl2iXg^(F5;-iARb&<)^@W!%$Z-;JZz&~<*rD)9e1f7pQG#9Yz{Pmp@JdoJ zX${^MOw84khI#Kh0Go<#)%yiFu`r+{^IS3xCBV;MKpmmbInrbDosbW2BgU$F?nne z*tC$|eo3ngtYm#e_L}pD_UeU&=HMFbjskv{4o$h_icKID$%J9Mub-Opv#u(s&M9)X z^`Y-iP*o}``wrFrW;6KqSWo`jA=^=2@6N%*cR&&#jgf)HFoJZ$nrLLVDREn*jP@sx z)<@Iz{QC`>McK%=PJ80LwFD^n8UW#jbDWpAR+W=SNvaQK&|13jbc6QaZxcazA4M)a zK3z@ND&JV-MrP-U!VlWMfBD^PpLj|N?O{SLApV%!^BpccuIKODe+VT!$nZZN)ITtk zMUcs|->}d(O>|zoz{RZmXVRWPnEO=PAEjJT$+%~Jli0o_3T*NP9uc;Zc#_i~3r%px z3XbdmdAo2I@TSMKFpepoSM~Xi8H%6liF=iXVJdPCByULXB#$gWElv2)RkD16r1)P1 zA2qWrq!EzUQIua8D0Jo4BIOFJIhSzt)_jfb8r3f%`;iEdV zM+`K-Gh&@|o^I2!z!idVb{PuAWNK#)T#hRbNN9q6DSPj_}RpLgOhu%UGR27B`S<|q(yA+W0( zcosi?a~Wi@e>Zs_7k3qO%fN6LbiMD0Wx2;=sNJsuOF3>nCtm3(cZuF7g;FkwcB2O`)gwNLC&YYe z;xZ??jv$0o^|r%k=zm0o3|pK3FU(8uC6)$E(r}whoQ{+CYK(+g0|#yJX*HSx+G(^X zRV8np+}1q!SvC4J1|Q`L3os10Us@wD1Jt0l-@ z%L9}=u1mCwbsK-K!K`oasQI%v)-TAMrqgZr13ThJ#x~|1%o2Y1T`ZrgLOPPEku;3J z!S>rDq%>c5@ER-k7CTHrPnFRL69%Oul|@ z(QFuCQ0i91i6!ES_^ZO|5x6W)n|`3i>hXR`;rtt1V{bl>F#4?*tG+@K3D2`bQjprE zATpU#^r$X4rJWX!`cMl8WX(NN&D-mih;eeG!~l}sYlX;XUbNH@c7-)ekc0d1WK=u) zNHOx#!^#{t{->fOiKWbz>;uD|i0?zJyDU_)*>yvmHP8KRnCh0w@^z=(23MM;Yx>Tb zQ}jddy6Qmxq0Lf90=Rn6ZW@uCW-g=Z(XpgF(63bmdec;b2C z=jV}-I%dtec2$ozQ(ZxDEk0L}3*F{=6sgOg_s&~f!F4TKQg@L6>h}o<;HpaMR%^hH z4N6VoYa}!hnH2dV4w)RKZU4Y*7^4RNirb~z`tgbX7tWoJ`gNe0W0OhqT6~_`hq3d* z^=$(lbhI0H2v3jpb?^u3Rl;BI$8Aen?-{lOb~n}y{XgHu2#T8yGD5E-BQWt#BT|0* zZMXZm&}{gIcFV~Po!fq?pUQD3rsHkVpv$6wIs^VGI#?z7|Hyu!GjNZpP(NN4m5ikZ zq~LeTSedmb_0=feBkoW_MKXrA(Wk1uGB7Ikl2hBG$N?Mca?t12N=6mwW^Y;ZMvZC`N z=CBeNjwt@YTkzi&G1UPk2d_%%CU+mp2FX}{==;soYTF{0pS}^8KUHELiw~g9I#Y_y zMb3M5AYY-H*w#8gVi6EC7oXw%qaU5CCocr%3L``nbINsY$RS9^Fo5}{W#_-9%Wnle z%;=Iv8wfB9!}*>AhCOcK4UIe%6JQ|28~#=AC!28$5{p#a69g_)j2gAa^-)L~q!;lQ zhgNHO=}W^Gd!sV-FY5!aCZ%49Y0-b(!EkQz27yd0euR(3iF&NvUKMNcupi{rdaiw2 zAP@w0n()ayUIi{e7ynyI#|}h`>y>#;<8}X4;>~d%{?F-h?(2FUVGoPv+n3@CVVFmx zP}6!2$5|%XbB;w4sQqwf{yIeU;t41Kh{;YuemY%pN1I3uRGskNmCBWH);QxZpW&l` ztj(+1i1mI_=(f3m;Q!L#!mAF1NE)tj&k}5ND2986cieZ_?&U(gv|)~Zo9KC&z(#RS zMD`vzba5XSr9C<*9;{!pT)YOP;oum7wvE(@^IjIXWd=}-)4-Xf(j%t%{zPOwmwtn9 z>?lNZ@4E3+{Omeq@rr)!qSx+4AYz<>Me;$`>_vOY3z@pP^&)=b$Pw3XgZGb0{Qwbe zb0){|3+o9==HN(<_p#q`5zX8^F(Jy2<)+rqqoM+k_}ok%+1GNh-MY@p1M}zat-3%5 zwPrD=MUC=1Y~@b5rNj_z%A&&J^iUOpw3iEK{@uvk)Yf^Bn$%)F-z-J!qx-(*7ua6s zvitbTvXZruwPaF@8KwTwXX(Xb1AKb{%hdK%NE5f@MuwKK3h?&|;Bb2$;MEI2At(I@ zJ}Z~X0X;Cjp0QDtUPLnZ{$sxCQeK zSlq|e#{v!ES5%NJ7^B&`j1swm3P37Yav}%hBM${|Q+ku_@=qgn;p4K)4b!R!orH2b zX3G=_MbR?8D-oZ~T)t4)VJ@9gy%Vw$Oo zkD|NR$vWEit#!P*PeCnr+A4KME-^!0UyJX@LoqqcZob7TuYxnPJiGJU#RzvtgMKNd zthBNlv7@}w*f9RxyZK|!K9hotUuC;f<9O&EG#0R4wZ1)tO7S%;O(Y$RT8}fdp`}lX zOT;&f#DRo7Q&ILU?<-(cr^Ek9fe?8&W%tfTSVNPxhfg`9o6Fs)3y*jt;q%meTzM#_ zN0LqCIDj0=$;o`ErKlOHxn&r0&fOC6Btzb)$jHjTb4aM)c?EBC0oy#qC(e<7MAV&U zkDnu79m1v8u$I?VA7t*FN4A2Eeb{pPRzK}|-_L@ZZrAlpQt&_~2NwfN(aY-}ELQUI zJx+9y#)c0tz`k2BMI6N4i3qVTSd4OU4((zNI{cmNV`oZ!6fBkK?=0+<^1p&G z$J%Jk>oVG1@`W3e)tSGOIDlIJKaS2itjYK7!=#J`Nu@y~M@#3V1W5&CG>9}ve`$o# zrBV_Cqmh;d=~8lZGeTgr#E4Pv^Lzi}j~xfGgJ<`3-Jj2S{;@(fquu_cKKtpLl7<+( zJu1kVsx&ft-+8br)R^vJPT;_yfZ;;kv)QEHYu-d=?1yh&%HzU0)O|tU0SDZ=l0Dt` zqqRD&Q=a^*7u{r7D^xIn`-?)*_qJhx_{id&{#RZ!);z@Gf}?}oTW@SR%hHrnt=xQx zDf?pbo#nVqcyKik>)xBckzZsLd(f8vwZmVA9b4|O-;;sB$OdlS9e=?!jf=)Wc=wfd zxRG=*E9fwg{gxrf2S7wXHd%gi5pCGu_tD|`N1a}eISzHVm~|N$feu;fa06iC)7G%* zFSKM{_p35|ql4~S(-xfamaePrbTyQ3Yv^vcjl7LO?b}a4hl8tv1=`be9P-oAY?x%g)!Unoee5Vj$k|jin5=;%u7&pu6vW zT6c*M$J(@)IpZ-V=~VhBX)U{cs?83;@;;q?yyz2SKmt!xope)O%hG#7*WrGXbo#!z#7TMv<&nGJ}B)o|XAN@Vl#o)Nw_W#`j(&lu<%tj@y>jXfZYWA9k4Q z0U>0(sA4gsii>wpvyh5p{O1sKjDs>hxXiwDqc)n=3!Lkn67G3>B}K7lH0-_4Sy%D8 z!k_|`V3;^1AF)qYL;xh|DPi}7-i5Cp5#f=Ln{_v4)ZgjfOkivb{mwW7Hj^GkR&UfE zmRD~XLXbb_I_o1mT=J1-Y;x-d~HX)s?hwh_f>sy zFdsj&SbbFd*Lz~{h$V?kG{3R4(xWPUJ4wIcxaZUC5dyYqN_ZvhvIDn*HBhWSLke#q z*~_z|&*W%}#%sH~Nyyrnh3pA&ReG>Cp#3(G@MeLX=r=8T)LK~hQ1L>h@YCoSfmZwA z=kusM@00}W!M=isO}yF^a;U?LFq}>@eow($!wx&r-$ajs00AqQOx!uaS1%qU3AuE!RM4yqAos_PUfp^sK^Kc=R}_^Z~Epe^=z$Q_9lG za|(ET(*ahKhCk@CMT-JKmhbG{6LPH1&Xgm+UhaJxHXbcJ%uhBe6q)nrL=#aYi>SVb zcBy?F0f!C1Mqqo&$cz;HeHtkNLgKfg*iKnk^<2{&RDRSGb{|V~usqFHsB+mFBkCn_ zax-Poj#;##B;-3Ga$wru0`=j_04(d&$FD-o`6p|TxR{m9fWW}{$V=L6?>^qFaj5^C z9j&SF+*iKpHCam(5eeN|UC4+}iaJ}vpmL*5cj%k?I*&(FJ^~xKl+CljI4iNRSxA^t z71i4SNB6#60{#~)gC1l%M*gH@fHEL)u9sbYxR|-|l*YHB5f3sbM2r7}Dz;<0d8mw_ z(t6clSgu!{hHf{y5xFdhhjqOW`Q)5Br-J^at@8$U%kJ;%EE1C&Qlp@^_sc_xNsCSLko{ufo$Aq@Y?FqHb` zB}eqp))#>=RDOle5+jUxk`Vr~x5-M^xlUs%dO#_q7v;gZ(agir$V~CRnBCuAF{|H> z>E~O~F&hSL@FCqmDY^C;?Es-LSvX33E5Yz@yna#N|Bl1!^@NbkHO>;|Q%3axm-8Sm zluQ_c{tLY zsyCKv_{gRATT>s`fLyr05y-4y?o&(2ybz=G_T%m?yulQWWhInrSV76Jm=1><{^qNc z8Ro$E94vRW3H}&~gOxf9=t?YcJx$_LsS6o|7$&o$MBZD`eoWdS zL`-}_X1vno`mhOqbvmX`Ct^GKGyJVq*TN{Os-klim46k#)}SE0>r$%oIkBZ@?wF8J z4^=7grnT52wL_~LZMs9fSGgnA?XFr3M{CZxKh3Ay^Btlxjd#F3!nG6iMKGKEf(f1i zU+JrCusRS>A1=vl?BF||5**J6*>Kma{^higpi|*^?K1GkUDMt9(ZoGZH;U{Zzg1iE zq>IYDX=`P9-{3*hkQB>10G6HZ9)b&~8xuSy+&2@2e8@6rd8bX35{B@9U1f6OSq`w& zKih1MLnTB#_7mq+^W}*cSD}Q-f0%g1#i(39gY#ecae;#NyAKo_pW(|cOXC15iKUCp67yh)S{rIBBw~T{QAxK&&>e#1$$wybu(7DC;qE+M6O7*NS@=r(P_Z2;#eqY<^!0-@x`~e@3cK_8h z9QG-~r&OMGBNy49!kvhXKElbxuP4s`ZC}Lk1-SWwQm#jL`OHY-woN0|(QCjucr$XGu{2g9x6yvskNAhh!Bvk4v7k+xaIQ#hoBD^nXCjwj_!B&L zs3pS1+3E}Zy;um8tihp*l}ws0$$K!jmfzEmc1abh23PSc!<{12NZr0&RY8$UvMZi+6H5$J zg9lNYAfUX6abjr%itLB$SrJu=Ax6TgHg($ibAzRuR3o0u(HFEt{Dte50we`a>?snh zhnfKe)R2N3DjZvADDbn0sYLg?f3aO z6J#CEuB4)Aqrh2H`PDOJHc`6&!T{5RT7F}=>Q5+l_NCuwRScO=Olwvo!R!h(*tgwI z_M|lq8sD2mHc`v#LOwkW8=to&JdzV=iwiJ1vQ?Sczg>?Z;8*v<@egppK1@QEc405X z`Gc7IE>3|cbj{}AZnqas07v58CaYLuBCFRE8<`(bu5Fzk-DHYtcYYpMUednxVb3DG zF}k4i>~t=6UJW6MQx<>DUnw-v&$&bN&qeBV{N z-mR?8;&;JHtRg$b)21%~-@9jq(m8;|1~3rGNrbnsmuXSc{ujqr7|>PB&hf0j-KQ!Ro-nMu61P(1{<-6}5h*MpF&z&Ope8@};h% z>WCU5AX>h`r4pU*3YkyU!+ho=c;Iny{#bMQp^~;mFk+mk>&Y%9gf7qXQr$jA^A8(E zWi;wBA*v2{AVeJ;gL1`f{3fA&|z=^C{b6?U^!iV3s>hl z#XFocj#N??!$>WbERU}1)cfaSE5BPZY2O(?sGR@NN`nN3A#neFZ^_lghLpQnQ$5iv zz=s=f#f?amj`EgqAwg9VfpV7va^i&Y<1e>4Mg^cPKWkf9!DOYaB!m$+)9pa)^Wsv% zqk=siAL_INwRMRD&i+6i5&L_1rAeh%>2XD^hKhlN2Wdf#~dl#LesxUeJy|C#9FFshF7lsQBH70KY@$8{zwQ zmY|YG+R%$ytvQc5W!`-|QSe4yF=B^>IUK%>Z zWV?Kdq&?&5$wJ14UFf?9y8W;68!-cp!-6ttGU<2TOk!&mN_GX_Q9LT0v~LF4yP6A0 zU5O7VioD&GIY&ND>9vL_g@*CHq{KYmh)!A=v9!!>(#3h12ER&cRVt)r%?Y#jq>z@i zuT>!sZ1~$&{@Q^rFkJU@_!3k6?C!V>whtYn+Phr)zKVPkN?Z>3&)#c~n=Y-$UN$z$C!ReS*L;;eEWa(%g>4nNV z>kkPQ0K0J~l)S7;jg9VQCD*MEzL>*_S0dPy>BoJT{!&OGychGFOyz4qpiCjC*nyy3 zeltfge|}IXMx4c#9og5%1KLwUT~%xveo~@(vJZT@K}<_)$=LFQGb(-|jHCVg=~2^k zKKaK+W|Ii^g8E5Orp_?JUpV0$pH9A6DbStpshfoMkxkRe-}Q>OzDHlD)s2DNb(&~+ zeoL7f{Ia*hwi_$|gCq zEL=FVPW*d~wF-j{wpKG1%2Yy2zhb;zP=RxA=^))|pHXenk*|KXfz+K8zN;lS=;sJ! zz_^YZSzR`IxhogZWh!$kb<;!T^ez6Cls5j4RWr@61q&Cs1!PMPhl;kb&hg?E<*aB+ zi%0Klnt+L8WW0AGkCboFSw-*k;ca}can#4h?#~ zn$k?Zx%0-b3S%0SS%C$nWON6gPLfnt_AFO+e)mJ0aUhcEG;KBOkf9^S%}6s03U94?#+LrdCA{-J-+-j#Q~u7 zf2c5BZo-&qN}0L2TYnwKtHe@d1{j^chILTQmM4o+w|FdvsXMcc`Q5n0o#Yx?>8wdU zquC0td;T9I!w<%l_;f3oN{uf@B8)=LHs`y)Wu_Ty*oCr#VRZ#jV*bgB)kKCHsI3Kw z=b%w3-qjT#Bf#pOBHWzdUYl`0)&jH$#0lW-5|rkoiki}F=X%3Qz3{+6O*AE(48K0k zO@dk_?g`ObC#7DjMCAzf(X`dt<@3$4nz`QL)0n8r539ygyjOYz@FvN%WhTH(5|cRa z2biyVhv=B=Zr90O`iw$8Xx@(l+qrwedo`1*!H2#_EI0FeP`kYE#^L7m&vFu#Z|H#qcW_g(|$()3+}{% zUn3Bk)U35V zwLF-LA@&jlp-gc~nCo?yK8J4rF}>qD#}JZXuq-$4_qV$X8>s0|x6Yf9A!9FZ^2zWX!-4(hr(V?EExQt;fBd~8E*;>iDK zWgZvRLB$Mn1)__gp7~kN1`m%Z2=WI5%A{h2Fb2vWrNJOMN;A>3Y)t~aHcSqH?;})W zDjYk_C?Uz<;VRo1OtbiJW%3Q)XC3J^(**gl46ols2Ncm`r)9SYXhjVuzb+Z&8>rem zP6j&cI-?}Wms|Ir0zM|1DnM`@=uFCHU=A<8EEj9SYpQJd^^UoJ#&Ofs_vH|Yoh6~q z>B|j{>H1+oCBiIPFQa%o{O^GNaG-sHOz{6h=vIM4JG!!|(rV9mY~8H)lUpKHD9yC? zSf`}|G-N6N@;>s#-8qYKZh6Qkh6R&>Ub$(}B>lR|f5qnqU{rx|YIu-#>8>aokwAXm zF=KHE z+%Z!4iQ0=wTfB%s%bzo7x?L}e1iHzd0M+En62rD#VE2FC_p_~|zW7bZ%$`KZYZG~Z zmlc)v?qPma>dvV0xT6|eLj9ar(B#nh)7_>3#B5^7+@I_KT%_DZJDjIO-Cg0r=4A#G z7XR-o9d*h__FU~lcEgXNrV4U&Sqc?Stuf&tZI<_h$S^b11sg)AD~R5Q@MFAX<@zRaQX42f4i5JCN^s1wTg4ji=sJoLWp3yi<>jxGUa(0>yw&Os(Py3 z+Veq2qr0BVVbNei<+ZOX;1r0Br2Xja*T2isu|QYpdL1<6@yTEJjwk=2Fyg~c7K}1w zxl++HigEN%HCyOJ43)f*4V&~ft4C5`(Ch}PdM=;2On2sO8 zod6TVLIm_}W=jb%Y`{&a1mFh9U&`82D|a|UyM&^+s~d3<_>_UOwGKmUl=jt*#ir^% zuCpB|ZHhK1fTJHwV^j}@n8`Aygb>pbLkjF{$^qjD^pIYK3x=|>+T(1wY6R>8@2szx zwi}(MIsEBm_~f53?XZf817Hl4s+TUTwv7A3;TsrYohNE!T(a6Yc*&8@%)5*`B^V<9 z>ZuH;Ok6O(0?w40&6+Bko?3Iok8%q+L3%E*y&;VKN# zsvRBRFWx>tOUy=;cgp_#1YhQTucz{Z-wmI}oXM}%+C2B||6Y2<-M57QRr%Wl-D#AP=APJt%s#+sRoq_e#$ z4z$WU`7U4Gb_>rC&qLkqGr9ThRop5LP+wN(2^G+wgru*lsiA##V7S>vpX*m*SQIoS zW*48|AY;xB=cJJx5C<(((vv{t>xVIxG>ZdEkq$cK@JZdUs+(#Fv!~we>36fj7dz?X zM@I!UA$q1yDd=L_BY(QP+-l(K5o)w~5BGijx0RiuxUKKU1~dFSV!R>q=;9~g6m1tjyct>DLe!9#}DCi?F{(QWJJ!+h3k^~((+1Ghs6yxQ2 zIwz6y+l|*xO)8B#`{(~M)YeISbi1m>{W~bIk?gUF#GsN-UR~|nvgC~rd7ZPRUbV?% zI+TC?DVjvd&EaeW<4iJ54CSDj^wB=cxoy5HS?pOmb>xF{0DxTIY+7O|=_Cm~5U}uW z3jk3-=z#X~C#QDh+vxmEzPF8^;{GKWwo*Ua!Ws8g0m%*X;^zX1+3cLHn2xqXxwtOx z!49Nis~Xsdi2ZCO9C2=T{@uw5xShEhDd9_gUyRmIi?MPVl~CL@{BWu;n69xND5tb@ z#16XSSUlkB{nuZ_70KTuvR7<+x!@+>@$Yf@lLgm=O>yXGsdpM<>qyUCR%NzNH8m{Q zsf?i0tp4mRP|r-PBIoXpX3tCgQ2-^T3r?bdB3g)}frdjE9<{5WRU7fRVD#hUHWd)Q z2NA2Z7QJHSa~``YIzlFTm_GflK3*xc|3X>$aJ6)Prl>vT zgqu#er@TI0nK^o8wAHl*aGYCTApN@oUlZX-Yj{&C?W(+3!*fQyvt)a^RBb9n(xr?1 zKn#dw73*0)UL(AL*sRXeczwlK%n{eel}VnkS>#g)pMR#mH6k(~KnU7mdFxi)XC)28 z0jA_fUNzOqI+<^oQ!JIv`(C3N1)^#7rrAH^_z3t<^W=^_gu8h>;J!`zZ31%9FEcV3 zaPGb8%j1hchzijQ|HrErI^n)#*5~Yef*;RMLbz8)f5Kp?pY(d(>Pvq*xN~3h4BY0} zLPP&$IsA0uE%%TmE!o7p3$5z9EFGk?soURbS_+iVy}{BkbITcOJW=@d$PyYl9%RHz z7LThnEx`MPrmZ#`D*xvKLW98P5M+luqk7z8a zE$0_+zv{oBvBAF#Jh#V&J2P)gp5KR>>piUsReM2<=d(U}O?Xi>GY|~Pl z8}Oshg;!{e*B0h_^E>RY3EV*x-ig0snUg+lJaIs%(#yM3t?v?l{Ca$yR^V@w#}A$v zO-r$!OR*cHaj95Q*3w?_3sS8GyDw5|{8P_&K)6udj0?^9%V*}FJxE40;wLgW>D-?Q zQRBCA9W_$VY4b|wAj1$qT1XHIA*R&sDSf{|V)HGM$Ij~qyC^x-m28ZN%I+MD{kMqe zAK+_+4(y$=)mw_I&VB}JszJZ~d9?cezNGEuApvZnbS!`Eg=e@i9Aa4CU*Po~2a&+A zP1_i}j$Q@g&RPGWWrxq$d9TtbqS!+X6C2oJX;idb@aO~}i>^)a)b4Fd_)9ACHP}JH z%EkJ*RfWxeEg+vFLkGAZHQV{?A|&uKuX_gqxSW)$e36HPjMKHZFL*JYDt;>OS0tgz zIXC9A5}ig56P5?P44T(&0wvRWQp2=$ciiK^J>>_+xUQ(T92$;3=77LIJd3u2%ac z4V6vEDOxcM5PK0oKjRI+c*;fRxKConWya+R4hE@`Og`+&VbsPcq_snasIk00 zoD0MytvUg>ws(lHqGKkUJL({aTj2YaEs0KHSa3!kBdp^9u=1V~?i++6NXH`(b5Gu+ z6anv&0HC(O}2HpT%;0Hyg+Wcqyf z=$ky)SFFcy?hFw^npSHuw&Vb7ri_cp)KCLN2Oseze;nYz=%M}ssmbP*=)R_ek`c(Q zne+qk+7$~UM?2q>?#EJK_{taW-s}fm%^3o|&ZnvVz29%XZE;RLW`B0+e%uvT+yV?3nC(Y`Ic@YNrI!t(H!)=-lQ?oX2>QJI!#pQ12hlC~h zCJd<#f8G5{VwZ>cMVXJBg;l>+Ny(358vSpt^~A1u%C~$Q_C8~VwCw~G z-}%idwJrUU)l`@h8o zv&aXUSB!SZfz+gmR&*NfEHqx|kNh9wA=|*QrGeYb@9slIZlCRshDPOWu3L6YUAL8o zY0BUEFJW9CMjT7aC8gQxx=g;+#vVhxYN&Y?bbuPb*#4>fekbj==Chf=ZWV$Zv7ITp zBqm~;JGGy*+~kb1QRuR;p1!rIB^@khG^hXf#CVu> zsEDzU>4pg)XSTa24FtNbaLs19ltrZTF9Z&NaTrZ+5RSgVRt7Fc?I>GiA>)a44HN2j z7xPM}`QJ-nKLm1cw$QS7$xr|n#ai7S4-S2a6o8iAGg_r=15xY<2yA0PK~-TCbEh~-l< zODX9zGop3!qKUsT=4Scs_s^_jV@JwE?T1(SEKle3jw=I8Zing^v*OzOWUDXSb)P

!R&# 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 N$5SA1&z8LN_*yx1=5Bk{)+Ae@ov^V( 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 z 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

XeEmC{ggzrdq{rD5IQ% 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

7lRsJ18cqZgjMhc3s1FUdHBL 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%0D~1^TbLkJE8*eBT`*5;`{hj8bc^ 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%0A~#;pb{SBCYI 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 z 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
rsOqPSpodui&FCY&;zXqQxb((AVtPIM# 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

5IpvgR#aRa7u4vD!@3ktl9Ka%B!}T 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�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 z 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

UkJH1v3hoHHMPSYr(bnhj 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 TRcl}K1tOGX#aS7u-PN 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

@A|^gQ<7vOjE?>={9NN^KT@zjO~EF7vmJgC}xl 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

(KK#y7>$!@P5YgRL^KUK53 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 + ` +} + +export function vueTemplate(str) { + return `` +} + +export function vueScript(str) { + return `` +} + +export function cssStyle(cssStr) { + return `` +} + +function buildFormTemplate(conf, child, type) { + let labelPosition = '' + if (conf.labelPosition !== 'right') { + labelPosition = `label-position="${conf.labelPosition}"` + } + const disabled = conf.disabled ? `:disabled="${conf.disabled}"` : '' + let str = ` + ${child} + ${buildFromBtns(conf, type)} + ` + if (someSpanIsNot24) { + str = ` + ${str} + ` + } + return str +} + +function buildFromBtns(conf, type) { + let str = '' + if (conf.formBtns && type === 'file') { + str = ` + 提交 + 重置 + ` + if (someSpanIsNot24) { + str = ` + ${str} + ` + } + } + return str +} + +// span不为24的用el-col包裹 +function colWrapper(element, str) { + if (someSpanIsNot24 || element.span !== 24) { + return ` + ${str} + ` + } + return str +} + +const layouts = { + colFormItem(element) { + let labelWidth = '' + if (element.labelWidth && element.labelWidth !== confGlobal.labelWidth) { + labelWidth = `label-width="${element.labelWidth}px"` + } + const required = !trigger[element.tag] && element.required ? 'required' : '' + const tagDom = tags[element.tag] ? tags[element.tag](element) : null + let str = ` + ${tagDom} + ` + str = colWrapper(element, str) + return str + }, + rowFormItem(element) { + const type = element.type === 'default' ? '' : `type="${element.type}"` + const justify = element.type === 'default' ? '' : `justify="${element.justify}"` + const align = element.type === 'default' ? '' : `align="${element.align}"` + const gutter = element.gutter ? `gutter="${element.gutter}"` : '' + const children = element.children.map(el => layouts[el.layout](el)) + let str = ` + ${children.join('\n')} + ` + str = colWrapper(element, str) + return str + } +} + +const tags = { + 'el-button': el => { + const { + tag, disabled + } = attrBuilder(el) + const type = el.type ? `type="${el.type}"` : '' + const icon = el.icon ? `icon="${el.icon}"` : '' + const size = el.size ? `size="${el.size}"` : '' + let child = buildElButtonChild(el) + + if (child) child = `\n${child}\n` // 换行 + return `<${el.tag} ${type} ${icon} ${size} ${disabled}>${child}` + }, + 'el-input': el => { + const { + disabled, vModel, clearable, placeholder, width + } = attrBuilder(el) + const maxlength = el.maxlength ? `:maxlength="${el.maxlength}"` : '' + const showWordLimit = el['show-word-limit'] ? 'show-word-limit' : '' + const readonly = el.readonly ? 'readonly' : '' + const prefixIcon = el['prefix-icon'] ? `prefix-icon='${el['prefix-icon']}'` : '' + const suffixIcon = el['suffix-icon'] ? `suffix-icon='${el['suffix-icon']}'` : '' + const showPassword = el['show-password'] ? 'show-password' : '' + const type = el.type ? `type="${el.type}"` : '' + const autosize = el.autosize && el.autosize.minRows + ? `:autosize="{minRows: ${el.autosize.minRows}, maxRows: ${el.autosize.maxRows}}"` + : '' + let child = buildElInputChild(el) + + if (child) child = `\n${child}\n` // 换行 + return `<${el.tag} ${vModel} ${type} ${placeholder} ${maxlength} ${showWordLimit} ${readonly} ${disabled} ${clearable} ${prefixIcon} ${suffixIcon} ${showPassword} ${autosize} ${width}>${child}` + }, + 'el-input-number': el => { + const { disabled, vModel, placeholder } = attrBuilder(el) + const controlsPosition = el['controls-position'] ? `controls-position=${el['controls-position']}` : '' + const min = el.min ? `:min='${el.min}'` : '' + const max = el.max ? `:max='${el.max}'` : '' + const step = el.step ? `:step='${el.step}'` : '' + const stepStrictly = el['step-strictly'] ? 'step-strictly' : '' + const precision = el.precision ? `:precision='${el.precision}'` : '' + + return `<${el.tag} ${vModel} ${placeholder} ${step} ${stepStrictly} ${precision} ${controlsPosition} ${min} ${max} ${disabled}>` + }, + 'el-select': el => { + const { + disabled, vModel, clearable, placeholder, width + } = attrBuilder(el) + const filterable = el.filterable ? 'filterable' : '' + const multiple = el.multiple ? 'multiple' : '' + let child = buildElSelectChild(el) + + if (child) child = `\n${child}\n` // 换行 + return `<${el.tag} ${vModel} ${placeholder} ${disabled} ${multiple} ${filterable} ${clearable} ${width}>${child}` + }, + 'el-radio-group': el => { + const { disabled, vModel } = attrBuilder(el) + const size = `size="${el.size}"` + let child = buildElRadioGroupChild(el) + + if (child) child = `\n${child}\n` // 换行 + return `<${el.tag} ${vModel} ${size} ${disabled}>${child}` + }, + 'el-checkbox-group': el => { + const { disabled, vModel } = attrBuilder(el) + const size = `size="${el.size}"` + const min = el.min ? `:min="${el.min}"` : '' + const max = el.max ? `:max="${el.max}"` : '' + let child = buildElCheckboxGroupChild(el) + + if (child) child = `\n${child}\n` // 换行 + return `<${el.tag} ${vModel} ${min} ${max} ${size} ${disabled}>${child}` + }, + 'el-switch': el => { + const { disabled, vModel } = attrBuilder(el) + const activeText = el['active-text'] ? `active-text="${el['active-text']}"` : '' + const inactiveText = el['inactive-text'] ? `inactive-text="${el['inactive-text']}"` : '' + const activeColor = el['active-color'] ? `active-color="${el['active-color']}"` : '' + const inactiveColor = el['inactive-color'] ? `inactive-color="${el['inactive-color']}"` : '' + const activeValue = el['active-value'] !== true ? `:active-value='${JSON.stringify(el['active-value'])}'` : '' + const inactiveValue = el['inactive-value'] !== false ? `:inactive-value='${JSON.stringify(el['inactive-value'])}'` : '' + + return `<${el.tag} ${vModel} ${activeText} ${inactiveText} ${activeColor} ${inactiveColor} ${activeValue} ${inactiveValue} ${disabled}>` + }, + 'el-cascader': el => { + const { + disabled, vModel, clearable, placeholder, width + } = attrBuilder(el) + const options = el.options ? `:options="${el.vModel}Options"` : '' + const props = el.props ? `:props="${el.vModel}Props"` : '' + const showAllLevels = el['show-all-levels'] ? '' : ':show-all-levels="false"' + const filterable = el.filterable ? 'filterable' : '' + const separator = el.separator === '/' ? '' : `separator="${el.separator}"` + + return `<${el.tag} ${vModel} ${options} ${props} ${width} ${showAllLevels} ${placeholder} ${separator} ${filterable} ${clearable} ${disabled}>` + }, + 'el-slider': el => { + const { disabled, vModel } = attrBuilder(el) + const min = el.min ? `:min='${el.min}'` : '' + const max = el.max ? `:max='${el.max}'` : '' + const step = el.step ? `:step='${el.step}'` : '' + const range = el.range ? 'range' : '' + const showStops = el['show-stops'] ? `:show-stops="${el['show-stops']}"` : '' + + return `<${el.tag} ${min} ${max} ${step} ${vModel} ${range} ${showStops} ${disabled}>` + }, + 'el-time-picker': el => { + const { + disabled, vModel, clearable, placeholder, width + } = attrBuilder(el) + const startPlaceholder = el['start-placeholder'] ? `start-placeholder="${el['start-placeholder']}"` : '' + const endPlaceholder = el['end-placeholder'] ? `end-placeholder="${el['end-placeholder']}"` : '' + const rangeSeparator = el['range-separator'] ? `range-separator="${el['range-separator']}"` : '' + const isRange = el['is-range'] ? 'is-range' : '' + const format = el.format ? `format="${el.format}"` : '' + const valueFormat = el['value-format'] ? `value-format="${el['value-format']}"` : '' + const pickerOptions = el['picker-options'] ? `:picker-options='${JSON.stringify(el['picker-options'])}'` : '' + + return `<${el.tag} ${vModel} ${isRange} ${format} ${valueFormat} ${pickerOptions} ${width} ${placeholder} ${startPlaceholder} ${endPlaceholder} ${rangeSeparator} ${clearable} ${disabled}>` + }, + 'el-date-picker': el => { + const { + disabled, vModel, clearable, placeholder, width + } = attrBuilder(el) + const startPlaceholder = el['start-placeholder'] ? `start-placeholder="${el['start-placeholder']}"` : '' + const endPlaceholder = el['end-placeholder'] ? `end-placeholder="${el['end-placeholder']}"` : '' + const rangeSeparator = el['range-separator'] ? `range-separator="${el['range-separator']}"` : '' + const format = el.format ? `format="${el.format}"` : '' + const valueFormat = el['value-format'] ? `value-format="${el['value-format']}"` : '' + const type = el.type === 'date' ? '' : `type="${el.type}"` + const readonly = el.readonly ? 'readonly' : '' + + return `<${el.tag} ${type} ${vModel} ${format} ${valueFormat} ${width} ${placeholder} ${startPlaceholder} ${endPlaceholder} ${rangeSeparator} ${clearable} ${readonly} ${disabled}>` + }, + 'el-rate': el => { + const { disabled, vModel } = attrBuilder(el) + const max = el.max ? `:max='${el.max}'` : '' + const allowHalf = el['allow-half'] ? 'allow-half' : '' + const showText = el['show-text'] ? 'show-text' : '' + const showScore = el['show-score'] ? 'show-score' : '' + + return `<${el.tag} ${vModel} ${allowHalf} ${showText} ${showScore} ${disabled}>` + }, + 'el-color-picker': el => { + const { disabled, vModel } = attrBuilder(el) + const size = `size="${el.size}"` + const showAlpha = el['show-alpha'] ? 'show-alpha' : '' + const colorFormat = el['color-format'] ? `color-format="${el['color-format']}"` : '' + + return `<${el.tag} ${vModel} ${size} ${showAlpha} ${colorFormat} ${disabled}>` + }, + 'el-upload': el => { + const disabled = el.disabled ? ':disabled=\'true\'' : '' + const action = el.action ? `:action="${el.vModel}Action"` : '' + const multiple = el.multiple ? 'multiple' : '' + const listType = el['list-type'] !== 'text' ? `list-type="${el['list-type']}"` : '' + const accept = el.accept ? `accept="${el.accept}"` : '' + const name = el.name !== 'file' ? `name="${el.name}"` : '' + const autoUpload = el['auto-upload'] === false ? ':auto-upload="false"' : '' + const beforeUpload = `:before-upload="${el.vModel}BeforeUpload"` + const fileList = `:file-list="${el.vModel}fileList"` + const ref = `ref="${el.vModel}"` + let child = buildElUploadChild(el) + + if (child) child = `\n${child}\n` // 换行 + return `<${el.tag} ${ref} ${fileList} ${action} ${autoUpload} ${multiple} ${beforeUpload} ${listType} ${accept} ${name} ${disabled}>${child}` + } +} + +function attrBuilder(el) { + return { + vModel: `v-model="${confGlobal.formModel}.${el.vModel}"`, + clearable: el.clearable ? 'clearable' : '', + placeholder: el.placeholder ? `placeholder="${el.placeholder}"` : '', + width: el.style && el.style.width ? ':style="{width: \'100%\'}"' : '', + disabled: el.disabled ? ':disabled=\'true\'' : '' + } +} + +// el-buttin 子级 +function buildElButtonChild(conf) { + const children = [] + if (conf.default) { + children.push(conf.default) + } + return children.join('\n') +} + +// el-input innerHTML +function buildElInputChild(conf) { + const children = [] + if (conf.prepend) { + children.push(``) + } + if (conf.append) { + children.push(``) + } + return children.join('\n') +} + +function buildElSelectChild(conf) { + const children = [] + if (conf.options && conf.options.length) { + children.push(``) + } + return children.join('\n') +} + +function buildElRadioGroupChild(conf) { + const children = [] + if (conf.options && conf.options.length) { + const tag = conf.optionType === 'button' ? 'el-radio-button' : 'el-radio' + const border = conf.border ? 'border' : '' + children.push(`<${tag} v-for="(item, index) in ${conf.vModel}Options" :key="index" :label="item.value" :disabled="item.disabled" ${border}>{{item.label}}`) + } + return children.join('\n') +} + +function buildElCheckboxGroupChild(conf) { + const children = [] + if (conf.options && conf.options.length) { + const tag = conf.optionType === 'button' ? 'el-checkbox-button' : 'el-checkbox' + const border = conf.border ? 'border' : '' + children.push(`<${tag} v-for="(item, index) in ${conf.vModel}Options" :key="index" :label="item.value" :disabled="item.disabled" ${border}>{{item.label}}`) + } + return children.join('\n') +} + +function buildElUploadChild(conf) { + const list = [] + if (conf['list-type'] === 'picture-card') list.push('') + else list.push(`${conf.buttonText}`) + if (conf.showTip) list.push(`
只能上传不超过 ${conf.fileSize}${conf.sizeUnit} 的${conf.accept}文件
`) + return list.join('\n') +} + +export function makeUpHtml(conf, type) { + const htmlList = [] + confGlobal = conf + someSpanIsNot24 = conf.fields.some(item => item.span !== 24) + conf.fields.forEach(el => { + htmlList.push(layouts[el.layout](el)) + }) + const htmlStr = htmlList.join('\n') + + let temp = buildFormTemplate(conf, htmlStr, type) + if (type === 'dialog') { + temp = dialogWrapper(temp) + } + confGlobal = null + return temp +} diff --git a/bs-ui/src/utils/generator/icon.json b/bs-ui/src/utils/generator/icon.json new file mode 100644 index 0000000..2d9999a --- /dev/null +++ b/bs-ui/src/utils/generator/icon.json @@ -0,0 +1 @@ +["platform-eleme","eleme","delete-solid","delete","s-tools","setting","user-solid","user","phone","phone-outline","more","more-outline","star-on","star-off","s-goods","goods","warning","warning-outline","question","info","remove","circle-plus","success","error","zoom-in","zoom-out","remove-outline","circle-plus-outline","circle-check","circle-close","s-help","help","minus","plus","check","close","picture","picture-outline","picture-outline-round","upload","upload2","download","camera-solid","camera","video-camera-solid","video-camera","message-solid","bell","s-cooperation","s-order","s-platform","s-fold","s-unfold","s-operation","s-promotion","s-home","s-release","s-ticket","s-management","s-open","s-shop","s-marketing","s-flag","s-comment","s-finance","s-claim","s-custom","s-opportunity","s-data","s-check","s-grid","menu","share","d-caret","caret-left","caret-right","caret-bottom","caret-top","bottom-left","bottom-right","back","right","bottom","top","top-left","top-right","arrow-left","arrow-right","arrow-down","arrow-up","d-arrow-left","d-arrow-right","video-pause","video-play","refresh","refresh-right","refresh-left","finished","sort","sort-up","sort-down","rank","loading","view","c-scale-to-original","date","edit","edit-outline","folder","folder-opened","folder-add","folder-remove","folder-delete","folder-checked","tickets","document-remove","document-delete","document-copy","document-checked","document","document-add","printer","paperclip","takeaway-box","search","monitor","attract","mobile","scissors","umbrella","headset","brush","mouse","coordinate","magic-stick","reading","data-line","data-board","pie-chart","data-analysis","collection-tag","film","suitcase","suitcase-1","receiving","collection","files","notebook-1","notebook-2","toilet-paper","office-building","school","table-lamp","house","no-smoking","smoking","shopping-cart-full","shopping-cart-1","shopping-cart-2","shopping-bag-1","shopping-bag-2","sold-out","sell","present","box","bank-card","money","coin","wallet","discount","price-tag","news","guide","male","female","thumb","cpu","link","connection","open","turn-off","set-up","chat-round","chat-line-round","chat-square","chat-dot-round","chat-dot-square","chat-line-square","message","postcard","position","turn-off-microphone","microphone","close-notification","bangzhu","time","odometer","crop","aim","switch-button","full-screen","copy-document","mic","stopwatch","medal-1","medal","trophy","trophy-1","first-aid-kit","discover","place","location","location-outline","location-information","add-location","delete-location","map-location","alarm-clock","timer","watch-1","watch","lock","unlock","key","service","mobile-phone","bicycle","truck","ship","basketball","football","soccer","baseball","wind-power","light-rain","lightning","heavy-rain","sunrise","sunrise-1","sunset","sunny","cloudy","partly-cloudy","cloudy-and-sunny","moon","moon-night","dish","dish-1","food","chicken","fork-spoon","knife-fork","burger","tableware","sugar","dessert","ice-cream","hot-water","water-cup","coffee-cup","cold-drink","goblet","goblet-full","goblet-square","goblet-square-full","refrigerator","grape","watermelon","cherry","apple","pear","orange","coffee","ice-tea","ice-drink","milk-tea","potato-strips","lollipop","ice-cream-square","ice-cream-round"] \ No newline at end of file diff --git a/bs-ui/src/utils/generator/js.js b/bs-ui/src/utils/generator/js.js new file mode 100644 index 0000000..ee8668d --- /dev/null +++ b/bs-ui/src/utils/generator/js.js @@ -0,0 +1,235 @@ +import { exportDefault, titleCase } from '@/utils/index' +import { trigger } from './config' + +const units = { + KB: '1024', + MB: '1024 / 1024', + GB: '1024 / 1024 / 1024' +} +let confGlobal +const inheritAttrs = { + file: '', + dialog: 'inheritAttrs: false,' +} + + +export function makeUpJs(conf, type) { + confGlobal = conf = JSON.parse(JSON.stringify(conf)) + const dataList = [] + const ruleList = [] + const optionsList = [] + const propsList = [] + const methodList = mixinMethod(type) + const uploadVarList = [] + + conf.fields.forEach(el => { + buildAttributes(el, dataList, ruleList, optionsList, methodList, propsList, uploadVarList) + }) + + const script = buildexport( + conf, + type, + dataList.join('\n'), + ruleList.join('\n'), + optionsList.join('\n'), + uploadVarList.join('\n'), + propsList.join('\n'), + methodList.join('\n') + ) + confGlobal = null + return script +} + +function buildAttributes(el, dataList, ruleList, optionsList, methodList, propsList, uploadVarList) { + buildData(el, dataList) + buildRules(el, ruleList) + + if (el.options && el.options.length) { + buildOptions(el, optionsList) + if (el.dataType === 'dynamic') { + const model = `${el.vModel}Options` + const options = titleCase(model) + buildOptionMethod(`get${options}`, model, methodList) + } + } + + if (el.props && el.props.props) { + buildProps(el, propsList) + } + + if (el.action && el.tag === 'el-upload') { + uploadVarList.push( + `${el.vModel}Action: '${el.action}', + ${el.vModel}fileList: [],` + ) + methodList.push(buildBeforeUpload(el)) + if (!el['auto-upload']) { + methodList.push(buildSubmitUpload(el)) + } + } + + if (el.children) { + el.children.forEach(el2 => { + buildAttributes(el2, dataList, ruleList, optionsList, methodList, propsList, uploadVarList) + }) + } +} + +function mixinMethod(type) { + const list = []; const + minxins = { + file: confGlobal.formBtns ? { + submitForm: `submitForm() { + this.$refs['${confGlobal.formRef}'].validate(valid => { + if(!valid) return + // TODO 提交表单 + }) + },`, + resetForm: `resetForm() { + this.$refs['${confGlobal.formRef}'].resetFields() + },` + } : null, + dialog: { + onOpen: 'onOpen() {},', + onClose: `onClose() { + this.$refs['${confGlobal.formRef}'].resetFields() + },`, + close: `close() { + this.$emit('update:visible', false) + },`, + handleConfirm: `handleConfirm() { + this.$refs['${confGlobal.formRef}'].validate(valid => { + if(!valid) return + this.close() + }) + },` + } + } + + const methods = minxins[type] + if (methods) { + Object.keys(methods).forEach(key => { + list.push(methods[key]) + }) + } + + return list +} + +function buildData(conf, dataList) { + if (conf.vModel === undefined) return + let defaultValue + if (typeof (conf.defaultValue) === 'string' && !conf.multiple) { + defaultValue = `'${conf.defaultValue}'` + } else { + defaultValue = `${JSON.stringify(conf.defaultValue)}` + } + dataList.push(`${conf.vModel}: ${defaultValue},`) +} + +function buildRules(conf, ruleList) { + if (conf.vModel === undefined) return + const rules = [] + if (trigger[conf.tag]) { + if (conf.required) { + const type = Array.isArray(conf.defaultValue) ? 'type: \'array\',' : '' + let message = Array.isArray(conf.defaultValue) ? `请至少选择一个${conf.vModel}` : conf.placeholder + if (message === undefined) message = `${conf.label}不能为空` + rules.push(`{ required: true, ${type} message: '${message}', trigger: '${trigger[conf.tag]}' }`) + } + if (conf.regList && Array.isArray(conf.regList)) { + conf.regList.forEach(item => { + if (item.pattern) { + rules.push(`{ pattern: ${eval(item.pattern)}, message: '${item.message}', trigger: '${trigger[conf.tag]}' }`) + } + }) + } + ruleList.push(`${conf.vModel}: [${rules.join(',')}],`) + } +} + +function buildOptions(conf, optionsList) { + if (conf.vModel === undefined) return + if (conf.dataType === 'dynamic') { conf.options = [] } + const str = `${conf.vModel}Options: ${JSON.stringify(conf.options)},` + optionsList.push(str) +} + +function buildProps(conf, propsList) { + if (conf.dataType === 'dynamic') { + conf.valueKey !== 'value' && (conf.props.props.value = conf.valueKey) + conf.labelKey !== 'label' && (conf.props.props.label = conf.labelKey) + conf.childrenKey !== 'children' && (conf.props.props.children = conf.childrenKey) + } + const str = `${conf.vModel}Props: ${JSON.stringify(conf.props.props)},` + propsList.push(str) +} + +function buildBeforeUpload(conf) { + const unitNum = units[conf.sizeUnit]; let rightSizeCode = ''; let acceptCode = ''; const + returnList = [] + if (conf.fileSize) { + rightSizeCode = `let isRightSize = file.size / ${unitNum} < ${conf.fileSize} + if(!isRightSize){ + this.$message.error('文件大小超过 ${conf.fileSize}${conf.sizeUnit}') + }` + returnList.push('isRightSize') + } + if (conf.accept) { + acceptCode = `let isAccept = new RegExp('${conf.accept}').test(file.type) + if(!isAccept){ + this.$message.error('应该选择${conf.accept}类型的文件') + }` + returnList.push('isAccept') + } + const str = `${conf.vModel}BeforeUpload(file) { + ${rightSizeCode} + ${acceptCode} + return ${returnList.join('&&')} + },` + return returnList.length ? str : '' +} + +function buildSubmitUpload(conf) { + const str = `submitUpload() { + this.$refs['${conf.vModel}'].submit() + },` + return str +} + +function buildOptionMethod(methodName, model, methodList) { + const str = `${methodName}() { + // TODO 发起请求获取数据 + this.${model} + },` + methodList.push(str) +} + +function buildexport(conf, type, data, rules, selectOptions, uploadVar, props, methods) { + const str = `${exportDefault}{ + ${inheritAttrs[type]} + components: {}, + props: [], + data () { + return { + ${conf.formModel}: { + ${data} + }, + ${conf.formRules}: { + ${rules} + }, + ${uploadVar} + ${selectOptions} + ${props} + } + }, + computed: {}, + watch: {}, + created () {}, + mounted () {}, + methods: { + ${methods} + } +}` + return str +} diff --git a/bs-ui/src/utils/generator/render.js b/bs-ui/src/utils/generator/render.js new file mode 100644 index 0000000..e8640f0 --- /dev/null +++ b/bs-ui/src/utils/generator/render.js @@ -0,0 +1,126 @@ +import { makeMap } from '@/utils/index' + +// 参考https://github.com/vuejs/vue/blob/v2.6.10/src/platforms/web/server/util.js +const isAttr = makeMap( + 'accept,accept-charset,accesskey,action,align,alt,async,autocomplete,' + + 'autofocus,autoplay,autosave,bgcolor,border,buffered,challenge,charset,' + + 'checked,cite,class,code,codebase,color,cols,colspan,content,http-equiv,' + + 'name,contenteditable,contextmenu,controls,coords,data,datetime,default,' + + 'defer,dir,dirname,disabled,download,draggable,dropzone,enctype,method,for,' + + 'form,formaction,headers,height,hidden,high,href,hreflang,http-equiv,' + + 'icon,id,ismap,itemprop,keytype,kind,label,lang,language,list,loop,low,' + + 'manifest,max,maxlength,media,method,GET,POST,min,multiple,email,file,' + + 'muted,name,novalidate,open,optimum,pattern,ping,placeholder,poster,' + + 'preload,radiogroup,readonly,rel,required,reversed,rows,rowspan,sandbox,' + + 'scope,scoped,seamless,selected,shape,size,type,text,password,sizes,span,' + + 'spellcheck,src,srcdoc,srclang,srcset,start,step,style,summary,tabindex,' + + 'target,title,type,usemap,value,width,wrap' +) + +function vModel(self, dataObject, defaultValue) { + dataObject.props.value = defaultValue + + dataObject.on.input = val => { + self.$emit('input', val) + } +} + +const componentChild = { + 'el-button': { + default(h, conf, key) { + return conf[key] + }, + }, + 'el-input': { + prepend(h, conf, key) { + return + }, + append(h, conf, key) { + return + } + }, + 'el-select': { + options(h, conf, key) { + const list = [] + conf.options.forEach(item => { + list.push() + }) + return list + } + }, + 'el-radio-group': { + options(h, conf, key) { + const list = [] + conf.options.forEach(item => { + if (conf.optionType === 'button') list.push({item.label}) + else list.push({item.label}) + }) + return list + } + }, + 'el-checkbox-group': { + options(h, conf, key) { + const list = [] + conf.options.forEach(item => { + if (conf.optionType === 'button') { + list.push({item.label}) + } else { + list.push({item.label}) + } + }) + return list + } + }, + 'el-upload': { + 'list-type': (h, conf, key) => { + const list = [] + if (conf['list-type'] === 'picture-card') { + list.push() + } else { + list.push({conf.buttonText}) + } + if (conf.showTip) { + list.push(
只能上传不超过 {conf.fileSize}{conf.sizeUnit} 的{conf.accept}文件
) + } + return list + } + } +} + +export default { + render(h) { + const dataObject = { + attrs: {}, + props: {}, + on: {}, + style: {} + } + const confClone = JSON.parse(JSON.stringify(this.conf)) + const children = [] + + const childObjs = componentChild[confClone.tag] + if (childObjs) { + Object.keys(childObjs).forEach(key => { + const childFunc = childObjs[key] + if (confClone[key]) { + children.push(childFunc(h, confClone, key)) + } + }) + } + + Object.keys(confClone).forEach(key => { + const val = confClone[key] + if (key === 'vModel') { + vModel(this, dataObject, confClone.defaultValue) + } else if (dataObject[key]) { + dataObject[key] = val + } else if (!isAttr(key)) { + dataObject.props[key] = val + } else { + dataObject.attrs[key] = val + } + }) + return h(this.conf.tag, dataObject, children) + }, + props: ['conf'] +} diff --git a/bs-ui/src/utils/index.js b/bs-ui/src/utils/index.js new file mode 100644 index 0000000..97be225 --- /dev/null +++ b/bs-ui/src/utils/index.js @@ -0,0 +1,444 @@ +import { parseTime } from './bs' + +/** + * 表格时间格式化 + */ +export function formatDate(cellValue) { + if (cellValue == null || cellValue == "") return ""; + var date = new Date(cellValue) + var year = date.getFullYear() + var month = date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1 + var day = date.getDate() < 10 ? '0' + date.getDate() : date.getDate() + var hours = date.getHours() < 10 ? '0' + date.getHours() : date.getHours() + var minutes = date.getMinutes() < 10 ? '0' + date.getMinutes() : date.getMinutes() + var seconds = date.getSeconds() < 10 ? '0' + date.getSeconds() : date.getSeconds() + return year + '-' + month + '-' + day + ' ' + hours + ':' + minutes + ':' + seconds +} + +/** + * 表格时间格式化 + */ +export function formatDateToDataStr(data) { + const curData = data || new Date(); + const year = curData.getFullYear() + const month = curData.getMonth() + 1 < 10 ? '0' + (curData.getMonth() + 1) : curData.getMonth() + 1 + const day = curData.getDate() < 10 ? '0' + curData.getDate() : curData.getDate() + + return year + '-' + month + '-' + day; +} + +/** + * @param {number} time + * @param {string} option + * @returns {string} + */ +export function formatTime(time, option) { + if (('' + time).length === 10) { + time = parseInt(time) * 1000 + } else { + time = +time + } + const d = new Date(time) + const now = Date.now() + + const diff = (now - d) / 1000 + + if (diff < 30) { + return '刚刚' + } else if (diff < 3600) { + // less 1 hour + return Math.ceil(diff / 60) + '分钟前' + } else if (diff < 3600 * 24) { + return Math.ceil(diff / 3600) + '小时前' + } else if (diff < 3600 * 24 * 2) { + return '1天前' + } + if (option) { + return parseTime(time, option) + } else { + return ( + d.getMonth() + + 1 + + '月' + + d.getDate() + + '日' + + d.getHours() + + '时' + + d.getMinutes() + + '分' + ) + } +} + +/** + * @param {string} url + * @returns {Object} + */ +export function getQueryObject(url) { + url = url == null ? window.location.href : url + const search = url.substring(url.lastIndexOf('?') + 1) + const obj = {} + const reg = /([^?&=]+)=([^?&=]*)/g + search.replace(reg, (rs, $1, $2) => { + const name = decodeURIComponent($1) + let val = decodeURIComponent($2) + val = String(val) + obj[name] = val + return rs + }) + return obj +} + +/** + * @param {string} input value + * @returns {number} output value + */ +export function byteLength(str) { + // returns the byte length of an utf8 string + let s = str.length + for (var i = str.length - 1; i >= 0; i--) { + const code = str.charCodeAt(i) + if (code > 0x7f && code <= 0x7ff) s++ + else if (code > 0x7ff && code <= 0xffff) s += 2 + if (code >= 0xDC00 && code <= 0xDFFF) i-- + } + return s +} + +/** + * @param {Array} actual + * @returns {Array} + */ +export function cleanArray(actual) { + const newArray = [] + for (let i = 0; i < actual.length; i++) { + if (actual[i]) { + newArray.push(actual[i]) + } + } + return newArray +} + +/** + * @param {Object} json + * @returns {Array} + */ +export function param(json) { + if (!json) return '' + return cleanArray( + Object.keys(json).map(key => { + if (json[key] === undefined) return '' + return encodeURIComponent(key) + '=' + encodeURIComponent(json[key]) + }) + ).join('&') +} + +/** + * @param {string} url + * @returns {Object} + */ +export function param2Obj(url) { + const search = decodeURIComponent(url.split('?')[1]).replace(/\+/g, ' ') + if (!search) { + return {} + } + const obj = {} + const searchArr = search.split('&') + searchArr.forEach(v => { + const index = v.indexOf('=') + if (index !== -1) { + const name = v.substring(0, index) + const val = v.substring(index + 1, v.length) + obj[name] = val + } + }) + return obj +} + +/** + * @param {string} val + * @returns {string} + */ +export function html2Text(val) { + const div = document.createElement('div') + div.innerHTML = val + return div.textContent || div.innerText +} + +/** + * Merges two objects, giving the last one precedence + * @param {Object} target + * @param {(Object|Array)} source + * @returns {Object} + */ +export function objectMerge(target, source) { + if (typeof target !== 'object') { + target = {} + } + if (Array.isArray(source)) { + return source.slice() + } + Object.keys(source).forEach(property => { + const sourceProperty = source[property] + if (typeof sourceProperty === 'object') { + target[property] = objectMerge(target[property], sourceProperty) + } else { + target[property] = sourceProperty + } + }) + return target +} + +/** + * @param {HTMLElement} element + * @param {string} className + */ +export function toggleClass(element, className) { + if (!element || !className) { + return + } + let classString = element.className + const nameIndex = classString.indexOf(className) + if (nameIndex === -1) { + classString += '' + className + } else { + classString = + classString.substr(0, nameIndex) + + classString.substr(nameIndex + className.length) + } + element.className = classString +} + +/** + * @param {string} type + * @returns {Date} + */ +export function getTime(type) { + if (type === 'start') { + return new Date().getTime() - 3600 * 1000 * 24 * 90 + } else { + return new Date(new Date().toDateString()) + } +} + +/** + * @param {Function} func + * @param {number} wait + * @param {boolean} immediate + * @return {*} + */ +export function debounce(func, wait, immediate) { + let timeout, args, context, timestamp, result + + const later = function () { + // 据上一次触发时间间隔 + const last = +new Date() - timestamp + + // 上次被包装函数被调用时间间隔 last 小于设定时间间隔 wait + if (last < wait && last > 0) { + timeout = setTimeout(later, wait - last) + } else { + timeout = null + // 如果设定为immediate===true,因为开始边界已经调用过了此处无需调用 + if (!immediate) { + result = func.apply(context, args) + if (!timeout) context = args = null + } + } + } + + return function (...args) { + context = this + timestamp = +new Date() + const callNow = immediate && !timeout + // 如果延时不存在,重新设定延时 + if (!timeout) timeout = setTimeout(later, wait) + if (callNow) { + result = func.apply(context, args) + context = args = null + } + + return result + } +} + +/** + * This is just a simple version of deep copy + * Has a lot of edge cases bug + * If you want to use a perfect deep copy, use lodash's _.cloneDeep + * @param {Object} source + * @returns {Object} + */ +export function deepClone(source) { + if (!source && typeof source !== 'object') { + throw new Error('error arguments', 'deepClone') + } + const targetObj = source.constructor === Array ? [] : {} + Object.keys(source).forEach(keys => { + if (source[keys] && typeof source[keys] === 'object') { + targetObj[keys] = deepClone(source[keys]) + } else { + targetObj[keys] = source[keys] + } + }) + return targetObj +} + +/** + * @param {Array} arr + * @returns {Array} + */ +export function uniqueArr(arr) { + return Array.from(new Set(arr)) +} + +/** + * @returns {string} + */ +export function createUniqueString() { + const timestamp = +new Date() + '' + const randomNum = parseInt((1 + Math.random()) * 65536) + '' + return (+(randomNum + timestamp)).toString(32) +} + +/** + * Check if an element has a class + * @param {HTMLElement} elm + * @param {string} cls + * @returns {boolean} + */ +export function hasClass(ele, cls) { + return !!ele.className.match(new RegExp('(\\s|^)' + cls + '(\\s|$)')) +} + +/** + * Add class to element + * @param {HTMLElement} elm + * @param {string} cls + */ +export function addClass(ele, cls) { + if (!hasClass(ele, cls)) ele.className += ' ' + cls +} + +/** + * Remove class from element + * @param {HTMLElement} elm + * @param {string} cls + */ +export function removeClass(ele, cls) { + if (hasClass(ele, cls)) { + const reg = new RegExp('(\\s|^)' + cls + '(\\s|$)') + ele.className = ele.className.replace(reg, ' ') + } +} + +export function makeMap(str, expectsLowerCase) { + const map = Object.create(null) + const list = str.split(',') + for (let i = 0; i < list.length; i++) { + map[list[i]] = true + } + return expectsLowerCase + ? val => map[val.toLowerCase()] + : val => map[val] +} + +export const exportDefault = 'export default ' + +export const beautifierConf = { + html: { + indent_size: '2', + indent_char: ' ', + max_preserve_newlines: '-1', + preserve_newlines: false, + keep_array_indentation: false, + break_chained_methods: false, + indent_scripts: 'separate', + brace_style: 'end-expand', + space_before_conditional: true, + unescape_strings: false, + jslint_happy: false, + end_with_newline: true, + wrap_line_length: '110', + indent_inner_html: true, + comma_first: false, + e4x: true, + indent_empty_lines: true + }, + js: { + indent_size: '2', + indent_char: ' ', + max_preserve_newlines: '-1', + preserve_newlines: false, + keep_array_indentation: false, + break_chained_methods: false, + indent_scripts: 'normal', + brace_style: 'end-expand', + space_before_conditional: true, + unescape_strings: false, + jslint_happy: true, + end_with_newline: true, + wrap_line_length: '110', + indent_inner_html: true, + comma_first: false, + e4x: true, + indent_empty_lines: true + } +} + +// 首字母大小 +export function titleCase(str) { + return str.replace(/( |^)[a-z]/g, L => L.toUpperCase()) +} + +// 下划转驼峰 +export function camelCase(str) { + return str.replace(/_[a-z]/g, str1 => str1.substr(-1).toUpperCase()) +} + +export function isNumberStr(str) { + return /^[+-]?(0|([1-9]\d*))(\.\d+)?$/g.test(str) +} + +// 时间范围选择默认值 +export function datePickerOpts() { + return { + shortcuts: [{ + text: '最近一周', + onClick(picker) { + const end = new Date(); + const start = new Date(); + start.setTime(start.getTime() - 3600 * 1000 * 24 * 7); + picker.$emit('pick', [start, end]); + } + }, { + text: '最近一个月', + onClick(picker) { + const end = new Date(); + const start = new Date(); + start.setTime(start.getTime() - 3600 * 1000 * 24 * 30); + picker.$emit('pick', [start, end]); + } + }, { + text: '最近三个月', + onClick(picker) { + const end = new Date(); + const start = new Date(); + start.setTime(start.getTime() - 3600 * 1000 * 24 * 90); + picker.$emit('pick', [start, end]); + } + }] + } +} + +// 获取两个yyyy-MM-dd日期相差天数 d1 - d2 +export function getDaysBetweenDate(d1, d2 = '') { + if (!d1) return 999999; + const s1 = d1.replace(/-/g, "/"); + const nowDate = new Date(); + const s2 = d2.replace(/-/g, "/") || `${nowDate.getFullYear()}/${nowDate.getMonth() + 1}/${nowDate.getDate()}`; + const t1 = (new Date(s1)).getTime(); + const t2 = (new Date(s2)).getTime(); + const time = t1 - t2; + return parseInt(time / (1000 * 60 * 60 * 24)); +} \ No newline at end of file diff --git a/bs-ui/src/utils/jsencrypt.js b/bs-ui/src/utils/jsencrypt.js new file mode 100644 index 0000000..78d9523 --- /dev/null +++ b/bs-ui/src/utils/jsencrypt.js @@ -0,0 +1,30 @@ +import JSEncrypt from 'jsencrypt/bin/jsencrypt.min' + +// 密钥对生成 http://web.chacuo.net/netrsakeypair + +const publicKey = 'MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAKoR8mX0rGKLqzcWmOzbfj64K8ZIgOdH\n' + + 'nzkXSOVOZbFu/TJhZ7rFAN+eaGkl3C4buccQd/EjEsj9ir7ijT7h96MCAwEAAQ==' + +const privateKey = 'MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEAqhHyZfSsYourNxaY\n' + + '7Nt+PrgrxkiA50efORdI5U5lsW79MmFnusUA355oaSXcLhu5xxB38SMSyP2KvuKN\n' + + 'PuH3owIDAQABAkAfoiLyL+Z4lf4Myxk6xUDgLaWGximj20CUf+5BKKnlrK+Ed8gA\n' + + 'kM0HqoTt2UZwA5E2MzS4EI2gjfQhz5X28uqxAiEA3wNFxfrCZlSZHb0gn2zDpWow\n' + + 'cSxQAgiCstxGUoOqlW8CIQDDOerGKH5OmCJ4Z21v+F25WaHYPxCFMvwxpcw99Ecv\n' + + 'DQIgIdhDTIqD2jfYjPTY8Jj3EDGPbH2HHuffvflECt3Ek60CIQCFRlCkHpi7hthh\n' + + 'YhovyloRYsM+IS9h/0BzlEAuO0ktMQIgSPT3aFAgJYwKpqRYKlLDVcflZFCKY7u3\n' + + 'UP8iWi1Qw0Y=' + +// 加密 +export function encrypt(txt) { + const encryptor = new JSEncrypt() + encryptor.setPublicKey(publicKey) // 设置公钥 + return encryptor.encrypt(txt) // 对数据进行加密 +} + +// 解密 +export function decrypt(txt) { + const encryptor = new JSEncrypt() + encryptor.setPrivateKey(privateKey) // 设置私钥 + return encryptor.decrypt(txt) // 对数据进行解密 +} + diff --git a/bs-ui/src/utils/permission.js b/bs-ui/src/utils/permission.js new file mode 100644 index 0000000..1730e33 --- /dev/null +++ b/bs-ui/src/utils/permission.js @@ -0,0 +1,51 @@ +import store from '@/store' + +/** + * 字符权限校验 + * @param {Array} value 校验值 + * @returns {Boolean} + */ +export function checkPermi(value) { + if (value && value instanceof Array && value.length > 0) { + const permissions = store.getters && store.getters.permissions + const permissionDatas = value + const all_permission = "*:*:*"; + + const hasPermission = permissions.some(permission => { + return all_permission === permission || permissionDatas.includes(permission) + }) + + if (!hasPermission) { + return false + } + return true + } else { + console.error(`need roles! Like checkPermi="['system:user:add','system:user:edit']"`) + return false + } +} + +/** + * 角色权限校验 + * @param {Array} value 校验值 + * @returns {Boolean} + */ +export function checkRole(value) { + if (value && value instanceof Array && value.length > 0) { + const roles = store.getters && store.getters.roles + const permissionRoles = value + const super_admin = "admin"; + + const hasRole = roles.some(role => { + return super_admin === role || permissionRoles.includes(role) + }) + + if (!hasRole) { + return false + } + return true + } else { + console.error(`need roles! Like checkRole="['admin','editor']"`) + return false + } +} \ No newline at end of file diff --git a/bs-ui/src/utils/request.js b/bs-ui/src/utils/request.js new file mode 100644 index 0000000..6fba0ad --- /dev/null +++ b/bs-ui/src/utils/request.js @@ -0,0 +1,146 @@ +import axios from 'axios' +import { Notification, MessageBox, Message, Loading } from 'element-ui' +import store from '@/store' +import { getToken } from '@/utils/auth' +import errorCode from '@/utils/errorCode' +import { tansParams, blobValidate } from "@/utils/bs"; +import cache from '@/plugins/cache' +import { saveAs } from 'file-saver' + +let downloadLoadingInstance; +// 是否显示重新登录 +export let isRelogin = { show: false }; + +axios.defaults.headers['Content-Type'] = 'application/json;charset=utf-8' +// 创建axios实例 +const service = axios.create({ + // axios中请求配置有baseURL选项,表示请求URL公共部分 + baseURL: process.env.VUE_APP_BASE_API, + // 超时 + timeout: 10000 +}) + +// request拦截器 +service.interceptors.request.use(config => { + // 是否需要设置 token + const isToken = (config.headers || {}).isToken === false + // 是否需要防止数据重复提交 + const isRepeatSubmit = (config.headers || {}).repeatSubmit === false + if (getToken() && !isToken) { + config.headers['Authorization'] = 'Bearer ' + getToken() // 让每个请求携带自定义token 请根据实际情况自行修改 + } + // get请求映射params参数 + if (config.method === 'get' && config.params) { + let url = config.url + '?' + tansParams(config.params); + url = url.slice(0, -1); + config.params = {}; + config.url = url; + } + if (!isRepeatSubmit && (config.method === 'post' || config.method === 'put')) { + const requestObj = { + url: config.url, + data: typeof config.data === 'object' ? JSON.stringify(config.data) : config.data, + time: new Date().getTime() + } + const sessionObj = cache.session.getJSON('sessionObj') + if (sessionObj === undefined || sessionObj === null || sessionObj === '') { + cache.session.setJSON('sessionObj', requestObj) + } else { + const s_url = sessionObj.url; // 请求地址 + const s_data = sessionObj.data; // 请求数据 + const s_time = sessionObj.time; // 请求时间 + const interval = 1000; // 间隔时间(ms),小于此时间视为重复提交 + if (s_data === requestObj.data && requestObj.time - s_time < interval && s_url === requestObj.url) { + const message = '数据正在处理,请勿重复提交'; + console.warn(`[${s_url}]: ` + message) + return Promise.reject(new Error(message)) + } else { + cache.session.setJSON('sessionObj', requestObj) + } + } + } + return config +}, error => { + console.log(error) + Promise.reject(error) +}) + +// 响应拦截器 +service.interceptors.response.use(res => { + // 未设置状态码则默认成功状态 + const code = res.data.code || 200; + // 获取错误信息 + const msg = errorCode[code] || res.data.msg || errorCode['default'] + // 二进制数据则直接返回 + if (res.request.responseType === 'blob' || res.request.responseType === 'arraybuffer') { + return res.data + } + if (code === 401) { + if (!isRelogin.show) { + isRelogin.show = true; + MessageBox.confirm('登录状态已过期,您可以继续留在该页面,或者重新登录', '系统提示', { confirmButtonText: '重新登录', cancelButtonText: '取消', type: 'warning' }).then(() => { + isRelogin.show = false; + store.dispatch('LogOut').then(() => { + location.href = '/index'; + }) + }).catch(() => { + isRelogin.show = false; + }); + } + return Promise.reject('无效的会话,或者会话已过期,请重新登录。') + } else if (code === 500) { + Message({ message: msg, type: 'error' }) + return Promise.reject(new Error(msg)) + } else if (code === 601) { + Message({ message: msg, type: 'warning' }) + return Promise.reject('error') + } else if (code !== 200) { + Notification.error({ title: msg }) + return Promise.reject('error') + } else { + return res.data + } + }, + error => { + console.log('err' + error) + let { message } = error; + if (message == "Network Error") { + message = "后端接口连接异常"; + } else if (message.includes("timeout")) { + message = "系统接口请求超时"; + } else if (message.includes("Request failed with status code")) { + message = "系统接口" + message.substr(message.length - 3) + "异常"; + } + Message({ message: message, type: 'error', duration: 5 * 1000 }) + return Promise.reject(error) + } +) + +// 通用下载方法 +export function download(url, params, filename, config) { + downloadLoadingInstance = Loading.service({ text: "正在下载数据,请稍候", spinner: "el-icon-loading", background: "rgba(0, 0, 0, 0.7)", }) + return service.post(url, params, { + transformRequest: [(params) => { return tansParams(params) }], + headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, + responseType: 'blob', + ...config + }).then(async (data) => { + const isBlob = blobValidate(data); + if (isBlob) { + const blob = new Blob([data]) + saveAs(blob, filename) + } else { + const resText = await data.text(); + const rspObj = JSON.parse(resText); + const errMsg = errorCode[rspObj.code] || rspObj.msg || errorCode['default'] + Message.error(errMsg); + } + downloadLoadingInstance.close(); + }).catch((r) => { + console.error(r) + Message.error('下载文件出现错误,请联系管理员!') + downloadLoadingInstance.close(); + }) +} + +export default service diff --git a/bs-ui/src/utils/scroll-to.js b/bs-ui/src/utils/scroll-to.js new file mode 100644 index 0000000..c5d8e04 --- /dev/null +++ b/bs-ui/src/utils/scroll-to.js @@ -0,0 +1,58 @@ +Math.easeInOutQuad = function(t, b, c, d) { + t /= d / 2 + if (t < 1) { + return c / 2 * t * t + b + } + t-- + return -c / 2 * (t * (t - 2) - 1) + b +} + +// requestAnimationFrame for Smart Animating http://goo.gl/sx5sts +var requestAnimFrame = (function() { + return window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || function(callback) { window.setTimeout(callback, 1000 / 60) } +})() + +/** + * Because it's so fucking difficult to detect the scrolling element, just move them all + * @param {number} amount + */ +function move(amount) { + document.documentElement.scrollTop = amount + document.body.parentNode.scrollTop = amount + document.body.scrollTop = amount +} + +function position() { + return document.documentElement.scrollTop || document.body.parentNode.scrollTop || document.body.scrollTop +} + +/** + * @param {number} to + * @param {number} duration + * @param {Function} callback + */ +export function scrollTo(to, duration, callback) { + const start = position() + const change = to - start + const increment = 20 + let currentTime = 0 + duration = (typeof (duration) === 'undefined') ? 500 : duration + var animateScroll = function() { + // increment the time + currentTime += increment + // find the value with the quadratic in-out easing function + var val = Math.easeInOutQuad(currentTime, start, change, duration) + // move the document.body + move(val) + // do the animation unless its over + if (currentTime < duration) { + requestAnimFrame(animateScroll) + } else { + if (callback && typeof (callback) === 'function') { + // the animation is done so lets callback + callback() + } + } + } + animateScroll() +} diff --git a/bs-ui/src/utils/validate.js b/bs-ui/src/utils/validate.js new file mode 100644 index 0000000..02c2308 --- /dev/null +++ b/bs-ui/src/utils/validate.js @@ -0,0 +1,96 @@ +/** + * @param {string} path + * @returns {Boolean} + */ +export function isExternal(path) { + return /^(https?:|mailto:|tel:)/.test(path) +} + +/** + * @param {string} str + * @returns {Boolean} + */ +export function validUsername(str) { + const valid_map = ['admin', 'editor'] + return valid_map.indexOf(str.trim()) >= 0 +} + +/** + * @param {string} url + * @returns {Boolean} + */ +export function validURL(url) { + const reg = /^(https?|ftp):\/\/([a-zA-Z0-9.-]+(:[a-zA-Z0-9.&%$-]+)*@)*((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}|([a-zA-Z0-9-]+\.)*[a-zA-Z0-9-]+\.(com|edu|gov|int|mil|net|org|biz|arpa|info|name|pro|aero|coop|museum|[a-zA-Z]{2}))(:[0-9]+)*(\/($|[a-zA-Z0-9.,?'\\+&%$#=~_-]+))*$/ + return reg.test(url) +} + +/** + * @param {string} str + * @returns {Boolean} + */ +export function validLowerCase(str) { + const reg = /^[a-z]+$/ + return reg.test(str) +} + +/** + * @param {string} str + * @returns {Boolean} + */ +export function validUpperCase(str) { + const reg = /^[A-Z]+$/ + return reg.test(str) +} + +/** + * @param {string} str + * @returns {Boolean} + */ +export function validAlphabets(str) { + const reg = /^[A-Za-z]+$/ + return reg.test(str) +} + +/** + * @param {string} email + * @returns {Boolean} + */ +export function validEmail(email) { + const reg = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/ + return reg.test(email) +} + +/** + * @param {string} str + * @returns {Boolean} + */ +export function isString(str) { + if (typeof str === 'string' || str instanceof String) { + return true + } + return false +} + +/** + * @param {Array} arg + * @returns {Boolean} + */ +export function isArray(arg) { + if (typeof Array.isArray === 'undefined') { + return Object.prototype.toString.call(arg) === '[object Array]' + } + return Array.isArray(arg) +} +/** + * @param value + * @returns {Boolean} + */ +export function hasValue(value) { + if (value) { + return true; + } + if (value === 0) { + return true; + } + return false +} diff --git a/bs-ui/src/views/bill/number/index.vue b/bs-ui/src/views/bill/number/index.vue new file mode 100644 index 0000000..86b36e6 --- /dev/null +++ b/bs-ui/src/views/bill/number/index.vue @@ -0,0 +1,290 @@ + + + diff --git a/bs-ui/src/views/components/CargoDesc/index.vue b/bs-ui/src/views/components/CargoDesc/index.vue new file mode 100644 index 0000000..11b332b --- /dev/null +++ b/bs-ui/src/views/components/CargoDesc/index.vue @@ -0,0 +1,80 @@ + + + + + \ No newline at end of file diff --git a/bs-ui/src/views/components/OutBillCargoDesc/index.vue b/bs-ui/src/views/components/OutBillCargoDesc/index.vue new file mode 100644 index 0000000..d77aa9c --- /dev/null +++ b/bs-ui/src/views/components/OutBillCargoDesc/index.vue @@ -0,0 +1,81 @@ + + + + + diff --git a/bs-ui/src/views/components/StockDesc/index.vue b/bs-ui/src/views/components/StockDesc/index.vue new file mode 100644 index 0000000..4cb248e --- /dev/null +++ b/bs-ui/src/views/components/StockDesc/index.vue @@ -0,0 +1,55 @@ + + + + + \ No newline at end of file diff --git a/bs-ui/src/views/components/icons/element-icons.js b/bs-ui/src/views/components/icons/element-icons.js new file mode 100644 index 0000000..9ea4d63 --- /dev/null +++ b/bs-ui/src/views/components/icons/element-icons.js @@ -0,0 +1,3 @@ +const elementIcons = ['platform-eleme', 'eleme', 'delete-solid', 'delete', 's-tools', 'setting', 'user-solid', 'user', 'phone', 'phone-outline', 'more', 'more-outline', 'star-on', 'star-off', 's-goods', 'goods', 'warning', 'warning-outline', 'question', 'info', 'remove', 'circle-plus', 'success', 'error', 'zoom-in', 'zoom-out', 'remove-outline', 'circle-plus-outline', 'circle-check', 'circle-close', 's-help', 'help', 'minus', 'plus', 'check', 'close', 'picture', 'picture-outline', 'picture-outline-round', 'upload', 'upload2', 'download', 'camera-solid', 'camera', 'video-camera-solid', 'video-camera', 'message-solid', 'bell', 's-cooperation', 's-order', 's-platform', 's-fold', 's-unfold', 's-operation', 's-promotion', 's-home', 's-release', 's-ticket', 's-management', 's-open', 's-shop', 's-marketing', 's-flag', 's-comment', 's-finance', 's-claim', 's-custom', 's-opportunity', 's-data', 's-check', 's-grid', 'menu', 'share', 'd-caret', 'caret-left', 'caret-right', 'caret-bottom', 'caret-top', 'bottom-left', 'bottom-right', 'back', 'right', 'bottom', 'top', 'top-left', 'top-right', 'arrow-left', 'arrow-right', 'arrow-down', 'arrow-up', 'd-arrow-left', 'd-arrow-right', 'video-pause', 'video-play', 'refresh', 'refresh-right', 'refresh-left', 'finished', 'sort', 'sort-up', 'sort-down', 'rank', 'loading', 'view', 'c-scale-to-original', 'date', 'edit', 'edit-outline', 'folder', 'folder-opened', 'folder-add', 'folder-remove', 'folder-delete', 'folder-checked', 'tickets', 'document-remove', 'document-delete', 'document-copy', 'document-checked', 'document', 'document-add', 'printer', 'paperclip', 'takeaway-box', 'search', 'monitor', 'attract', 'mobile', 'scissors', 'umbrella', 'headset', 'brush', 'mouse', 'coordinate', 'magic-stick', 'reading', 'data-line', 'data-board', 'pie-chart', 'data-analysis', 'collection-tag', 'film', 'suitcase', 'suitcase-1', 'receiving', 'collection', 'files', 'notebook-1', 'notebook-2', 'toilet-paper', 'office-building', 'school', 'table-lamp', 'house', 'no-smoking', 'smoking', 'shopping-cart-full', 'shopping-cart-1', 'shopping-cart-2', 'shopping-bag-1', 'shopping-bag-2', 'sold-out', 'sell', 'present', 'box', 'bank-card', 'money', 'coin', 'wallet', 'discount', 'price-tag', 'news', 'guide', 'male', 'female', 'thumb', 'cpu', 'link', 'connection', 'open', 'turn-off', 'set-up', 'chat-round', 'chat-line-round', 'chat-square', 'chat-dot-round', 'chat-dot-square', 'chat-line-square', 'message', 'postcard', 'position', 'turn-off-microphone', 'microphone', 'close-notification', 'bangzhu', 'time', 'odometer', 'crop', 'aim', 'switch-button', 'full-screen', 'copy-document', 'mic', 'stopwatch', 'medal-1', 'medal', 'trophy', 'trophy-1', 'first-aid-kit', 'discover', 'place', 'location', 'location-outline', 'location-information', 'add-location', 'delete-location', 'map-location', 'alarm-clock', 'timer', 'watch-1', 'watch', 'lock', 'unlock', 'key', 'service', 'mobile-phone', 'bicycle', 'truck', 'ship', 'basketball', 'football', 'soccer', 'baseball', 'wind-power', 'light-rain', 'lightning', 'heavy-rain', 'sunrise', 'sunrise-1', 'sunset', 'sunny', 'cloudy', 'partly-cloudy', 'cloudy-and-sunny', 'moon', 'moon-night', 'dish', 'dish-1', 'food', 'chicken', 'fork-spoon', 'knife-fork', 'burger', 'tableware', 'sugar', 'dessert', 'ice-cream', 'hot-water', 'water-cup', 'coffee-cup', 'cold-drink', 'goblet', 'goblet-full', 'goblet-square', 'goblet-square-full', 'refrigerator', 'grape', 'watermelon', 'cherry', 'apple', 'pear', 'orange', 'coffee', 'ice-tea', 'ice-drink', 'milk-tea', 'potato-strips', 'lollipop', 'ice-cream-square', 'ice-cream-round'] + +export default elementIcons diff --git a/bs-ui/src/views/components/icons/index.vue b/bs-ui/src/views/components/icons/index.vue new file mode 100644 index 0000000..d3c9a71 --- /dev/null +++ b/bs-ui/src/views/components/icons/index.vue @@ -0,0 +1,87 @@ + + + + + diff --git a/bs-ui/src/views/components/icons/svg-icons.js b/bs-ui/src/views/components/icons/svg-icons.js new file mode 100644 index 0000000..724cd8e --- /dev/null +++ b/bs-ui/src/views/components/icons/svg-icons.js @@ -0,0 +1,10 @@ +const req = require.context('../../../assets/icons/svg', false, /\.svg$/) +const requireAll = requireContext => requireContext.keys() + +const re = /\.\/(.*)\.svg/ + +const svgIcons = requireAll(req).map(i => { + return i.match(re)[1] +}) + +export default svgIcons diff --git a/bs-ui/src/views/dashboard/BarChart.vue b/bs-ui/src/views/dashboard/BarChart.vue new file mode 100644 index 0000000..cd33d2d --- /dev/null +++ b/bs-ui/src/views/dashboard/BarChart.vue @@ -0,0 +1,102 @@ + + + diff --git a/bs-ui/src/views/dashboard/LineChart.vue b/bs-ui/src/views/dashboard/LineChart.vue new file mode 100644 index 0000000..ddd1063 --- /dev/null +++ b/bs-ui/src/views/dashboard/LineChart.vue @@ -0,0 +1,135 @@ + + + diff --git a/bs-ui/src/views/dashboard/PanelGroup.vue b/bs-ui/src/views/dashboard/PanelGroup.vue new file mode 100644 index 0000000..1a1081f --- /dev/null +++ b/bs-ui/src/views/dashboard/PanelGroup.vue @@ -0,0 +1,181 @@ + + + + + diff --git a/bs-ui/src/views/dashboard/PieChart.vue b/bs-ui/src/views/dashboard/PieChart.vue new file mode 100644 index 0000000..c360057 --- /dev/null +++ b/bs-ui/src/views/dashboard/PieChart.vue @@ -0,0 +1,79 @@ + + + diff --git a/bs-ui/src/views/dashboard/RaddarChart.vue b/bs-ui/src/views/dashboard/RaddarChart.vue new file mode 100644 index 0000000..b1790ca --- /dev/null +++ b/bs-ui/src/views/dashboard/RaddarChart.vue @@ -0,0 +1,116 @@ + + + diff --git a/bs-ui/src/views/dashboard/mixins/resize.js b/bs-ui/src/views/dashboard/mixins/resize.js new file mode 100644 index 0000000..b1e76e9 --- /dev/null +++ b/bs-ui/src/views/dashboard/mixins/resize.js @@ -0,0 +1,56 @@ +import { debounce } from '@/utils' + +export default { + data() { + return { + $_sidebarElm: null, + $_resizeHandler: null + } + }, + mounted() { + this.initListener() + }, + activated() { + if (!this.$_resizeHandler) { + // avoid duplication init + this.initListener() + } + + // when keep-alive chart activated, auto resize + this.resize() + }, + beforeDestroy() { + this.destroyListener() + }, + deactivated() { + this.destroyListener() + }, + methods: { + // use $_ for mixins properties + // https://vuejs.org/v2/style-guide/index.html#Private-property-names-essential + $_sidebarResizeHandler(e) { + if (e.propertyName === 'width') { + this.$_resizeHandler() + } + }, + initListener() { + this.$_resizeHandler = debounce(() => { + this.resize() + }, 100) + window.addEventListener('resize', this.$_resizeHandler) + + this.$_sidebarElm = document.getElementsByClassName('sidebar-container')[0] + this.$_sidebarElm && this.$_sidebarElm.addEventListener('transitionend', this.$_sidebarResizeHandler) + }, + destroyListener() { + window.removeEventListener('resize', this.$_resizeHandler) + this.$_resizeHandler = null + + this.$_sidebarElm && this.$_sidebarElm.removeEventListener('transitionend', this.$_sidebarResizeHandler) + }, + resize() { + const { chart } = this + chart && chart.resize() + } + } +} diff --git a/bs-ui/src/views/error/401.vue b/bs-ui/src/views/error/401.vue new file mode 100644 index 0000000..448b6ec --- /dev/null +++ b/bs-ui/src/views/error/401.vue @@ -0,0 +1,88 @@ + + + + + diff --git a/bs-ui/src/views/error/404.vue b/bs-ui/src/views/error/404.vue new file mode 100644 index 0000000..96f075c --- /dev/null +++ b/bs-ui/src/views/error/404.vue @@ -0,0 +1,233 @@ + + + + + diff --git a/bs-ui/src/views/finance/amortize/index.vue b/bs-ui/src/views/finance/amortize/index.vue new file mode 100644 index 0000000..2cc4b0e --- /dev/null +++ b/bs-ui/src/views/finance/amortize/index.vue @@ -0,0 +1,300 @@ + + + + \ No newline at end of file diff --git a/bs-ui/src/views/finance/cash/index.vue b/bs-ui/src/views/finance/cash/index.vue new file mode 100644 index 0000000..5cc1a4a --- /dev/null +++ b/bs-ui/src/views/finance/cash/index.vue @@ -0,0 +1,260 @@ + + + diff --git a/bs-ui/src/views/finance/components/AmortizeEdit/index.vue b/bs-ui/src/views/finance/components/AmortizeEdit/index.vue new file mode 100644 index 0000000..0345d45 --- /dev/null +++ b/bs-ui/src/views/finance/components/AmortizeEdit/index.vue @@ -0,0 +1,200 @@ + + + + + \ No newline at end of file diff --git a/bs-ui/src/views/finance/components/CashEdit/index.vue b/bs-ui/src/views/finance/components/CashEdit/index.vue new file mode 100644 index 0000000..593faa7 --- /dev/null +++ b/bs-ui/src/views/finance/components/CashEdit/index.vue @@ -0,0 +1,185 @@ + + + + + \ No newline at end of file diff --git a/bs-ui/src/views/finance/writeoff/index.vue b/bs-ui/src/views/finance/writeoff/index.vue new file mode 100644 index 0000000..ee59964 --- /dev/null +++ b/bs-ui/src/views/finance/writeoff/index.vue @@ -0,0 +1,93 @@ + + + + diff --git a/bs-ui/src/views/finance/writeoff/modules/AmortizeList.vue b/bs-ui/src/views/finance/writeoff/modules/AmortizeList.vue new file mode 100644 index 0000000..3478d79 --- /dev/null +++ b/bs-ui/src/views/finance/writeoff/modules/AmortizeList.vue @@ -0,0 +1,230 @@ + + + diff --git a/bs-ui/src/views/finance/writeoff/modules/CashList.vue b/bs-ui/src/views/finance/writeoff/modules/CashList.vue new file mode 100644 index 0000000..792eead --- /dev/null +++ b/bs-ui/src/views/finance/writeoff/modules/CashList.vue @@ -0,0 +1,233 @@ + + + diff --git a/bs-ui/src/views/finance/writeoff_pay/index.vue b/bs-ui/src/views/finance/writeoff_pay/index.vue new file mode 100644 index 0000000..1de795a --- /dev/null +++ b/bs-ui/src/views/finance/writeoff_pay/index.vue @@ -0,0 +1,22 @@ + + + + diff --git a/bs-ui/src/views/index.vue b/bs-ui/src/views/index.vue new file mode 100644 index 0000000..974399c --- /dev/null +++ b/bs-ui/src/views/index.vue @@ -0,0 +1,36 @@ + + + + + + diff --git a/bs-ui/src/views/index_v1.vue b/bs-ui/src/views/index_v1.vue new file mode 100644 index 0000000..d2d2ec6 --- /dev/null +++ b/bs-ui/src/views/index_v1.vue @@ -0,0 +1,98 @@ + + + + + diff --git a/bs-ui/src/views/indexs/bulkCargo/index.vue b/bs-ui/src/views/indexs/bulkCargo/index.vue new file mode 100644 index 0000000..eae7efe --- /dev/null +++ b/bs-ui/src/views/indexs/bulkCargo/index.vue @@ -0,0 +1,13 @@ + + + + + \ No newline at end of file diff --git a/bs-ui/src/views/indexs/warehouse/index.vue b/bs-ui/src/views/indexs/warehouse/index.vue new file mode 100644 index 0000000..de225ac --- /dev/null +++ b/bs-ui/src/views/indexs/warehouse/index.vue @@ -0,0 +1,329 @@ + + + + + + diff --git a/bs-ui/src/views/jxc/berth/index.vue b/bs-ui/src/views/jxc/berth/index.vue new file mode 100644 index 0000000..06ef478 --- /dev/null +++ b/bs-ui/src/views/jxc/berth/index.vue @@ -0,0 +1,452 @@ + + + + diff --git a/bs-ui/src/views/jxc/bmcargo/components/BmcargoConfirm/index.vue b/bs-ui/src/views/jxc/bmcargo/components/BmcargoConfirm/index.vue new file mode 100644 index 0000000..85d1b49 --- /dev/null +++ b/bs-ui/src/views/jxc/bmcargo/components/BmcargoConfirm/index.vue @@ -0,0 +1,1210 @@ + + + + + diff --git a/bs-ui/src/views/jxc/bmcargo/components/BmcargoEdit/index.vue b/bs-ui/src/views/jxc/bmcargo/components/BmcargoEdit/index.vue new file mode 100644 index 0000000..ab850a2 --- /dev/null +++ b/bs-ui/src/views/jxc/bmcargo/components/BmcargoEdit/index.vue @@ -0,0 +1,686 @@ + + + + + diff --git a/bs-ui/src/views/jxc/bmcargo/components/BmcargoList/index.vue b/bs-ui/src/views/jxc/bmcargo/components/BmcargoList/index.vue new file mode 100644 index 0000000..d442775 --- /dev/null +++ b/bs-ui/src/views/jxc/bmcargo/components/BmcargoList/index.vue @@ -0,0 +1,203 @@ + + + + + diff --git a/bs-ui/src/views/jxc/bmcargo/components/VoyageNumber/index.vue b/bs-ui/src/views/jxc/bmcargo/components/VoyageNumber/index.vue new file mode 100644 index 0000000..fe61160 --- /dev/null +++ b/bs-ui/src/views/jxc/bmcargo/components/VoyageNumber/index.vue @@ -0,0 +1,130 @@ + + + + + diff --git a/bs-ui/src/views/jxc/bmcargo/index.vue b/bs-ui/src/views/jxc/bmcargo/index.vue new file mode 100644 index 0000000..90d49fc --- /dev/null +++ b/bs-ui/src/views/jxc/bmcargo/index.vue @@ -0,0 +1,502 @@ + + + + diff --git a/bs-ui/src/views/jxc/bmport/index.vue b/bs-ui/src/views/jxc/bmport/index.vue new file mode 100644 index 0000000..50d7cf1 --- /dev/null +++ b/bs-ui/src/views/jxc/bmport/index.vue @@ -0,0 +1,789 @@ + + + diff --git a/bs-ui/src/views/jxc/bmvoyage/index.vue b/bs-ui/src/views/jxc/bmvoyage/index.vue new file mode 100644 index 0000000..4ac85db --- /dev/null +++ b/bs-ui/src/views/jxc/bmvoyage/index.vue @@ -0,0 +1,806 @@ + + + diff --git a/bs-ui/src/views/jxc/cargo/index.vue b/bs-ui/src/views/jxc/cargo/index.vue new file mode 100644 index 0000000..b0b35ed --- /dev/null +++ b/bs-ui/src/views/jxc/cargo/index.vue @@ -0,0 +1,536 @@ + + + diff --git a/bs-ui/src/views/jxc/ckbill/index.vue b/bs-ui/src/views/jxc/ckbill/index.vue new file mode 100644 index 0000000..370eae2 --- /dev/null +++ b/bs-ui/src/views/jxc/ckbill/index.vue @@ -0,0 +1,657 @@ + + + diff --git a/bs-ui/src/views/jxc/ckcargo/index.vue b/bs-ui/src/views/jxc/ckcargo/index.vue new file mode 100644 index 0000000..98c699a --- /dev/null +++ b/bs-ui/src/views/jxc/ckcargo/index.vue @@ -0,0 +1,957 @@ + + + diff --git a/bs-ui/src/views/jxc/ckchange/index.vue b/bs-ui/src/views/jxc/ckchange/index.vue new file mode 100644 index 0000000..894e102 --- /dev/null +++ b/bs-ui/src/views/jxc/ckchange/index.vue @@ -0,0 +1,525 @@ + + + diff --git a/bs-ui/src/views/jxc/ckconfirm/index.vue b/bs-ui/src/views/jxc/ckconfirm/index.vue new file mode 100644 index 0000000..43b0d56 --- /dev/null +++ b/bs-ui/src/views/jxc/ckconfirm/index.vue @@ -0,0 +1,577 @@ + + + + diff --git a/bs-ui/src/views/jxc/ckconfirm/index_bak.vue b/bs-ui/src/views/jxc/ckconfirm/index_bak.vue new file mode 100644 index 0000000..0d3d7b0 --- /dev/null +++ b/bs-ui/src/views/jxc/ckconfirm/index_bak.vue @@ -0,0 +1,577 @@ + + + + diff --git a/bs-ui/src/views/jxc/ckinquiry/index.vue b/bs-ui/src/views/jxc/ckinquiry/index.vue new file mode 100644 index 0000000..31182fd --- /dev/null +++ b/bs-ui/src/views/jxc/ckinquiry/index.vue @@ -0,0 +1,699 @@ + + + diff --git a/bs-ui/src/views/jxc/ckmixed/index.vue b/bs-ui/src/views/jxc/ckmixed/index.vue new file mode 100644 index 0000000..c279c08 --- /dev/null +++ b/bs-ui/src/views/jxc/ckmixed/index.vue @@ -0,0 +1,1103 @@ + + + + diff --git a/bs-ui/src/views/jxc/ckoutbound/components/StockChoose/index.vue b/bs-ui/src/views/jxc/ckoutbound/components/StockChoose/index.vue new file mode 100644 index 0000000..8382d91 --- /dev/null +++ b/bs-ui/src/views/jxc/ckoutbound/components/StockChoose/index.vue @@ -0,0 +1,309 @@ + + + + + diff --git a/bs-ui/src/views/jxc/ckoutbound/components/StockOut/index.vue b/bs-ui/src/views/jxc/ckoutbound/components/StockOut/index.vue new file mode 100644 index 0000000..6589535 --- /dev/null +++ b/bs-ui/src/views/jxc/ckoutbound/components/StockOut/index.vue @@ -0,0 +1,702 @@ + + + + + diff --git a/bs-ui/src/views/jxc/ckoutbound/index.vue b/bs-ui/src/views/jxc/ckoutbound/index.vue new file mode 100644 index 0000000..6808745 --- /dev/null +++ b/bs-ui/src/views/jxc/ckoutbound/index.vue @@ -0,0 +1,602 @@ + + + + diff --git a/bs-ui/src/views/jxc/ckoutboundCar/components/StockChoose/index.vue b/bs-ui/src/views/jxc/ckoutboundCar/components/StockChoose/index.vue new file mode 100644 index 0000000..83fd82e --- /dev/null +++ b/bs-ui/src/views/jxc/ckoutboundCar/components/StockChoose/index.vue @@ -0,0 +1,310 @@ + + + + + diff --git a/bs-ui/src/views/jxc/ckoutboundCar/components/StockOut/index.vue b/bs-ui/src/views/jxc/ckoutboundCar/components/StockOut/index.vue new file mode 100644 index 0000000..9d1c8c0 --- /dev/null +++ b/bs-ui/src/views/jxc/ckoutboundCar/components/StockOut/index.vue @@ -0,0 +1,999 @@ + + + + + diff --git a/bs-ui/src/views/jxc/ckoutboundCar/index.vue b/bs-ui/src/views/jxc/ckoutboundCar/index.vue new file mode 100644 index 0000000..9e14555 --- /dev/null +++ b/bs-ui/src/views/jxc/ckoutboundCar/index.vue @@ -0,0 +1,603 @@ + + + + diff --git a/bs-ui/src/views/jxc/ckstock/index.vue b/bs-ui/src/views/jxc/ckstock/index.vue new file mode 100644 index 0000000..f68029d --- /dev/null +++ b/bs-ui/src/views/jxc/ckstock/index.vue @@ -0,0 +1,600 @@ + + + diff --git a/bs-ui/src/views/jxc/cktransfer/components/Transfer/index.vue b/bs-ui/src/views/jxc/cktransfer/components/Transfer/index.vue new file mode 100644 index 0000000..de14436 --- /dev/null +++ b/bs-ui/src/views/jxc/cktransfer/components/Transfer/index.vue @@ -0,0 +1,682 @@ + + + + + diff --git a/bs-ui/src/views/jxc/cktransfer/index.vue b/bs-ui/src/views/jxc/cktransfer/index.vue new file mode 100644 index 0000000..2409949 --- /dev/null +++ b/bs-ui/src/views/jxc/cktransfer/index.vue @@ -0,0 +1,469 @@ + + + + diff --git a/bs-ui/src/views/jxc/cktransfer/index_new.vue b/bs-ui/src/views/jxc/cktransfer/index_new.vue new file mode 100644 index 0000000..0f8aef0 --- /dev/null +++ b/bs-ui/src/views/jxc/cktransfer/index_new.vue @@ -0,0 +1,1121 @@ + + + + \ No newline at end of file diff --git a/bs-ui/src/views/jxc/ckwarehouse/components/BillEdit/index.vue b/bs-ui/src/views/jxc/ckwarehouse/components/BillEdit/index.vue new file mode 100644 index 0000000..77920d2 --- /dev/null +++ b/bs-ui/src/views/jxc/ckwarehouse/components/BillEdit/index.vue @@ -0,0 +1,723 @@ + + + + + diff --git a/bs-ui/src/views/jxc/ckwarehouse/components/BillList/index.vue b/bs-ui/src/views/jxc/ckwarehouse/components/BillList/index.vue new file mode 100644 index 0000000..c6931f7 --- /dev/null +++ b/bs-ui/src/views/jxc/ckwarehouse/components/BillList/index.vue @@ -0,0 +1,143 @@ + + + + + diff --git a/bs-ui/src/views/jxc/ckwarehouse/index.vue b/bs-ui/src/views/jxc/ckwarehouse/index.vue new file mode 100644 index 0000000..85b0f94 --- /dev/null +++ b/bs-ui/src/views/jxc/ckwarehouse/index.vue @@ -0,0 +1,547 @@ + + + + diff --git a/bs-ui/src/views/jxc/cust/index.vue b/bs-ui/src/views/jxc/cust/index.vue new file mode 100644 index 0000000..fa887ca --- /dev/null +++ b/bs-ui/src/views/jxc/cust/index.vue @@ -0,0 +1,415 @@ + + + diff --git a/bs-ui/src/views/jxc/custItem/index.vue b/bs-ui/src/views/jxc/custItem/index.vue new file mode 100644 index 0000000..9adf278 --- /dev/null +++ b/bs-ui/src/views/jxc/custItem/index.vue @@ -0,0 +1,325 @@ + + + diff --git a/bs-ui/src/views/jxc/dyn/index.vue b/bs-ui/src/views/jxc/dyn/index.vue new file mode 100644 index 0000000..a48f627 --- /dev/null +++ b/bs-ui/src/views/jxc/dyn/index.vue @@ -0,0 +1,306 @@ + + + diff --git a/bs-ui/src/views/jxc/instock/index.vue b/bs-ui/src/views/jxc/instock/index.vue new file mode 100644 index 0000000..18afcde --- /dev/null +++ b/bs-ui/src/views/jxc/instock/index.vue @@ -0,0 +1,613 @@ + + + diff --git a/bs-ui/src/views/jxc/outstock/index.vue b/bs-ui/src/views/jxc/outstock/index.vue new file mode 100644 index 0000000..7fc2b61 --- /dev/null +++ b/bs-ui/src/views/jxc/outstock/index.vue @@ -0,0 +1,627 @@ + + + diff --git a/bs-ui/src/views/jxc/port/index.vue b/bs-ui/src/views/jxc/port/index.vue new file mode 100644 index 0000000..27bb56e --- /dev/null +++ b/bs-ui/src/views/jxc/port/index.vue @@ -0,0 +1,431 @@ + + + diff --git a/bs-ui/src/views/jxc/stock/index.vue b/bs-ui/src/views/jxc/stock/index.vue new file mode 100644 index 0000000..cecb1d4 --- /dev/null +++ b/bs-ui/src/views/jxc/stock/index.vue @@ -0,0 +1,392 @@ + + diff --git a/bs-ui/src/views/jxc/total/index.vue b/bs-ui/src/views/jxc/total/index.vue new file mode 100644 index 0000000..6c2014d --- /dev/null +++ b/bs-ui/src/views/jxc/total/index.vue @@ -0,0 +1,483 @@ + + + diff --git a/bs-ui/src/views/jxc/transfer/index.vue b/bs-ui/src/views/jxc/transfer/index.vue new file mode 100644 index 0000000..c340d18 --- /dev/null +++ b/bs-ui/src/views/jxc/transfer/index.vue @@ -0,0 +1,688 @@ + + + diff --git a/bs-ui/src/views/jxc/vessel/index.vue b/bs-ui/src/views/jxc/vessel/index.vue new file mode 100644 index 0000000..3210b49 --- /dev/null +++ b/bs-ui/src/views/jxc/vessel/index.vue @@ -0,0 +1,456 @@ + + diff --git a/bs-ui/src/views/jxc/warehouse/index.vue b/bs-ui/src/views/jxc/warehouse/index.vue new file mode 100644 index 0000000..b591110 --- /dev/null +++ b/bs-ui/src/views/jxc/warehouse/index.vue @@ -0,0 +1,396 @@ + + diff --git a/bs-ui/src/views/login.vue b/bs-ui/src/views/login.vue new file mode 100644 index 0000000..453b625 --- /dev/null +++ b/bs-ui/src/views/login.vue @@ -0,0 +1,250 @@ + + + + + diff --git a/bs-ui/src/views/monitor/cache/index.vue b/bs-ui/src/views/monitor/cache/index.vue new file mode 100644 index 0000000..e81da2e --- /dev/null +++ b/bs-ui/src/views/monitor/cache/index.vue @@ -0,0 +1,144 @@ + + + diff --git a/bs-ui/src/views/monitor/cache/list.vue b/bs-ui/src/views/monitor/cache/list.vue new file mode 100644 index 0000000..29a7c74 --- /dev/null +++ b/bs-ui/src/views/monitor/cache/list.vue @@ -0,0 +1,241 @@ + + + diff --git a/bs-ui/src/views/monitor/druid/index.vue b/bs-ui/src/views/monitor/druid/index.vue new file mode 100644 index 0000000..c6ad585 --- /dev/null +++ b/bs-ui/src/views/monitor/druid/index.vue @@ -0,0 +1,15 @@ + + diff --git a/bs-ui/src/views/monitor/job/index.vue b/bs-ui/src/views/monitor/job/index.vue new file mode 100644 index 0000000..841491d --- /dev/null +++ b/bs-ui/src/views/monitor/job/index.vue @@ -0,0 +1,513 @@ + + + diff --git a/bs-ui/src/views/monitor/job/log.vue b/bs-ui/src/views/monitor/job/log.vue new file mode 100644 index 0000000..60bee1d --- /dev/null +++ b/bs-ui/src/views/monitor/job/log.vue @@ -0,0 +1,295 @@ + + + diff --git a/bs-ui/src/views/monitor/logininfor/index.vue b/bs-ui/src/views/monitor/logininfor/index.vue new file mode 100644 index 0000000..d6af834 --- /dev/null +++ b/bs-ui/src/views/monitor/logininfor/index.vue @@ -0,0 +1,246 @@ + + + + diff --git a/bs-ui/src/views/monitor/online/index.vue b/bs-ui/src/views/monitor/online/index.vue new file mode 100644 index 0000000..ad613c9 --- /dev/null +++ b/bs-ui/src/views/monitor/online/index.vue @@ -0,0 +1,122 @@ + + + + diff --git a/bs-ui/src/views/monitor/operlog/index.vue b/bs-ui/src/views/monitor/operlog/index.vue new file mode 100644 index 0000000..34a3ce3 --- /dev/null +++ b/bs-ui/src/views/monitor/operlog/index.vue @@ -0,0 +1,313 @@ + + + + diff --git a/bs-ui/src/views/monitor/server/index.vue b/bs-ui/src/views/monitor/server/index.vue new file mode 100644 index 0000000..15ffc9a --- /dev/null +++ b/bs-ui/src/views/monitor/server/index.vue @@ -0,0 +1,207 @@ + + + diff --git a/bs-ui/src/views/redirect.vue b/bs-ui/src/views/redirect.vue new file mode 100644 index 0000000..db4c1d6 --- /dev/null +++ b/bs-ui/src/views/redirect.vue @@ -0,0 +1,12 @@ + diff --git a/bs-ui/src/views/register.vue b/bs-ui/src/views/register.vue new file mode 100644 index 0000000..467d858 --- /dev/null +++ b/bs-ui/src/views/register.vue @@ -0,0 +1,209 @@ + + + + + diff --git a/bs-ui/src/views/system/config/index.vue b/bs-ui/src/views/system/config/index.vue new file mode 100644 index 0000000..48b26af --- /dev/null +++ b/bs-ui/src/views/system/config/index.vue @@ -0,0 +1,346 @@ + + + diff --git a/bs-ui/src/views/system/dept/index.vue b/bs-ui/src/views/system/dept/index.vue new file mode 100644 index 0000000..e502b4e --- /dev/null +++ b/bs-ui/src/views/system/dept/index.vue @@ -0,0 +1,340 @@ + + + diff --git a/bs-ui/src/views/system/dict/data.vue b/bs-ui/src/views/system/dict/data.vue new file mode 100644 index 0000000..324bb64 --- /dev/null +++ b/bs-ui/src/views/system/dict/data.vue @@ -0,0 +1,402 @@ + + + \ No newline at end of file diff --git a/bs-ui/src/views/system/dict/index.vue b/bs-ui/src/views/system/dict/index.vue new file mode 100644 index 0000000..6ca5457 --- /dev/null +++ b/bs-ui/src/views/system/dict/index.vue @@ -0,0 +1,347 @@ + + + \ No newline at end of file diff --git a/bs-ui/src/views/system/menu/index.vue b/bs-ui/src/views/system/menu/index.vue new file mode 100644 index 0000000..2a83f9e --- /dev/null +++ b/bs-ui/src/views/system/menu/index.vue @@ -0,0 +1,452 @@ + + + diff --git a/bs-ui/src/views/system/notice/index.vue b/bs-ui/src/views/system/notice/index.vue new file mode 100644 index 0000000..30df3f0 --- /dev/null +++ b/bs-ui/src/views/system/notice/index.vue @@ -0,0 +1,355 @@ + + + diff --git a/bs-ui/src/views/system/post/index.vue b/bs-ui/src/views/system/post/index.vue new file mode 100644 index 0000000..444bf63 --- /dev/null +++ b/bs-ui/src/views/system/post/index.vue @@ -0,0 +1,309 @@ + + + diff --git a/bs-ui/src/views/system/role/authUser.vue b/bs-ui/src/views/system/role/authUser.vue new file mode 100644 index 0000000..147aa33 --- /dev/null +++ b/bs-ui/src/views/system/role/authUser.vue @@ -0,0 +1,199 @@ + + + \ No newline at end of file diff --git a/bs-ui/src/views/system/role/index.vue b/bs-ui/src/views/system/role/index.vue new file mode 100644 index 0000000..fb3b5ef --- /dev/null +++ b/bs-ui/src/views/system/role/index.vue @@ -0,0 +1,605 @@ + + + \ No newline at end of file diff --git a/bs-ui/src/views/system/role/selectUser.vue b/bs-ui/src/views/system/role/selectUser.vue new file mode 100644 index 0000000..b2b072f --- /dev/null +++ b/bs-ui/src/views/system/role/selectUser.vue @@ -0,0 +1,138 @@ + + + diff --git a/bs-ui/src/views/system/tenant/config/index.vue b/bs-ui/src/views/system/tenant/config/index.vue new file mode 100644 index 0000000..6880540 --- /dev/null +++ b/bs-ui/src/views/system/tenant/config/index.vue @@ -0,0 +1,488 @@ + + + diff --git a/bs-ui/src/views/system/tenant/edit.vue b/bs-ui/src/views/system/tenant/edit.vue new file mode 100644 index 0000000..44f21ef --- /dev/null +++ b/bs-ui/src/views/system/tenant/edit.vue @@ -0,0 +1,140 @@ + + + + diff --git a/bs-ui/src/views/system/tenant/index.vue b/bs-ui/src/views/system/tenant/index.vue new file mode 100644 index 0000000..e5ef609 --- /dev/null +++ b/bs-ui/src/views/system/tenant/index.vue @@ -0,0 +1,407 @@ + + + diff --git a/bs-ui/src/views/system/user/authRole.vue b/bs-ui/src/views/system/user/authRole.vue new file mode 100644 index 0000000..ab5e72f --- /dev/null +++ b/bs-ui/src/views/system/user/authRole.vue @@ -0,0 +1,117 @@ + + + \ No newline at end of file diff --git a/bs-ui/src/views/system/user/index.vue b/bs-ui/src/views/system/user/index.vue new file mode 100644 index 0000000..d0783a7 --- /dev/null +++ b/bs-ui/src/views/system/user/index.vue @@ -0,0 +1,670 @@ + + + diff --git a/bs-ui/src/views/system/user/profile/index.vue b/bs-ui/src/views/system/user/profile/index.vue new file mode 100644 index 0000000..ad530f9 --- /dev/null +++ b/bs-ui/src/views/system/user/profile/index.vue @@ -0,0 +1,91 @@ + + + diff --git a/bs-ui/src/views/system/user/profile/resetPwd.vue b/bs-ui/src/views/system/user/profile/resetPwd.vue new file mode 100644 index 0000000..64e8f8c --- /dev/null +++ b/bs-ui/src/views/system/user/profile/resetPwd.vue @@ -0,0 +1,68 @@ + + + diff --git a/bs-ui/src/views/system/user/profile/userAvatar.vue b/bs-ui/src/views/system/user/profile/userAvatar.vue new file mode 100644 index 0000000..72af029 --- /dev/null +++ b/bs-ui/src/views/system/user/profile/userAvatar.vue @@ -0,0 +1,188 @@ + + + + diff --git a/bs-ui/src/views/system/user/profile/userInfo.vue b/bs-ui/src/views/system/user/profile/userInfo.vue new file mode 100644 index 0000000..c09a20b --- /dev/null +++ b/bs-ui/src/views/system/user/profile/userInfo.vue @@ -0,0 +1,75 @@ + + + diff --git a/bs-ui/src/views/tm/carriage_order/finished/index.vue b/bs-ui/src/views/tm/carriage_order/finished/index.vue new file mode 100644 index 0000000..17a14ab --- /dev/null +++ b/bs-ui/src/views/tm/carriage_order/finished/index.vue @@ -0,0 +1,208 @@ + + + + \ No newline at end of file diff --git a/bs-ui/src/views/tm/carriage_order/plan/components/TransCargoPlan.vue b/bs-ui/src/views/tm/carriage_order/plan/components/TransCargoPlan.vue new file mode 100644 index 0000000..8461705 --- /dev/null +++ b/bs-ui/src/views/tm/carriage_order/plan/components/TransCargoPlan.vue @@ -0,0 +1,172 @@ + + diff --git a/bs-ui/src/views/tm/carriage_order/plan/components/TransCargoPlanEdit.vue b/bs-ui/src/views/tm/carriage_order/plan/components/TransCargoPlanEdit.vue new file mode 100644 index 0000000..7c8362b --- /dev/null +++ b/bs-ui/src/views/tm/carriage_order/plan/components/TransCargoPlanEdit.vue @@ -0,0 +1,548 @@ + + + + + \ No newline at end of file diff --git a/bs-ui/src/views/tm/carriage_order/plan/components/TransPlan.vue b/bs-ui/src/views/tm/carriage_order/plan/components/TransPlan.vue new file mode 100644 index 0000000..5848408 --- /dev/null +++ b/bs-ui/src/views/tm/carriage_order/plan/components/TransPlan.vue @@ -0,0 +1,153 @@ + + diff --git a/bs-ui/src/views/tm/carriage_order/plan/components/TransPlanAuto.vue b/bs-ui/src/views/tm/carriage_order/plan/components/TransPlanAuto.vue new file mode 100644 index 0000000..82291b5 --- /dev/null +++ b/bs-ui/src/views/tm/carriage_order/plan/components/TransPlanAuto.vue @@ -0,0 +1,148 @@ + + + + + \ No newline at end of file diff --git a/bs-ui/src/views/tm/carriage_order/plan/components/TransPlanEdit.vue b/bs-ui/src/views/tm/carriage_order/plan/components/TransPlanEdit.vue new file mode 100644 index 0000000..47c2b7e --- /dev/null +++ b/bs-ui/src/views/tm/carriage_order/plan/components/TransPlanEdit.vue @@ -0,0 +1,707 @@ + + + + + diff --git a/bs-ui/src/views/tm/carriage_order/plan/index.vue b/bs-ui/src/views/tm/carriage_order/plan/index.vue new file mode 100644 index 0000000..bd9748c --- /dev/null +++ b/bs-ui/src/views/tm/carriage_order/plan/index.vue @@ -0,0 +1,109 @@ + + + + \ No newline at end of file diff --git a/bs-ui/src/views/tm/carriage_order/unfinished/index.vue b/bs-ui/src/views/tm/carriage_order/unfinished/index.vue new file mode 100644 index 0000000..d862a5b --- /dev/null +++ b/bs-ui/src/views/tm/carriage_order/unfinished/index.vue @@ -0,0 +1,245 @@ + + + + \ No newline at end of file diff --git a/bs-ui/src/views/tm/components/AutoTableHeight.js b/bs-ui/src/views/tm/components/AutoTableHeight.js new file mode 100644 index 0000000..d6f991e --- /dev/null +++ b/bs-ui/src/views/tm/components/AutoTableHeight.js @@ -0,0 +1,66 @@ +export default { + props: { + // 给定一个固定的高度,优先级高 + height: { + type: Number, + default: 0 + }, + // 自动计算高度,优先级中 + autoHeight: { + type: Boolean, + default: true + }, + // 给的一个去除的额外高度,会自动计算表格高度,优先级低 + screenExtraHeight: { + type: Number, + default: 110 + }, + // 列表之外的高度 + extraHeight: { + type: Number, + default: 82 + }, + }, + data() { + return { + // 屏幕高度 + screenHeight: 0, + // 当前组件高度 + currentHeight: 0, + + }; + }, + computed: { + tableHeight() { + if (this.height > 0) { + return this.height - this.extraHeight; + } + if (this.autoHeight) { + return this.currentHeight - this.extraHeight; + } + if (this.screenExtraHeight > 0) { + return this.screenHeight - this.screenExtraHeight - this.extraHeight; + } + return ''; + } + }, + created() { + window.addEventListener("resize", this.screenResize); + }, + destroyed() { + window.removeEventListener("resize", this.screenResize); + }, + mounted() { + this.screenResize(); + }, + methods: { + // 屏幕大小变化 + screenResize() { + this.screenHeight = document.documentElement.clientHeight || document.body.clientHeight; + this.$nextTick(() => { + this.currentHeight = this.$refs.list.offsetHeight; + }); + + }, + } + }; \ No newline at end of file diff --git a/bs-ui/src/views/tm/components/CarriageCargoInput/index.vue b/bs-ui/src/views/tm/components/CarriageCargoInput/index.vue new file mode 100644 index 0000000..660f572 --- /dev/null +++ b/bs-ui/src/views/tm/components/CarriageCargoInput/index.vue @@ -0,0 +1,97 @@ + + + + + diff --git a/bs-ui/src/views/tm/components/CarriageCargoList/index.vue b/bs-ui/src/views/tm/components/CarriageCargoList/index.vue new file mode 100644 index 0000000..29125b6 --- /dev/null +++ b/bs-ui/src/views/tm/components/CarriageCargoList/index.vue @@ -0,0 +1,60 @@ + + + + diff --git a/bs-ui/src/views/tm/components/CarriageOrderEdit/index.vue b/bs-ui/src/views/tm/components/CarriageOrderEdit/index.vue new file mode 100644 index 0000000..10ba2cf --- /dev/null +++ b/bs-ui/src/views/tm/components/CarriageOrderEdit/index.vue @@ -0,0 +1,519 @@ + + + + + \ No newline at end of file diff --git a/bs-ui/src/views/tm/components/ConsignOrderEdit/index.vue b/bs-ui/src/views/tm/components/ConsignOrderEdit/index.vue new file mode 100644 index 0000000..0792812 --- /dev/null +++ b/bs-ui/src/views/tm/components/ConsignOrderEdit/index.vue @@ -0,0 +1,472 @@ + + + + + \ No newline at end of file diff --git a/bs-ui/src/views/tm/components/CustEdit/index.vue b/bs-ui/src/views/tm/components/CustEdit/index.vue new file mode 100644 index 0000000..f19aaad --- /dev/null +++ b/bs-ui/src/views/tm/components/CustEdit/index.vue @@ -0,0 +1,146 @@ + + + + + \ No newline at end of file diff --git a/bs-ui/src/views/tm/components/CustInput/index.vue b/bs-ui/src/views/tm/components/CustInput/index.vue new file mode 100644 index 0000000..6da9f30 --- /dev/null +++ b/bs-ui/src/views/tm/components/CustInput/index.vue @@ -0,0 +1,74 @@ + + + + + \ No newline at end of file diff --git a/bs-ui/src/views/tm/components/CustList/index.vue b/bs-ui/src/views/tm/components/CustList/index.vue new file mode 100644 index 0000000..ac5ac8e --- /dev/null +++ b/bs-ui/src/views/tm/components/CustList/index.vue @@ -0,0 +1,64 @@ + + + + diff --git a/bs-ui/src/views/tm/components/DriverEdit/index.vue b/bs-ui/src/views/tm/components/DriverEdit/index.vue new file mode 100644 index 0000000..b3cc270 --- /dev/null +++ b/bs-ui/src/views/tm/components/DriverEdit/index.vue @@ -0,0 +1,219 @@ + + + + + diff --git a/bs-ui/src/views/tm/components/DriverInput/index.vue b/bs-ui/src/views/tm/components/DriverInput/index.vue new file mode 100644 index 0000000..c2b792d --- /dev/null +++ b/bs-ui/src/views/tm/components/DriverInput/index.vue @@ -0,0 +1,97 @@ + + + + + diff --git a/bs-ui/src/views/tm/components/DriverList/index.vue b/bs-ui/src/views/tm/components/DriverList/index.vue new file mode 100644 index 0000000..d6ec8d9 --- /dev/null +++ b/bs-ui/src/views/tm/components/DriverList/index.vue @@ -0,0 +1,64 @@ + + + diff --git a/bs-ui/src/views/tm/components/OrderInput/index.vue b/bs-ui/src/views/tm/components/OrderInput/index.vue new file mode 100644 index 0000000..55e7329 --- /dev/null +++ b/bs-ui/src/views/tm/components/OrderInput/index.vue @@ -0,0 +1,101 @@ + + + + + \ No newline at end of file diff --git a/bs-ui/src/views/tm/components/OrderList/index.vue b/bs-ui/src/views/tm/components/OrderList/index.vue new file mode 100644 index 0000000..17f0e39 --- /dev/null +++ b/bs-ui/src/views/tm/components/OrderList/index.vue @@ -0,0 +1,103 @@ + + + + \ No newline at end of file diff --git a/bs-ui/src/views/tm/components/SimpleList/index.vue b/bs-ui/src/views/tm/components/SimpleList/index.vue new file mode 100644 index 0000000..e767324 --- /dev/null +++ b/bs-ui/src/views/tm/components/SimpleList/index.vue @@ -0,0 +1,250 @@ + + + + diff --git a/bs-ui/src/views/tm/components/VehicleEdit/index.vue b/bs-ui/src/views/tm/components/VehicleEdit/index.vue new file mode 100644 index 0000000..b24e67c --- /dev/null +++ b/bs-ui/src/views/tm/components/VehicleEdit/index.vue @@ -0,0 +1,282 @@ + + + + + \ No newline at end of file diff --git a/bs-ui/src/views/tm/components/VehicleInput/index.vue b/bs-ui/src/views/tm/components/VehicleInput/index.vue new file mode 100644 index 0000000..23439f8 --- /dev/null +++ b/bs-ui/src/views/tm/components/VehicleInput/index.vue @@ -0,0 +1,107 @@ + + + + + \ No newline at end of file diff --git a/bs-ui/src/views/tm/components/VehicleList/index.vue b/bs-ui/src/views/tm/components/VehicleList/index.vue new file mode 100644 index 0000000..42efabd --- /dev/null +++ b/bs-ui/src/views/tm/components/VehicleList/index.vue @@ -0,0 +1,60 @@ + + + diff --git a/bs-ui/src/views/tm/consign_order/finished/index.vue b/bs-ui/src/views/tm/consign_order/finished/index.vue new file mode 100644 index 0000000..ee32a6e --- /dev/null +++ b/bs-ui/src/views/tm/consign_order/finished/index.vue @@ -0,0 +1,209 @@ + + + diff --git a/bs-ui/src/views/tm/consign_order/unfinished/index.vue b/bs-ui/src/views/tm/consign_order/unfinished/index.vue new file mode 100644 index 0000000..7022a4c --- /dev/null +++ b/bs-ui/src/views/tm/consign_order/unfinished/index.vue @@ -0,0 +1,238 @@ + + + diff --git a/bs-ui/src/views/tm/cust/index.vue b/bs-ui/src/views/tm/cust/index.vue new file mode 100644 index 0000000..14a6d13 --- /dev/null +++ b/bs-ui/src/views/tm/cust/index.vue @@ -0,0 +1,347 @@ + + + diff --git a/bs-ui/src/views/tm/cust/modules/search.vue b/bs-ui/src/views/tm/cust/modules/search.vue new file mode 100644 index 0000000..4b4d53a --- /dev/null +++ b/bs-ui/src/views/tm/cust/modules/search.vue @@ -0,0 +1,51 @@ + + diff --git a/bs-ui/src/views/tm/driver/index.vue b/bs-ui/src/views/tm/driver/index.vue new file mode 100644 index 0000000..3d9ad09 --- /dev/null +++ b/bs-ui/src/views/tm/driver/index.vue @@ -0,0 +1,292 @@ + + + diff --git a/bs-ui/src/views/tm/driver/modules/search.vue b/bs-ui/src/views/tm/driver/modules/search.vue new file mode 100644 index 0000000..05cb1dc --- /dev/null +++ b/bs-ui/src/views/tm/driver/modules/search.vue @@ -0,0 +1,52 @@ + + diff --git a/bs-ui/src/views/tm/vehicle/index.vue b/bs-ui/src/views/tm/vehicle/index.vue new file mode 100644 index 0000000..8642217 --- /dev/null +++ b/bs-ui/src/views/tm/vehicle/index.vue @@ -0,0 +1,335 @@ + + + diff --git a/bs-ui/src/views/tm/vehicle/modules/search.vue b/bs-ui/src/views/tm/vehicle/modules/search.vue new file mode 100644 index 0000000..91df264 --- /dev/null +++ b/bs-ui/src/views/tm/vehicle/modules/search.vue @@ -0,0 +1,55 @@ + + diff --git a/bs-ui/src/views/tool/build/CodeTypeDialog.vue b/bs-ui/src/views/tool/build/CodeTypeDialog.vue new file mode 100644 index 0000000..b5c2e2e --- /dev/null +++ b/bs-ui/src/views/tool/build/CodeTypeDialog.vue @@ -0,0 +1,106 @@ + + diff --git a/bs-ui/src/views/tool/build/DraggableItem.vue b/bs-ui/src/views/tool/build/DraggableItem.vue new file mode 100644 index 0000000..e881778 --- /dev/null +++ b/bs-ui/src/views/tool/build/DraggableItem.vue @@ -0,0 +1,100 @@ + diff --git a/bs-ui/src/views/tool/build/IconsDialog.vue b/bs-ui/src/views/tool/build/IconsDialog.vue new file mode 100644 index 0000000..958be50 --- /dev/null +++ b/bs-ui/src/views/tool/build/IconsDialog.vue @@ -0,0 +1,123 @@ + + + diff --git a/bs-ui/src/views/tool/build/RightPanel.vue b/bs-ui/src/views/tool/build/RightPanel.vue new file mode 100644 index 0000000..c2760eb --- /dev/null +++ b/bs-ui/src/views/tool/build/RightPanel.vue @@ -0,0 +1,946 @@ + + + + + diff --git a/bs-ui/src/views/tool/build/TreeNodeDialog.vue b/bs-ui/src/views/tool/build/TreeNodeDialog.vue new file mode 100644 index 0000000..fa7f0b2 --- /dev/null +++ b/bs-ui/src/views/tool/build/TreeNodeDialog.vue @@ -0,0 +1,149 @@ + + diff --git a/bs-ui/src/views/tool/build/index.vue b/bs-ui/src/views/tool/build/index.vue new file mode 100644 index 0000000..2bd298b --- /dev/null +++ b/bs-ui/src/views/tool/build/index.vue @@ -0,0 +1,768 @@ + + + + + diff --git a/bs-ui/src/views/tool/gen/basicInfoForm.vue b/bs-ui/src/views/tool/gen/basicInfoForm.vue new file mode 100644 index 0000000..7029529 --- /dev/null +++ b/bs-ui/src/views/tool/gen/basicInfoForm.vue @@ -0,0 +1,60 @@ + + + diff --git a/bs-ui/src/views/tool/gen/editTable.vue b/bs-ui/src/views/tool/gen/editTable.vue new file mode 100644 index 0000000..951497a --- /dev/null +++ b/bs-ui/src/views/tool/gen/editTable.vue @@ -0,0 +1,234 @@ + + + diff --git a/bs-ui/src/views/tool/gen/genInfoForm.vue b/bs-ui/src/views/tool/gen/genInfoForm.vue new file mode 100644 index 0000000..eaf4ff7 --- /dev/null +++ b/bs-ui/src/views/tool/gen/genInfoForm.vue @@ -0,0 +1,299 @@ + + + diff --git a/bs-ui/src/views/tool/gen/importTable.vue b/bs-ui/src/views/tool/gen/importTable.vue new file mode 100644 index 0000000..3ea9532 --- /dev/null +++ b/bs-ui/src/views/tool/gen/importTable.vue @@ -0,0 +1,120 @@ + + + diff --git a/bs-ui/src/views/tool/gen/index.vue b/bs-ui/src/views/tool/gen/index.vue new file mode 100644 index 0000000..0205f2e --- /dev/null +++ b/bs-ui/src/views/tool/gen/index.vue @@ -0,0 +1,337 @@ + + + diff --git a/bs-ui/src/views/tool/swagger/index.vue b/bs-ui/src/views/tool/swagger/index.vue new file mode 100644 index 0000000..b8becc6 --- /dev/null +++ b/bs-ui/src/views/tool/swagger/index.vue @@ -0,0 +1,15 @@ + + diff --git a/bs-ui/vue.config.js b/bs-ui/vue.config.js new file mode 100644 index 0000000..a9befc4 --- /dev/null +++ b/bs-ui/vue.config.js @@ -0,0 +1,134 @@ +'use strict' +const path = require('path') + +function resolve(dir) { + return path.join(__dirname, dir) +} + +const CompressionPlugin = require('compression-webpack-plugin') + +const name = process.env.VUE_APP_TITLE || '保税仓库管理系统' // 网页标题 + +const port = process.env.port || process.env.npm_config_port || 80 // 端口 + +// vue.config.js 配置说明 +//官方vue.config.js 参考文档 https://cli.vuejs.org/zh/config/#css-loaderoptions +// 这里只列一部分,具体配置参考文档 +module.exports = { + // 部署生产环境和开发环境下的URL。 + // 默认情况下,Vue CLI 会假设你的应用是被部署在一个域名的根路径上 + // 例如 https://www.bs.vip/。如果应用被部署在一个子路径上,你就需要用这个选项指定这个子路径。例如,如果你的应用被部署在 https://www.bs.vip/admin/,则设置 baseUrl 为 /admin/。 + publicPath: process.env.NODE_ENV === "production" ? "/" : "/", + // 在npm run build 或 yarn build 时 ,生成文件的目录名称(要和baseUrl的生产环境路径一致)(默认dist) + outputDir: 'dist', + // 用于放置生成的静态资源 (js、css、img、fonts) 的;(项目打包之后,静态资源会放在这个文件夹下) + assetsDir: 'static', + // 是否开启eslint保存检测,有效值:ture | false | 'error' + lintOnSave: process.env.NODE_ENV === 'development', + // 如果你不需要生产环境的 source map,可以将其设置为 false 以加速生产环境构建。 + productionSourceMap: false, + // webpack-dev-server 相关配置 + devServer: { + host: '0.0.0.0', + port: port, + open: true, + proxy: { + // detail: https://cli.vuejs.org/config/#devserver-proxy + [process.env.VUE_APP_BASE_API]: { + target: `http://localhost:8080`, + changeOrigin: true, + pathRewrite: { + ['^' + process.env.VUE_APP_BASE_API]: '' + } + } + }, + disableHostCheck: true + }, + css: { + loaderOptions: { + sass: { + sassOptions: { outputStyle: "expanded" } + } + } + }, + configureWebpack: { + name: name, + resolve: { + alias: { + '@': resolve('src') + } + }, + plugins: [ + // http://doc.bs.vip/bs-vue/other/faq.html#使用gzip解压缩静态文件 + new CompressionPlugin({ + cache: false, // 不启用文件缓存 + test: /\.(js|css|html)?$/i, // 压缩文件格式 + filename: '[path].gz[query]', // 压缩后的文件名 + algorithm: 'gzip', // 使用gzip压缩 + minRatio: 0.8 // 压缩率小于1才会压缩 + }) + ], + }, + chainWebpack(config) { + config.plugins.delete('preload') // TODO: need test + config.plugins.delete('prefetch') // TODO: need test + + // set svg-sprite-loader + config.module + .rule('svg') + .exclude.add(resolve('src/assets/icons')) + .end() + config.module + .rule('icons') + .test(/\.svg$/) + .include.add(resolve('src/assets/icons')) + .end() + .use('svg-sprite-loader') + .loader('svg-sprite-loader') + .options({ + symbolId: 'icon-[name]' + }) + .end() + + config.when(process.env.NODE_ENV !== 'development', config => { + config + .plugin('ScriptExtHtmlWebpackPlugin') + .after('html') + .use('script-ext-html-webpack-plugin', [{ + // `runtime` must same as runtimeChunk name. default is `runtime` + inline: /runtime\..*\.js$/ + }]) + .end() + + config.optimization.splitChunks({ + chunks: 'all', + cacheGroups: { + libs: { + name: 'chunk-libs', + test: /[\\/]node_modules[\\/]/, + priority: 10, + chunks: 'initial' // only package third parties that are initially dependent + }, + elementUI: { + name: 'chunk-elementUI', // split elementUI into a single package + test: /[\\/]node_modules[\\/]_?element-ui(.*)/, // in order to adapt to cnpm + priority: 20 // the weight needs to be larger than libs and app or it will be packaged into libs or app + }, + commons: { + name: 'chunk-commons', + test: resolve('src/components'), // can customize your rules + minChunks: 3, // minimum common number + priority: 5, + reuseExistingChunk: true + } + } + }) + + config.optimization.runtimeChunk('single'), + { + from: path.resolve(__dirname, './public/robots.txt'), //防爬虫文件 + to: './' //到根目录下 + } + }) + } +} diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..b657a89 --- /dev/null +++ b/pom.xml @@ -0,0 +1,307 @@ + + + 4.0.0 + + com.bs + my-base + 3.8.6 + + bs + + + 3.8.6 + UTF-8 + UTF-8 + 1.8 + 3.1.1 + 1.2.16 + 1.21 + 3.0.0 + 2.3.3 + 1.4.6 + 2.0.34 + 6.4.3 + 1.18.26 + 2.11.0 + 3.2.2 + 4.1.2 + 2.3 + 0.9.1 + 3.5.3.1 + 1.4.5 + 3.0.0 + 1.2.15 + 3.5.2 + 3.0.3 + + + + + + + + + com.github.xiaoymin + knife4j-spring-boot-starter + ${knife4j.version} + + + mapstruct + org.mapstruct + + + + + com.github.jsqlparser + jsqlparser + 4.2 + + + cn.hutool + hutool-all + 5.8.25 + + + + com.alibaba + druid-spring-boot-starter + ${druid.version} + + + + io.springfox + springfox-boot-starter + ${swagger.version} + + + io.swagger + swagger-models + + + + + com.baomidou + mybatis-plus-boot-starter + ${mybatis-plus.version} + + + + jsqlparser + com.github.jsqlparser + + + + + com.github.yulichang + mybatis-plus-join-boot-starter + ${mybatis-plus-join.version} + + + + org.springframework.boot + spring-boot-dependencies + 2.5.15 + pom + import + + + + + com.alibaba + druid-spring-boot-starter + ${druid.version} + + + + com.baomidou + mybatis-plus-generator + ${mybatis-plus-generator.version} + + + + eu.bitwalker + UserAgentUtils + ${bitwalker.version} + + + + + com.github.pagehelper + pagehelper-spring-boot-starter + ${pagehelper.boot.version} + + + + jsqlparser + com.github.jsqlparser + + + + + + + com.github.oshi + oshi-core + ${oshi.version} + + + + + org.projectlombok + lombok + ${lombok.version} + + + + + io.springfox + springfox-boot-starter + ${swagger.version} + + + io.swagger + swagger-models + + + + + + + commons-io + commons-io + ${commons.io.version} + + + + + org.apache.poi + poi-ooxml + ${poi.version} + + + + + org.apache.velocity + velocity-engine-core + ${velocity.version} + + + + + commons-collections + commons-collections + ${commons.collections.version} + + + + + com.alibaba.fastjson2 + fastjson2 + ${fastjson.version} + + + + + io.jsonwebtoken + jjwt + ${jwt.version} + + + + + pro.fessional + kaptcha + ${kaptcha.version} + + + + + com.bs + bs-quartz + ${bs.version} + + + + + com.bs + bs-generator + ${bs.version} + + + + + com.bs + bs-framework + ${bs.version} + + + + + com.bs + bs-system + ${bs.version} + + + + + com.bs + bs-common + ${bs.version} + + + + + + + bs-admin + bs-framework + bs-system + bs-quartz + bs-generator + bs-common + + pom + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.1 + + ${java.version} + ${java.version} + ${project.build.sourceEncoding} + + + + + + + + public + aliyun nexus + https://maven.aliyun.com/repository/public + + true + + + + + + + public + aliyun nexus + https://maven.aliyun.com/repository/public + + true + + + false + + + + + diff --git a/ry.bat b/ry.bat new file mode 100644 index 0000000..ac1e437 --- /dev/null +++ b/ry.bat @@ -0,0 +1,67 @@ +@echo off + +rem jarƽĿ¼ +set AppName=ruoyi-admin.jar + +rem JVM +set JVM_OPTS="-Dname=%AppName% -Duser.timezone=Asia/Shanghai -Xms512m -Xmx1024m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=512m -XX:+HeapDumpOnOutOfMemoryError -XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:NewRatio=1 -XX:SurvivorRatio=30 -XX:+UseParallelGC -XX:+UseParallelOldGC" + + +ECHO. + ECHO. [1] %AppName% + ECHO. [2] ر%AppName% + ECHO. [3] %AppName% + ECHO. [4] ״̬ %AppName% + ECHO. [5] +ECHO. + +ECHO.ѡĿ: +set /p ID= + IF "%id%"=="1" GOTO start + IF "%id%"=="2" GOTO stop + IF "%id%"=="3" GOTO restart + IF "%id%"=="4" GOTO status + IF "%id%"=="5" EXIT +PAUSE +:start + for /f "usebackq tokens=1-2" %%a in (`jps -l ^| findstr %AppName%`) do ( + set pid=%%a + set image_name=%%b + ) + if defined pid ( + echo %%is running + PAUSE + ) + +start javaw %JVM_OPTS% -jar %AppName% + +echo starting +echo Start %AppName% success... +goto:eof + +rem stopͨjpspid +:stop + for /f "usebackq tokens=1-2" %%a in (`jps -l ^| findstr %AppName%`) do ( + set pid=%%a + set image_name=%%b + ) + if not defined pid (echo process %AppName% does not exists) else ( + echo prepare to kill %image_name% + echo start kill %pid% ... + rem ݽIDkill + taskkill /f /pid %pid% + ) +goto:eof +:restart + call :stop + call :start +goto:eof +:status + for /f "usebackq tokens=1-2" %%a in (`jps -l ^| findstr %AppName%`) do ( + set pid=%%a + set image_name=%%b + ) + if not defined pid (echo process %AppName% is dead ) else ( + echo %image_name% is running + ) +goto:eof diff --git a/sql/20240405235624.nb3 b/sql/20240405235624.nb3 new file mode 100644 index 0000000000000000000000000000000000000000..4c8d44219c1d9abf08f7c1827a9e7505797250a9 GIT binary patch literal 83456 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
?(#WJb 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

v%+E~Ha}*4d%`z_ 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 literal 0 HcmV?d00001 diff --git a/sql/my-base.sql b/sql/my-base.sql new file mode 100644 index 0000000..f6cdbd2 --- /dev/null +++ b/sql/my-base.sql @@ -0,0 +1,1122 @@ +/* + Navicat Premium Data Transfer + + Source Server : 本地mysql + Source Server Type : MySQL + Source Server Version : 50736 (5.7.36-log) + Source Host : localhost:3306 + Source Schema : my-base + + Target Server Type : MySQL + Target Server Version : 50736 (5.7.36-log) + File Encoding : 65001 + + Date: 05/04/2024 23:56:58 +*/ + +SET NAMES utf8mb4; +SET FOREIGN_KEY_CHECKS = 0; + +-- ---------------------------- +-- Table structure for cm_attach +-- ---------------------------- +DROP TABLE IF EXISTS `cm_attach`; +CREATE TABLE `cm_attach` ( + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '用户id', + `file_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '文件组id', + `file_sort` int(11) NULL DEFAULT NULL COMMENT '文件排序', + `attach_name` varchar(400) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '文件名称(编译后)', + `attach_file_type` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '文件类型', + `attach_content_type` varchar(400) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '文件编码类型', + `attach_file_size` bigint(20) NULL DEFAULT NULL COMMENT '文件大小', + `attach_file_url` varchar(600) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '文件路径', + `old_name` varchar(400) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '文件名(原始)', + `version_no` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '文件版本号', + `create_dept` bigint(20) NULL DEFAULT NULL COMMENT '创建部门', + `create_by` bigint(20) NULL DEFAULT NULL COMMENT '创建人', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + `update_by` bigint(20) NULL DEFAULT NULL COMMENT '修改人', + `update_time` datetime NULL DEFAULT NULL COMMENT '修改时间', + `remark` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '备注', + `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT '0' COMMENT '删除标志(0代表存在 2代表删除)', + `tenant_id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 39 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '附近信息表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of cm_attach +-- ---------------------------- +INSERT INTO `cm_attach` VALUES (1, '854ceb237a6140db90308200bbc3e818', 1, 'close-gt (1)_20240324110027A001.png', 'pic', 'image/png', 3200, '/profile//2024/03/24/close-gt (1)_20240324110027A001.png', 'close-gt (1).png', '1', 103, 1, '2024-03-24 11:00:27', NULL, NULL, '', '0', '0'); +INSERT INTO `cm_attach` VALUES (2, '854ceb237a6140db90308200bbc3e818', 1, 'close-gt (1)_20240324110612A002.png', 'pic', 'image/png', 3200, '/profile//2024/03/24/close-gt (1)_20240324110612A002.png', 'close-gt (1).png', '1', 103, 1, '2024-03-24 11:06:26', NULL, NULL, '', '0', '0'); +INSERT INTO `cm_attach` VALUES (3, '854ceb237a6140db90308200bbc3e818', 1, 'close-gt_20240324111120A001.png', 'pic', 'image/png', 3200, '/profile/upload/2024/03/24/close-gt_20240324111120A001.png', 'close-gt.png', '1', 103, 1, '2024-03-24 11:11:20', NULL, NULL, '', '0', '0'); +INSERT INTO `cm_attach` VALUES (4, '', 1, 'close-gt (1)_20240324113459A001.png', 'pic', 'image/png', 3200, '/profile/upload/2024/03/24/close-gt (1)_20240324113459A001.png', 'close-gt (1).png', '1', 103, 1, '2024-03-24 11:35:00', NULL, NULL, '', '0', '0'); +INSERT INTO `cm_attach` VALUES (5, '', 1, 'close-gt (1)_20240324113555A002.png', 'pic', 'image/png', 3200, '/profile/upload/2024/03/24/close-gt (1)_20240324113555A002.png', 'close-gt (1).png', '1', 103, 1, '2024-03-24 11:35:56', NULL, NULL, '', '0', '0'); +INSERT INTO `cm_attach` VALUES (6, '', 1, 'test_20240324114109A003.jpg', 'pic', 'image/jpeg', 25711, '/profile/upload/2024/03/24/test_20240324114109A003.jpg', 'test.jpg', '1', 103, 1, '2024-03-24 11:41:09', NULL, NULL, '', '0', '0'); +INSERT INTO `cm_attach` VALUES (7, '', 1, 'test_20240324114215A004.jpg', 'pic', 'image/jpeg', 25711, '/profile/upload/2024/03/24/test_20240324114215A004.jpg', 'test.jpg', '1', 103, 1, '2024-03-24 11:42:15', NULL, NULL, '', '0', '0'); +INSERT INTO `cm_attach` VALUES (8, '', 1, 'test_20240324114341A005.jpg', 'pic', 'image/jpeg', 25711, '/profile/upload/2024/03/24/test_20240324114341A005.jpg', 'test.jpg', '1', 103, 1, '2024-03-24 11:43:42', NULL, NULL, '', '0', '0'); +INSERT INTO `cm_attach` VALUES (9, '4d0fb9f2c9c34e2a8b2751b03859c685', 1, 'test_20240324115620A006.jpg', 'pic', 'image/jpeg', 25711, '/profile/upload/2024/03/24/test_20240324115620A006.jpg', 'test.jpg', '1', 103, 1, '2024-03-24 11:56:21', 1, '2024-03-24 11:56:26', '', '2', '0'); +INSERT INTO `cm_attach` VALUES (10, '8ac7bb3f196c472b80b6afa224564db0', 1, 'test_20240324132733A001.jpg', 'pic', 'image/jpeg', 25711, '/profile/upload/2024/03/24/test_20240324132733A001.jpg', 'test.jpg', '1', 103, 1, '2024-03-24 13:27:34', NULL, NULL, '', '0', '0'); +INSERT INTO `cm_attach` VALUES (11, 'd08480b1d9394463ba48f15e2349759b', 1, 'test_20240324132853A002.jpg', 'pic', 'image/jpeg', 25711, '/profile/upload/2024/03/24/test_20240324132853A002.jpg', 'test.jpg', '1', 103, 1, '2024-03-24 13:28:53', NULL, NULL, '', '0', '0'); +INSERT INTO `cm_attach` VALUES (12, '92876ff115744eceadee8623b086d583', 1, 'test_20240324133032A003.jpg', 'pic', 'image/jpeg', 25711, '/profile/upload/2024/03/24/test_20240324133032A003.jpg', 'test.jpg', '1', 103, 1, '2024-03-24 13:30:33', NULL, NULL, '', '0', '0'); +INSERT INTO `cm_attach` VALUES (13, '92876ff115744eceadee8623b086d583', 1, 'test_20240324142732A001.jpg', 'pic', 'image/jpeg', 25711, '/profile/upload/2024/03/24/test_20240324142732A001.jpg', 'test.jpg', '1', 103, 1, '2024-03-24 14:27:32', 1, '2024-03-24 14:28:39', '', '2', '0'); +INSERT INTO `cm_attach` VALUES (14, 'd334985940834d508533b0bce0b2fdea', 1, 'close-gt (1)_20240324142936A002.png', 'pic', 'image/png', 3200, '/profile/upload/2024/03/24/close-gt (1)_20240324142936A002.png', 'close-gt (1).png', '1', 103, 1, '2024-03-24 14:29:36', 1, '2024-03-24 14:30:20', '', '2', '0'); +INSERT INTO `cm_attach` VALUES (15, 'd52d3f728e244a2c86fa584ec24aaa15', 1, 'test_20240324144527A003.jpg', 'pic', 'image/jpeg', 25711, '/profile/upload/2024/03/24/test_20240324144527A003.jpg', 'test.jpg', '1', 103, 1, '2024-03-24 14:45:28', NULL, NULL, '', '0', '0'); +INSERT INTO `cm_attach` VALUES (16, 'e52f116e25ce4085b3edcbf6b63eb3fc', 1, 'test_20240324144540A004.jpg', 'pic', 'image/jpeg', 25711, '/profile/upload/2024/03/24/test_20240324144540A004.jpg', 'test.jpg', '1', 103, 1, '2024-03-24 14:45:40', NULL, NULL, '', '0', '0'); +INSERT INTO `cm_attach` VALUES (17, '2f34f24d0c16478db05da6438751ca75', 1, 'test_20240324144626A005.jpg', 'pic', 'image/jpeg', 25711, '/profile/upload/2024/03/24/test_20240324144626A005.jpg', 'test.jpg', '1', 103, 1, '2024-03-24 14:46:26', NULL, NULL, '', '0', '0'); +INSERT INTO `cm_attach` VALUES (18, '2dbb71d137a542e58e1ce3063ce6b8f5', 1, 'test_20240324144650A006.jpg', 'pic', 'image/jpeg', 25711, '/profile/upload/2024/03/24/test_20240324144650A006.jpg', 'test.jpg', '1', 103, 1, '2024-03-24 14:46:50', NULL, NULL, '', '0', '0'); +INSERT INTO `cm_attach` VALUES (19, '27bffe85189846dda3ef8fea2e0f8286', 1, 'test_20240324144805A007.jpg', 'pic', 'image/jpeg', 25711, '/profile/upload/2024/03/24/test_20240324144805A007.jpg', 'test.jpg', '1', 103, 1, '2024-03-24 14:48:05', 1, '2024-03-24 14:49:02', '', '2', '0'); +INSERT INTO `cm_attach` VALUES (20, '9249a98176064941a8b1457f8f90903a', 1, 'close-gt (1)_20240324144816A008.png', 'pic', 'image/png', 3200, '/profile/upload/2024/03/24/close-gt (1)_20240324144816A008.png', 'close-gt (1).png', '1', 103, 1, '2024-03-24 14:48:17', NULL, NULL, '', '0', '0'); +INSERT INTO `cm_attach` VALUES (21, '1bddc20b3ea8470dbcd8130fa365821a', 1, 'test_20240324144852A009.jpg', 'pic', 'image/jpeg', 25711, '/profile/upload/2024/03/24/test_20240324144852A009.jpg', 'test.jpg', '1', 103, 1, '2024-03-24 14:48:52', 1, '2024-03-24 14:49:00', '', '2', '0'); +INSERT INTO `cm_attach` VALUES (22, '9249a98176064941a8b1457f8f90903a', 1, 'WechatIMG2_20240330160149A001.jpeg', 'pic', 'image/jpeg', 296157, '/profile/upload/2024/03/30/WechatIMG2_20240330160149A001.jpeg', 'WechatIMG2.jpeg', '1', 103, 1, '2024-03-30 16:01:49', 1, '2024-03-30 16:02:30', '', '2', '0'); +INSERT INTO `cm_attach` VALUES (23, 'b017830a90584348b0e949cf6b04438e', 1, 'WechatIMG2_20240330160239A002.jpeg', 'pic', 'image/jpeg', 296157, '/profile/upload/2024/03/30/WechatIMG2_20240330160239A002.jpeg', 'WechatIMG2.jpeg', '1', 103, 1, '2024-03-30 16:02:40', NULL, NULL, '', '0', '0'); +INSERT INTO `cm_attach` VALUES (24, '9e3c1517463d45e2b8162b8bf67ded06', 1, 'WechatIMG2_20240330160249A003.jpeg', 'pic', 'image/jpeg', 296157, '/profile/upload/2024/03/30/WechatIMG2_20240330160249A003.jpeg', 'WechatIMG2.jpeg', '1', 103, 1, '2024-03-30 16:02:50', NULL, NULL, '', '0', '0'); +INSERT INTO `cm_attach` VALUES (25, '9249a98176064941a8b1457f8f90903a', 1, 'WechatIMG2_20240330161530A004.jpeg', 'pic', 'image/jpeg', 296157, '/profile/upload/2024/03/30/WechatIMG2_20240330161530A004.jpeg', 'WechatIMG2.jpeg', '1', 103, 1, '2024-03-30 16:15:30', 1, '2024-03-30 16:24:50', '', '2', '0'); +INSERT INTO `cm_attach` VALUES (26, 'c8684284a237403c833f3775a5bdda14', 1, 'WechatIMG2_20240330162458A005.jpeg', 'pic', 'image/jpeg', 296157, '/profile/upload/2024/03/30/WechatIMG2_20240330162458A005.jpeg', 'WechatIMG2.jpeg', '1', 103, 1, '2024-03-30 16:24:59', NULL, NULL, '', '0', '0'); +INSERT INTO `cm_attach` VALUES (27, '9249a98176064941a8b1457f8f90903a', 1, 'WechatIMG2_20240330163225A006.jpeg', 'pic', 'image/jpeg', 296157, '/profile/upload/2024/03/30/WechatIMG2_20240330163225A006.jpeg', 'WechatIMG2.jpeg', '1', 103, 1, '2024-03-30 16:32:25', 1, '2024-03-30 16:33:54', '', '2', '0'); +INSERT INTO `cm_attach` VALUES (28, '19b2531bad52456a8d8a14ea74aaff05', 1, 'WechatIMG2_20240330163406A007.jpeg', 'pic', 'image/jpeg', 296157, '/profile/upload/2024/03/30/WechatIMG2_20240330163406A007.jpeg', 'WechatIMG2.jpeg', '1', 103, 1, '2024-03-30 16:34:07', NULL, NULL, '', '0', '0'); +INSERT INTO `cm_attach` VALUES (29, '9249a98176064941a8b1457f8f90903a', 1, 'WechatIMG3_20240330163802A008.jpeg', 'pic', 'image/jpeg', 272074, '/profile/upload/2024/03/30/WechatIMG3_20240330163802A008.jpeg', 'WechatIMG3.jpeg', '1', 103, 1, '2024-03-30 16:38:02', 1, '2024-03-30 16:38:12', '', '2', '0'); +INSERT INTO `cm_attach` VALUES (30, '9249a98176064941a8b1457f8f90903a', 1, 'WechatIMG3_20240330165036A009.jpeg', 'pic', 'image/jpeg', 272074, '/profile/upload/2024/03/30/WechatIMG3_20240330165036A009.jpeg', 'WechatIMG3.jpeg', '1', 103, 1, '2024-03-30 16:50:36', NULL, NULL, '', '0', '0'); +INSERT INTO `cm_attach` VALUES (31, '94f2a3750d354d3caac5d6af1ce5543e', 1, 'WechatIMG43_20240330165045A010.jpeg', 'pic', 'image/jpeg', 366637, '/profile/upload/2024/03/30/WechatIMG43_20240330165045A010.jpeg', 'WechatIMG43.jpeg', '1', 103, 1, '2024-03-30 16:50:45', NULL, NULL, '', '0', '0'); +INSERT INTO `cm_attach` VALUES (32, '94f2a3750d354d3caac5d6af1ce5543e', 1, 'WechatIMG125_20240330170109A011.jpg', 'pic', 'image/jpeg', 172806, '/profile/upload/2024/03/30/WechatIMG125_20240330170109A011.jpg', 'WechatIMG125.jpg', '1', 103, 1, '2024-03-30 17:01:10', 1, '2024-03-30 17:01:31', '', '2', '0'); +INSERT INTO `cm_attach` VALUES (33, '94f2a3750d354d3caac5d6af1ce5543e', 1, 'WechatIMG43_20240330170118A012.jpeg', 'pic', 'image/jpeg', 366637, '/profile/upload/2024/03/30/WechatIMG43_20240330170118A012.jpeg', 'WechatIMG43.jpeg', '1', 103, 1, '2024-03-30 17:01:18', 1, '2024-03-30 17:01:29', '', '2', '0'); +INSERT INTO `cm_attach` VALUES (34, '8233e0cfa4f74de280a755b3e632d484', 1, 'share-local-icon_20240330172027A013.png', 'pic', 'image/png', 8551, '/profile/upload/2024/03/30/share-local-icon_20240330172027A013.png', 'share-local-icon.png', '1', 103, 1, '2024-03-30 17:20:27', NULL, NULL, '', '0', '0'); +INSERT INTO `cm_attach` VALUES (35, '8ead475077ac4881a3dbb65c2c1bf03e', 1, 'WechatIMG43_20240330172034A014.jpeg', 'pic', 'image/jpeg', 366637, '/profile/upload/2024/03/30/WechatIMG43_20240330172034A014.jpeg', 'WechatIMG43.jpeg', '1', 103, 1, '2024-03-30 17:20:34', NULL, NULL, '', '0', '0'); +INSERT INTO `cm_attach` VALUES (36, '3182eb6c8bdc4f468a7906efa0c1d777', 1, 'WechatIMG2_20240330172041A015.jpeg', 'pic', 'image/jpeg', 296157, '/profile/upload/2024/03/30/WechatIMG2_20240330172041A015.jpeg', 'WechatIMG2.jpeg', '1', 103, 1, '2024-03-30 17:20:42', NULL, NULL, '', '0', '0'); +INSERT INTO `cm_attach` VALUES (37, 'fb58707416594cde9ae6598644df54d7', 1, 'WechatIMG43_20240330172052A016.jpeg', 'pic', 'image/jpeg', 366637, '/profile/upload/2024/03/30/WechatIMG43_20240330172052A016.jpeg', 'WechatIMG43.jpeg', '1', 103, 1, '2024-03-30 17:20:52', NULL, NULL, '', '0', '0'); +INSERT INTO `cm_attach` VALUES (38, '8233e0cfa4f74de280a755b3e632d484', 1, 'share-local-icon_20240330173105A017.png', 'pic', 'image/png', 8551, '/profile/upload/2024/03/30/share-local-icon_20240330173105A017.png', 'share-local-icon.png', '1', 103, 1, '2024-03-30 17:31:06', NULL, NULL, '', '0', '0'); + +-- ---------------------------- +-- Table structure for gen_table +-- ---------------------------- +DROP TABLE IF EXISTS `gen_table`; +CREATE TABLE `gen_table` ( + `table_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '编号', + `table_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT '' COMMENT '表名称', + `table_comment` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT '' COMMENT '表描述', + `sub_table_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '关联子表的表名', + `sub_table_fk_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '子表关联的外键名', + `class_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT '' COMMENT '实体类名称', + `tpl_category` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT 'crud' COMMENT '使用的模板(crud单表操作 tree树表操作)', + `package_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '生成包路径', + `module_name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '生成模块名', + `business_name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '生成业务名', + `function_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '生成功能名', + `function_author` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '生成功能作者', + `gen_type` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT '0' COMMENT '生成代码方式(0zip压缩包 1自定义路径)', + `gen_path` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT '/' COMMENT '生成路径(不填默认项目路径)', + `options` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '其它生成选项', + `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间', + `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '备注', + PRIMARY KEY (`table_id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 43 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '代码生成业务表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of gen_table +-- ---------------------------- + +-- ---------------------------- +-- Table structure for gen_table_column +-- ---------------------------- +DROP TABLE IF EXISTS `gen_table_column`; +CREATE TABLE `gen_table_column` ( + `column_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '编号', + `table_id` bigint(20) NULL DEFAULT NULL COMMENT '归属表编号', + `column_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '列名称', + `column_comment` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '列描述', + `column_type` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '列类型', + `java_type` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT 'JAVA类型', + `java_field` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT 'JAVA字段名', + `is_pk` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '是否主键(1是)', + `is_increment` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '是否自增(1是)', + `is_required` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '是否必填(1是)', + `is_insert` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '是否为插入字段(1是)', + `is_edit` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '是否编辑字段(1是)', + `is_list` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '是否列表字段(1是)', + `is_query` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '是否查询字段(1是)', + `query_type` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT 'EQ' COMMENT '查询方式(等于、不等于、大于、小于、范围)', + `html_type` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '显示类型(文本框、文本域、下拉框、复选框、单选框、日期控件)', + `dict_type` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT '' COMMENT '字典类型', + `sort` int(11) NULL DEFAULT NULL COMMENT '排序', + `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间', + PRIMARY KEY (`column_id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 1087 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '代码生成业务表字段' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of gen_table_column +-- ---------------------------- + +-- ---------------------------- +-- Table structure for qrtz_blob_triggers +-- ---------------------------- +DROP TABLE IF EXISTS `qrtz_blob_triggers`; +CREATE TABLE `qrtz_blob_triggers` ( + `sched_name` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '调度名称', + `trigger_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT 'qrtz_triggers表trigger_name的外键', + `trigger_group` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT 'qrtz_triggers表trigger_group的外键', + `blob_data` blob NULL COMMENT '存放持久化Trigger对象', + PRIMARY KEY (`sched_name`, `trigger_name`, `trigger_group`) USING BTREE, + CONSTRAINT `qrtz_blob_triggers_ibfk_1` FOREIGN KEY (`sched_name`, `trigger_name`, `trigger_group`) REFERENCES `qrtz_triggers` (`sched_name`, `trigger_name`, `trigger_group`) ON DELETE RESTRICT ON UPDATE RESTRICT +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = 'Blob类型的触发器表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of qrtz_blob_triggers +-- ---------------------------- + +-- ---------------------------- +-- Table structure for qrtz_calendars +-- ---------------------------- +DROP TABLE IF EXISTS `qrtz_calendars`; +CREATE TABLE `qrtz_calendars` ( + `sched_name` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '调度名称', + `calendar_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '日历名称', + `calendar` blob NOT NULL COMMENT '存放持久化calendar对象', + PRIMARY KEY (`sched_name`, `calendar_name`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '日历信息表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of qrtz_calendars +-- ---------------------------- + +-- ---------------------------- +-- Table structure for qrtz_cron_triggers +-- ---------------------------- +DROP TABLE IF EXISTS `qrtz_cron_triggers`; +CREATE TABLE `qrtz_cron_triggers` ( + `sched_name` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '调度名称', + `trigger_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT 'qrtz_triggers表trigger_name的外键', + `trigger_group` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT 'qrtz_triggers表trigger_group的外键', + `cron_expression` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT 'cron表达式', + `time_zone_id` varchar(80) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '时区', + PRIMARY KEY (`sched_name`, `trigger_name`, `trigger_group`) USING BTREE, + CONSTRAINT `qrtz_cron_triggers_ibfk_1` FOREIGN KEY (`sched_name`, `trigger_name`, `trigger_group`) REFERENCES `qrtz_triggers` (`sched_name`, `trigger_name`, `trigger_group`) ON DELETE RESTRICT ON UPDATE RESTRICT +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = 'Cron类型的触发器表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of qrtz_cron_triggers +-- ---------------------------- + +-- ---------------------------- +-- Table structure for qrtz_fired_triggers +-- ---------------------------- +DROP TABLE IF EXISTS `qrtz_fired_triggers`; +CREATE TABLE `qrtz_fired_triggers` ( + `sched_name` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '调度名称', + `entry_id` varchar(95) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '调度器实例id', + `trigger_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT 'qrtz_triggers表trigger_name的外键', + `trigger_group` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT 'qrtz_triggers表trigger_group的外键', + `instance_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '调度器实例名', + `fired_time` bigint(20) NOT NULL COMMENT '触发的时间', + `sched_time` bigint(20) NOT NULL COMMENT '定时器制定的时间', + `priority` int(11) NOT NULL COMMENT '优先级', + `state` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '状态', + `job_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '任务名称', + `job_group` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '任务组名', + `is_nonconcurrent` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '是否并发', + `requests_recovery` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '是否接受恢复执行', + PRIMARY KEY (`sched_name`, `entry_id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '已触发的触发器表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of qrtz_fired_triggers +-- ---------------------------- + +-- ---------------------------- +-- Table structure for qrtz_job_details +-- ---------------------------- +DROP TABLE IF EXISTS `qrtz_job_details`; +CREATE TABLE `qrtz_job_details` ( + `sched_name` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '调度名称', + `job_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '任务名称', + `job_group` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '任务组名', + `description` varchar(250) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '相关介绍', + `job_class_name` varchar(250) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '执行任务类名称', + `is_durable` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '是否持久化', + `is_nonconcurrent` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '是否并发', + `is_update_data` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '是否更新数据', + `requests_recovery` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '是否接受恢复执行', + `job_data` blob NULL COMMENT '存放持久化job对象', + PRIMARY KEY (`sched_name`, `job_name`, `job_group`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '任务详细信息表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of qrtz_job_details +-- ---------------------------- + +-- ---------------------------- +-- Table structure for qrtz_locks +-- ---------------------------- +DROP TABLE IF EXISTS `qrtz_locks`; +CREATE TABLE `qrtz_locks` ( + `sched_name` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '调度名称', + `lock_name` varchar(40) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '悲观锁名称', + PRIMARY KEY (`sched_name`, `lock_name`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '存储的悲观锁信息表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of qrtz_locks +-- ---------------------------- + +-- ---------------------------- +-- Table structure for qrtz_paused_trigger_grps +-- ---------------------------- +DROP TABLE IF EXISTS `qrtz_paused_trigger_grps`; +CREATE TABLE `qrtz_paused_trigger_grps` ( + `sched_name` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '调度名称', + `trigger_group` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT 'qrtz_triggers表trigger_group的外键', + PRIMARY KEY (`sched_name`, `trigger_group`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '暂停的触发器表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of qrtz_paused_trigger_grps +-- ---------------------------- + +-- ---------------------------- +-- Table structure for qrtz_scheduler_state +-- ---------------------------- +DROP TABLE IF EXISTS `qrtz_scheduler_state`; +CREATE TABLE `qrtz_scheduler_state` ( + `sched_name` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '调度名称', + `instance_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '实例名称', + `last_checkin_time` bigint(20) NOT NULL COMMENT '上次检查时间', + `checkin_interval` bigint(20) NOT NULL COMMENT '检查间隔时间', + PRIMARY KEY (`sched_name`, `instance_name`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '调度器状态表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of qrtz_scheduler_state +-- ---------------------------- + +-- ---------------------------- +-- Table structure for qrtz_simple_triggers +-- ---------------------------- +DROP TABLE IF EXISTS `qrtz_simple_triggers`; +CREATE TABLE `qrtz_simple_triggers` ( + `sched_name` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '调度名称', + `trigger_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT 'qrtz_triggers表trigger_name的外键', + `trigger_group` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT 'qrtz_triggers表trigger_group的外键', + `repeat_count` bigint(20) NOT NULL COMMENT '重复的次数统计', + `repeat_interval` bigint(20) NOT NULL COMMENT '重复的间隔时间', + `times_triggered` bigint(20) NOT NULL COMMENT '已经触发的次数', + PRIMARY KEY (`sched_name`, `trigger_name`, `trigger_group`) USING BTREE, + CONSTRAINT `qrtz_simple_triggers_ibfk_1` FOREIGN KEY (`sched_name`, `trigger_name`, `trigger_group`) REFERENCES `qrtz_triggers` (`sched_name`, `trigger_name`, `trigger_group`) ON DELETE RESTRICT ON UPDATE RESTRICT +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '简单触发器的信息表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of qrtz_simple_triggers +-- ---------------------------- + +-- ---------------------------- +-- Table structure for qrtz_simprop_triggers +-- ---------------------------- +DROP TABLE IF EXISTS `qrtz_simprop_triggers`; +CREATE TABLE `qrtz_simprop_triggers` ( + `sched_name` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '调度名称', + `trigger_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT 'qrtz_triggers表trigger_name的外键', + `trigger_group` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT 'qrtz_triggers表trigger_group的外键', + `str_prop_1` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT 'String类型的trigger的第一个参数', + `str_prop_2` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT 'String类型的trigger的第二个参数', + `str_prop_3` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT 'String类型的trigger的第三个参数', + `int_prop_1` int(11) NULL DEFAULT NULL COMMENT 'int类型的trigger的第一个参数', + `int_prop_2` int(11) NULL DEFAULT NULL COMMENT 'int类型的trigger的第二个参数', + `long_prop_1` bigint(20) NULL DEFAULT NULL COMMENT 'long类型的trigger的第一个参数', + `long_prop_2` bigint(20) NULL DEFAULT NULL COMMENT 'long类型的trigger的第二个参数', + `dec_prop_1` decimal(13, 4) NULL DEFAULT NULL COMMENT 'decimal类型的trigger的第一个参数', + `dec_prop_2` decimal(13, 4) NULL DEFAULT NULL COMMENT 'decimal类型的trigger的第二个参数', + `bool_prop_1` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT 'Boolean类型的trigger的第一个参数', + `bool_prop_2` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT 'Boolean类型的trigger的第二个参数', + PRIMARY KEY (`sched_name`, `trigger_name`, `trigger_group`) USING BTREE, + CONSTRAINT `qrtz_simprop_triggers_ibfk_1` FOREIGN KEY (`sched_name`, `trigger_name`, `trigger_group`) REFERENCES `qrtz_triggers` (`sched_name`, `trigger_name`, `trigger_group`) ON DELETE RESTRICT ON UPDATE RESTRICT +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '同步机制的行锁表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of qrtz_simprop_triggers +-- ---------------------------- + +-- ---------------------------- +-- Table structure for qrtz_triggers +-- ---------------------------- +DROP TABLE IF EXISTS `qrtz_triggers`; +CREATE TABLE `qrtz_triggers` ( + `sched_name` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '调度名称', + `trigger_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '触发器的名字', + `trigger_group` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '触发器所属组的名字', + `job_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT 'qrtz_job_details表job_name的外键', + `job_group` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT 'qrtz_job_details表job_group的外键', + `description` varchar(250) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '相关介绍', + `next_fire_time` bigint(20) NULL DEFAULT NULL COMMENT '上一次触发时间(毫秒)', + `prev_fire_time` bigint(20) NULL DEFAULT NULL COMMENT '下一次触发时间(默认为-1表示不触发)', + `priority` int(11) NULL DEFAULT NULL COMMENT '优先级', + `trigger_state` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '触发器状态', + `trigger_type` varchar(8) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '触发器的类型', + `start_time` bigint(20) NOT NULL COMMENT '开始时间', + `end_time` bigint(20) NULL DEFAULT NULL COMMENT '结束时间', + `calendar_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '日程表名称', + `misfire_instr` smallint(6) NULL DEFAULT NULL COMMENT '补偿执行的策略', + `job_data` blob NULL COMMENT '存放持久化job对象', + PRIMARY KEY (`sched_name`, `trigger_name`, `trigger_group`) USING BTREE, + INDEX `sched_name`(`sched_name`, `job_name`, `job_group`) USING BTREE, + CONSTRAINT `qrtz_triggers_ibfk_1` FOREIGN KEY (`sched_name`, `job_name`, `job_group`) REFERENCES `qrtz_job_details` (`sched_name`, `job_name`, `job_group`) ON DELETE RESTRICT ON UPDATE RESTRICT +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '触发器详细信息表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of qrtz_triggers +-- ---------------------------- + +-- ---------------------------- +-- Table structure for sys_config +-- ---------------------------- +DROP TABLE IF EXISTS `sys_config`; +CREATE TABLE `sys_config` ( + `config_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '参数主键', + `config_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT '' COMMENT '参数名称', + `config_key` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT '' COMMENT '参数键名', + `config_value` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT '' COMMENT '参数键值', + `config_type` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT 'N' COMMENT '系统内置(Y是 N否)', + `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间', + `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '备注', + PRIMARY KEY (`config_id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 10 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '参数配置表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of sys_config +-- ---------------------------- +INSERT INTO `sys_config` VALUES (1, '主框架页-默认皮肤样式名称', 'sys.index.skinName', 'skin-blue', 'Y', '1', '2023-07-08 16:37:25', '1', NULL, '蓝色 skin-blue、绿色 skin-green、紫色 skin-purple、红色 skin-red、黄色 skin-yellow'); +INSERT INTO `sys_config` VALUES (2, '用户管理-账号初始密码', 'sys.user.initPassword', '123456', 'Y', '1', '2023-07-08 16:37:25', '1', NULL, '初始化密码 123456'); +INSERT INTO `sys_config` VALUES (3, '主框架页-侧边栏主题', 'sys.index.sideTheme', 'theme-light', 'Y', '1', '2023-07-08 16:37:25', '1', '2023-07-31 21:59:25', '深色主题theme-dark,浅色主题theme-light'); +INSERT INTO `sys_config` VALUES (4, '账号自助-验证码开关', 'sys.account.captchaEnabled', 'true', 'Y', '1', '2023-07-08 16:37:25', '1', NULL, '是否开启验证码功能(true开启,false关闭)'); +INSERT INTO `sys_config` VALUES (5, '账号自助-是否开启用户注册功能', 'sys.account.registerUser', 'false', 'Y', '1', '2023-07-08 16:37:25', '1', NULL, '是否开启注册用户功能(true开启,false关闭)'); +INSERT INTO `sys_config` VALUES (6, '用户登录-黑名单列表', 'sys.login.blackIPList', '', 'Y', '1', '2023-07-08 16:37:25', '1', NULL, '设置登录IP黑名单限制,多个匹配项以;分隔,支持匹配(*通配、网段)'); +INSERT INTO `sys_config` VALUES (7, '入库有效期提醒时间设置', 'inBillCargoExpiryDateWarn', '45', 'Y', '1', '2024-03-14 11:44:10', '1', '2024-03-14 17:48:06', '入库有效期提醒时间设置'); +INSERT INTO `sys_config` VALUES (8, '仓库有效期提醒', 'warehouseExpiryDateWarn', '105', 'Y', '1', '2024-03-14 15:37:11', '1', '2024-03-14 15:42:14', '仓库有效期提醒时间设置'); +INSERT INTO `sys_config` VALUES (9, '出库单据有效期提醒', 'outBillCargoExpiryDateWarn', '30', 'Y', '1', '2024-03-14 15:59:59', '1', '2024-03-14 17:48:33', '出库单据即将过期提醒'); + +-- ---------------------------- +-- Table structure for sys_dept +-- ---------------------------- +DROP TABLE IF EXISTS `sys_dept`; +CREATE TABLE `sys_dept` ( + `dept_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '部门id', + `parent_id` bigint(20) NULL DEFAULT 0 COMMENT '父部门id', + `ancestors` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT '' COMMENT '祖级列表', + `dept_name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT '' COMMENT '部门名称', + `order_num` int(11) NULL DEFAULT 0 COMMENT '显示顺序', + `leader` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '负责人', + `phone` varchar(11) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '联系电话', + `email` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '邮箱', + `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT '0' COMMENT '部门状态(0正常 1停用)', + `create_dept` bigint(20) NULL DEFAULT NULL COMMENT '创建部门', + `create_by` bigint(20) NULL DEFAULT NULL COMMENT '创建人', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + `update_by` bigint(20) NULL DEFAULT NULL COMMENT '修改人', + `update_time` datetime NULL DEFAULT NULL COMMENT '修改时间', + `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '备注', + `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT '0' COMMENT '删除标志(0代表存在 2代表删除)', + `tenant_id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL DEFAULT '0', + PRIMARY KEY (`dept_id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 118 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '部门表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of sys_dept +-- ---------------------------- +INSERT INTO `sys_dept` VALUES (116, 0, '0', '总公司', 0, 'admin', '15888888888', 'zgs@qq.com', '0', 103, 1, '2024-02-26 21:30:58', NULL, NULL, NULL, '0', '0'); +INSERT INTO `sys_dept` VALUES (117, 116, '0,116', '福建分公司', 1, 'admin', '15888888888', 'zgs@qq.com', '0', 103, 1, '2024-02-26 21:30:58', NULL, NULL, NULL, '0', '0'); + +-- ---------------------------- +-- Table structure for sys_dict_data +-- ---------------------------- +DROP TABLE IF EXISTS `sys_dict_data`; +CREATE TABLE `sys_dict_data` ( + `dict_code` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '字典编码', + `dict_sort` int(11) NULL DEFAULT 0 COMMENT '字典排序', + `dict_label` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT '' COMMENT '字典标签', + `dict_value` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT '' COMMENT '字典键值', + `dict_type` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT '' COMMENT '字典类型', + `css_class` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '样式属性(其他样式扩展)', + `list_class` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '表格回显样式', + `is_default` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT 'N' COMMENT '是否默认(Y是 N否)', + `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT '0' COMMENT '状态(0正常 1停用)', + `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间', + `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '备注', + PRIMARY KEY (`dict_code`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 199 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '字典数据表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of sys_dict_data +-- ---------------------------- +INSERT INTO `sys_dict_data` VALUES (1, 1, '男', '0', 'sys_user_sex', '', '', 'Y', '0', '1', '2023-07-08 16:37:24', '1', NULL, '性别男'); +INSERT INTO `sys_dict_data` VALUES (2, 2, '女', '1', 'sys_user_sex', '', '', 'N', '0', '1', '2023-07-08 16:37:24', '1', NULL, '性别女'); +INSERT INTO `sys_dict_data` VALUES (3, 3, '未知', '2', 'sys_user_sex', '', '', 'N', '0', '1', '2023-07-08 16:37:24', '1', NULL, '性别未知'); +INSERT INTO `sys_dict_data` VALUES (4, 1, '显示', '0', 'sys_show_hide', '', 'primary', 'Y', '0', '1', '2023-07-08 16:37:24', '1', NULL, '显示菜单'); +INSERT INTO `sys_dict_data` VALUES (5, 2, '隐藏', '1', 'sys_show_hide', '', 'danger', 'N', '0', '1', '2023-07-08 16:37:24', '1', NULL, '隐藏菜单'); +INSERT INTO `sys_dict_data` VALUES (6, 1, '正常', '0', 'sys_normal_disable', '', 'primary', 'Y', '0', '1', '2023-07-08 16:37:24', '1', NULL, '正常状态'); +INSERT INTO `sys_dict_data` VALUES (7, 2, '停用', '1', 'sys_normal_disable', '', 'danger', 'N', '0', '1', '2023-07-08 16:37:24', '1', NULL, '停用状态'); +INSERT INTO `sys_dict_data` VALUES (8, 1, '正常', '0', 'sys_job_status', '', 'primary', 'Y', '0', '1', '2023-07-08 16:37:24', '1', NULL, '正常状态'); +INSERT INTO `sys_dict_data` VALUES (9, 2, '暂停', '1', 'sys_job_status', '', 'danger', 'N', '0', '1', '2023-07-08 16:37:24', '1', NULL, '停用状态'); +INSERT INTO `sys_dict_data` VALUES (10, 1, '默认', 'DEFAULT', 'sys_job_group', '', '', 'Y', '0', '1', '2023-07-08 16:37:24', '1', NULL, '默认分组'); +INSERT INTO `sys_dict_data` VALUES (11, 2, '系统', 'SYSTEM', 'sys_job_group', '', '', 'N', '0', '1', '2023-07-08 16:37:24', '1', NULL, '系统分组'); +INSERT INTO `sys_dict_data` VALUES (12, 1, '是', 'Y', 'sys_yes_no', '', 'primary', 'Y', '0', '1', '2023-07-08 16:37:24', '1', NULL, '系统默认是'); +INSERT INTO `sys_dict_data` VALUES (13, 2, '否', 'N', 'sys_yes_no', '', 'danger', 'N', '0', '1', '2023-07-08 16:37:24', '1', NULL, '系统默认否'); +INSERT INTO `sys_dict_data` VALUES (14, 1, '通知', '1', 'sys_notice_type', '', 'warning', 'Y', '0', '1', '2023-07-08 16:37:24', '1', NULL, '通知'); +INSERT INTO `sys_dict_data` VALUES (15, 2, '公告', '2', 'sys_notice_type', '', 'success', 'N', '0', '1', '2023-07-08 16:37:24', '1', NULL, '公告'); +INSERT INTO `sys_dict_data` VALUES (16, 1, '正常', '0', 'sys_notice_status', '', 'primary', 'Y', '0', '1', '2023-07-08 16:37:24', '1', NULL, '正常状态'); +INSERT INTO `sys_dict_data` VALUES (17, 2, '关闭', '1', 'sys_notice_status', '', 'danger', 'N', '0', '1', '2023-07-08 16:37:24', '1', NULL, '关闭状态'); +INSERT INTO `sys_dict_data` VALUES (18, 99, '其他', '0', 'sys_oper_type', '', 'info', 'N', '0', '1', '2023-07-08 16:37:24', '1', NULL, '其他操作'); +INSERT INTO `sys_dict_data` VALUES (19, 1, '新增', '1', 'sys_oper_type', '', 'info', 'N', '0', '1', '2023-07-08 16:37:24', '1', NULL, '新增操作'); +INSERT INTO `sys_dict_data` VALUES (20, 2, '修改', '2', 'sys_oper_type', '', 'info', 'N', '0', '1', '2023-07-08 16:37:24', '1', NULL, '修改操作'); +INSERT INTO `sys_dict_data` VALUES (21, 3, '删除', '3', 'sys_oper_type', '', 'danger', 'N', '0', '1', '2023-07-08 16:37:24', '1', NULL, '删除操作'); +INSERT INTO `sys_dict_data` VALUES (22, 4, '授权', '4', 'sys_oper_type', '', 'primary', 'N', '0', '1', '2023-07-08 16:37:24', '1', NULL, '授权操作'); +INSERT INTO `sys_dict_data` VALUES (23, 5, '导出', '5', 'sys_oper_type', '', 'warning', 'N', '0', '1', '2023-07-08 16:37:24', '1', NULL, '导出操作'); +INSERT INTO `sys_dict_data` VALUES (24, 6, '导入', '6', 'sys_oper_type', '', 'warning', 'N', '0', '1', '2023-07-08 16:37:24', '1', NULL, '导入操作'); +INSERT INTO `sys_dict_data` VALUES (25, 7, '强退', '7', 'sys_oper_type', '', 'danger', 'N', '0', '1', '2023-07-08 16:37:24', '1', NULL, '强退操作'); +INSERT INTO `sys_dict_data` VALUES (26, 8, '生成代码', '8', 'sys_oper_type', '', 'warning', 'N', '0', '1', '2023-07-08 16:37:24', '1', NULL, '生成操作'); +INSERT INTO `sys_dict_data` VALUES (27, 9, '清空数据', '9', 'sys_oper_type', '', 'danger', 'N', '0', '1', '2023-07-08 16:37:24', '1', NULL, '清空操作'); +INSERT INTO `sys_dict_data` VALUES (28, 1, '成功', '0', 'sys_common_status', '', 'primary', 'N', '0', '1', '2023-07-08 16:37:24', '1', NULL, '正常状态'); +INSERT INTO `sys_dict_data` VALUES (29, 2, '失败', '1', 'sys_common_status', '', 'danger', 'N', '0', '1', '2023-07-08 16:37:24', '1', NULL, '停用状态'); +INSERT INTO `sys_dict_data` VALUES (100, 1, '中国', 'CHN', 'sys_nationality', NULL, 'primary', 'N', '0', '1', '2023-07-10 14:04:01', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (101, 2, '美国', 'USA', 'sys_nationality', NULL, 'primary', 'N', '0', '1', '2023-07-10 14:04:24', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (102, 3, '卢旺达', 'RWA', 'sys_nationality', NULL, 'primary', 'N', '0', '1', '2023-07-10 14:04:58', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (103, 1, '计划', '1', 'sys_ship_dynamic_type', NULL, 'primary', 'N', '0', '1', '2023-07-10 15:42:40', '1', '2023-07-10 15:47:45', NULL); +INSERT INTO `sys_dict_data` VALUES (104, 2, '实际', '2', 'sys_ship_dynamic_type', NULL, 'primary', 'N', '0', '1', '2023-07-10 15:44:05', '1', '2023-07-10 15:47:51', NULL); +INSERT INTO `sys_dict_data` VALUES (105, 3, '预报', '3', 'sys_ship_dynamic_type', NULL, 'primary', 'N', '0', '1', '2023-07-10 15:44:24', '1', '2023-07-10 15:47:54', NULL); +INSERT INTO `sys_dict_data` VALUES (106, 4, '确报', '4', 'sys_ship_dynamic_type', NULL, 'primary', 'N', '0', '1', '2023-07-10 15:44:44', '1', '2023-07-10 15:47:58', NULL); +INSERT INTO `sys_dict_data` VALUES (107, 1, '进港', '1', 'sys_ship_dynamic', NULL, 'primary', 'N', '0', '1', '2023-07-10 15:48:51', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (108, 2, '进泊', '2', 'sys_ship_dynamic', NULL, 'success', 'N', '0', '1', '2023-07-10 15:49:10', '1', '2023-07-10 16:18:59', NULL); +INSERT INTO `sys_dict_data` VALUES (109, 3, '靠泊', '3', 'sys_ship_dynamic', NULL, 'info', 'N', '0', '1', '2023-07-10 15:50:02', '1', '2023-07-10 16:19:08', NULL); +INSERT INTO `sys_dict_data` VALUES (110, 4, '离泊', '4', 'sys_ship_dynamic', NULL, 'warning', 'N', '0', '1', '2023-07-10 15:50:17', '1', '2023-07-10 16:19:13', NULL); +INSERT INTO `sys_dict_data` VALUES (111, 5, '离港', '5', 'sys_ship_dynamic', NULL, 'danger', 'N', '0', '1', '2023-07-10 15:50:37', '1', '2023-07-10 16:19:17', NULL); +INSERT INTO `sys_dict_data` VALUES (112, 1, '卸船', '1', 'sys_port_objective', NULL, 'primary', 'N', '0', '1', '2023-07-10 15:56:45', '1', '2023-08-16 22:24:51', NULL); +INSERT INTO `sys_dict_data` VALUES (113, 2, '装船', '2', 'sys_port_objective', NULL, 'primary', 'N', '0', '1', '2023-07-10 15:57:44', '1', '2023-08-16 22:24:58', NULL); +INSERT INTO `sys_dict_data` VALUES (114, 1, '海松物流', '1', 'sys_agent', NULL, 'primary', 'N', '0', '1', '2023-07-10 16:03:05', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (115, 2, '中远海运', '2', 'sys_agent', NULL, 'primary', 'N', '0', '1', '2023-07-10 16:03:18', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (116, 3, '外轮代理', '3', 'sys_agent', NULL, 'primary', 'N', '0', '1', '2023-07-10 16:03:32', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (117, 4, '莆田兴通', '4', 'sys_agent', NULL, 'primary', 'N', '0', '1', '2023-07-10 16:03:44', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (118, 5, '海港物流', '5', 'sys_agent', NULL, 'primary', 'N', '0', '1', '2023-07-10 16:04:01', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (119, 6, '八方物流', '6', 'sys_agent', NULL, 'primary', 'N', '0', '1', '2023-07-10 16:04:17', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (120, 1, '进口', '1', 'sys_business_nature', NULL, 'primary', 'N', '0', '1', '2023-07-10 16:05:12', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (121, 2, '出口', '2', 'sys_business_nature', NULL, 'primary', 'N', '0', '1', '2023-07-10 16:05:23', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (122, 1, '内贸', '1', 'sys_trade_nature', NULL, 'primary', 'N', '0', '1', '2023-07-10 16:06:18', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (123, 2, '外贸', '2', 'sys_trade_nature', NULL, 'primary', 'N', '0', '1', '2023-07-10 16:06:29', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (124, 2, '裸件', '2', 'sys_package_type', NULL, 'primary', 'N', '0', '1', '2023-07-10 16:07:43', '1', '2023-09-11 17:28:23', NULL); +INSERT INTO `sys_dict_data` VALUES (125, 1, '吨', '070', 'sys_measurement_unit', NULL, 'primary', 'N', '0', '1', '2023-07-10 16:12:53', '1', '2023-09-15 09:06:08', NULL); +INSERT INTO `sys_dict_data` VALUES (126, 1, '一般舱', '1', 'sys_hatch_type', NULL, 'primary', 'N', '0', '1', '2023-07-10 16:13:44', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (127, 1, '船方起货机械', '1', 'sys_shipport_cargo_machinery', NULL, 'primary', 'N', '0', '1', '2023-07-10 16:14:40', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (128, 2, '港方起货机械', '2', 'sys_shipport_cargo_machinery', NULL, 'primary', 'N', '0', '1', '2023-07-10 16:14:50', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (129, 1, '是', '1', 'sys_introduction', NULL, 'primary', 'N', '0', '1', '2023-07-10 16:15:39', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (130, 2, '否', '2', 'sys_introduction', NULL, 'primary', 'N', '0', '1', '2023-07-10 16:15:46', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (131, 1, '是', '1', 'sys_dissociation', NULL, 'primary', 'N', '0', '1', '2023-07-10 16:16:25', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (132, 2, '否', '2', 'sys_dissociation', NULL, 'primary', 'N', '0', '1', '2023-07-10 16:16:33', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (133, 1, '是', '1', 'sys_diversion', NULL, 'primary', 'N', '0', '1', '2023-07-10 16:17:18', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (134, 2, '否', '2', 'sys_diversion', NULL, 'primary', 'N', '0', '1', '2023-07-10 16:17:28', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (135, 1, '入库', '1', 'sys_document_type', NULL, 'primary', 'N', '0', '1', '2023-07-13 11:21:51', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (136, 2, '出库', '2', 'sys_document_type', NULL, 'primary', 'N', '0', '1', '2023-07-13 11:22:06', '1', '2023-07-13 11:22:53', NULL); +INSERT INTO `sys_dict_data` VALUES (137, 3, '转场', '3', 'sys_document_type', NULL, 'primary', 'N', '0', '1', '2023-07-13 11:22:20', '1', '2023-07-13 11:22:57', NULL); +INSERT INTO `sys_dict_data` VALUES (138, 3, '混配', '4', 'sys_document_type', NULL, 'primary', 'N', '0', '1', '2023-07-13 11:22:35', '1', '2023-07-13 11:23:02', NULL); +INSERT INTO `sys_dict_data` VALUES (139, 1, '入库', '1', 'sys_inbound_outbound_type', NULL, 'primary', 'N', '0', '1', '2023-07-13 11:24:25', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (140, 2, '出库', '2', 'sys_inbound_outbound_type', NULL, 'primary', 'N', '0', '1', '2023-07-13 11:24:39', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (141, 1, '未审核', '1', 'sys_state', NULL, 'primary', 'N', '0', '1', '2023-07-13 12:21:34', '1', '2023-07-13 12:21:40', NULL); +INSERT INTO `sys_dict_data` VALUES (142, 2, '已审核', '2', 'sys_state', NULL, 'primary', 'N', '0', '1', '2023-07-13 12:21:54', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (143, 3, '一般贸易', 'ybmy', 'sys_trade_nature', NULL, 'primary', 'N', '0', '1', '2023-08-02 10:12:01', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (144, 4, '巴拿马', 'PAN', 'sys_nationality', NULL, 'primary', 'N', '0', '1', '2023-08-07 11:20:41', '1', '2023-08-07 11:23:23', NULL); +INSERT INTO `sys_dict_data` VALUES (145, 1, '散装', '1', 'sys_package_type', NULL, 'primary', 'N', '0', '1', '2023-09-11 17:28:41', '1', '2023-09-15 00:06:03', NULL); +INSERT INTO `sys_dict_data` VALUES (146, 4, '保税仓库货物', '4', 'sys_trade_nature', NULL, 'default', 'N', '0', '1', '2023-09-11 17:32:00', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (147, 0, '中国', '142', 'sys_origin_country', NULL, 'primary', 'N', '0', '1', '2023-09-15 09:00:33', '1', '2023-09-15 09:03:33', NULL); +INSERT INTO `sys_dict_data` VALUES (148, 1, '澳大利亚', '601', 'sys_origin_country', NULL, 'primary', 'N', '0', '1', '2023-09-15 09:00:55', '1', '2023-09-15 09:04:03', NULL); +INSERT INTO `sys_dict_data` VALUES (149, 2, '巴西', '410', 'sys_origin_country', NULL, 'primary', 'N', '0', '1', '2023-09-15 09:01:11', '1', '2023-09-15 09:04:24', NULL); +INSERT INTO `sys_dict_data` VALUES (150, 1, '人民币', '142', 'sys_curr_type', NULL, 'primary', 'N', '0', '1', '2023-09-15 09:07:40', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (151, 2, '美元', '502', 'sys_curr_type', NULL, 'primary', 'N', '0', '1', '2023-09-15 09:08:42', '1', '2023-09-15 09:09:11', NULL); +INSERT INTO `sys_dict_data` VALUES (152, 3, '欧元', '300', 'sys_curr_type', NULL, 'primary', 'N', '0', '1', '2023-09-15 09:09:06', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (153, 4, '英镑', '303', 'sys_curr_type', NULL, 'primary', 'N', '0', '1', '2023-09-15 09:09:31', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (154, 5, '澳大利亚元', '601', 'sys_curr_type', NULL, 'primary', 'N', '0', '1', '2023-09-15 09:09:52', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (155, 6, '加拿大元', '501', 'sys_curr_type', NULL, 'primary', 'N', '0', '1', '2023-09-15 09:10:13', '1', '2023-09-15 09:10:19', NULL); +INSERT INTO `sys_dict_data` VALUES (156, 1, '船舶', '1', 'sys_out_type', NULL, 'primary', 'N', '0', '1', '2023-09-20 13:20:16', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (157, 2, '火车', '2', 'sys_out_type', NULL, 'primary', 'N', '0', '1', '2023-09-20 13:20:25', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (158, 3, '车辆', '3', 'sys_out_type', NULL, 'primary', 'N', '0', '1', '2023-09-20 13:20:34', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (159, 1, '东吴保税仓', 'L3506D23A001', 'sys_stock_code', NULL, 'primary', 'N', '0', '1', '2023-09-20 19:45:57', '1', '2023-09-20 19:58:00', NULL); +INSERT INTO `sys_dict_data` VALUES (160, 2, '罗屿保税仓', 'L3506D23A002', 'sys_stock_code', NULL, 'primary', 'N', '0', '1', '2023-09-20 19:46:32', '1', '2023-09-20 19:58:05', NULL); +INSERT INTO `sys_dict_data` VALUES (161, 0, '/', '/', 'sys_origin_country', NULL, 'primary', 'N', '0', '1', '2023-09-26 10:06:35', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (162, 0, '印度尼西亚', '112', 'sys_origin_country', NULL, 'primary', 'N', '0', '1', '2023-09-26 10:28:37', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (163, 0, '哥伦比亚', '413', 'sys_origin_country', NULL, 'primary', 'N', '0', '1', '2023-09-26 10:28:59', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (165, 0, '越南', '141', 'sys_origin_country', NULL, 'primary', 'N', '0', '1', '2023-09-26 10:31:38', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (166, 0, '菲律宾', '129', 'sys_origin_country', NULL, 'primary', 'N', '0', '1', '2023-09-26 10:31:49', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (167, 7, '港币', '110', 'sys_curr_type', NULL, 'primary', 'N', '0', '1', '2023-09-26 10:33:57', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (168, 0, '日本元', '116', 'sys_curr_type', NULL, 'primary', 'N', '0', '1', '2023-09-26 10:34:30', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (169, 0, '台', '001', 'sys_measurement_unit', NULL, 'primary', 'N', '0', '1', '2023-09-26 10:35:40', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (170, 0, '辆', '003', 'sys_measurement_unit', NULL, 'primary', 'N', '0', '1', '2023-09-26 10:35:56', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (171, 0, '个', '007', 'sys_measurement_unit', NULL, 'primary', 'N', '0', '1', '2023-09-26 10:36:07', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (172, 0, '件', '011', 'sys_measurement_unit', NULL, 'primary', 'N', '0', '1', '2023-09-26 10:36:23', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (173, 0, '中国香港', '110', 'sys_origin_country', NULL, 'primary', 'N', '0', '1', '2023-09-26 10:36:58', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (174, 0, '印度', '111', 'sys_origin_country', NULL, 'primary', 'N', '0', '1', '2023-09-26 10:37:19', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (175, 0, '日本', '116', 'sys_origin_country', NULL, 'primary', 'N', '0', '1', '2023-09-26 10:37:59', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (176, 0, '中国澳门', '121', 'sys_origin_country', NULL, 'primary', 'N', '0', '1', '2023-09-26 10:38:14', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (177, 0, '马来西亚', '122', 'sys_origin_country', NULL, 'primary', 'N', '0', '1', '2023-09-26 10:38:33', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (178, 0, '沙特阿拉伯', '131', 'sys_origin_country', NULL, 'primary', 'N', '0', '1', '2023-09-26 10:39:23', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (179, 0, '新加坡', '132', 'sys_origin_country', NULL, 'primary', 'N', '0', '1', '2023-09-26 10:39:38', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (180, 0, '韩国', '133', 'sys_origin_country', NULL, 'primary', 'N', '0', '1', '2023-09-26 10:39:56', '1', '2023-09-26 10:40:01', NULL); +INSERT INTO `sys_dict_data` VALUES (181, 0, '阿联酋', '138', 'sys_origin_country', NULL, 'primary', 'N', '0', '1', '2023-09-26 10:40:23', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (182, 0, '中国台湾', '143', 'sys_origin_country', NULL, 'primary', 'N', '0', '1', '2023-09-26 10:41:08', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (183, 0, '意大利', '307', 'sys_origin_country', NULL, 'primary', 'N', '0', '1', '2023-09-26 10:41:32', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (184, 0, '西班牙', '312', 'sys_origin_country', NULL, 'primary', 'N', '0', '1', '2023-09-26 10:41:53', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (185, 0, '瑞士', '331', 'sys_origin_country', NULL, 'primary', 'N', '0', '1', '2023-09-26 10:42:16', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (186, 0, '立陶宛', '336', 'sys_origin_country', NULL, 'primary', 'N', '0', '1', '2023-09-26 10:42:40', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (187, 0, '俄罗斯联邦', '344', 'sys_origin_country', NULL, 'primary', 'N', '0', '1', '2023-09-26 10:42:56', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (188, 0, '乌克兰', '347', 'sys_origin_country', NULL, 'primary', 'N', '0', '1', '2023-09-26 10:43:17', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (190, 0, '加拿大', '501', 'sys_origin_country', NULL, 'primary', 'N', '0', '1', '2023-09-26 10:50:54', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (191, 0, '美国', '502', 'sys_origin_country', NULL, 'primary', 'N', '0', '1', '2023-09-26 10:51:12', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (192, 1, '未确认', '0', 'bm_vessel_cargo_status', NULL, 'primary', 'N', '0', '1', '2023-10-08 14:20:21', '1', '2023-10-08 14:20:45', NULL); +INSERT INTO `sys_dict_data` VALUES (193, 2, '已确认', '1', 'bm_vessel_cargo_status', NULL, 'primary', 'N', '0', '1', '2023-10-08 14:20:37', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (194, 4, '转非保税堆场', '4', 'sys_out_type', NULL, 'primary', 'N', '0', '1', '2023-10-19 09:25:02', '1', '2023-10-19 09:26:12', NULL); +INSERT INTO `sys_dict_data` VALUES (195, 0, '托运方', '0', 'customer_type', NULL, 'primary', 'N', '0', '1', '2024-03-11 21:01:25', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (196, 1, '承运方', '1', 'customer_type', NULL, 'primary', 'N', '0', '1', '2024-03-11 21:02:01', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (197, 0, '运输费用', 'ysfy', 'cost_type', NULL, 'default', 'N', '0', '1', '2024-03-17 13:06:03', '', NULL, NULL); +INSERT INTO `sys_dict_data` VALUES (198, 0, 'B1', 'B1', 'license_type', NULL, 'primary', 'N', '0', '1', '2024-03-31 21:16:28', '1', '2024-03-31 21:22:13', NULL); + +-- ---------------------------- +-- Table structure for sys_dict_type +-- ---------------------------- +DROP TABLE IF EXISTS `sys_dict_type`; +CREATE TABLE `sys_dict_type` ( + `dict_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '字典主键', + `dict_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT '' COMMENT '字典名称', + `dict_type` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT '' COMMENT '字典类型', + `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT '0' COMMENT '状态(0正常 1停用)', + `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间', + `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '备注', + PRIMARY KEY (`dict_id`) USING BTREE, + UNIQUE INDEX `dict_type`(`dict_type`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 125 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '字典类型表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of sys_dict_type +-- ---------------------------- +INSERT INTO `sys_dict_type` VALUES (1, '用户性别', 'sys_user_sex', '0', '1', '2023-07-08 16:37:24', '1', NULL, '用户性别列表'); +INSERT INTO `sys_dict_type` VALUES (2, '菜单状态', 'sys_show_hide', '0', '1', '2023-07-08 16:37:24', '1', NULL, '菜单状态列表'); +INSERT INTO `sys_dict_type` VALUES (3, '系统开关', 'sys_normal_disable', '0', '1', '2023-07-08 16:37:24', '1', NULL, '系统开关列表'); +INSERT INTO `sys_dict_type` VALUES (4, '任务状态', 'sys_job_status', '0', '1', '2023-07-08 16:37:24', '1', NULL, '任务状态列表'); +INSERT INTO `sys_dict_type` VALUES (5, '任务分组', 'sys_job_group', '0', '1', '2023-07-08 16:37:24', '1', NULL, '任务分组列表'); +INSERT INTO `sys_dict_type` VALUES (6, '系统是否', 'sys_yes_no', '0', '1', '2023-07-08 16:37:24', '1', NULL, '系统是否列表'); +INSERT INTO `sys_dict_type` VALUES (7, '通知类型', 'sys_notice_type', '0', '1', '2023-07-08 16:37:24', '1', NULL, '通知类型列表'); +INSERT INTO `sys_dict_type` VALUES (8, '通知状态', 'sys_notice_status', '0', '1', '2023-07-08 16:37:24', '1', NULL, '通知状态列表'); +INSERT INTO `sys_dict_type` VALUES (9, '操作类型', 'sys_oper_type', '0', '1', '2023-07-08 16:37:24', '1', NULL, '操作类型列表'); +INSERT INTO `sys_dict_type` VALUES (10, '系统状态', 'sys_common_status', '0', '1', '2023-07-08 16:37:24', '1', NULL, '登录状态列表'); +INSERT INTO `sys_dict_type` VALUES (100, '国籍', 'sys_nationality', '0', '1', '2023-07-10 14:02:07', '', NULL, NULL); +INSERT INTO `sys_dict_type` VALUES (101, '船舶动态类型', 'sys_ship_dynamic_type', '0', '1', '2023-07-10 15:40:44', '', NULL, NULL); +INSERT INTO `sys_dict_type` VALUES (102, '船舶动态', 'sys_ship_dynamic', '0', '1', '2023-07-10 15:47:35', '1', '2023-07-10 15:48:13', NULL); +INSERT INTO `sys_dict_type` VALUES (103, '来港目的', 'sys_port_objective', '0', '1', '2023-07-10 15:56:20', '', NULL, NULL); +INSERT INTO `sys_dict_type` VALUES (104, '代理', 'sys_agent', '0', '1', '2023-07-10 16:02:42', '', NULL, NULL); +INSERT INTO `sys_dict_type` VALUES (105, '业务性质', 'sys_business_nature', '0', '1', '2023-07-10 16:04:54', '', NULL, NULL); +INSERT INTO `sys_dict_type` VALUES (106, '贸易性质', 'sys_trade_nature', '0', '1', '2023-07-10 16:06:01', '', NULL, NULL); +INSERT INTO `sys_dict_type` VALUES (107, '包装类型', 'sys_package_type', '0', '1', '2023-07-10 16:07:27', '', NULL, NULL); +INSERT INTO `sys_dict_type` VALUES (108, '计量单位', 'sys_measurement_unit', '0', '1', '2023-07-10 16:12:39', '', NULL, NULL); +INSERT INTO `sys_dict_type` VALUES (109, '舱口类型', 'sys_hatch_type', '0', '1', '2023-07-10 16:13:29', '', NULL, NULL); +INSERT INTO `sys_dict_type` VALUES (110, '船港货机械', 'sys_shipport_cargo_machinery', '0', '1', '2023-07-10 16:14:23', '', NULL, NULL); +INSERT INTO `sys_dict_type` VALUES (111, '进引', 'sys_introduction', '0', '1', '2023-07-10 16:15:22', '', NULL, NULL); +INSERT INTO `sys_dict_type` VALUES (112, '离引', 'sys_dissociation', '0', '1', '2023-07-10 16:16:13', '', NULL, NULL); +INSERT INTO `sys_dict_type` VALUES (113, '移引', 'sys_diversion', '0', '1', '2023-07-10 16:17:07', '', NULL, NULL); +INSERT INTO `sys_dict_type` VALUES (114, '单据类型', 'sys_document_type', '0', '1', '2023-07-13 11:19:31', '', NULL, NULL); +INSERT INTO `sys_dict_type` VALUES (115, '出入库类型', 'sys_inbound_outbound_type', '0', '1', '2023-07-13 11:24:07', '', NULL, NULL); +INSERT INTO `sys_dict_type` VALUES (116, '状态', 'sys_state', '0', '1', '2023-07-13 12:21:17', '', NULL, NULL); +INSERT INTO `sys_dict_type` VALUES (117, '原产国', 'sys_origin_country', '0', '1', '2023-09-15 09:00:17', '', NULL, NULL); +INSERT INTO `sys_dict_type` VALUES (118, '币种', 'sys_curr_type', '0', '1', '2023-09-15 09:06:59', '', NULL, NULL); +INSERT INTO `sys_dict_type` VALUES (119, '出入库类型', 'sys_out_type', '0', '1', '2023-09-20 13:20:01', '', NULL, NULL); +INSERT INTO `sys_dict_type` VALUES (120, '保税仓金二册账号', 'sys_stock_code', '0', '1', '2023-09-20 19:45:15', '', NULL, NULL); +INSERT INTO `sys_dict_type` VALUES (121, '单据状态', 'bm_vessel_cargo_status', '0', '1', '2023-10-08 14:20:04', '', NULL, NULL); +INSERT INTO `sys_dict_type` VALUES (122, '客户类型', 'customer_type', '0', '1', '2024-03-11 20:58:20', '', NULL, NULL); +INSERT INTO `sys_dict_type` VALUES (123, '费用类型', 'cost_type', '0', '1', '2024-03-17 13:05:24', '', NULL, NULL); +INSERT INTO `sys_dict_type` VALUES (124, '驾驶证类型', 'license_type', '0', '1', '2024-03-31 21:16:07', '', NULL, NULL); + +-- ---------------------------- +-- Table structure for sys_job +-- ---------------------------- +DROP TABLE IF EXISTS `sys_job`; +CREATE TABLE `sys_job` ( + `job_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '任务ID', + `job_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL DEFAULT '' COMMENT '任务名称', + `job_group` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL DEFAULT 'DEFAULT' COMMENT '任务组名', + `invoke_target` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '调用目标字符串', + `cron_expression` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT '' COMMENT 'cron执行表达式', + `misfire_policy` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT '3' COMMENT '计划执行错误策略(1立即执行 2执行一次 3放弃执行)', + `concurrent` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT '1' COMMENT '是否并发执行(0允许 1禁止)', + `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT '0' COMMENT '状态(0正常 1暂停)', + `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间', + `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT '' COMMENT '备注信息', + PRIMARY KEY (`job_id`, `job_name`, `job_group`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 4 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '定时任务调度表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of sys_job +-- ---------------------------- +INSERT INTO `sys_job` VALUES (1, '系统默认(无参)', 'DEFAULT', 'ryTask.ryNoParams', '0/10 * * * * ?', '3', '1', '1', '1', '2023-07-08 16:37:25', '1', NULL, ''); +INSERT INTO `sys_job` VALUES (2, '系统默认(有参)', 'DEFAULT', 'ryTask.ryParams(\'ry\')', '0/15 * * * * ?', '3', '1', '1', '1', '2023-07-08 16:37:25', '1', NULL, ''); +INSERT INTO `sys_job` VALUES (3, '系统默认(多参)', 'DEFAULT', 'ryTask.ryMultipleParams(\'ry\', true, 2000L, 316.50D, 100)', '0/20 * * * * ?', '3', '1', '1', '1', '2023-07-08 16:37:25', '1', NULL, ''); + +-- ---------------------------- +-- Table structure for sys_job_log +-- ---------------------------- +DROP TABLE IF EXISTS `sys_job_log`; +CREATE TABLE `sys_job_log` ( + `job_log_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '任务日志ID', + `job_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '任务名称', + `job_group` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '任务组名', + `invoke_target` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '调用目标字符串', + `job_message` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '日志信息', + `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT '0' COMMENT '执行状态(0正常 1失败)', + `exception_info` varchar(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT '' COMMENT '异常信息', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + PRIMARY KEY (`job_log_id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '定时任务调度日志表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of sys_job_log +-- ---------------------------- + +-- ---------------------------- +-- Table structure for sys_logininfor +-- ---------------------------- +DROP TABLE IF EXISTS `sys_logininfor`; +CREATE TABLE `sys_logininfor` ( + `info_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '访问ID', + `user_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT '' COMMENT '用户账号', + `ipaddr` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT '' COMMENT '登录IP地址', + `login_location` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT '' COMMENT '登录地点', + `browser` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT '' COMMENT '浏览器类型', + `os` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT '' COMMENT '操作系统', + `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT '0' COMMENT '登录状态(0成功 1失败)', + `msg` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT '' COMMENT '提示消息', + `login_time` datetime NULL DEFAULT NULL COMMENT '访问时间', + PRIMARY KEY (`info_id`) USING BTREE, + INDEX `idx_sys_logininfor_s`(`status`) USING BTREE, + INDEX `idx_sys_logininfor_lt`(`login_time`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '系统访问记录' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of sys_logininfor +-- ---------------------------- + +-- ---------------------------- +-- Table structure for sys_menu +-- ---------------------------- +DROP TABLE IF EXISTS `sys_menu`; +CREATE TABLE `sys_menu` ( + `menu_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '菜单ID', + `menu_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '菜单名称', + `parent_id` bigint(20) NULL DEFAULT 0 COMMENT '父菜单ID', + `order_num` int(11) NULL DEFAULT 0 COMMENT '显示顺序', + `path` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT '' COMMENT '路由地址', + `component` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '组件路径', + `query` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '路由参数', + `is_frame` int(11) NULL DEFAULT 1 COMMENT '是否为外链(0是 1否)', + `is_cache` int(11) NULL DEFAULT 0 COMMENT '是否缓存(0缓存 1不缓存)', + `menu_type` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT '' COMMENT '菜单类型(M目录 C菜单 F按钮)', + `visible` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT '0' COMMENT '菜单状态(0显示 1隐藏)', + `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT '0' COMMENT '菜单状态(0正常 1停用)', + `perms` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '权限标识', + `icon` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT '#' COMMENT '菜单图标', + `create_dept` bigint(20) NULL DEFAULT NULL COMMENT '创建部门', + `create_by` bigint(20) NULL DEFAULT NULL COMMENT '创建人', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + `update_by` bigint(20) NULL DEFAULT NULL COMMENT '修改人', + `update_time` datetime NULL DEFAULT NULL COMMENT '修改时间', + `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '备注', + `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT '0' COMMENT '删除标志(0代表存在 2代表删除)', + `tenant_id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL DEFAULT '0', + PRIMARY KEY (`menu_id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 2446 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '菜单权限表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of sys_menu +-- ---------------------------- +INSERT INTO `sys_menu` VALUES (1, '系统管理', 0, 80, 'system', NULL, '', 1, 0, 'M', '0', '0', '', 'system', NULL, NULL, NULL, NULL, NULL, NULL, '0', '0'); +INSERT INTO `sys_menu` VALUES (2, '系统监控', 0, 70, 'monitor', NULL, '', 1, 0, 'M', '0', '0', '', 'monitor', NULL, NULL, NULL, NULL, NULL, NULL, '0', '0'); +INSERT INTO `sys_menu` VALUES (3, '系统工具', 0, 60, 'tool', NULL, '', 1, 0, 'M', '0', '0', '', 'swagger', NULL, NULL, NULL, NULL, NULL, NULL, '0', '0'); +INSERT INTO `sys_menu` VALUES (100, '用户管理', 1, 1, 'user', 'system/user/index', '', 1, 0, 'C', '0', '0', 'system:user:list', 'system', NULL, NULL, NULL, NULL, NULL, NULL, '0', '0'); +INSERT INTO `sys_menu` VALUES (101, '角色管理', 1, 2, 'role', 'system/role/index', '', 1, 0, 'C', '0', '0', 'system:role:list', 'system', NULL, NULL, NULL, NULL, NULL, NULL, '0', '0'); +INSERT INTO `sys_menu` VALUES (102, '菜单管理', 1, 3, 'menu', 'system/menu/index', '', 1, 0, 'C', '0', '0', 'system:menu:list', 'system', NULL, NULL, NULL, NULL, NULL, NULL, '0', '0'); +INSERT INTO `sys_menu` VALUES (103, '部门管理', 1, 4, 'dept', 'system/dept/index', '', 1, 0, 'C', '0', '0', 'system:dept:list', 'system', NULL, NULL, NULL, NULL, NULL, NULL, '0', '0'); +INSERT INTO `sys_menu` VALUES (104, '岗位管理', 1, 5, 'post', 'system/post/index', '', 1, 0, 'C', '0', '0', 'system:post:list', 'system', NULL, NULL, NULL, NULL, NULL, NULL, '0', '0'); +INSERT INTO `sys_menu` VALUES (105, '字典管理', 1, 6, 'dict', 'system/dict/index', '', 1, 0, 'C', '0', '0', 'system:dict:list', 'system', NULL, NULL, NULL, NULL, NULL, NULL, '0', '0'); +INSERT INTO `sys_menu` VALUES (106, '参数设置', 1, 7, 'config', 'system/config/index', '', 1, 0, 'C', '0', '0', 'system:config:list', 'system', NULL, NULL, NULL, NULL, NULL, NULL, '0', '0'); +INSERT INTO `sys_menu` VALUES (107, '通知公告', 1, 8, 'notice', 'system/notice/index', '', 1, 0, 'C', '0', '0', 'system:notice:list', 'system', NULL, NULL, NULL, NULL, NULL, NULL, '0', '0'); +INSERT INTO `sys_menu` VALUES (108, '日志管理', 1, 9, 'log', '', '', 1, 0, 'M', '0', '0', '', 'system', NULL, NULL, NULL, NULL, NULL, NULL, '0', '0'); +INSERT INTO `sys_menu` VALUES (109, '在线用户', 2, 1, 'online', 'monitor/online/index', '', 1, 0, 'C', '0', '0', 'monitor:online:list', 'monitor', NULL, NULL, NULL, NULL, NULL, NULL, '0', '0'); +INSERT INTO `sys_menu` VALUES (110, '定时任务', 2, 2, 'job', 'monitor/job/index', '', 1, 0, 'C', '0', '0', 'monitor:job:list', 'monitor', NULL, NULL, NULL, NULL, NULL, NULL, '0', '0'); +INSERT INTO `sys_menu` VALUES (111, '数据监控', 2, 3, 'druid', 'monitor/druid/index', '', 1, 0, 'C', '0', '0', 'monitor:druid:list', 'monitor', NULL, NULL, NULL, NULL, NULL, NULL, '0', '0'); +INSERT INTO `sys_menu` VALUES (112, '服务监控', 2, 4, 'server', 'monitor/server/index', '', 1, 0, 'C', '0', '0', 'monitor:server:list', 'monitor', NULL, NULL, NULL, NULL, NULL, NULL, '0', '0'); +INSERT INTO `sys_menu` VALUES (113, '缓存监控', 2, 5, 'cache', 'monitor/cache/index', '', 1, 0, 'C', '0', '0', 'monitor:cache:list', 'monitor', NULL, NULL, NULL, NULL, NULL, NULL, '0', '0'); +INSERT INTO `sys_menu` VALUES (114, '缓存列表', 2, 6, 'cacheList', 'monitor/cache/list', '', 1, 0, 'C', '0', '0', 'monitor:cache:list', 'monitor', NULL, NULL, NULL, NULL, NULL, NULL, '0', '0'); +INSERT INTO `sys_menu` VALUES (115, '表单构建', 3, 1, 'build', 'tool/build/index', '', 1, 0, 'C', '0', '0', 'tool:build:list', 'swagger', NULL, NULL, NULL, NULL, NULL, NULL, '0', '0'); +INSERT INTO `sys_menu` VALUES (116, '代码生成', 3, 2, 'gen', 'tool/gen/index', '', 1, 0, 'C', '0', '0', 'tool:gen:list', 'swagger', NULL, NULL, NULL, NULL, NULL, NULL, '0', '0'); +INSERT INTO `sys_menu` VALUES (117, '系统接口', 3, 3, 'swagger', 'tool/swagger/index', '', 1, 0, 'C', '0', '0', 'tool:swagger:list', 'swagger', NULL, NULL, NULL, NULL, NULL, NULL, '0', '0'); +INSERT INTO `sys_menu` VALUES (500, '操作日志', 108, 1, 'operlog', 'monitor/operlog/index', '', 1, 0, 'C', '0', '0', 'monitor:operlog:list', 'form', NULL, NULL, NULL, NULL, NULL, NULL, '0', '0'); +INSERT INTO `sys_menu` VALUES (501, '登录日志', 108, 2, 'logininfor', 'monitor/logininfor/index', '', 1, 0, 'C', '0', '0', 'monitor:logininfor:list', 'logininfor', NULL, NULL, NULL, NULL, NULL, NULL, '0', '0'); +INSERT INTO `sys_menu` VALUES (1000, '用户查询', 100, 1, '', '', '', 1, 0, 'F', '0', '0', 'system:user:query', '#', NULL, NULL, NULL, NULL, NULL, NULL, '0', '0'); +INSERT INTO `sys_menu` VALUES (1001, '用户新增', 100, 2, '', '', '', 1, 0, 'F', '0', '0', 'system:user:add', '#', NULL, NULL, NULL, NULL, NULL, NULL, '0', '0'); +INSERT INTO `sys_menu` VALUES (1002, '用户修改', 100, 3, '', '', '', 1, 0, 'F', '0', '0', 'system:user:edit', '#', NULL, NULL, NULL, NULL, NULL, NULL, '0', '0'); +INSERT INTO `sys_menu` VALUES (1003, '用户删除', 100, 4, '', '', '', 1, 0, 'F', '0', '0', 'system:user:remove', '#', NULL, NULL, NULL, NULL, NULL, NULL, '0', '0'); +INSERT INTO `sys_menu` VALUES (1004, '用户导出', 100, 5, '', '', '', 1, 0, 'F', '0', '0', 'system:user:export', '#', NULL, NULL, NULL, NULL, NULL, NULL, '0', '0'); +INSERT INTO `sys_menu` VALUES (1005, '用户导入', 100, 6, '', '', '', 1, 0, 'F', '0', '0', 'system:user:import', '#', NULL, NULL, NULL, NULL, NULL, NULL, '0', '0'); +INSERT INTO `sys_menu` VALUES (1006, '重置密码', 100, 7, '', '', '', 1, 0, 'F', '0', '0', 'system:user:resetPwd', '#', NULL, NULL, NULL, NULL, NULL, NULL, '0', '0'); +INSERT INTO `sys_menu` VALUES (1007, '角色查询', 101, 1, '', '', '', 1, 0, 'F', '0', '0', 'system:role:query', '#', NULL, NULL, NULL, NULL, NULL, NULL, '0', '0'); +INSERT INTO `sys_menu` VALUES (1008, '角色新增', 101, 2, '', '', '', 1, 0, 'F', '0', '0', 'system:role:add', '#', NULL, NULL, NULL, NULL, NULL, NULL, '0', '0'); +INSERT INTO `sys_menu` VALUES (1009, '角色修改', 101, 3, '', '', '', 1, 0, 'F', '0', '0', 'system:role:edit', '#', NULL, NULL, NULL, NULL, NULL, NULL, '0', '0'); +INSERT INTO `sys_menu` VALUES (1010, '角色删除', 101, 4, '', '', '', 1, 0, 'F', '0', '0', 'system:role:remove', '#', NULL, NULL, NULL, NULL, NULL, NULL, '0', '0'); +INSERT INTO `sys_menu` VALUES (1011, '角色导出', 101, 5, '', '', '', 1, 0, 'F', '0', '0', 'system:role:export', '#', NULL, NULL, NULL, NULL, NULL, NULL, '0', '0'); +INSERT INTO `sys_menu` VALUES (1012, '菜单查询', 102, 1, '', '', '', 1, 0, 'F', '0', '0', 'system:menu:query', '#', NULL, NULL, NULL, NULL, NULL, NULL, '0', '0'); +INSERT INTO `sys_menu` VALUES (1013, '菜单新增', 102, 2, '', '', '', 1, 0, 'F', '0', '0', 'system:menu:add', '#', NULL, NULL, NULL, NULL, NULL, NULL, '0', '0'); +INSERT INTO `sys_menu` VALUES (1014, '菜单修改', 102, 3, '', '', '', 1, 0, 'F', '0', '0', 'system:menu:edit', '#', NULL, NULL, NULL, NULL, NULL, NULL, '0', '0'); +INSERT INTO `sys_menu` VALUES (1015, '菜单删除', 102, 4, '', '', '', 1, 0, 'F', '0', '0', 'system:menu:remove', '#', NULL, NULL, NULL, NULL, NULL, NULL, '0', '0'); +INSERT INTO `sys_menu` VALUES (1016, '部门查询', 103, 1, '', '', '', 1, 0, 'F', '0', '0', 'system:dept:query', '#', NULL, NULL, NULL, NULL, NULL, NULL, '0', '0'); +INSERT INTO `sys_menu` VALUES (1017, '部门新增', 103, 2, '', '', '', 1, 0, 'F', '0', '0', 'system:dept:add', '#', NULL, NULL, NULL, NULL, NULL, NULL, '0', '0'); +INSERT INTO `sys_menu` VALUES (1018, '部门修改', 103, 3, '', '', '', 1, 0, 'F', '0', '0', 'system:dept:edit', '#', NULL, NULL, NULL, NULL, NULL, NULL, '0', '0'); +INSERT INTO `sys_menu` VALUES (1019, '部门删除', 103, 4, '', '', '', 1, 0, 'F', '0', '0', 'system:dept:remove', '#', NULL, NULL, NULL, NULL, NULL, NULL, '0', '0'); +INSERT INTO `sys_menu` VALUES (1020, '岗位查询', 104, 1, '', '', '', 1, 0, 'F', '0', '0', 'system:post:query', '#', NULL, NULL, NULL, NULL, NULL, NULL, '0', '0'); +INSERT INTO `sys_menu` VALUES (1021, '岗位新增', 104, 2, '', '', '', 1, 0, 'F', '0', '0', 'system:post:add', '#', NULL, NULL, NULL, NULL, NULL, NULL, '0', '0'); +INSERT INTO `sys_menu` VALUES (1022, '岗位修改', 104, 3, '', '', '', 1, 0, 'F', '0', '0', 'system:post:edit', '#', NULL, NULL, NULL, NULL, NULL, NULL, '0', '0'); +INSERT INTO `sys_menu` VALUES (1023, '岗位删除', 104, 4, '', '', '', 1, 0, 'F', '0', '0', 'system:post:remove', '#', NULL, NULL, NULL, NULL, NULL, NULL, '0', '0'); +INSERT INTO `sys_menu` VALUES (1024, '岗位导出', 104, 5, '', '', '', 1, 0, 'F', '0', '0', 'system:post:export', '#', NULL, NULL, NULL, NULL, NULL, NULL, '0', '0'); +INSERT INTO `sys_menu` VALUES (1025, '字典查询', 105, 1, '#', '', '', 1, 0, 'F', '0', '0', 'system:dict:query', '#', NULL, NULL, NULL, NULL, NULL, NULL, '0', '0'); +INSERT INTO `sys_menu` VALUES (1026, '字典新增', 105, 2, '#', '', '', 1, 0, 'F', '0', '0', 'system:dict:add', '#', NULL, NULL, NULL, NULL, NULL, NULL, '0', '0'); +INSERT INTO `sys_menu` VALUES (1027, '字典修改', 105, 3, '#', '', '', 1, 0, 'F', '0', '0', 'system:dict:edit', '#', NULL, NULL, NULL, NULL, NULL, NULL, '0', '0'); +INSERT INTO `sys_menu` VALUES (1028, '字典删除', 105, 4, '#', '', '', 1, 0, 'F', '0', '0', 'system:dict:remove', '#', NULL, NULL, NULL, NULL, NULL, NULL, '0', '0'); +INSERT INTO `sys_menu` VALUES (1029, '字典导出', 105, 5, '#', '', '', 1, 0, 'F', '0', '0', 'system:dict:export', '#', NULL, NULL, NULL, NULL, NULL, NULL, '0', '0'); +INSERT INTO `sys_menu` VALUES (1030, '参数查询', 106, 1, '#', '', '', 1, 0, 'F', '0', '0', 'system:config:query', '#', NULL, NULL, NULL, NULL, NULL, NULL, '0', '0'); +INSERT INTO `sys_menu` VALUES (1031, '参数新增', 106, 2, '#', '', '', 1, 0, 'F', '0', '0', 'system:config:add', '#', NULL, NULL, NULL, NULL, NULL, NULL, '0', '0'); +INSERT INTO `sys_menu` VALUES (1032, '参数修改', 106, 3, '#', '', '', 1, 0, 'F', '0', '0', 'system:config:edit', '#', NULL, NULL, NULL, NULL, NULL, NULL, '0', '0'); +INSERT INTO `sys_menu` VALUES (1033, '参数删除', 106, 4, '#', '', '', 1, 0, 'F', '0', '0', 'system:config:remove', '#', NULL, NULL, NULL, NULL, NULL, NULL, '0', '0'); +INSERT INTO `sys_menu` VALUES (1034, '参数导出', 106, 5, '#', '', '', 1, 0, 'F', '0', '0', 'system:config:export', '#', NULL, NULL, NULL, NULL, NULL, NULL, '0', '0'); +INSERT INTO `sys_menu` VALUES (1035, '公告查询', 107, 1, '#', '', '', 1, 0, 'F', '0', '0', 'system:notice:query', '#', NULL, NULL, NULL, NULL, NULL, NULL, '0', '0'); +INSERT INTO `sys_menu` VALUES (1036, '公告新增', 107, 2, '#', '', '', 1, 0, 'F', '0', '0', 'system:notice:add', '#', NULL, NULL, NULL, NULL, NULL, NULL, '0', '0'); +INSERT INTO `sys_menu` VALUES (1037, '公告修改', 107, 3, '#', '', '', 1, 0, 'F', '0', '0', 'system:notice:edit', '#', NULL, NULL, NULL, NULL, NULL, NULL, '0', '0'); +INSERT INTO `sys_menu` VALUES (1038, '公告删除', 107, 4, '#', '', '', 1, 0, 'F', '0', '0', 'system:notice:remove', '#', NULL, NULL, NULL, NULL, NULL, NULL, '0', '0'); +INSERT INTO `sys_menu` VALUES (1039, '操作查询', 500, 1, '#', '', '', 1, 0, 'F', '0', '0', 'monitor:operlog:query', '#', NULL, NULL, NULL, NULL, NULL, NULL, '0', '0'); +INSERT INTO `sys_menu` VALUES (1040, '操作删除', 500, 2, '#', '', '', 1, 0, 'F', '0', '0', 'monitor:operlog:remove', '#', NULL, NULL, NULL, NULL, NULL, NULL, '0', '0'); +INSERT INTO `sys_menu` VALUES (1041, '日志导出', 500, 3, '#', '', '', 1, 0, 'F', '0', '0', 'monitor:operlog:export', '#', NULL, NULL, NULL, NULL, NULL, NULL, '0', '0'); +INSERT INTO `sys_menu` VALUES (1042, '登录查询', 501, 1, '#', '', '', 1, 0, 'F', '0', '0', 'monitor:logininfor:query', '#', NULL, NULL, NULL, NULL, NULL, NULL, '0', '0'); +INSERT INTO `sys_menu` VALUES (1043, '登录删除', 501, 2, '#', '', '', 1, 0, 'F', '0', '0', 'monitor:logininfor:remove', '#', NULL, NULL, NULL, NULL, NULL, NULL, '0', '0'); +INSERT INTO `sys_menu` VALUES (1044, '日志导出', 501, 3, '#', '', '', 1, 0, 'F', '0', '0', 'monitor:logininfor:export', '#', NULL, NULL, NULL, NULL, NULL, NULL, '0', '0'); +INSERT INTO `sys_menu` VALUES (1045, '账户解锁', 501, 4, '#', '', '', 1, 0, 'F', '0', '0', 'monitor:logininfor:unlock', '#', NULL, NULL, NULL, NULL, NULL, NULL, '0', '0'); +INSERT INTO `sys_menu` VALUES (1046, '在线查询', 109, 1, '#', '', '', 1, 0, 'F', '0', '0', 'monitor:online:query', '#', NULL, NULL, NULL, NULL, NULL, NULL, '0', '0'); +INSERT INTO `sys_menu` VALUES (1047, '批量强退', 109, 2, '#', '', '', 1, 0, 'F', '0', '0', 'monitor:online:batchLogout', '#', NULL, NULL, NULL, NULL, NULL, NULL, '0', '0'); +INSERT INTO `sys_menu` VALUES (1048, '单条强退', 109, 3, '#', '', '', 1, 0, 'F', '0', '0', 'monitor:online:forceLogout', '#', NULL, NULL, NULL, NULL, NULL, NULL, '0', '0'); +INSERT INTO `sys_menu` VALUES (1049, '任务查询', 110, 1, '#', '', '', 1, 0, 'F', '0', '0', 'monitor:job:query', '#', NULL, NULL, NULL, NULL, NULL, NULL, '0', '0'); +INSERT INTO `sys_menu` VALUES (1050, '任务新增', 110, 2, '#', '', '', 1, 0, 'F', '0', '0', 'monitor:job:add', '#', NULL, NULL, NULL, NULL, NULL, NULL, '0', '0'); +INSERT INTO `sys_menu` VALUES (1051, '任务修改', 110, 3, '#', '', '', 1, 0, 'F', '0', '0', 'monitor:job:edit', '#', NULL, NULL, NULL, NULL, NULL, NULL, '0', '0'); +INSERT INTO `sys_menu` VALUES (1052, '任务删除', 110, 4, '#', '', '', 1, 0, 'F', '0', '0', 'monitor:job:remove', '#', NULL, NULL, NULL, NULL, NULL, NULL, '0', '0'); +INSERT INTO `sys_menu` VALUES (1053, '状态修改', 110, 5, '#', '', '', 1, 0, 'F', '0', '0', 'monitor:job:changeStatus', '#', NULL, NULL, NULL, NULL, NULL, NULL, '0', '0'); +INSERT INTO `sys_menu` VALUES (1054, '任务导出', 110, 6, '#', '', '', 1, 0, 'F', '0', '0', 'monitor:job:export', '#', NULL, NULL, NULL, NULL, NULL, NULL, '0', '0'); +INSERT INTO `sys_menu` VALUES (1055, '生成查询', 116, 1, '#', '', '', 1, 0, 'F', '0', '0', 'tool:gen:query', '#', NULL, NULL, NULL, NULL, NULL, NULL, '0', '0'); +INSERT INTO `sys_menu` VALUES (1056, '生成修改', 116, 2, '#', '', '', 1, 0, 'F', '0', '0', 'tool:gen:edit', '#', NULL, NULL, NULL, NULL, NULL, NULL, '0', '0'); +INSERT INTO `sys_menu` VALUES (1057, '生成删除', 116, 3, '#', '', '', 1, 0, 'F', '0', '0', 'tool:gen:remove', '#', NULL, NULL, NULL, NULL, NULL, NULL, '0', '0'); +INSERT INTO `sys_menu` VALUES (1058, '导入代码', 116, 4, '#', '', '', 1, 0, 'F', '0', '0', 'tool:gen:import', '#', NULL, NULL, NULL, NULL, NULL, NULL, '0', '0'); +INSERT INTO `sys_menu` VALUES (1059, '预览代码', 116, 5, '#', '', '', 1, 0, 'F', '0', '0', 'tool:gen:preview', '#', NULL, NULL, NULL, NULL, NULL, NULL, '0', '0'); +INSERT INTO `sys_menu` VALUES (1060, '生成代码', 116, 6, '#', '', '', 1, 0, 'F', '0', '0', 'tool:gen:code', '#', NULL, NULL, NULL, NULL, NULL, NULL, '0', '0'); +INSERT INTO `sys_menu` VALUES (2429, '租户管理', 1, 10, 'tenant', NULL, NULL, 1, 0, 'M', '0', '0', NULL, 'people', NULL, NULL, NULL, NULL, NULL, NULL, '0', '0'); +INSERT INTO `sys_menu` VALUES (2430, '租户配置', 2429, 2, 'config', 'system/tenant/config', NULL, 1, 0, 'C', '0', '0', 'system:tenant:config', 'button', NULL, NULL, NULL, NULL, NULL, NULL, '0', '0'); +INSERT INTO `sys_menu` VALUES (2431, '租户管理', 2429, 1, 'system/tenant', 'system/tenant', NULL, 1, 0, 'C', '0', '0', 'system:tenant', 'button', NULL, NULL, NULL, NULL, NULL, NULL, '0', '0'); + +-- ---------------------------- +-- Table structure for sys_notice +-- ---------------------------- +DROP TABLE IF EXISTS `sys_notice`; +CREATE TABLE `sys_notice` ( + `notice_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '公告ID', + `notice_title` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '公告标题', + `notice_type` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '公告类型sys_notice_type字典(1通知 2公告)', + `notice_content` longblob NULL COMMENT '公告内容', + `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT '0' COMMENT '公告状态(0正常 1关闭)', + `read_status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT '0' COMMENT '阅读状态(0未阅读 1已阅读)', + `read_user` bigint(20) NULL DEFAULT NULL COMMENT '查看人', + `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL DEFAULT '0' COMMENT '删除标志(0代表存在 2代表删除)', + `create_dept` bigint(20) NULL DEFAULT NULL COMMENT '创建部门', + `create_by` bigint(20) NULL DEFAULT NULL COMMENT '创建人', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + `update_by` bigint(20) NULL DEFAULT NULL COMMENT '修改人', + `update_time` datetime NULL DEFAULT NULL COMMENT '修改时间', + `tenant_id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL DEFAULT '0', + `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '备注', + PRIMARY KEY (`notice_id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 4 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '通知公告表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of sys_notice +-- ---------------------------- +INSERT INTO `sys_notice` VALUES (1, '温馨提醒:2018-07-01 若依新版本发布啦', '2', 0xE696B0E78988E69CACE58685E5AEB9, '0', '0', NULL, '2', NULL, 1, '2023-07-08 16:37:25', 1, '2023-08-20 16:23:48', '0', '管理员'); +INSERT INTO `sys_notice` VALUES (2, '维护通知:2018-07-01 若依系统凌晨维护', '1', 0xE7BBB4E68AA4E58685E5AEB9, '0', '0', NULL, '2', NULL, 1, '2023-07-08 16:37:25', 1, '2023-08-20 16:23:50', '0', '管理员'); +INSERT INTO `sys_notice` VALUES (3, '关于账号的使用', '2', 0xE8B4A6E58FB7E4BDBFE794A8E8B4A6E58FB7E4BDBFE794A8E8B4A6E58FB7E4BDBFE794A8E8B4A6E58FB7E4BDBFE794A80AE8B4A6E58FB7E4BDBFE794A8E8B4A6E58FB7E4BDBFE794A8E8B4A6E58FB7E4BDBFE794A8E8B4A6E58FB7E4BDBFE794A80AE8B4A6E58FB7E4BDBFE794A8E8B4A6E58FB7E4BDBFE794A8E8B4A6E58FB7E4BDBFE794A8E8B4A6E58FB7E4BDBFE794A8E8B4A6E58FB7E4BDBFE794A8E8B4A6E58FB7E4BDBFE794A8E8B4A6E58FB7E4BDBFE794A8E8B4A6E58FB7E4BDBFE794A80AE8B4A6E58FB7E4BDBFE794A8E8B4A6E58FB7E4BDBFE794A8E8B4A6E58FB7E4BDBFE794A8E8B4A6E58FB7E4BDBFE794A8, '0', '0', NULL, '0', 103, 1, '2023-08-20 16:25:58', 1, '2023-08-21 16:26:10', '0', NULL); + +-- ---------------------------- +-- Table structure for sys_oper_log +-- ---------------------------- +DROP TABLE IF EXISTS `sys_oper_log`; +CREATE TABLE `sys_oper_log` ( + `oper_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '日志主键', + `title` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT '' COMMENT '模块标题', + `business_type` int(11) NULL DEFAULT 0 COMMENT '业务类型(0其它 1新增 2修改 3删除)', + `method` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT '' COMMENT '方法名称', + `request_method` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT '' COMMENT '请求方式', + `operator_type` int(11) NULL DEFAULT 0 COMMENT '操作类别(0其它 1后台用户 2手机端用户)', + `oper_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT '' COMMENT '操作人员', + `dept_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT '' COMMENT '部门名称', + `oper_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT '' COMMENT '请求URL', + `oper_ip` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT '' COMMENT '主机地址', + `oper_location` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT '' COMMENT '操作地点', + `oper_param` varchar(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT '' COMMENT '请求参数', + `json_result` varchar(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT '' COMMENT '返回参数', + `status` int(11) NULL DEFAULT 0 COMMENT '操作状态(0正常 1异常)', + `error_msg` varchar(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT '' COMMENT '错误消息', + `oper_time` datetime NULL DEFAULT NULL COMMENT '操作时间', + `cost_time` bigint(20) NULL DEFAULT 0 COMMENT '消耗时间', + PRIMARY KEY (`oper_id`) USING BTREE, + INDEX `idx_sys_oper_log_bt`(`business_type`) USING BTREE, + INDEX `idx_sys_oper_log_s`(`status`) USING BTREE, + INDEX `idx_sys_oper_log_ot`(`oper_time`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 4 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '操作日志记录' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of sys_oper_log +-- ---------------------------- +INSERT INTO `sys_oper_log` VALUES (2, '操作日志', 3, 'com.bs.web.controller.monitor.SysOperlogController.remove()', 'DELETE', 1, 'admin', NULL, '/monitor/operlog/1', '127.0.0.1', '内网IP', '{}', '{\"msg\":\"操作成功\",\"code\":200,\"state\":\"ok\"}', 0, NULL, '2024-04-05 23:56:04', 11); +INSERT INTO `sys_oper_log` VALUES (3, '登录日志', 9, 'com.bs.web.controller.monitor.SysLogininforController.clean()', 'DELETE', 1, 'admin', NULL, '/monitor/logininfor/clean', '127.0.0.1', '内网IP', '{}', '{\"msg\":\"操作成功\",\"code\":200,\"state\":\"ok\"}', 0, NULL, '2024-04-05 23:56:14', 18); + +-- ---------------------------- +-- Table structure for sys_post +-- ---------------------------- +DROP TABLE IF EXISTS `sys_post`; +CREATE TABLE `sys_post` ( + `post_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '岗位ID', + `post_code` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '岗位编码', + `post_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '岗位名称', + `post_sort` int(11) NOT NULL COMMENT '显示顺序', + `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '状态(0正常 1停用)', + `create_dept` bigint(20) NULL DEFAULT NULL COMMENT '创建部门', + `create_by` bigint(20) NULL DEFAULT NULL COMMENT '创建人', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + `update_by` bigint(20) NULL DEFAULT NULL COMMENT '修改人', + `update_time` datetime NULL DEFAULT NULL COMMENT '修改时间', + `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '备注', + `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT '0' COMMENT '删除标志(0代表存在 2代表删除)', + `tenant_id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL DEFAULT '0', + PRIMARY KEY (`post_id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 13 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '岗位信息表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of sys_post +-- ---------------------------- +INSERT INTO `sys_post` VALUES (1, 'ceo', '董事长', 1, '0', NULL, NULL, NULL, NULL, NULL, NULL, '0', '0'); +INSERT INTO `sys_post` VALUES (2, 'se', '项目经理', 2, '0', NULL, NULL, NULL, NULL, NULL, NULL, '0', '0'); +INSERT INTO `sys_post` VALUES (3, 'hr', '人力资源', 3, '0', NULL, NULL, NULL, NULL, NULL, NULL, '0', '0'); +INSERT INTO `sys_post` VALUES (4, 'user', '普通员工', 4, '0', NULL, NULL, NULL, NULL, NULL, NULL, '0', '0'); + +-- ---------------------------- +-- Table structure for sys_role +-- ---------------------------- +DROP TABLE IF EXISTS `sys_role`; +CREATE TABLE `sys_role` ( + `role_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '角色ID', + `role_name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '角色名称', + `role_key` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '角色权限字符串', + `role_sort` int(11) NOT NULL COMMENT '显示顺序', + `data_scope` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT '1' COMMENT '数据范围(1:全部数据权限 2:自定数据权限 3:本部门数据权限 4:本部门及以下数据权限)', + `menu_check_strictly` tinyint(1) NULL DEFAULT 1 COMMENT '菜单树选择项是否关联显示', + `dept_check_strictly` tinyint(1) NULL DEFAULT 1 COMMENT '部门树选择项是否关联显示', + `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '角色状态(0正常 1停用)', + `create_dept` bigint(20) NULL DEFAULT NULL COMMENT '创建部门', + `create_by` bigint(20) NULL DEFAULT NULL COMMENT '创建人', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + `update_by` bigint(20) NULL DEFAULT NULL COMMENT '修改人', + `update_time` datetime NULL DEFAULT NULL COMMENT '修改时间', + `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '备注', + `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT '0' COMMENT '删除标志(0代表存在 2代表删除)', + `tenant_id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL DEFAULT '0', + PRIMARY KEY (`role_id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 5 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '角色信息表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of sys_role +-- ---------------------------- +INSERT INTO `sys_role` VALUES (1, '超级管理员', 'admin', 1, '1', 1, 1, '0', NULL, NULL, NULL, NULL, NULL, NULL, '0', '0'); + +-- ---------------------------- +-- Table structure for sys_role_dept +-- ---------------------------- +DROP TABLE IF EXISTS `sys_role_dept`; +CREATE TABLE `sys_role_dept` ( + `role_id` bigint(20) NOT NULL COMMENT '角色ID', + `dept_id` bigint(20) NOT NULL COMMENT '部门ID', + PRIMARY KEY (`role_id`, `dept_id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '角色和部门关联表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of sys_role_dept +-- ---------------------------- +INSERT INTO `sys_role_dept` VALUES (2, 100); +INSERT INTO `sys_role_dept` VALUES (2, 101); +INSERT INTO `sys_role_dept` VALUES (2, 105); + +-- ---------------------------- +-- Table structure for sys_role_menu +-- ---------------------------- +DROP TABLE IF EXISTS `sys_role_menu`; +CREATE TABLE `sys_role_menu` ( + `role_id` bigint(20) NOT NULL COMMENT '角色ID', + `menu_id` bigint(20) NOT NULL COMMENT '菜单ID', + PRIMARY KEY (`role_id`, `menu_id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '角色和菜单关联表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of sys_role_menu +-- ---------------------------- + +-- ---------------------------- +-- Table structure for sys_tenant +-- ---------------------------- +DROP TABLE IF EXISTS `sys_tenant`; +CREATE TABLE `sys_tenant` ( + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '用户ID', + `name` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '租户名', + `simple_name` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '租户简名', + `area_code` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '行政区划', + `password` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '租户密码', + `user_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '租户账号', + `contact_user` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '联系人', + `contact_phone` varchar(40) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '联系电话', + `status` int(11) NOT NULL DEFAULT 1 COMMENT '状态,启用1,禁用0,即将过期2', + `create_dept` bigint(20) NULL DEFAULT NULL COMMENT '创建部门', + `create_by` bigint(20) NULL DEFAULT NULL COMMENT '创建人', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + `update_by` bigint(20) NULL DEFAULT NULL COMMENT '修改人', + `update_time` datetime NULL DEFAULT NULL COMMENT '修改时间', + `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '备注', + `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT '0' COMMENT '删除标志(0代表存在 2代表删除)', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 6 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '租户信息表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of sys_tenant +-- ---------------------------- +INSERT INTO `sys_tenant` VALUES (5, '福建泽昇物流有限公司', '泽昇物流', NULL, '12345678', 'zswladmin', '郑旭', '13960989026', 1, 103, 1, '2024-02-26 21:30:58', 1, '2024-04-01 22:04:34', '泽昇物流', '0'); + +-- ---------------------------- +-- Table structure for sys_user +-- ---------------------------- +DROP TABLE IF EXISTS `sys_user`; +CREATE TABLE `sys_user` ( + `user_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '用户ID', + `dept_id` bigint(20) NULL DEFAULT NULL COMMENT '部门ID', + `user_name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '用户账号', + `nick_name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '用户昵称', + `user_type` varchar(2) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT '00' COMMENT '用户类型(00系统用户)', + `email` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT '' COMMENT '用户邮箱', + `phonenumber` varchar(11) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT '' COMMENT '手机号码', + `sex` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT '0' COMMENT '用户性别(0男 1女 2未知)', + `avatar` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT '' COMMENT '头像地址', + `password` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT '' COMMENT '密码', + `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT '0' COMMENT '帐号状态(0正常 1停用)', + `login_ip` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT '' COMMENT '最后登录IP', + `login_date` datetime NULL DEFAULT NULL COMMENT '最后登录时间', + `is_tenant` char(1) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT 'N' COMMENT '是否是租户,Y是N,不是', + `is_tenant_admin` char(1) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT 'N' COMMENT '是否是租户管理员,Y是N,不是', + `create_dept` bigint(20) NULL DEFAULT NULL COMMENT '创建部门', + `create_by` bigint(20) NULL DEFAULT NULL COMMENT '创建人', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + `update_by` bigint(20) NULL DEFAULT NULL COMMENT '修改人', + `update_time` datetime NULL DEFAULT NULL COMMENT '修改时间', + `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '备注', + `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT '0' COMMENT '删除标志(0代表存在 2代表删除)', + `tenant_id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL DEFAULT '0', + PRIMARY KEY (`user_id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 5 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '用户信息表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of sys_user +-- ---------------------------- +INSERT INTO `sys_user` VALUES (1, 103, 'admin', '管理员', '00', 'ry@163.com', '15888888888', '1', '/profile/avatar/2024/04/02/blob_20240402223118A002.png', '$2a$10$M8IYdkyOoteEadENqqlkhOVJfynrlcqAQllFTSPRkWJYdNtetOW36', '0', '127.0.0.1', '2024-04-05 23:24:08', 'N', 'N', NULL, 1, '2023-07-08 16:37:23', NULL, '2024-04-05 23:24:08', '管理员', '0', '0'); +INSERT INTO `sys_user` VALUES (3, 100, 'test', '1111', '00', '1031040634@qq.com', '18659979259', '0', '', '$2a$10$pFSN/TgE33F67RFk7Npo1uS6eAbay9KSQOAfCywaZajATTIVbJCSa', '0', '', NULL, 'N', 'N', 103, 1, '2024-02-28 22:12:57', NULL, NULL, '123123', '0', '0'); + +-- ---------------------------- +-- Table structure for sys_user_post +-- ---------------------------- +DROP TABLE IF EXISTS `sys_user_post`; +CREATE TABLE `sys_user_post` ( + `user_id` bigint(20) NOT NULL COMMENT '用户ID', + `post_id` bigint(20) NOT NULL COMMENT '岗位ID', + PRIMARY KEY (`user_id`, `post_id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '用户与岗位关联表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of sys_user_post +-- ---------------------------- +INSERT INTO `sys_user_post` VALUES (1, 1); +INSERT INTO `sys_user_post` VALUES (2, 2); +INSERT INTO `sys_user_post` VALUES (1762843330462539778, 1); +INSERT INTO `sys_user_post` VALUES (1762843330462539780, 4); + +-- ---------------------------- +-- Table structure for sys_user_role +-- ---------------------------- +DROP TABLE IF EXISTS `sys_user_role`; +CREATE TABLE `sys_user_role` ( + `user_id` bigint(20) NOT NULL COMMENT '用户ID', + `role_id` bigint(20) NOT NULL COMMENT '角色ID', + PRIMARY KEY (`user_id`, `role_id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '用户和角色关联表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of sys_user_role +-- ---------------------------- +INSERT INTO `sys_user_role` VALUES (1, 1); + +-- ---------------------------- +-- Table structure for tenant_config +-- ---------------------------- +DROP TABLE IF EXISTS `tenant_config`; +CREATE TABLE `tenant_config` ( + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '用户ID', + `home_type` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '首页类型', + `start_data` date NULL DEFAULT NULL COMMENT '开始时间', + `stop_data` date NULL DEFAULT NULL COMMENT '结束时间', + `is_user_astrict` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '是否限制用户数', + `user_quantity` int(11) NULL DEFAULT NULL COMMENT '用户数', + `is_on_line` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '是否限制在线数', + `on_line_user_quantity` int(11) NULL DEFAULT NULL COMMENT '在线数', + `is_definition_name` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '是否定义系统名称', + `sys_name` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '系统名称', + `is_definition_logo` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '是否定义系统logo', + `sys_log` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '系统log', + `is_definition_hue` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '是否定义系统色调', + `sys_hue` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '系统色调', + `customization_fields` mediumtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '定制化数据,键值对{key:{type1:\"\",type2:\"\",value:\"\"},key2:{type1:\"\",type2:\"\",value:\"\"}}具体操作时候,做具体说明', + `create_dept` bigint(20) NULL DEFAULT NULL COMMENT '创建部门', + `create_by` bigint(20) NULL DEFAULT NULL COMMENT '创建人', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + `update_by` bigint(20) NULL DEFAULT NULL COMMENT '修改人', + `update_time` datetime NULL DEFAULT NULL COMMENT '修改时间', + `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '备注', + `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT '0' COMMENT '删除标志(0代表存在 2代表删除)', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 6 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '租户配置' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of tenant_config +-- ---------------------------- +INSERT INTO `tenant_config` VALUES (1, 'bulkCargo', '2024-04-02', '2029-11-29', 'N', 10, 'N', 10, 'Y', '福建泽昇物流有限公司', 'Y', '/profile/avatar/2024/04/02/blob_20240402204852A002.png', 'N', '#409EFF', NULL, 103, 1, '2024-04-02 20:22:23', 1, '2024-04-02 21:09:58', NULL, '2'); +INSERT INTO `tenant_config` VALUES (5, 'bulkCargo', '2024-04-02', '2024-04-30', 'N', 10, 'N', 10, 'Y', '福建泽昇物流有限公司', 'Y', '/profile/avatar/2024/04/02/blob_20240402211311A001.png', 'N', '#409EFF', NULL, 103, 1, '2024-04-02 21:10:51', 1, '2024-04-02 21:13:19', NULL, '0'); + +SET FOREIGN_KEY_CHECKS = 1;

2u!RKPW_4cK5Yy%SRbS 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 div + > .el-submenu + > .el-submenu__title + .el-submenu__icon-arrow { + display: none; +} + +.el-table .warning-row { + background: #faecd8; +} + +.el-table .danger-row { + background: #fde2e2; +} + +.el-table__body-wrapper { + z-index: 1; +} \ No newline at end of file diff --git a/bs-ui/src/assets/styles/element-variables.scss b/bs-ui/src/assets/styles/element-variables.scss new file mode 100644 index 0000000..1615ff2 --- /dev/null +++ b/bs-ui/src/assets/styles/element-variables.scss @@ -0,0 +1,31 @@ +/** +* I think element-ui's default theme color is too light for long-term use. +* So I modified the default color and you can modify it to your liking. +**/ + +/* theme color */ +$--color-primary: #1890ff; +$--color-success: #13ce66; +$--color-warning: #ffba00; +$--color-danger: #ff4949; +// $--color-info: #1E1E1E; + +$--button-font-weight: 400; + +// $--color-text-regular: #1f2d3d; + +$--border-color-light: #dfe4ed; +$--border-color-lighter: #e6ebf5; + +$--table-border: 1px solid #dfe6ec; + +/* icon font path, required */ +$--font-path: '~element-ui/lib/theme-chalk/fonts'; + +@import "~element-ui/packages/theme-chalk/src/index"; + +// the :export directive is the magic sauce for webpack +// https://www.bluematador.com/blog/how-to-share-variables-between-js-and-sass +:export { + theme: $--color-primary; +} diff --git a/bs-ui/src/assets/styles/index.scss b/bs-ui/src/assets/styles/index.scss new file mode 100644 index 0000000..91abce8 --- /dev/null +++ b/bs-ui/src/assets/styles/index.scss @@ -0,0 +1,187 @@ +@import './variables.scss'; +@import './mixin.scss'; +@import './transition.scss'; +@import './element-ui.scss'; +@import './sidebar.scss'; +@import './btn.scss'; +@import './edit.scss'; + +body { + height: 100%; + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + text-rendering: optimizeLegibility; + font-family: Helvetica Neue, Helvetica, PingFang SC, Hiragino Sans GB, Microsoft YaHei, Arial, sans-serif; +} + +label { + font-weight: 700; +} + +html { + height: 100%; + box-sizing: border-box; +} + +#app { + height: 100%; +} + +*, +*:before, +*:after { + box-sizing: inherit; +} + +.no-padding { + padding: 0px !important; +} + +.padding-content { + padding: 4px 0; +} + +a:focus, +a:active { + outline: none; +} + +a, +a:focus, +a:hover { + cursor: pointer; + color: inherit; + text-decoration: none; +} + +div:focus { + outline: none; +} + +.fr { + float: right; +} + +.fl { + float: left; +} + +.pr-5 { + padding-right: 5px; +} + +.pl-5 { + padding-left: 5px; +} + +.block { + display: block; +} + +.pointer { + cursor: pointer; +} + +.inlineBlock { + display: block; +} + +.clearfix { + &:after { + visibility: hidden; + display: block; + font-size: 0; + content: " "; + clear: both; + height: 0; + } +} + +aside { + background: #eef1f6; + padding: 8px 24px; + margin-bottom: 20px; + border-radius: 2px; + display: block; + line-height: 32px; + font-size: 16px; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; + color: #2c3e50; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + + a { + color: #337ab7; + cursor: pointer; + + &:hover { + color: rgb(32, 160, 255); + } + } +} + +//main-container全局样式 +.app-container { + padding: 20px; +} + +.components-container { + margin: 30px 50px; + position: relative; +} + +.pagination-container { + margin-top: 30px; +} + +.text-center { + text-align: center +} + +.sub-navbar { + height: 50px; + line-height: 50px; + position: relative; + width: 100%; + text-align: right; + padding-right: 20px; + transition: 600ms ease position; + background: linear-gradient(90deg, rgba(32, 182, 249, 1) 0%, rgba(32, 182, 249, 1) 0%, rgba(33, 120, 241, 1) 100%, rgba(33, 120, 241, 1) 100%); + + .subtitle { + font-size: 20px; + color: #fff; + } + + &.draft { + background: #d0d0d0; + } + + &.deleted { + background: #d0d0d0; + } +} + +.link-type, +.link-type:focus { + color: #337ab7; + cursor: pointer; + + &:hover { + color: rgb(32, 160, 255); + } +} + +.filter-container { + padding-bottom: 10px; + + .filter-item { + display: inline-block; + vertical-align: middle; + margin-bottom: 10px; + } +} + +.filter-input { + width: 160px !important; +} \ No newline at end of file diff --git a/bs-ui/src/assets/styles/mixin.scss b/bs-ui/src/assets/styles/mixin.scss new file mode 100644 index 0000000..06fa061 --- /dev/null +++ b/bs-ui/src/assets/styles/mixin.scss @@ -0,0 +1,66 @@ +@mixin clearfix { + &:after { + content: ""; + display: table; + clear: both; + } +} + +@mixin scrollBar { + &::-webkit-scrollbar-track-piece { + background: #d3dce6; + } + + &::-webkit-scrollbar { + width: 6px; + } + + &::-webkit-scrollbar-thumb { + background: #99a9bf; + border-radius: 20px; + } +} + +@mixin relative { + position: relative; + width: 100%; + height: 100%; +} + +@mixin pct($pct) { + width: #{$pct}; + position: relative; + margin: 0 auto; +} + +@mixin triangle($width, $height, $color, $direction) { + $width: $width/2; + $color-border-style: $height solid $color; + $transparent-border-style: $width solid transparent; + height: 0; + width: 0; + + @if $direction==up { + border-bottom: $color-border-style; + border-left: $transparent-border-style; + border-right: $transparent-border-style; + } + + @else if $direction==right { + border-left: $color-border-style; + border-top: $transparent-border-style; + border-bottom: $transparent-border-style; + } + + @else if $direction==down { + border-top: $color-border-style; + border-left: $transparent-border-style; + border-right: $transparent-border-style; + } + + @else if $direction==left { + border-right: $color-border-style; + border-top: $transparent-border-style; + border-bottom: $transparent-border-style; + } +} diff --git a/bs-ui/src/assets/styles/ruoyi.scss b/bs-ui/src/assets/styles/ruoyi.scss new file mode 100644 index 0000000..c3cdd9b --- /dev/null +++ b/bs-ui/src/assets/styles/ruoyi.scss @@ -0,0 +1,285 @@ + /** + * 通用css样式布局处理 + * Copyright (c) 2019 bs + */ + + /** 基础通用 **/ +.pt5 { + padding-top: 5px; +} +.pr5 { + padding-right: 5px; +} +.pb5 { + padding-bottom: 5px; +} +.mt5 { + margin-top: 5px; +} +.mr5 { + margin-right: 5px; +} +.mb5 { + margin-bottom: 5px; +} +.mb8 { + margin-bottom: 8px; +} +.ml5 { + margin-left: 5px; +} +.mt10 { + margin-top: 10px; +} +.mr10 { + margin-right: 10px; +} +.mb10 { + margin-bottom: 10px; +} +.ml10 { + margin-left: 10px; +} +.mt20 { + margin-top: 20px; +} +.mr20 { + margin-right: 20px; +} +.mb20 { + margin-bottom: 20px; +} +.ml20 { + margin-left: 20px; +} + +.h1, .h2, .h3, .h4, .h5, .h6, h1, h2, h3, h4, h5, h6 { + font-family: inherit; + font-weight: 500; + line-height: 1.1; + color: inherit; +} + +.el-message-box__status + .el-message-box__message{ + word-break: break-word; +} + +.el-dialog:not(.is-fullscreen) { + margin-top: 6vh !important; +} + +.el-dialog__wrapper.scrollbar .el-dialog .el-dialog__body { + overflow: auto; + overflow-x: hidden; + max-height: 70vh; + padding: 10px 20px 0; +} + +.el-table { + .el-table__header-wrapper, .el-table__fixed-header-wrapper { + th { + word-break: break-word; + background-color: #f8f8f9; + color: #515a6e; + height: 40px; + font-size: 13px; + } + } + .el-table__body-wrapper { + .el-button [class*="el-icon-"] + span { + margin-left: 1px; + } + } +} + +/** 表单布局 **/ +.form-header { + font-size:15px; + color:#6379bb; + border-bottom:1px solid #ddd; + margin:8px 10px 25px 10px; + padding-bottom:5px +} + +/** 表格布局 **/ +.pagination-container { + position: relative; + height: 25px; + margin-bottom: 10px; + margin-top: 15px; + padding: 5px 20px !important; +} + +/* tree border */ +.tree-border { + margin-top: 5px; + border: 1px solid #e5e6e7; + background: #FFFFFF none; + border-radius:4px; +} + +.pagination-container .el-pagination { + right: 0; + position: absolute; +} + +@media ( max-width : 768px) { + .pagination-container .el-pagination > .el-pagination__jump { + display: none !important; + } + .pagination-container .el-pagination > .el-pagination__sizes { + display: none !important; + } +} + +.el-table .fixed-width .el-button--mini { + padding-left: 0; + padding-right: 0; + width: inherit; +} + +/** 表格更多操作下拉样式 */ +.el-table .el-dropdown-link,.el-table .el-dropdown-selfdefine { + cursor: pointer; + margin-left: 5px; +} + +.el-table .el-dropdown, .el-icon-arrow-down { + font-size: 12px; +} + +.el-tree-node__content > .el-checkbox { + margin-right: 8px; +} + +.list-group-striped > .list-group-item { + border-left: 0; + border-right: 0; + border-radius: 0; + padding-left: 0; + padding-right: 0; +} + +.list-group { + padding-left: 0px; + list-style: none; +} + +.list-group-item { + border-bottom: 1px solid #e7eaec; + border-top: 1px solid #e7eaec; + margin-bottom: -1px; + padding: 11px 0px; + font-size: 13px; +} + +.pull-right { + float: right !important; +} + +.el-card__header { + padding: 14px 15px 7px; + min-height: 40px; +} + +.el-card__body { + padding: 15px 20px 20px 20px; +} + +.card-box { + padding-right: 15px; + padding-left: 15px; + margin-bottom: 10px; +} + +/* button color */ +.el-button--cyan.is-active, +.el-button--cyan:active { + background: #20B2AA; + border-color: #20B2AA; + color: #FFFFFF; +} + +.el-button--cyan:focus, +.el-button--cyan:hover { + background: #48D1CC; + border-color: #48D1CC; + color: #FFFFFF; +} + +.el-button--cyan { + background-color: #20B2AA; + border-color: #20B2AA; + color: #FFFFFF; +} + +/* text color */ +.text-normal { + color: #333333; +} + +.text-gray { + color: #666666; +} + +.text-navy { + color: #1ab394; +} + +.text-primary { + color: inherit; +} + +.text-success { + color: #1c84c6; +} + +.text-info { + color: #23c6c8; +} + +.text-warning { + color: #f8ac59; +} + +.text-danger { + color: #ed5565; +} + +.text-muted { + color: #888888; +} + +/* image */ +.img-circle { + border-radius: 50%; +} + +.img-lg { + width: 120px; + height: 120px; +} + +.avatar-upload-preview { + position: relative; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + width: 200px; + height: 200px; + border-radius: 50%; + box-shadow: 0 0 4px #ccc; + overflow: hidden; +} + +/* 拖拽列样式 */ +.sortable-ghost{ + opacity: .8; + color: #fff!important; + background: #42b983!important; +} + +.top-right-btn { + position: relative; + float: right; +} diff --git a/bs-ui/src/assets/styles/sidebar.scss b/bs-ui/src/assets/styles/sidebar.scss new file mode 100644 index 0000000..abe5b63 --- /dev/null +++ b/bs-ui/src/assets/styles/sidebar.scss @@ -0,0 +1,227 @@ +#app { + + .main-container { + height: 100%; + transition: margin-left .28s; + margin-left: $base-sidebar-width; + position: relative; + } + + .sidebarHide { + margin-left: 0!important; + } + + .sidebar-container { + -webkit-transition: width .28s; + transition: width 0.28s; + width: $base-sidebar-width !important; + background-color: $base-menu-background; + height: 100%; + position: fixed; + font-size: 0px; + top: 0; + bottom: 0; + left: 0; + z-index: 1001; + overflow: hidden; + -webkit-box-shadow: 2px 0 6px rgba(0,21,41,.35); + box-shadow: 2px 0 6px rgba(0,21,41,.35); + + // reset element-ui css + .horizontal-collapse-transition { + transition: 0s width ease-in-out, 0s padding-left ease-in-out, 0s padding-right ease-in-out; + } + + .scrollbar-wrapper { + overflow-x: hidden !important; + } + + .el-scrollbar__bar.is-vertical { + right: 0px; + } + + .el-scrollbar { + height: 100%; + } + + &.has-logo { + .el-scrollbar { + height: calc(100% - 50px); + } + } + + .is-horizontal { + display: none; + } + + a { + display: inline-block; + width: 100%; + overflow: hidden; + } + + .svg-icon { + margin-right: 16px; + } + + .el-menu { + border: none; + height: 100%; + width: 100% !important; + } + + .el-menu-item, .el-submenu__title { + overflow: hidden !important; + text-overflow: ellipsis !important; + white-space: nowrap !important; + } + + // menu hover + .submenu-title-noDropdown, + .el-submenu__title { + &:hover { + background-color: rgba(0, 0, 0, 0.06) !important; + } + } + + & .theme-dark .is-active > .el-submenu__title { + color: $base-menu-color-active !important; + } + + & .nest-menu .el-submenu>.el-submenu__title, + & .el-submenu .el-menu-item { + min-width: $base-sidebar-width !important; + + &:hover { + background-color: rgba(0, 0, 0, 0.06) !important; + } + } + + & .theme-dark .nest-menu .el-submenu>.el-submenu__title, + & .theme-dark .el-submenu .el-menu-item { + background-color: $base-sub-menu-background !important; + + &:hover { + background-color: $base-sub-menu-hover !important; + } + } + } + + .hideSidebar { + .sidebar-container { + width: 54px !important; + } + + .main-container { + margin-left: 54px; + } + + .submenu-title-noDropdown { + padding: 0 !important; + position: relative; + + .el-tooltip { + padding: 0 !important; + + .svg-icon { + margin-left: 20px; + } + } + } + + .el-submenu { + overflow: hidden; + + &>.el-submenu__title { + padding: 0 !important; + + .svg-icon { + margin-left: 20px; + } + + } + } + + .el-menu--collapse { + .el-submenu { + &>.el-submenu__title { + &>span { + height: 0; + width: 0; + overflow: hidden; + visibility: hidden; + display: inline-block; + } + } + } + } + } + + .el-menu--collapse .el-menu .el-submenu { + min-width: $base-sidebar-width !important; + } + + // mobile responsive + .mobile { + .main-container { + margin-left: 0px; + } + + .sidebar-container { + transition: transform .28s; + width: $base-sidebar-width !important; + } + + &.hideSidebar { + .sidebar-container { + pointer-events: none; + transition-duration: 0.3s; + transform: translate3d(-$base-sidebar-width, 0, 0); + } + } + } + + .withoutAnimation { + + .main-container, + .sidebar-container { + transition: none; + } + } +} + +// when menu collapsed +.el-menu--vertical { + &>.el-menu { + .svg-icon { + margin-right: 16px; + } + } + + .nest-menu .el-submenu>.el-submenu__title, + .el-menu-item { + &:hover { + // you can use $subMenuHover + background-color: rgba(0, 0, 0, 0.06) !important; + } + } + + // the scroll bar appears when the subMenu is too long + >.el-menu--popup { + max-height: 100vh; + overflow-y: auto; + + &::-webkit-scrollbar-track-piece { + background: #d3dce6; + } + + &::-webkit-scrollbar { + width: 6px; + } + + &::-webkit-scrollbar-thumb { + background: #99a9bf; + border-radius: 20px; + } + } +} diff --git a/bs-ui/src/assets/styles/transition.scss b/bs-ui/src/assets/styles/transition.scss new file mode 100644 index 0000000..073f8c6 --- /dev/null +++ b/bs-ui/src/assets/styles/transition.scss @@ -0,0 +1,49 @@ +// global transition css + +/* fade */ +.fade-enter-active, +.fade-leave-active { + transition: opacity 0.28s; +} + +.fade-enter, +.fade-leave-active { + opacity: 0; +} + +/* fade-transform */ +.fade-transform--move, +.fade-transform-leave-active, +.fade-transform-enter-active { + transition: all .5s; +} + +.fade-transform-enter { + opacity: 0; + transform: translateX(-30px); +} + +.fade-transform-leave-to { + opacity: 0; + transform: translateX(30px); +} + +/* breadcrumb transition */ +.breadcrumb-enter-active, +.breadcrumb-leave-active { + transition: all .5s; +} + +.breadcrumb-enter, +.breadcrumb-leave-active { + opacity: 0; + transform: translateX(20px); +} + +.breadcrumb-move { + transition: all .5s; +} + +.breadcrumb-leave-active { + position: absolute; +} diff --git a/bs-ui/src/assets/styles/variables.scss b/bs-ui/src/assets/styles/variables.scss new file mode 100644 index 0000000..0a61909 --- /dev/null +++ b/bs-ui/src/assets/styles/variables.scss @@ -0,0 +1,54 @@ +// base color +$blue:#324157; +$light-blue:#3A71A8; +$red:#C03639; +$pink: #E65D6E; +$green: #30B08F; +$tiffany: #4AB7BD; +$yellow:#FEC171; +$panGreen: #30B08F; + +// 默认菜单主题风格 +$base-menu-color:#bfcbd9; +$base-menu-color-active:#f4f4f5; +$base-menu-background:#304156; +$base-logo-title-color: #ffffff; + +$base-menu-light-color:rgba(0,0,0,.70); +$base-menu-light-background:#ffffff; +$base-logo-light-title-color: #001529; + +$base-sub-menu-background:#1f2d3d; +$base-sub-menu-hover:#001528; + +// 自定义暗色菜单风格 +/** +$base-menu-color:hsla(0,0%,100%,.65); +$base-menu-color-active:#fff; +$base-menu-background:#001529; +$base-logo-title-color: #ffffff; + +$base-menu-light-color:rgba(0,0,0,.70); +$base-menu-light-background:#ffffff; +$base-logo-light-title-color: #001529; + +$base-sub-menu-background:#000c17; +$base-sub-menu-hover:#001528; +*/ + +$base-sidebar-width: 220px; + +// the :export directive is the magic sauce for webpack +// https://www.bluematador.com/blog/how-to-share-variables-between-js-and-sass +:export { + menuColor: $base-menu-color; + menuLightColor: $base-menu-light-color; + menuColorActive: $base-menu-color-active; + menuBackground: $base-menu-background; + menuLightBackground: $base-menu-light-background; + subMenuBackground: $base-sub-menu-background; + subMenuHover: $base-sub-menu-hover; + sideBarWidth: $base-sidebar-width; + logoTitleColor: $base-logo-title-color; + logoLightTitleColor: $base-logo-light-title-color +} diff --git a/bs-ui/src/components/BillNumberInput/index.vue b/bs-ui/src/components/BillNumberInput/index.vue new file mode 100644 index 0000000..b7f0e67 --- /dev/null +++ b/bs-ui/src/components/BillNumberInput/index.vue @@ -0,0 +1,70 @@ + + + + + \ No newline at end of file diff --git a/bs-ui/src/components/Breadcrumb/index.vue b/bs-ui/src/components/Breadcrumb/index.vue new file mode 100644 index 0000000..1696f54 --- /dev/null +++ b/bs-ui/src/components/Breadcrumb/index.vue @@ -0,0 +1,74 @@ + + + + + diff --git a/bs-ui/src/components/Chain/SelectTable/ChainSelect.vue b/bs-ui/src/components/Chain/SelectTable/ChainSelect.vue new file mode 100644 index 0000000..c25624e --- /dev/null +++ b/bs-ui/src/components/Chain/SelectTable/ChainSelect.vue @@ -0,0 +1,109 @@ + + + + diff --git a/bs-ui/src/components/Chain/SelectTable/MultiSelectTable.vue b/bs-ui/src/components/Chain/SelectTable/MultiSelectTable.vue new file mode 100644 index 0000000..4148b1e --- /dev/null +++ b/bs-ui/src/components/Chain/SelectTable/MultiSelectTable.vue @@ -0,0 +1,393 @@ + + + + + diff --git a/bs-ui/src/components/Chain/SelectTable/SelectTable.vue b/bs-ui/src/components/Chain/SelectTable/SelectTable.vue new file mode 100644 index 0000000..1f729f1 --- /dev/null +++ b/bs-ui/src/components/Chain/SelectTable/SelectTable.vue @@ -0,0 +1,374 @@ + + + + + diff --git a/bs-ui/src/components/Crontab/day.vue b/bs-ui/src/components/Crontab/day.vue new file mode 100644 index 0000000..fe3eaf0 --- /dev/null +++ b/bs-ui/src/components/Crontab/day.vue @@ -0,0 +1,161 @@ + + + diff --git a/bs-ui/src/components/Crontab/hour.vue b/bs-ui/src/components/Crontab/hour.vue new file mode 100644 index 0000000..4b1f1fc --- /dev/null +++ b/bs-ui/src/components/Crontab/hour.vue @@ -0,0 +1,114 @@ + + + diff --git a/bs-ui/src/components/Crontab/index.vue b/bs-ui/src/components/Crontab/index.vue new file mode 100644 index 0000000..3963df2 --- /dev/null +++ b/bs-ui/src/components/Crontab/index.vue @@ -0,0 +1,430 @@ + + + + diff --git a/bs-ui/src/components/Crontab/min.vue b/bs-ui/src/components/Crontab/min.vue new file mode 100644 index 0000000..43cab90 --- /dev/null +++ b/bs-ui/src/components/Crontab/min.vue @@ -0,0 +1,116 @@ + + + \ No newline at end of file diff --git a/bs-ui/src/components/Crontab/month.vue b/bs-ui/src/components/Crontab/month.vue new file mode 100644 index 0000000..fd0ac38 --- /dev/null +++ b/bs-ui/src/components/Crontab/month.vue @@ -0,0 +1,114 @@ + + + diff --git a/bs-ui/src/components/Crontab/result.vue b/bs-ui/src/components/Crontab/result.vue new file mode 100644 index 0000000..aea6e0e --- /dev/null +++ b/bs-ui/src/components/Crontab/result.vue @@ -0,0 +1,559 @@ + + + diff --git a/bs-ui/src/components/Crontab/second.vue b/bs-ui/src/components/Crontab/second.vue new file mode 100644 index 0000000..e7b7761 --- /dev/null +++ b/bs-ui/src/components/Crontab/second.vue @@ -0,0 +1,117 @@ + + + diff --git a/bs-ui/src/components/Crontab/week.vue b/bs-ui/src/components/Crontab/week.vue new file mode 100644 index 0000000..1cec700 --- /dev/null +++ b/bs-ui/src/components/Crontab/week.vue @@ -0,0 +1,202 @@ + + + diff --git a/bs-ui/src/components/Crontab/year.vue b/bs-ui/src/components/Crontab/year.vue new file mode 100644 index 0000000..5487a6c --- /dev/null +++ b/bs-ui/src/components/Crontab/year.vue @@ -0,0 +1,131 @@ + + + diff --git a/bs-ui/src/components/DictData/index.js b/bs-ui/src/components/DictData/index.js new file mode 100644 index 0000000..7b85d4a --- /dev/null +++ b/bs-ui/src/components/DictData/index.js @@ -0,0 +1,49 @@ +import Vue from 'vue' +import store from '@/store' +import DataDict from '@/utils/dict' +import { getDicts as getDicts } from '@/api/system/dict/data' + +function searchDictByKey(dict, key) { + if (key == null && key == "") { + return null + } + try { + for (let i = 0; i < dict.length; i++) { + if (dict[i].key == key) { + return dict[i].value + } + } + } catch (e) { + return null + } +} + +function install() { + Vue.use(DataDict, { + metas: { + '*': { + labelField: 'dictLabel', + valueField: 'dictValue', + request(dictMeta) { + const storeDict = searchDictByKey(store.getters.dict, dictMeta.type) + if (storeDict) { + return new Promise(resolve => { resolve(storeDict) }) + } else { + return new Promise((resolve, reject) => { + getDicts(dictMeta.type).then(res => { + store.dispatch('dict/setDict', { key: dictMeta.type, value: res.data }) + resolve(res.data) + }).catch(error => { + reject(error) + }) + }) + } + }, + }, + }, + }) +} + +export default { + install, +} \ No newline at end of file diff --git a/bs-ui/src/components/DictTag/index.vue b/bs-ui/src/components/DictTag/index.vue new file mode 100644 index 0000000..dc962ef --- /dev/null +++ b/bs-ui/src/components/DictTag/index.vue @@ -0,0 +1,78 @@ + + + + diff --git a/bs-ui/src/components/Editor/index.vue b/bs-ui/src/components/Editor/index.vue new file mode 100644 index 0000000..6bb5a18 --- /dev/null +++ b/bs-ui/src/components/Editor/index.vue @@ -0,0 +1,272 @@ + + + + + diff --git a/bs-ui/src/components/FileGroupUpload/index.vue b/bs-ui/src/components/FileGroupUpload/index.vue new file mode 100644 index 0000000..58dfdbc --- /dev/null +++ b/bs-ui/src/components/FileGroupUpload/index.vue @@ -0,0 +1,320 @@ + + + + + diff --git a/bs-ui/src/components/FileUpload/index.vue b/bs-ui/src/components/FileUpload/index.vue new file mode 100644 index 0000000..6c583cf --- /dev/null +++ b/bs-ui/src/components/FileUpload/index.vue @@ -0,0 +1,215 @@ + + + + + diff --git a/bs-ui/src/components/Hamburger/index.vue b/bs-ui/src/components/Hamburger/index.vue new file mode 100644 index 0000000..368b002 --- /dev/null +++ b/bs-ui/src/components/Hamburger/index.vue @@ -0,0 +1,44 @@ + + + + + diff --git a/bs-ui/src/components/HeaderSearch/index.vue b/bs-ui/src/components/HeaderSearch/index.vue new file mode 100644 index 0000000..c4d76bb --- /dev/null +++ b/bs-ui/src/components/HeaderSearch/index.vue @@ -0,0 +1,189 @@ + + + + + diff --git a/bs-ui/src/components/IconSelect/index.vue b/bs-ui/src/components/IconSelect/index.vue new file mode 100644 index 0000000..8dadc02 --- /dev/null +++ b/bs-ui/src/components/IconSelect/index.vue @@ -0,0 +1,104 @@ + + + + + + diff --git a/bs-ui/src/components/IconSelect/requireIcons.js b/bs-ui/src/components/IconSelect/requireIcons.js new file mode 100644 index 0000000..99e5c54 --- /dev/null +++ b/bs-ui/src/components/IconSelect/requireIcons.js @@ -0,0 +1,11 @@ + +const req = require.context('../../assets/icons/svg', false, /\.svg$/) +const requireAll = requireContext => requireContext.keys() + +const re = /\.\/(.*)\.svg/ + +const icons = requireAll(req).map(i => { + return i.match(re)[1] +}) + +export default icons diff --git a/bs-ui/src/components/ImagePreview/index.vue b/bs-ui/src/components/ImagePreview/index.vue new file mode 100644 index 0000000..3c770c7 --- /dev/null +++ b/bs-ui/src/components/ImagePreview/index.vue @@ -0,0 +1,90 @@ + + + + + diff --git a/bs-ui/src/components/ImageUpload/index.vue b/bs-ui/src/components/ImageUpload/index.vue new file mode 100644 index 0000000..b57a15e --- /dev/null +++ b/bs-ui/src/components/ImageUpload/index.vue @@ -0,0 +1,226 @@ + + + + + diff --git a/bs-ui/src/components/MyFormItem/index.vue b/bs-ui/src/components/MyFormItem/index.vue new file mode 100644 index 0000000..8781945 --- /dev/null +++ b/bs-ui/src/components/MyFormItem/index.vue @@ -0,0 +1,35 @@ + + + + + \ No newline at end of file diff --git a/bs-ui/src/components/MyPage/index.vue b/bs-ui/src/components/MyPage/index.vue new file mode 100644 index 0000000..a9af338 --- /dev/null +++ b/bs-ui/src/components/MyPage/index.vue @@ -0,0 +1,56 @@ + + + + + \ No newline at end of file diff --git a/bs-ui/src/components/MySelectButton/index.vue b/bs-ui/src/components/MySelectButton/index.vue new file mode 100644 index 0000000..2e9d006 --- /dev/null +++ b/bs-ui/src/components/MySelectButton/index.vue @@ -0,0 +1,60 @@ + + + + + \ No newline at end of file diff --git a/bs-ui/src/components/Pagination/index.vue b/bs-ui/src/components/Pagination/index.vue new file mode 100644 index 0000000..56f5a6b --- /dev/null +++ b/bs-ui/src/components/Pagination/index.vue @@ -0,0 +1,114 @@ + + + + + diff --git a/bs-ui/src/components/PanThumb/index.vue b/bs-ui/src/components/PanThumb/index.vue new file mode 100644 index 0000000..1bcf417 --- /dev/null +++ b/bs-ui/src/components/PanThumb/index.vue @@ -0,0 +1,142 @@ + + + + + diff --git a/bs-ui/src/components/ParentView/index.vue b/bs-ui/src/components/ParentView/index.vue new file mode 100644 index 0000000..7bf6148 --- /dev/null +++ b/bs-ui/src/components/ParentView/index.vue @@ -0,0 +1,3 @@ + diff --git a/bs-ui/src/components/RightPanel/index.vue b/bs-ui/src/components/RightPanel/index.vue new file mode 100644 index 0000000..5abeecb --- /dev/null +++ b/bs-ui/src/components/RightPanel/index.vue @@ -0,0 +1,106 @@ + + + + + diff --git a/bs-ui/src/components/RightToolbar/index.vue b/bs-ui/src/components/RightToolbar/index.vue new file mode 100644 index 0000000..527e07c --- /dev/null +++ b/bs-ui/src/components/RightToolbar/index.vue @@ -0,0 +1,104 @@ + + + diff --git a/bs-ui/src/components/Rq/index.vue b/bs-ui/src/components/Rq/index.vue new file mode 100644 index 0000000..4bad071 --- /dev/null +++ b/bs-ui/src/components/Rq/index.vue @@ -0,0 +1,16 @@ + + + + + \ No newline at end of file diff --git a/bs-ui/src/components/Screenfull/index.vue b/bs-ui/src/components/Screenfull/index.vue new file mode 100644 index 0000000..d4e539c --- /dev/null +++ b/bs-ui/src/components/Screenfull/index.vue @@ -0,0 +1,57 @@ + + + + + diff --git a/bs-ui/src/components/SizeSelect/index.vue b/bs-ui/src/components/SizeSelect/index.vue new file mode 100644 index 0000000..069b5de --- /dev/null +++ b/bs-ui/src/components/SizeSelect/index.vue @@ -0,0 +1,56 @@ + + + diff --git a/bs-ui/src/components/SvgIcon/index.vue b/bs-ui/src/components/SvgIcon/index.vue new file mode 100644 index 0000000..e4bf5ad --- /dev/null +++ b/bs-ui/src/components/SvgIcon/index.vue @@ -0,0 +1,61 @@ + + + + + diff --git a/bs-ui/src/components/ThemePicker/index.vue b/bs-ui/src/components/ThemePicker/index.vue new file mode 100644 index 0000000..1714e1f --- /dev/null +++ b/bs-ui/src/components/ThemePicker/index.vue @@ -0,0 +1,173 @@ + + + + + diff --git a/bs-ui/src/components/TopNav/index.vue b/bs-ui/src/components/TopNav/index.vue new file mode 100644 index 0000000..9fb8dd8 --- /dev/null +++ b/bs-ui/src/components/TopNav/index.vue @@ -0,0 +1,191 @@ + + + + + diff --git a/bs-ui/src/components/WarehouseName/index.vue b/bs-ui/src/components/WarehouseName/index.vue new file mode 100644 index 0000000..c6b6b10 --- /dev/null +++ b/bs-ui/src/components/WarehouseName/index.vue @@ -0,0 +1,28 @@ + + + + + \ No newline at end of file diff --git a/bs-ui/src/components/iFrame/index.vue b/bs-ui/src/components/iFrame/index.vue new file mode 100644 index 0000000..426857f --- /dev/null +++ b/bs-ui/src/components/iFrame/index.vue @@ -0,0 +1,36 @@ + + + diff --git a/bs-ui/src/layout/components/Navbar.vue b/bs-ui/src/layout/components/Navbar.vue new file mode 100644 index 0000000..fab9711 --- /dev/null +++ b/bs-ui/src/layout/components/Navbar.vue @@ -0,0 +1,188 @@ + + + + + diff --git a/bs-ui/src/layout/components/Settings/index.vue b/bs-ui/src/layout/components/Settings/index.vue new file mode 100644 index 0000000..8b49842 --- /dev/null +++ b/bs-ui/src/layout/components/Settings/index.vue @@ -0,0 +1,260 @@ + + + + + diff --git a/bs-ui/src/layout/components/Sidebar/FixiOSBug.js b/bs-ui/src/layout/components/Sidebar/FixiOSBug.js new file mode 100644 index 0000000..6823726 --- /dev/null +++ b/bs-ui/src/layout/components/Sidebar/FixiOSBug.js @@ -0,0 +1,25 @@ +export default { + computed: { + device() { + return this.$store.state.app.device + } + }, + mounted() { + // In order to fix the click on menu on the ios device will trigger the mouseleave bug + this.fixBugIniOS() + }, + methods: { + fixBugIniOS() { + const $subMenu = this.$refs.subMenu + if ($subMenu) { + const handleMouseleave = $subMenu.handleMouseleave + $subMenu.handleMouseleave = (e) => { + if (this.device === 'mobile') { + return + } + handleMouseleave(e) + } + } + } + } +} diff --git a/bs-ui/src/layout/components/Sidebar/Item.vue b/bs-ui/src/layout/components/Sidebar/Item.vue new file mode 100644 index 0000000..be3285d --- /dev/null +++ b/bs-ui/src/layout/components/Sidebar/Item.vue @@ -0,0 +1,33 @@ + diff --git a/bs-ui/src/layout/components/Sidebar/Link.vue b/bs-ui/src/layout/components/Sidebar/Link.vue new file mode 100644 index 0000000..8b0bc93 --- /dev/null +++ b/bs-ui/src/layout/components/Sidebar/Link.vue @@ -0,0 +1,43 @@ + + + diff --git a/bs-ui/src/layout/components/Sidebar/Logo.vue b/bs-ui/src/layout/components/Sidebar/Logo.vue new file mode 100644 index 0000000..ea46103 --- /dev/null +++ b/bs-ui/src/layout/components/Sidebar/Logo.vue @@ -0,0 +1,115 @@ + + + + + diff --git a/bs-ui/src/layout/components/Sidebar/SidebarItem.vue b/bs-ui/src/layout/components/Sidebar/SidebarItem.vue new file mode 100644 index 0000000..4853fbb --- /dev/null +++ b/bs-ui/src/layout/components/Sidebar/SidebarItem.vue @@ -0,0 +1,100 @@ + + + diff --git a/bs-ui/src/layout/components/Sidebar/index.vue b/bs-ui/src/layout/components/Sidebar/index.vue new file mode 100644 index 0000000..51d0839 --- /dev/null +++ b/bs-ui/src/layout/components/Sidebar/index.vue @@ -0,0 +1,57 @@ + + + diff --git a/bs-ui/src/layout/components/TagsView/ScrollPane.vue b/bs-ui/src/layout/components/TagsView/ScrollPane.vue new file mode 100644 index 0000000..bb753a1 --- /dev/null +++ b/bs-ui/src/layout/components/TagsView/ScrollPane.vue @@ -0,0 +1,94 @@ + + + + + diff --git a/bs-ui/src/layout/components/TagsView/index.vue b/bs-ui/src/layout/components/TagsView/index.vue new file mode 100644 index 0000000..96585a5 --- /dev/null +++ b/bs-ui/src/layout/components/TagsView/index.vue @@ -0,0 +1,332 @@ + + + + + + + diff --git a/bs-ui/src/layout/components/index.js b/bs-ui/src/layout/components/index.js new file mode 100644 index 0000000..104bd3a --- /dev/null +++ b/bs-ui/src/layout/components/index.js @@ -0,0 +1,5 @@ +export { default as AppMain } from './AppMain' +export { default as Navbar } from './Navbar' +export { default as Settings } from './Settings' +export { default as Sidebar } from './Sidebar/index.vue' +export { default as TagsView } from './TagsView/index.vue' diff --git a/bs-ui/src/layout/index.vue b/bs-ui/src/layout/index.vue new file mode 100644 index 0000000..dba4393 --- /dev/null +++ b/bs-ui/src/layout/index.vue @@ -0,0 +1,111 @@ + + + + + diff --git a/bs-ui/src/layout/mixin/ResizeHandler.js b/bs-ui/src/layout/mixin/ResizeHandler.js new file mode 100644 index 0000000..e8d0df8 --- /dev/null +++ b/bs-ui/src/layout/mixin/ResizeHandler.js @@ -0,0 +1,45 @@ +import store from '@/store' + +const { body } = document +const WIDTH = 992 // refer to Bootstrap's responsive design + +export default { + watch: { + $route(route) { + if (this.device === 'mobile' && this.sidebar.opened) { + store.dispatch('app/closeSideBar', { withoutAnimation: false }) + } + } + }, + beforeMount() { + window.addEventListener('resize', this.$_resizeHandler) + }, + beforeDestroy() { + window.removeEventListener('resize', this.$_resizeHandler) + }, + mounted() { + const isMobile = this.$_isMobile() + if (isMobile) { + store.dispatch('app/toggleDevice', 'mobile') + store.dispatch('app/closeSideBar', { withoutAnimation: true }) + } + }, + methods: { + // use $_ for mixins properties + // https://vuejs.org/v2/style-guide/index.html#Private-property-names-essential + $_isMobile() { + const rect = body.getBoundingClientRect() + return rect.width - 1 < WIDTH + }, + $_resizeHandler() { + if (!document.hidden) { + const isMobile = this.$_isMobile() + store.dispatch('app/toggleDevice', isMobile ? 'mobile' : 'desktop') + + if (isMobile) { + store.dispatch('app/closeSideBar', { withoutAnimation: true }) + } + } + } + } +} diff --git a/bs-ui/src/main.js b/bs-ui/src/main.js new file mode 100644 index 0000000..c66afbf --- /dev/null +++ b/bs-ui/src/main.js @@ -0,0 +1,103 @@ +import Vue from 'vue' + +import Cookies from 'js-cookie' + +import Element from 'element-ui' +import './assets/styles/element-variables.scss' + +import '@/assets/styles/index.scss' // global css +import '@/assets/styles/ruoyi.scss' // bs css +import App from './App' +import store from './store' +import router from './router' +import directive from './directive' // directive +import plugins from './plugins' // plugins +import { download } from '@/utils/request' +import * as Validate from '@/utils/validate' +import Utils from '@/utils'; + +import './assets/icons' // icon +import './permission' // permission control +import { getDicts } from "@/api/system/dict/data"; +import { getConfigKey } from "@/api/system/config"; +import { parseTime, resetForm, addDateRange, selectDictLabel, selectDictLabels, handleTree,sortBy } from "@/utils/bs"; +// 分页组件 +import Pagination from "@/components/Pagination"; +// 自定义表格工具组件 +import RightToolbar from "@/components/RightToolbar" +// 富文本组件 +import Editor from "@/components/Editor" +// 文件上传组件 +import FileUpload from "@/components/FileUpload" +// 图片上传组件 +import ImageUpload from "@/components/ImageUpload" +// 图片预览组件 +import ImagePreview from "@/components/ImagePreview" +// 字典标签组件 +import DictTag from '@/components/DictTag' +// 头部标签组件 +import VueMeta from 'vue-meta' +// 字典数据组件 +import DictData from '@/components/DictData' +import WarehouseName from '@/components/WarehouseName'; +import BillNumberInput from '@/components/BillNumberInput'; +import Rq from '@/components/Rq'; +import MyPage from '@/components/MyPage'; +import MyFormItem from '@/components/MyFormItem'; +import MySelectButton from '@/components/MySelectButton'; + +// 全局方法挂载 +Vue.prototype.getDicts = getDicts +Vue.prototype.getConfigKey = getConfigKey +Vue.prototype.parseTime = parseTime +Vue.prototype.resetForm = resetForm +Vue.prototype.$sortBy = sortBy; +Vue.prototype.addDateRange = addDateRange +Vue.prototype.selectDictLabel = selectDictLabel +Vue.prototype.selectDictLabels = selectDictLabels +Vue.prototype.download = download +Vue.prototype.handleTree = handleTree +Vue.prototype.$utils = Utils +Vue.prototype.$validate = Validate + +// 全局组件挂载 +Vue.component('DictTag', DictTag) +Vue.component('Pagination', Pagination) +Vue.component('RightToolbar', RightToolbar) +Vue.component('Editor', Editor) +Vue.component('FileUpload', FileUpload) +Vue.component('ImageUpload', ImageUpload) +Vue.component('ImagePreview', ImagePreview) +Vue.component('WarehouseName', WarehouseName) +Vue.component('BillNumberInput', BillNumberInput) +Vue.component('Rq', Rq) +Vue.component('MyPage', MyPage) +Vue.component('MyFormItem', MyFormItem) +Vue.component('MySelectButton', MySelectButton) + +Vue.use(directive) +Vue.use(plugins) +Vue.use(VueMeta) +DictData.install() + +/** + * If you don't want to use mock-server + * you want to use MockJs for mock api + * you can execute: mockXHR() + * + * Currently MockJs will be used in the production environment, + * please remove it before going online! ! ! + */ + +Vue.use(Element, { + size: Cookies.get('size') || 'medium' // set element-ui default size +}) + +Vue.config.productionTip = false + +new Vue({ + el: '#app', + router, + store, + render: h => h(App) +}) diff --git a/bs-ui/src/permission.js b/bs-ui/src/permission.js new file mode 100644 index 0000000..609d215 --- /dev/null +++ b/bs-ui/src/permission.js @@ -0,0 +1,56 @@ +import router from './router' +import store from './store' +import { Message } from 'element-ui' +import NProgress from 'nprogress' +import 'nprogress/nprogress.css' +import { getToken } from '@/utils/auth' +import { isRelogin } from '@/utils/request' + +NProgress.configure({ showSpinner: false }) + +const whiteList = ['/login', '/register'] + +router.beforeEach((to, from, next) => { + NProgress.start() + if (getToken()) { + to.meta.title && store.dispatch('settings/setTitle', to.meta.title) + /* has token*/ + if (to.path === '/login') { + next({ path: '/' }) + NProgress.done() + } else { + if (store.getters.roles.length === 0) { + isRelogin.show = true + // 判断当前用户是否已拉取完user_info信息 + store.dispatch('GetInfo').then(() => { + isRelogin.show = false + store.dispatch('GenerateRoutes').then(accessRoutes => { + // 根据roles权限生成可访问的路由表 + router.addRoutes(accessRoutes) // 动态添加可访问路由表 + next({ ...to, replace: true }) // hack方法 确保addRoutes已完成 + }) + }).catch(err => { + store.dispatch('LogOut').then(() => { + Message.error(err) + next({ path: '/' }) + }) + }) + } else { + next() + } + } + } else { + // 没有token + if (whiteList.indexOf(to.path) !== -1) { + // 在免登录白名单,直接进入 + next() + } else { + next(`/login?redirect=${to.fullPath}`) // 否则全部重定向到登录页 + NProgress.done() + } + } +}) + +router.afterEach(() => { + NProgress.done() +}) diff --git a/bs-ui/src/plugins/auth.js b/bs-ui/src/plugins/auth.js new file mode 100644 index 0000000..6c6bc24 --- /dev/null +++ b/bs-ui/src/plugins/auth.js @@ -0,0 +1,60 @@ +import store from '@/store' + +function authPermission(permission) { + const all_permission = "*:*:*"; + const permissions = store.getters && store.getters.permissions + if (permission && permission.length > 0) { + return permissions.some(v => { + return all_permission === v || v === permission + }) + } else { + return false + } +} + +function authRole(role) { + const super_admin = "admin"; + const roles = store.getters && store.getters.roles + if (role && role.length > 0) { + return roles.some(v => { + return super_admin === v || v === role + }) + } else { + return false + } +} + +export default { + // 验证用户是否具备某权限 + hasPermi(permission) { + return authPermission(permission); + }, + // 验证用户是否含有指定权限,只需包含其中一个 + hasPermiOr(permissions) { + return permissions.some(item => { + return authPermission(item) + }) + }, + // 验证用户是否含有指定权限,必须全部拥有 + hasPermiAnd(permissions) { + return permissions.every(item => { + return authPermission(item) + }) + }, + // 验证用户是否具备某角色 + hasRole(role) { + return authRole(role); + }, + // 验证用户是否含有指定角色,只需包含其中一个 + hasRoleOr(roles) { + return roles.some(item => { + return authRole(item) + }) + }, + // 验证用户是否含有指定角色,必须全部拥有 + hasRoleAnd(roles) { + return roles.every(item => { + return authRole(item) + }) + } +} diff --git a/bs-ui/src/plugins/cache.js b/bs-ui/src/plugins/cache.js new file mode 100644 index 0000000..6b5c00b --- /dev/null +++ b/bs-ui/src/plugins/cache.js @@ -0,0 +1,77 @@ +const sessionCache = { + set (key, value) { + if (!sessionStorage) { + return + } + if (key != null && value != null) { + sessionStorage.setItem(key, value) + } + }, + get (key) { + if (!sessionStorage) { + return null + } + if (key == null) { + return null + } + return sessionStorage.getItem(key) + }, + setJSON (key, jsonValue) { + if (jsonValue != null) { + this.set(key, JSON.stringify(jsonValue)) + } + }, + getJSON (key) { + const value = this.get(key) + if (value != null) { + return JSON.parse(value) + } + }, + remove (key) { + sessionStorage.removeItem(key); + } +} +const localCache = { + set (key, value) { + if (!localStorage) { + return + } + if (key != null && value != null) { + localStorage.setItem(key, value) + } + }, + get (key) { + if (!localStorage) { + return null + } + if (key == null) { + return null + } + return localStorage.getItem(key) + }, + setJSON (key, jsonValue) { + if (jsonValue != null) { + this.set(key, JSON.stringify(jsonValue)) + } + }, + getJSON (key) { + const value = this.get(key) + if (value != null) { + return JSON.parse(value) + } + }, + remove (key) { + localStorage.removeItem(key); + } +} + +export default { + /** + * 会话级缓存 + */ + session: sessionCache, + /** + * 本地缓存 + */ + local: localCache +} diff --git a/bs-ui/src/plugins/download.js b/bs-ui/src/plugins/download.js new file mode 100644 index 0000000..0fd17c3 --- /dev/null +++ b/bs-ui/src/plugins/download.js @@ -0,0 +1,89 @@ +import axios from 'axios' +import { Message } from 'element-ui' +import { saveAs } from 'file-saver' +import { getToken } from '@/utils/auth' +import errorCode from '@/utils/errorCode' +import { blobValidate } from '@/utils/bs' + +const baseURL = process.env.VUE_APP_BASE_API + +export default { + name(name, isDelete = true) { + var url = baseURL + '/common/download?fileName=' + encodeURIComponent(name) + '&delete=' + isDelete + axios({ + method: 'get', + url: url, + responseType: 'blob', + headers: { 'Authorization': 'Bearer ' + getToken() } + }).then((res) => { + const isBlob = blobValidate(res.data) + if (isBlob) { + const blob = new Blob([res.data]) + this.saveAs(blob, decodeURIComponent(res.headers['download-filename'])) + } else { + this.printErrMsg(res.data) + } + }) + }, + attachId(attachId, fileName, isDelete = true) { + var url = baseURL + '/common/fileDownloadById?attachId=' + encodeURIComponent(attachId) + '&delete=' + isDelete + axios({ + method: 'get', + url: url, + responseType: 'blob', + headers: { 'Authorization': 'Bearer ' + getToken() } + }).then((res) => { + const isBlob = blobValidate(res.data) + if (isBlob) { + const blob = new Blob([res.data]) + this.saveAs(blob, fileName) + } else { + this.printErrMsg(res.data) + } + }) + }, + resource(resource) { + var url = baseURL + '/common/download/resource?resource=' + encodeURIComponent(resource) + axios({ + method: 'get', + url: url, + responseType: 'blob', + headers: { 'Authorization': 'Bearer ' + getToken() } + }).then((res) => { + const isBlob = blobValidate(res.data) + if (isBlob) { + const blob = new Blob([res.data]) + this.saveAs(blob, decodeURIComponent(res.headers['download-filename'])) + } else { + this.printErrMsg(res.data) + } + }) + }, + zip(url, name) { + var url = baseURL + url + axios({ + method: 'get', + url: url, + responseType: 'blob', + headers: { 'Authorization': 'Bearer ' + getToken() } + }).then((res) => { + const isBlob = blobValidate(res.data) + if (isBlob) { + const blob = new Blob([res.data], { type: 'application/zip' }) + this.saveAs(blob, name) + } else { + this.printErrMsg(res.data) + } + }) + }, + saveAs(text, name, opts) { + saveAs(text, name, opts) + }, + async printErrMsg(data) { + const resText = await data.text() + const rspObj = JSON.parse(resText) + const errMsg = errorCode[rspObj.code] || rspObj.msg || errorCode['default'] + Message.error(errMsg) + } +} + diff --git a/bs-ui/src/plugins/index.js b/bs-ui/src/plugins/index.js new file mode 100644 index 0000000..d000f2d --- /dev/null +++ b/bs-ui/src/plugins/index.js @@ -0,0 +1,20 @@ +import tab from './tab' +import auth from './auth' +import cache from './cache' +import modal from './modal' +import download from './download' + +export default { + install(Vue) { + // 页签操作 + Vue.prototype.$tab = tab + // 认证对象 + Vue.prototype.$auth = auth + // 缓存对象 + Vue.prototype.$cache = cache + // 模态框对象 + Vue.prototype.$modal = modal + // 下载文件 + Vue.prototype.$download = download + } +} diff --git a/bs-ui/src/plugins/modal.js b/bs-ui/src/plugins/modal.js new file mode 100644 index 0000000..bcc9ba0 --- /dev/null +++ b/bs-ui/src/plugins/modal.js @@ -0,0 +1,89 @@ +import { Message, MessageBox, Notification, Loading } from 'element-ui' + +let loadingInstance; + +export default { + // 消息提示 + msg(content) { + Message.info(content) + }, + // 错误消息 + msgError(content) { + Message.error(content) + }, + // 成功消息 + msgSuccess(content) { + Message.success(content) + }, + // 警告消息 + msgWarning(content) { + Message.warning(content) + }, + // 弹出提示 + alert(content) { + MessageBox.alert(content, "系统提示") + }, + // 错误提示 + alertError(content) { + MessageBox.alert(content, "系统提示", { type: 'error' }) + }, + // 成功提示 + alertSuccess(content) { + MessageBox.alert(content, "系统提示", { type: 'success' }) + }, + // 警告提示 + alertWarning(content) { + MessageBox.alert(content, "系统提示", { type: 'warning' }) + }, + // 通知提示 + notify(content) { + Notification.info(content) + }, + // 错误通知 + notifyError(content) { + Notification.error(content); + }, + // 成功通知 + notifySuccess(content) { + Notification.success(content) + }, + // 警告通知 + notifyWarning(content) { + Notification.warning(content) + }, + // 确认窗体 + confirm(content) { + return MessageBox.confirm(content, "系统提示", { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: "warning", + }) + }, + // 提交内容 + prompt(content) { + return MessageBox.prompt(content, "系统提示", { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: "warning", + }) + }, + // 打开遮罩层 + loading(content) { + loadingInstance = Loading.service({ + lock: true, + text: content, + spinner: "el-icon-loading", + background: "rgba(0, 0, 0, 0.7)", + }) + }, + // 关闭遮罩层 + closeLoading() { + loadingInstance.close(); + }, + // 表单警告消息 + formWarning(failRules) { + const key = Object.keys(failRules)[0]; + const message = failRules[key][0].message; + Message.warning(message); + }, +} diff --git a/bs-ui/src/plugins/tab.js b/bs-ui/src/plugins/tab.js new file mode 100644 index 0000000..b029c0e --- /dev/null +++ b/bs-ui/src/plugins/tab.js @@ -0,0 +1,71 @@ +import store from '@/store' +import router from '@/router'; + +export default { + // 刷新当前tab页签 + refreshPage(obj) { + const { path, query, matched } = router.currentRoute; + if (obj === undefined) { + matched.forEach((m) => { + if (m.components && m.components.default && m.components.default.name) { + if (!['Layout', 'ParentView'].includes(m.components.default.name)) { + obj = { name: m.components.default.name, path: path, query: query }; + } + } + }); + } + return store.dispatch('tagsView/delCachedView', obj).then(() => { + const { path, query } = obj + router.replace({ + path: '/redirect' + path, + query: query + }) + }) + }, + // 关闭当前tab页签,打开新页签 + closeOpenPage(obj) { + store.dispatch("tagsView/delView", router.currentRoute); + if (obj !== undefined) { + return router.push(obj); + } + }, + // 关闭指定tab页签 + closePage(obj) { + if (obj === undefined) { + return store.dispatch('tagsView/delView', router.currentRoute).then(({ visitedViews }) => { + const latestView = visitedViews.slice(-1)[0] + if (latestView) { + return router.push(latestView.fullPath) + } + return router.push('/'); + }); + } + return store.dispatch('tagsView/delView', obj); + }, + // 关闭所有tab页签 + closeAllPage() { + return store.dispatch('tagsView/delAllViews'); + }, + // 关闭左侧tab页签 + closeLeftPage(obj) { + return store.dispatch('tagsView/delLeftTags', obj || router.currentRoute); + }, + // 关闭右侧tab页签 + closeRightPage(obj) { + return store.dispatch('tagsView/delRightTags', obj || router.currentRoute); + }, + // 关闭其他tab页签 + closeOtherPage(obj) { + return store.dispatch('tagsView/delOthersViews', obj || router.currentRoute); + }, + // 添加tab页签 + openPage(title, url, params) { + var obj = { path: url, meta: { title: title } } + store.dispatch('tagsView/addView', obj); + return router.push({ path: url, query: params }); + }, + // 修改tab页签 + updatePage(obj) { + return store.dispatch('tagsView/updateVisitedView', obj); + } +} diff --git a/bs-ui/src/router/index.js b/bs-ui/src/router/index.js new file mode 100644 index 0000000..71907b6 --- /dev/null +++ b/bs-ui/src/router/index.js @@ -0,0 +1,183 @@ +import Vue from 'vue' +import Router from 'vue-router' + +Vue.use(Router) + +/* Layout */ +import Layout from '@/layout' + +/** + * Note: 路由配置项 + * + * hidden: true // 当设置 true 的时候该路由不会再侧边栏出现 如401,login等页面,或者如一些编辑页面/edit/1 + * alwaysShow: true // 当你一个路由下面的 children 声明的路由大于1个时,自动会变成嵌套的模式--如组件页面 + * // 只有一个时,会将那个子路由当做根路由显示在侧边栏--如引导页面 + * // 若你想不管路由下面的 children 声明的个数都显示你的根路由 + * // 你可以设置 alwaysShow: true,这样它就会忽略之前定义的规则,一直显示根路由 + * redirect: noRedirect // 当设置 noRedirect 的时候该路由在面包屑导航中不可被点击 + * name:'router-name' // 设定路由的名字,一定要填写不然使用时会出现各种问题 + * query: '{"id": 1, "name": "ry"}' // 访问路由的默认传递参数 + * roles: ['admin', 'common'] // 访问路由的角色权限 + * permissions: ['a:a:a', 'b:b:b'] // 访问路由的菜单权限 + * meta : { + noCache: true // 如果设置为true,则不会被 缓存(默认 false) + title: 'title' // 设置该路由在侧边栏和面包屑中展示的名字 + icon: 'svg-name' // 设置该路由的图标,对应路径src/assets/icons/svg + breadcrumb: false // 如果设置为false,则不会在breadcrumb面包屑中显示 + activeMenu: '/system/user' // 当路由设置了该属性,则会高亮相对应的侧边栏。 + } + */ + +// 公共路由 +export const constantRoutes = [ + { + path: '/redirect', + component: Layout, + hidden: true, + children: [ + { + path: '/redirect/:path(.*)', + component: () => import('@/views/redirect') + } + ] + }, + { + path: '/login', + component: () => import('@/views/login'), + hidden: true + }, + { + path: '/register', + component: () => import('@/views/register'), + hidden: true + }, + { + path: '/404', + component: () => import('@/views/error/404'), + hidden: true + }, + { + path: '/401', + component: () => import('@/views/error/401'), + hidden: true + }, + { + path: '', + component: Layout, + redirect: 'index', + children: [ + { + path: 'index', + component: () => import('@/views/index'), + name: 'Index', + meta: { title: '首页', icon: 'dashboard', affix: true } + } + ] + }, + { + path: '/user', + component: Layout, + hidden: true, + redirect: 'noredirect', + children: [ + { + path: 'profile', + component: () => import('@/views/system/user/profile/index'), + name: 'Profile', + meta: { title: '个人中心', icon: 'user' } + } + ] + } +] + +// 动态路由,基于用户权限动态去加载 +export const dynamicRoutes = [ + { + path: '/system/user-auth', + component: Layout, + hidden: true, + permissions: ['system:user:edit'], + children: [ + { + path: 'role/:userId(\\d+)', + component: () => import('@/views/system/user/authRole'), + name: 'AuthRole', + meta: { title: '分配角色', activeMenu: '/system/user' } + } + ] + }, + { + path: '/system/role-auth', + component: Layout, + hidden: true, + permissions: ['system:role:edit'], + children: [ + { + path: 'user/:roleId(\\d+)', + component: () => import('@/views/system/role/authUser'), + name: 'AuthUser', + meta: { title: '分配用户', activeMenu: '/system/role' } + } + ] + }, + { + path: '/system/dict-data', + component: Layout, + hidden: true, + permissions: ['system:dict:list'], + children: [ + { + path: 'index/:dictId(\\d+)', + component: () => import('@/views/system/dict/data'), + name: 'Data', + meta: { title: '字典数据', activeMenu: '/system/dict' } + } + ] + }, + { + path: '/monitor/job-log', + component: Layout, + hidden: true, + permissions: ['monitor:job:list'], + children: [ + { + path: 'index/:jobId(\\d+)', + component: () => import('@/views/monitor/job/log'), + name: 'JobLog', + meta: { title: '调度日志', activeMenu: '/monitor/job' } + } + ] + }, + { + path: '/tool/gen-edit', + component: Layout, + hidden: true, + permissions: ['tool:gen:edit'], + children: [ + { + path: 'index/:tableId(\\d+)', + component: () => import('@/views/tool/gen/editTable'), + name: 'GenEdit', + meta: { title: '修改生成配置', activeMenu: '/tool/gen' } + } + ] + } +] + +// 防止连续点击多次路由报错 +let routerPush = Router.prototype.push; +let routerReplace = Router.prototype.replace; +// push +Router.prototype.push = function push(location) { + return routerPush.call(this, location).catch(err => err) +} +// replace +Router.prototype.replace = function push(location) { + return routerReplace.call(this, location).catch(err => err) +} + +export default new Router({ + mode: 'history', // 去掉url中的# + scrollBehavior: () => ({ y: 0 }), + routes: constantRoutes +}) diff --git a/bs-ui/src/settings.js b/bs-ui/src/settings.js new file mode 100644 index 0000000..78a8bc1 --- /dev/null +++ b/bs-ui/src/settings.js @@ -0,0 +1,44 @@ +module.exports = { + /** + * 侧边栏主题 深色主题theme-dark,浅色主题theme-light + */ + sideTheme: 'theme-light', + + /** + * 是否系统布局配置 + */ + showSettings: false, + + /** + * 是否显示顶部导航 + */ + topNav: false, + + /** + * 是否显示 tagsView + */ + tagsView: true, + + /** + * 是否固定头部 + */ + fixedHeader: false, + + /** + * 是否显示logo + */ + sidebarLogo: true, + + /** + * 是否显示动态标题 + */ + dynamicTitle: false, + + /** + * @type {string | array} 'production' | ['production', 'development'] + * @description Need show err logs component. + * The default is only used in the production env + * If you want to also use it in dev, you can pass ['production', 'development'] + */ + errorLog: 'production' +} diff --git a/bs-ui/src/store/getters.js b/bs-ui/src/store/getters.js new file mode 100644 index 0000000..99d2cf2 --- /dev/null +++ b/bs-ui/src/store/getters.js @@ -0,0 +1,21 @@ +const getters = { + sidebar: state => state.app.sidebar, + size: state => state.app.size, + device: state => state.app.device, + dict: state => state.dict.dict, + visitedViews: state => state.tagsView.visitedViews, + cachedViews: state => state.tagsView.cachedViews, + token: state => state.user.token, + avatar: state => state.user.avatar, + name: state => state.user.name, + tenantConfig: state => state.user.tenantConfig, + introduction: state => state.user.introduction, + roles: state => state.user.roles, + permissions: state => state.user.permissions, + permission_routes: state => state.permission.routes, + topbarRouters:state => state.permission.topbarRouters, + defaultRoutes:state => state.permission.defaultRoutes, + sidebarRouters:state => state.permission.sidebarRouters, + warehouseData:state => state.warehouse.warehouse, +} +export default getters diff --git a/bs-ui/src/store/index.js b/bs-ui/src/store/index.js new file mode 100644 index 0000000..fa23991 --- /dev/null +++ b/bs-ui/src/store/index.js @@ -0,0 +1,27 @@ +import Vue from 'vue' +import Vuex from 'vuex' +import app from './modules/app' +import dict from './modules/dict' +import user from './modules/user' +import warehouse from './modules/warehouse' +import tagsView from './modules/tagsView' +import permission from './modules/permission' +import settings from './modules/settings' +import getters from './getters' + +Vue.use(Vuex) + +const store = new Vuex.Store({ + modules: { + app, + dict, + user, + tagsView, + permission, + settings, + warehouse + }, + getters +}) + +export default store diff --git a/bs-ui/src/store/modules/app.js b/bs-ui/src/store/modules/app.js new file mode 100644 index 0000000..3e22d1c --- /dev/null +++ b/bs-ui/src/store/modules/app.js @@ -0,0 +1,66 @@ +import Cookies from 'js-cookie' + +const state = { + sidebar: { + opened: Cookies.get('sidebarStatus') ? !!+Cookies.get('sidebarStatus') : true, + withoutAnimation: false, + hide: false + }, + device: 'desktop', + size: Cookies.get('size') || 'medium' +} + +const mutations = { + TOGGLE_SIDEBAR: state => { + if (state.sidebar.hide) { + return false; + } + state.sidebar.opened = !state.sidebar.opened + state.sidebar.withoutAnimation = false + if (state.sidebar.opened) { + Cookies.set('sidebarStatus', 1) + } else { + Cookies.set('sidebarStatus', 0) + } + }, + CLOSE_SIDEBAR: (state, withoutAnimation) => { + Cookies.set('sidebarStatus', 0) + state.sidebar.opened = false + state.sidebar.withoutAnimation = withoutAnimation + }, + TOGGLE_DEVICE: (state, device) => { + state.device = device + }, + SET_SIZE: (state, size) => { + state.size = size + Cookies.set('size', size) + }, + SET_SIDEBAR_HIDE: (state, status) => { + state.sidebar.hide = status + } +} + +const actions = { + toggleSideBar({ commit }) { + commit('TOGGLE_SIDEBAR') + }, + closeSideBar({ commit }, { withoutAnimation }) { + commit('CLOSE_SIDEBAR', withoutAnimation) + }, + toggleDevice({ commit }, device) { + commit('TOGGLE_DEVICE', device) + }, + setSize({ commit }, size) { + commit('SET_SIZE', size) + }, + toggleSideBarHide({ commit }, status) { + commit('SET_SIDEBAR_HIDE', status) + } +} + +export default { + namespaced: true, + state, + mutations, + actions +} diff --git a/bs-ui/src/store/modules/dict.js b/bs-ui/src/store/modules/dict.js new file mode 100644 index 0000000..f95bead --- /dev/null +++ b/bs-ui/src/store/modules/dict.js @@ -0,0 +1,50 @@ +const state = { + dict: new Array() +} +const mutations = { + SET_DICT: (state, { key, value }) => { + if (key !== null && key !== "") { + state.dict.push({ + key: key, + value: value + }) + } + }, + REMOVE_DICT: (state, key) => { + try { + for (let i = 0; i < state.dict.length; i++) { + if (state.dict[i].key == key) { + state.dict.splice(i, i) + return true + } + } + } catch (e) { + } + }, + CLEAN_DICT: (state) => { + state.dict = new Array() + } +} + +const actions = { + // 设置字典 + setDict({ commit }, data) { + commit('SET_DICT', data) + }, + // 删除字典 + removeDict({ commit }, key) { + commit('REMOVE_DICT', key) + }, + // 清空字典 + cleanDict({ commit }) { + commit('CLEAN_DICT') + } +} + +export default { + namespaced: true, + state, + mutations, + actions +} + diff --git a/bs-ui/src/store/modules/permission.js b/bs-ui/src/store/modules/permission.js new file mode 100644 index 0000000..2287665 --- /dev/null +++ b/bs-ui/src/store/modules/permission.js @@ -0,0 +1,133 @@ +import auth from '@/plugins/auth' +import router, { constantRoutes, dynamicRoutes } from '@/router' +import { getRouters } from '@/api/menu' +import Layout from '@/layout/index' +import ParentView from '@/components/ParentView' +import InnerLink from '@/layout/components/InnerLink' + +const permission = { + state: { + routes: [], + addRoutes: [], + defaultRoutes: [], + topbarRouters: [], + sidebarRouters: [] + }, + mutations: { + SET_ROUTES: (state, routes) => { + state.addRoutes = routes + state.routes = constantRoutes.concat(routes) + }, + SET_DEFAULT_ROUTES: (state, routes) => { + state.defaultRoutes = constantRoutes.concat(routes) + }, + SET_TOPBAR_ROUTES: (state, routes) => { + state.topbarRouters = routes + }, + SET_SIDEBAR_ROUTERS: (state, routes) => { + state.sidebarRouters = routes + }, + }, + actions: { + // 生成路由 + GenerateRoutes({ commit }) { + return new Promise(resolve => { + // 向后端请求路由数据 + getRouters().then(res => { + const sdata = JSON.parse(JSON.stringify(res.data)) + const rdata = JSON.parse(JSON.stringify(res.data)) + const sidebarRoutes = filterAsyncRouter(sdata) + const rewriteRoutes = filterAsyncRouter(rdata, false, true) + const asyncRoutes = filterDynamicRoutes(dynamicRoutes); + rewriteRoutes.push({ path: '*', redirect: '/404', hidden: true }) + router.addRoutes(asyncRoutes); + commit('SET_ROUTES', rewriteRoutes) + commit('SET_SIDEBAR_ROUTERS', constantRoutes.concat(sidebarRoutes)) + commit('SET_DEFAULT_ROUTES', sidebarRoutes) + commit('SET_TOPBAR_ROUTES', sidebarRoutes) + resolve(rewriteRoutes) + }) + }) + } + } +} + +// 遍历后台传来的路由字符串,转换为组件对象 +function filterAsyncRouter(asyncRouterMap, lastRouter = false, type = false) { + return asyncRouterMap.filter(route => { + if (type && route.children) { + route.children = filterChildren(route.children) + } + if (route.component) { + // Layout ParentView 组件特殊处理 + if (route.component === 'Layout') { + route.component = Layout + } else if (route.component === 'ParentView') { + route.component = ParentView + } else if (route.component === 'InnerLink') { + route.component = InnerLink + } else { + route.component = loadView(route.component) + } + } + if (route.children != null && route.children && route.children.length) { + route.children = filterAsyncRouter(route.children, route, type) + } else { + delete route['children'] + delete route['redirect'] + } + return true + }) +} + +function filterChildren(childrenMap, lastRouter = false) { + var children = [] + childrenMap.forEach((el, index) => { + if (el.children && el.children.length) { + if (el.component === 'ParentView' && !lastRouter) { + el.children.forEach(c => { + c.path = el.path + '/' + c.path + if (c.children && c.children.length) { + children = children.concat(filterChildren(c.children, c)) + return + } + children.push(c) + }) + return + } + } + if (lastRouter) { + el.path = lastRouter.path + '/' + el.path + } + children = children.concat(el) + }) + return children +} + +// 动态路由遍历,验证是否具备权限 +export function filterDynamicRoutes(routes) { + const res = [] + routes.forEach(route => { + if (route.permissions) { + if (auth.hasPermiOr(route.permissions)) { + res.push(route) + } + } else if (route.roles) { + if (auth.hasRoleOr(route.roles)) { + res.push(route) + } + } + }) + return res +} + +export const loadView = (view) => { + if (process.env.NODE_ENV === 'development') { + return (resolve) => require([`@/views/${view}`], resolve) + } else { + // 使用 import 实现生产环境的路由懒加载 + return () => import(`@/views/${view}`) + } +} + +export default permission diff --git a/bs-ui/src/store/modules/settings.js b/bs-ui/src/store/modules/settings.js new file mode 100644 index 0000000..2455a1e --- /dev/null +++ b/bs-ui/src/store/modules/settings.js @@ -0,0 +1,42 @@ +import defaultSettings from '@/settings' + +const { sideTheme, showSettings, topNav, tagsView, fixedHeader, sidebarLogo, dynamicTitle } = defaultSettings + +const storageSetting = JSON.parse(localStorage.getItem('layout-setting')) || '' +const state = { + title: '', + theme: storageSetting.theme || '#409EFF', + sideTheme: storageSetting.sideTheme || sideTheme, + showSettings: showSettings, + topNav: storageSetting.topNav === undefined ? topNav : storageSetting.topNav, + tagsView: storageSetting.tagsView === undefined ? tagsView : storageSetting.tagsView, + fixedHeader: storageSetting.fixedHeader === undefined ? fixedHeader : storageSetting.fixedHeader, + sidebarLogo: storageSetting.sidebarLogo === undefined ? sidebarLogo : storageSetting.sidebarLogo, + dynamicTitle: storageSetting.dynamicTitle === undefined ? dynamicTitle : storageSetting.dynamicTitle +} +const mutations = { + CHANGE_SETTING: (state, { key, value }) => { + if (state.hasOwnProperty(key)) { + state[key] = value + } + } +} + +const actions = { + // 修改布局设置 + changeSetting({ commit }, data) { + commit('CHANGE_SETTING', data) + }, + // 设置网页标题 + setTitle({ commit }, title) { + state.title = title + } +} + +export default { + namespaced: true, + state, + mutations, + actions +} + diff --git a/bs-ui/src/store/modules/tagsView.js b/bs-ui/src/store/modules/tagsView.js new file mode 100644 index 0000000..5fc011c --- /dev/null +++ b/bs-ui/src/store/modules/tagsView.js @@ -0,0 +1,228 @@ +const state = { + visitedViews: [], + cachedViews: [], + iframeViews: [] +} + +const mutations = { + ADD_IFRAME_VIEW: (state, view) => { + if (state.iframeViews.some(v => v.path === view.path)) return + state.iframeViews.push( + Object.assign({}, view, { + title: view.meta.title || 'no-name' + }) + ) + }, + ADD_VISITED_VIEW: (state, view) => { + if (state.visitedViews.some(v => v.path === view.path)) return + state.visitedViews.push( + Object.assign({}, view, { + title: view.meta.title || 'no-name' + }) + ) + }, + ADD_CACHED_VIEW: (state, view) => { + if (state.cachedViews.includes(view.name)) return + if (view.meta && !view.meta.noCache) { + state.cachedViews.push(view.name) + } + }, + DEL_VISITED_VIEW: (state, view) => { + for (const [i, v] of state.visitedViews.entries()) { + if (v.path === view.path) { + state.visitedViews.splice(i, 1) + break + } + } + state.iframeViews = state.iframeViews.filter(item => item.path !== view.path) + }, + DEL_IFRAME_VIEW: (state, view) => { + state.iframeViews = state.iframeViews.filter(item => item.path !== view.path) + }, + DEL_CACHED_VIEW: (state, view) => { + const index = state.cachedViews.indexOf(view.name) + index > -1 && state.cachedViews.splice(index, 1) + }, + + DEL_OTHERS_VISITED_VIEWS: (state, view) => { + state.visitedViews = state.visitedViews.filter(v => { + return v.meta.affix || v.path === view.path + }) + state.iframeViews = state.iframeViews.filter(item => item.path === view.path) + }, + DEL_OTHERS_CACHED_VIEWS: (state, view) => { + const index = state.cachedViews.indexOf(view.name) + if (index > -1) { + state.cachedViews = state.cachedViews.slice(index, index + 1) + } else { + state.cachedViews = [] + } + }, + DEL_ALL_VISITED_VIEWS: state => { + // keep affix tags + const affixTags = state.visitedViews.filter(tag => tag.meta.affix) + state.visitedViews = affixTags + state.iframeViews = [] + }, + DEL_ALL_CACHED_VIEWS: state => { + state.cachedViews = [] + }, + UPDATE_VISITED_VIEW: (state, view) => { + for (let v of state.visitedViews) { + if (v.path === view.path) { + v = Object.assign(v, view) + break + } + } + }, + DEL_RIGHT_VIEWS: (state, view) => { + const index = state.visitedViews.findIndex(v => v.path === view.path) + if (index === -1) { + return + } + state.visitedViews = state.visitedViews.filter((item, idx) => { + if (idx <= index || (item.meta && item.meta.affix)) { + return true + } + const i = state.cachedViews.indexOf(item.name) + if (i > -1) { + state.cachedViews.splice(i, 1) + } + if(item.meta.link) { + const fi = state.iframeViews.findIndex(v => v.path === item.path) + state.iframeViews.splice(fi, 1) + } + return false + }) + }, + DEL_LEFT_VIEWS: (state, view) => { + const index = state.visitedViews.findIndex(v => v.path === view.path) + if (index === -1) { + return + } + state.visitedViews = state.visitedViews.filter((item, idx) => { + if (idx >= index || (item.meta && item.meta.affix)) { + return true + } + const i = state.cachedViews.indexOf(item.name) + if (i > -1) { + state.cachedViews.splice(i, 1) + } + if(item.meta.link) { + const fi = state.iframeViews.findIndex(v => v.path === item.path) + state.iframeViews.splice(fi, 1) + } + return false + }) + } +} + +const actions = { + addView({ dispatch }, view) { + dispatch('addVisitedView', view) + dispatch('addCachedView', view) + }, + addIframeView({ commit }, view) { + commit('ADD_IFRAME_VIEW', view) + }, + addVisitedView({ commit }, view) { + commit('ADD_VISITED_VIEW', view) + }, + addCachedView({ commit }, view) { + commit('ADD_CACHED_VIEW', view) + }, + delView({ dispatch, state }, view) { + return new Promise(resolve => { + dispatch('delVisitedView', view) + dispatch('delCachedView', view) + resolve({ + visitedViews: [...state.visitedViews], + cachedViews: [...state.cachedViews] + }) + }) + }, + delVisitedView({ commit, state }, view) { + return new Promise(resolve => { + commit('DEL_VISITED_VIEW', view) + resolve([...state.visitedViews]) + }) + }, + delIframeView({ commit, state }, view) { + return new Promise(resolve => { + commit('DEL_IFRAME_VIEW', view) + resolve([...state.iframeViews]) + }) + }, + delCachedView({ commit, state }, view) { + return new Promise(resolve => { + commit('DEL_CACHED_VIEW', view) + resolve([...state.cachedViews]) + }) + }, + delOthersViews({ dispatch, state }, view) { + return new Promise(resolve => { + dispatch('delOthersVisitedViews', view) + dispatch('delOthersCachedViews', view) + resolve({ + visitedViews: [...state.visitedViews], + cachedViews: [...state.cachedViews] + }) + }) + }, + delOthersVisitedViews({ commit, state }, view) { + return new Promise(resolve => { + commit('DEL_OTHERS_VISITED_VIEWS', view) + resolve([...state.visitedViews]) + }) + }, + delOthersCachedViews({ commit, state }, view) { + return new Promise(resolve => { + commit('DEL_OTHERS_CACHED_VIEWS', view) + resolve([...state.cachedViews]) + }) + }, + delAllViews({ dispatch, state }, view) { + return new Promise(resolve => { + dispatch('delAllVisitedViews', view) + dispatch('delAllCachedViews', view) + resolve({ + visitedViews: [...state.visitedViews], + cachedViews: [...state.cachedViews] + }) + }) + }, + delAllVisitedViews({ commit, state }) { + return new Promise(resolve => { + commit('DEL_ALL_VISITED_VIEWS') + resolve([...state.visitedViews]) + }) + }, + delAllCachedViews({ commit, state }) { + return new Promise(resolve => { + commit('DEL_ALL_CACHED_VIEWS') + resolve([...state.cachedViews]) + }) + }, + updateVisitedView({ commit }, view) { + commit('UPDATE_VISITED_VIEW', view) + }, + delRightTags({ commit }, view) { + return new Promise(resolve => { + commit('DEL_RIGHT_VIEWS', view) + resolve([...state.visitedViews]) + }) + }, + delLeftTags({ commit }, view) { + return new Promise(resolve => { + commit('DEL_LEFT_VIEWS', view) + resolve([...state.visitedViews]) + }) + }, +} + +export default { + namespaced: true, + state, + mutations, + actions +} diff --git a/bs-ui/src/store/modules/user.js b/bs-ui/src/store/modules/user.js new file mode 100644 index 0000000..ca7a64e --- /dev/null +++ b/bs-ui/src/store/modules/user.js @@ -0,0 +1,101 @@ +import { login, logout, getInfo } from '@/api/login' +import { getToken, setToken, removeToken } from '@/utils/auth' + +const user = { + state: { + token: getToken(), + name: '', + avatar: '', + roles: [], + permissions: [], + tenantConfig: {}, //租户配置 + }, + + mutations: { + SET_TOKEN: (state, token) => { + state.token = token + }, + SET_NAME: (state, name) => { + state.name = name + }, + SET_AVATAR: (state, avatar) => { + state.avatar = avatar + }, + SET_ROLES: (state, roles) => { + state.roles = roles + }, + SET_PERMISSIONS: (state, permissions) => { + state.permissions = permissions + }, + SET_TENANT_CONFIG: (state, tenantConfig) => { + state.tenantConfig = tenantConfig || {} + } + }, + + actions: { + // 登录 + Login({ commit }, userInfo) { + const username = userInfo.username.trim() + const password = userInfo.password + const code = userInfo.code + const uuid = userInfo.uuid + return new Promise((resolve, reject) => { + login(username, password, code, uuid).then(res => { + setToken(res.token) + commit('SET_TOKEN', res.token) + resolve() + }).catch(error => { + reject(error) + }) + }) + }, + + // 获取用户信息 + GetInfo({ commit, state }) { + return new Promise((resolve, reject) => { + getInfo().then(res => { + const user = res.user + const avatar = (user.avatar == "" || user.avatar == null) ? require("@/assets/images/profile.jpg") : process.env.VUE_APP_BASE_API + user.avatar; + if (res.roles && res.roles.length > 0) { // 验证返回的roles是否是一个非空数组 + commit('SET_ROLES', res.roles) + commit('SET_PERMISSIONS', res.permissions) + } else { + commit('SET_ROLES', ['ROLE_DEFAULT']) + } + commit('SET_NAME', user.userName) + commit('SET_AVATAR', avatar) + commit('SET_TENANT_CONFIG', res.tenantConfig) + resolve(res) + }).catch(error => { + reject(error) + }) + }) + }, + + // 退出系统 + LogOut({ commit, state }) { + return new Promise((resolve, reject) => { + logout(state.token).then(() => { + commit('SET_TOKEN', '') + commit('SET_ROLES', []) + commit('SET_PERMISSIONS', []) + removeToken() + resolve() + }).catch(error => { + reject(error) + }) + }) + }, + + // 前端 登出 + FedLogOut({ commit }) { + return new Promise(resolve => { + commit('SET_TOKEN', '') + removeToken() + resolve() + }) + } + } +} + +export default user diff --git a/bs-ui/src/store/modules/warehouse.js b/bs-ui/src/store/modules/warehouse.js new file mode 100644 index 0000000..28c63ac --- /dev/null +++ b/bs-ui/src/store/modules/warehouse.js @@ -0,0 +1,66 @@ +import { listWarehouse } from "@/api/jxc/warehouse"; + +const state = { + warehouse: {}, + warehouseList: [], + loading: false, +} +const mutations = { + SET_WAREHOUSE: (state, warehouse) => { + state.warehouse = warehouse; + }, + SET_WAREHOUSE_LIST: (state, warehouseList) => { + state.warehouseList = warehouseList; + }, + SET_LOADING: (state, loading) => { + state.loading = loading; + }, +} + +const actions = { + setWarehouse({ commit, state }, data) { + if (data) { + commit('SET_WAREHOUSE_LIST', data); + const obj = {}; + data.forEach(node => { + if (node.stockCode) { + obj[node.stockCode] = node; + } + }); + commit('SET_WAREHOUSE', obj); + } + + }, + getWarehouse({ commit, state }, data) { + if (state.loading || state.warehouseList.length > 0) { + return; + } + commit('SET_LOADING', true); + listWarehouse().then(res => { + if (res.data) { + commit('SET_WAREHOUSE_LIST', res.data || []); + + if (res.data) { + const obj = {}; + res.data.forEach(node => { + if (node.stockCode) { + obj[node.stockCode] = node; + } + }); + commit('SET_WAREHOUSE', obj); + } + + } + commit('SET_LOADING', false); + }).catch(e => { + commit('SET_LOADING', false); + }); + } +} + +export default { + namespaced: true, + state, + mutations, + actions +} \ No newline at end of file diff --git a/bs-ui/src/utils/auth.js b/bs-ui/src/utils/auth.js new file mode 100644 index 0000000..08a43d6 --- /dev/null +++ b/bs-ui/src/utils/auth.js @@ -0,0 +1,15 @@ +import Cookies from 'js-cookie' + +const TokenKey = 'Admin-Token' + +export function getToken() { + return Cookies.get(TokenKey) +} + +export function setToken(token) { + return Cookies.set(TokenKey, token) +} + +export function removeToken() { + return Cookies.remove(TokenKey) +} diff --git a/bs-ui/src/utils/bs.js b/bs-ui/src/utils/bs.js new file mode 100644 index 0000000..179bcaf --- /dev/null +++ b/bs-ui/src/utils/bs.js @@ -0,0 +1,249 @@ + + +/** + * 通用js方法封装处理 + * Copyright (c) 2019 bs + */ + +// 日期格式化 +export function parseTime(time, pattern) { + if (arguments.length === 0 || !time) { + return null + } + const format = pattern || '{y}-{m}-{d} {h}:{i}:{s}' + let date + if (typeof time === 'object') { + date = time + } else { + if ((typeof time === 'string') && (/^[0-9]+$/.test(time))) { + time = parseInt(time) + } else if (typeof time === 'string') { + time = time.replace(new RegExp(/-/gm), '/').replace('T', ' ').replace(new RegExp(/\.[\d]{3}/gm), ''); + } + if ((typeof time === 'number') && (time.toString().length === 10)) { + time = time * 1000 + } + date = new Date(time) + } + const formatObj = { + y: date.getFullYear(), + m: date.getMonth() + 1, + d: date.getDate(), + h: date.getHours(), + i: date.getMinutes(), + s: date.getSeconds(), + a: date.getDay() + } + const time_str = format.replace(/{(y|m|d|h|i|s|a)+}/g, (result, key) => { + let value = formatObj[key] + // Note: getDay() returns 0 on Sunday + if (key === 'a') { return ['日', '一', '二', '三', '四', '五', '六'][value] } + if (result.length > 0 && value < 10) { + value = '0' + value + } + return value || 0 + }) + return time_str +} + +// 表单重置 +export function resetForm(refName) { + if (this.$refs[refName]) { + this.$refs[refName].resetFields(); + } +} + +// 添加日期范围 +export function addDateRange(params, dateRange, propName) { + let search = params; + search.params = typeof (search.params) === 'object' && search.params !== null && !Array.isArray(search.params) ? search.params : {}; + dateRange = Array.isArray(dateRange) ? dateRange : []; + if (typeof (propName) === 'undefined') { + search.params['beginTime'] = dateRange[0]; + search.params['endTime'] = dateRange[1]; + } else { + search.params['begin' + propName] = dateRange[0]; + search.params['end' + propName] = dateRange[1]; + } + return search; +} + +// 回显数据字典 +export function selectDictLabel(datas, value) { + if (value === undefined) { + return ""; + } + var actions = []; + Object.keys(datas).some((key) => { + if (datas[key].value == ('' + value)) { + actions.push(datas[key].label); + return true; + } + }) + if (actions.length === 0) { + actions.push(value); + } + return actions.join(''); +} + +// 回显数据字典(字符串、数组) +export function selectDictLabels(datas, value, separator) { + if (value === undefined || value.length ===0) { + return ""; + } + if (Array.isArray(value)) { + value = value.join(","); + } + var actions = []; + var currentSeparator = undefined === separator ? "," : separator; + var temp = value.split(currentSeparator); + Object.keys(value.split(currentSeparator)).some((val) => { + var match = false; + Object.keys(datas).some((key) => { + if (datas[key].value == ('' + temp[val])) { + actions.push(datas[key].label + currentSeparator); + match = true; + } + }) + if (!match) { + actions.push(temp[val] + currentSeparator); + } + }) + return actions.join('').substring(0, actions.join('').length - 1); +} + +// 字符串格式化(%s ) +export function sprintf(str) { + var args = arguments, flag = true, i = 1; + str = str.replace(/%s/g, function () { + var arg = args[i++]; + if (typeof arg === 'undefined') { + flag = false; + return ''; + } + return arg; + }); + return flag ? str : ''; +} + +// 转换字符串,undefined,null等转化为"" +export function parseStrEmpty(str) { + if (!str || str == "undefined" || str == "null") { + return ""; + } + return str; +} + +// 数据合并 +export function mergeRecursive(source, target) { + for (var p in target) { + try { + if (target[p].constructor == Object) { + source[p] = mergeRecursive(source[p], target[p]); + } else { + source[p] = target[p]; + } + } catch (e) { + source[p] = target[p]; + } + } + return source; +}; +/** + * 获取排序字段 + * @param col + * @param sortBy + */ +export function sortBy(col, sortBy) { + if (col.order === "ascending") { + sortBy.orderByColumn = col.prop; + sortBy.isAsc = "ASC"; + } else if (col.order === "descending") { + sortBy.orderByColumn = col.prop; + sortBy.isAsc = "DESC"; + } else if (col.order == null) { + sortBy.orderByColumn = null; + sortBy.isAsc = null; + } +} +/** + * 构造树型结构数据 + * @param {*} data 数据源 + * @param {*} id id字段 默认 'id' + * @param {*} parentId 父节点字段 默认 'parentId' + * @param {*} children 孩子节点字段 默认 'children' + */ +export function handleTree(data, id, parentId, children) { + let config = { + id: id || 'id', + parentId: parentId || 'parentId', + childrenList: children || 'children' + }; + + var childrenListMap = {}; + var nodeIds = {}; + var tree = []; + + for (let d of data) { + let parentId = d[config.parentId]; + if (childrenListMap[parentId] == null) { + childrenListMap[parentId] = []; + } + nodeIds[d[config.id]] = d; + childrenListMap[parentId].push(d); + } + + for (let d of data) { + let parentId = d[config.parentId]; + if (nodeIds[parentId] == null) { + tree.push(d); + } + } + + for (let t of tree) { + adaptToChildrenList(t); + } + + function adaptToChildrenList(o) { + if (childrenListMap[o[config.id]] !== null) { + o[config.childrenList] = childrenListMap[o[config.id]]; + } + if (o[config.childrenList]) { + for (let c of o[config.childrenList]) { + adaptToChildrenList(c); + } + } + } + return tree; +} + +/** +* 参数处理 +* @param {*} params 参数 +*/ +export function tansParams(params) { + let result = '' + for (const propName of Object.keys(params)) { + const value = params[propName]; + var part = encodeURIComponent(propName) + "="; + if (value !== null && value !== "" && typeof (value) !== "undefined") { + if (typeof value === 'object') { + for (const key of Object.keys(value)) { + if (value[key] !== null && value[key] !== "" && typeof (value[key]) !== 'undefined') { + let params = propName + '[' + key + ']'; + var subPart = encodeURIComponent(params) + "="; + result += subPart + encodeURIComponent(value[key]) + "&"; + } + } + } else { + result += part + encodeURIComponent(value) + "&"; + } + } + } + return result +} + +// 验证是否为blob格式 +export function blobValidate(data) { + return data.type !== 'application/json' +} diff --git a/bs-ui/src/utils/dict/Dict.js b/bs-ui/src/utils/dict/Dict.js new file mode 100644 index 0000000..6294e02 --- /dev/null +++ b/bs-ui/src/utils/dict/Dict.js @@ -0,0 +1,82 @@ +import Vue from 'vue' +import { mergeRecursive } from "@/utils/bs"; +import DictMeta from './DictMeta' +import DictData from './DictData' + +const DEFAULT_DICT_OPTIONS = { + types: [], +} + +/** + * @classdesc 字典 + * @property {Object} label 标签对象,内部属性名为字典类型名称 + * @property {Object} dict 字段数组,内部属性名为字典类型名称 + * @property {Array.} _dictMetas 字典元数据数组 + */ +export default class Dict { + constructor() { + this.owner = null + this.label = {} + this.type = {} + } + + init(options) { + if (options instanceof Array) { + options = { types: options } + } + const opts = mergeRecursive(DEFAULT_DICT_OPTIONS, options) + if (opts.types === undefined) { + throw new Error('need dict types') + } + const ps = [] + this._dictMetas = opts.types.map(t => DictMeta.parse(t)) + this._dictMetas.forEach(dictMeta => { + const type = dictMeta.type + Vue.set(this.label, type, {}) + Vue.set(this.type, type, []) + if (dictMeta.lazy) { + return + } + ps.push(loadDict(this, dictMeta)) + }) + return Promise.all(ps) + } + + /** + * 重新加载字典 + * @param {String} type 字典类型 + */ + reloadDict(type) { + const dictMeta = this._dictMetas.find(e => e.type === type) + if (dictMeta === undefined) { + return Promise.reject(`the dict meta of ${type} was not found`) + } + return loadDict(this, dictMeta) + } +} + +/** + * 加载字典 + * @param {Dict} dict 字典 + * @param {DictMeta} dictMeta 字典元数据 + * @returns {Promise} + */ +function loadDict(dict, dictMeta) { + return dictMeta.request(dictMeta) + .then(response => { + const type = dictMeta.type + let dicts = dictMeta.responseConverter(response, dictMeta) + if (!(dicts instanceof Array)) { + console.error('the return of responseConverter must be Array.') + dicts = [] + } else if (dicts.filter(d => d instanceof DictData).length !== dicts.length) { + console.error('the type of elements in dicts must be DictData') + dicts = [] + } + dict.type[type].splice(0, Number.MAX_SAFE_INTEGER, ...dicts) + dicts.forEach(d => { + Vue.set(dict.label[type], d.value, d.label) + }) + return dicts + }) +} diff --git a/bs-ui/src/utils/dict/DictConverter.js b/bs-ui/src/utils/dict/DictConverter.js new file mode 100644 index 0000000..0cf5df8 --- /dev/null +++ b/bs-ui/src/utils/dict/DictConverter.js @@ -0,0 +1,17 @@ +import DictOptions from './DictOptions' +import DictData from './DictData' + +export default function(dict, dictMeta) { + const label = determineDictField(dict, dictMeta.labelField, ...DictOptions.DEFAULT_LABEL_FIELDS) + const value = determineDictField(dict, dictMeta.valueField, ...DictOptions.DEFAULT_VALUE_FIELDS) + return new DictData(dict[label], dict[value], dict) +} + +/** + * 确定字典字段 + * @param {DictData} dict + * @param {...String} fields + */ +function determineDictField(dict, ...fields) { + return fields.find(f => Object.prototype.hasOwnProperty.call(dict, f)) +} diff --git a/bs-ui/src/utils/dict/DictData.js b/bs-ui/src/utils/dict/DictData.js new file mode 100644 index 0000000..afc763e --- /dev/null +++ b/bs-ui/src/utils/dict/DictData.js @@ -0,0 +1,13 @@ +/** + * @classdesc 字典数据 + * @property {String} label 标签 + * @property {*} value 标签 + * @property {Object} raw 原始数据 + */ +export default class DictData { + constructor(label, value, raw) { + this.label = label + this.value = value + this.raw = raw + } +} diff --git a/bs-ui/src/utils/dict/DictMeta.js b/bs-ui/src/utils/dict/DictMeta.js new file mode 100644 index 0000000..aa54dc9 --- /dev/null +++ b/bs-ui/src/utils/dict/DictMeta.js @@ -0,0 +1,38 @@ +import { mergeRecursive } from "@/utils/bs"; +import DictOptions from './DictOptions' + +/** + * @classdesc 字典元数据 + * @property {String} type 类型 + * @property {Function} request 请求 + * @property {String} label 标签字段 + * @property {String} value 值字段 + */ +export default class DictMeta { + constructor(options) { + this.type = options.type + this.request = options.request + this.responseConverter = options.responseConverter + this.labelField = options.labelField + this.valueField = options.valueField + this.lazy = options.lazy === true + } +} + + +/** + * 解析字典元数据 + * @param {Object} options + * @returns {DictMeta} + */ +DictMeta.parse= function(options) { + let opts = null + if (typeof options === 'string') { + opts = DictOptions.metas[options] || {} + opts.type = options + } else if (typeof options === 'object') { + opts = options + } + opts = mergeRecursive(DictOptions.metas['*'], opts) + return new DictMeta(opts) +} diff --git a/bs-ui/src/utils/dict/DictOptions.js b/bs-ui/src/utils/dict/DictOptions.js new file mode 100644 index 0000000..baf5ddc --- /dev/null +++ b/bs-ui/src/utils/dict/DictOptions.js @@ -0,0 +1,51 @@ +import { mergeRecursive } from "@/utils/bs"; +import dictConverter from './DictConverter' + +export const options = { + metas: { + '*': { + /** + * 字典请求,方法签名为function(dictMeta: DictMeta): Promise + */ + request: (dictMeta) => { + console.log(`load dict ${dictMeta.type}`) + return Promise.resolve([]) + }, + /** + * 字典响应数据转换器,方法签名为function(response: Object, dictMeta: DictMeta): DictData + */ + responseConverter, + labelField: 'label', + valueField: 'value', + }, + }, + /** + * 默认标签字段 + */ + DEFAULT_LABEL_FIELDS: ['label', 'name', 'title'], + /** + * 默认值字段 + */ + DEFAULT_VALUE_FIELDS: ['value', 'id', 'uid', 'key'], +} + +/** + * 映射字典 + * @param {Object} response 字典数据 + * @param {DictMeta} dictMeta 字典元数据 + * @returns {DictData} + */ +function responseConverter(response, dictMeta) { + const dicts = response.content instanceof Array ? response.content : response + if (dicts === undefined) { + console.warn(`no dict data of "${dictMeta.type}" found in the response`) + return [] + } + return dicts.map(d => dictConverter(d, dictMeta)) +} + +export function mergeOptions(src) { + mergeRecursive(options, src) +} + +export default options diff --git a/bs-ui/src/utils/dict/index.js b/bs-ui/src/utils/dict/index.js new file mode 100644 index 0000000..215eb9e --- /dev/null +++ b/bs-ui/src/utils/dict/index.js @@ -0,0 +1,33 @@ +import Dict from './Dict' +import { mergeOptions } from './DictOptions' + +export default function(Vue, options) { + mergeOptions(options) + Vue.mixin({ + data() { + if (this.$options === undefined || this.$options.dicts === undefined || this.$options.dicts === null) { + return {} + } + const dict = new Dict() + dict.owner = this + return { + dict + } + }, + created() { + if (!(this.dict instanceof Dict)) { + return + } + options.onCreated && options.onCreated(this.dict) + this.dict.init(this.$options.dicts).then(() => { + options.onReady && options.onReady(this.dict) + this.$nextTick(() => { + this.$emit('dictReady', this.dict) + if (this.$options.methods && this.$options.methods.onDictReady instanceof Function) { + this.$options.methods.onDictReady.call(this, this.dict) + } + }) + }) + }, + }) +} diff --git a/bs-ui/src/utils/errorCode.js b/bs-ui/src/utils/errorCode.js new file mode 100644 index 0000000..d2111ee --- /dev/null +++ b/bs-ui/src/utils/errorCode.js @@ -0,0 +1,6 @@ +export default { + '401': '认证失败,无法访问系统资源', + '403': '当前操作没有权限', + '404': '访问资源不存在', + 'default': '系统未知错误,请反馈给管理员' +} diff --git a/bs-ui/src/utils/generator/config.js b/bs-ui/src/utils/generator/config.js new file mode 100644 index 0000000..7abf227 --- /dev/null +++ b/bs-ui/src/utils/generator/config.js @@ -0,0 +1,438 @@ +export const formConf = { + formRef: 'elForm', + formModel: 'formData', + size: 'medium', + labelPosition: 'right', + labelWidth: 100, + formRules: 'rules', + gutter: 15, + disabled: false, + span: 24, + formBtns: true +} + +export const inputComponents = [ + { + label: '单行文本', + tag: 'el-input', + tagIcon: 'input', + placeholder: '请输入', + defaultValue: undefined, + span: 24, + labelWidth: null, + style: { width: '100%' }, + clearable: true, + prepend: '', + append: '', + 'prefix-icon': '', + 'suffix-icon': '', + maxlength: null, + 'show-word-limit': false, + readonly: false, + disabled: false, + required: true, + regList: [], + changeTag: true, + document: 'https://element.eleme.cn/#/zh-CN/component/input' + }, + { + label: '多行文本', + tag: 'el-input', + tagIcon: 'textarea', + type: 'textarea', + placeholder: '请输入', + defaultValue: undefined, + span: 24, + labelWidth: null, + autosize: { + minRows: 4, + maxRows: 4 + }, + style: { width: '100%' }, + maxlength: null, + 'show-word-limit': false, + readonly: false, + disabled: false, + required: true, + regList: [], + changeTag: true, + document: 'https://element.eleme.cn/#/zh-CN/component/input' + }, + { + label: '密码', + tag: 'el-input', + tagIcon: 'password', + placeholder: '请输入', + defaultValue: undefined, + span: 24, + 'show-password': true, + labelWidth: null, + style: { width: '100%' }, + clearable: true, + prepend: '', + append: '', + 'prefix-icon': '', + 'suffix-icon': '', + maxlength: null, + 'show-word-limit': false, + readonly: false, + disabled: false, + required: true, + regList: [], + changeTag: true, + document: 'https://element.eleme.cn/#/zh-CN/component/input' + }, + { + label: '计数器', + tag: 'el-input-number', + tagIcon: 'number', + placeholder: '', + defaultValue: undefined, + span: 24, + labelWidth: null, + min: undefined, + max: undefined, + step: undefined, + 'step-strictly': false, + precision: undefined, + 'controls-position': '', + disabled: false, + required: true, + regList: [], + changeTag: true, + document: 'https://element.eleme.cn/#/zh-CN/component/input-number' + } +] + +export const selectComponents = [ + { + label: '下拉选择', + tag: 'el-select', + tagIcon: 'select', + placeholder: '请选择', + defaultValue: undefined, + span: 24, + labelWidth: null, + style: { width: '100%' }, + clearable: true, + disabled: false, + required: true, + filterable: false, + multiple: false, + options: [{ + label: '选项一', + value: 1 + }, { + label: '选项二', + value: 2 + }], + regList: [], + changeTag: true, + document: 'https://element.eleme.cn/#/zh-CN/component/select' + }, + { + label: '级联选择', + tag: 'el-cascader', + tagIcon: 'cascader', + placeholder: '请选择', + defaultValue: [], + span: 24, + labelWidth: null, + style: { width: '100%' }, + props: { + props: { + multiple: false + } + }, + 'show-all-levels': true, + disabled: false, + clearable: true, + filterable: false, + required: true, + options: [{ + id: 1, + value: 1, + label: '选项1', + children: [{ + id: 2, + value: 2, + label: '选项1-1' + }] + }], + dataType: 'dynamic', + labelKey: 'label', + valueKey: 'value', + childrenKey: 'children', + separator: '/', + regList: [], + changeTag: true, + document: 'https://element.eleme.cn/#/zh-CN/component/cascader' + }, + { + label: '单选框组', + tag: 'el-radio-group', + tagIcon: 'radio', + defaultValue: undefined, + span: 24, + labelWidth: null, + style: {}, + optionType: 'default', + border: false, + size: 'medium', + disabled: false, + required: true, + options: [{ + label: '选项一', + value: 1 + }, { + label: '选项二', + value: 2 + }], + regList: [], + changeTag: true, + document: 'https://element.eleme.cn/#/zh-CN/component/radio' + }, + { + label: '多选框组', + tag: 'el-checkbox-group', + tagIcon: 'checkbox', + defaultValue: [], + span: 24, + labelWidth: null, + style: {}, + optionType: 'default', + border: false, + size: 'medium', + disabled: false, + required: true, + options: [{ + label: '选项一', + value: 1 + }, { + label: '选项二', + value: 2 + }], + regList: [], + changeTag: true, + document: 'https://element.eleme.cn/#/zh-CN/component/checkbox' + }, + { + label: '开关', + tag: 'el-switch', + tagIcon: 'switch', + defaultValue: false, + span: 24, + labelWidth: null, + style: {}, + disabled: false, + required: true, + 'active-text': '', + 'inactive-text': '', + 'active-color': null, + 'inactive-color': null, + 'active-value': true, + 'inactive-value': false, + regList: [], + changeTag: true, + document: 'https://element.eleme.cn/#/zh-CN/component/switch' + }, + { + label: '滑块', + tag: 'el-slider', + tagIcon: 'slider', + defaultValue: null, + span: 24, + labelWidth: null, + disabled: false, + required: true, + min: 0, + max: 100, + step: 1, + 'show-stops': false, + range: false, + regList: [], + changeTag: true, + document: 'https://element.eleme.cn/#/zh-CN/component/slider' + }, + { + label: '时间选择', + tag: 'el-time-picker', + tagIcon: 'time', + placeholder: '请选择', + defaultValue: null, + span: 24, + labelWidth: null, + style: { width: '100%' }, + disabled: false, + clearable: true, + required: true, + 'picker-options': { + selectableRange: '00:00:00-23:59:59' + }, + format: 'HH:mm:ss', + 'value-format': 'HH:mm:ss', + regList: [], + changeTag: true, + document: 'https://element.eleme.cn/#/zh-CN/component/time-picker' + }, + { + label: '时间范围', + tag: 'el-time-picker', + tagIcon: 'time-range', + defaultValue: null, + span: 24, + labelWidth: null, + style: { width: '100%' }, + disabled: false, + clearable: true, + required: true, + 'is-range': true, + 'range-separator': '至', + 'start-placeholder': '开始时间', + 'end-placeholder': '结束时间', + format: 'HH:mm:ss', + 'value-format': 'HH:mm:ss', + regList: [], + changeTag: true, + document: 'https://element.eleme.cn/#/zh-CN/component/time-picker' + }, + { + label: '日期选择', + tag: 'el-date-picker', + tagIcon: 'date', + placeholder: '请选择', + defaultValue: null, + type: 'date', + span: 24, + labelWidth: null, + style: { width: '100%' }, + disabled: false, + clearable: true, + required: true, + format: 'yyyy-MM-dd', + 'value-format': 'yyyy-MM-dd', + readonly: false, + regList: [], + changeTag: true, + document: 'https://element.eleme.cn/#/zh-CN/component/date-picker' + }, + { + label: '日期范围', + tag: 'el-date-picker', + tagIcon: 'date-range', + defaultValue: null, + span: 24, + labelWidth: null, + style: { width: '100%' }, + type: 'daterange', + 'range-separator': '至', + 'start-placeholder': '开始日期', + 'end-placeholder': '结束日期', + disabled: false, + clearable: true, + required: true, + format: 'yyyy-MM-dd', + 'value-format': 'yyyy-MM-dd', + readonly: false, + regList: [], + changeTag: true, + document: 'https://element.eleme.cn/#/zh-CN/component/date-picker' + }, + { + label: '评分', + tag: 'el-rate', + tagIcon: 'rate', + defaultValue: 0, + span: 24, + labelWidth: null, + style: {}, + max: 5, + 'allow-half': false, + 'show-text': false, + 'show-score': false, + disabled: false, + required: true, + regList: [], + changeTag: true, + document: 'https://element.eleme.cn/#/zh-CN/component/rate' + }, + { + label: '颜色选择', + tag: 'el-color-picker', + tagIcon: 'color', + defaultValue: null, + labelWidth: null, + 'show-alpha': false, + 'color-format': '', + disabled: false, + required: true, + size: 'medium', + regList: [], + changeTag: true, + document: 'https://element.eleme.cn/#/zh-CN/component/color-picker' + }, + { + label: '上传', + tag: 'el-upload', + tagIcon: 'upload', + action: 'https://jsonplaceholder.typicode.com/posts/', + defaultValue: null, + labelWidth: null, + disabled: false, + required: true, + accept: '', + name: 'file', + 'auto-upload': true, + showTip: false, + buttonText: '点击上传', + fileSize: 2, + sizeUnit: 'MB', + 'list-type': 'text', + multiple: false, + regList: [], + changeTag: true, + document: 'https://element.eleme.cn/#/zh-CN/component/upload' + } +] + +export const layoutComponents = [ + { + layout: 'rowFormItem', + tagIcon: 'row', + type: 'default', + justify: 'start', + align: 'top', + label: '行容器', + layoutTree: true, + children: [], + document: 'https://element.eleme.cn/#/zh-CN/component/layout' + }, + { + layout: 'colFormItem', + label: '按钮', + changeTag: true, + labelWidth: null, + tag: 'el-button', + tagIcon: 'button', + span: 24, + default: '主要按钮', + type: 'primary', + icon: 'el-icon-search', + size: 'medium', + disabled: false, + document: 'https://element.eleme.cn/#/zh-CN/component/button' + } +] + +// 组件rule的触发方式,无触发方式的组件不生成rule +export const trigger = { + 'el-input': 'blur', + 'el-input-number': 'blur', + 'el-select': 'change', + 'el-radio-group': 'change', + 'el-checkbox-group': 'change', + 'el-cascader': 'change', + 'el-time-picker': 'change', + 'el-date-picker': 'change', + 'el-rate': 'change' +} diff --git a/bs-ui/src/utils/generator/css.js b/bs-ui/src/utils/generator/css.js new file mode 100644 index 0000000..c1c62e6 --- /dev/null +++ b/bs-ui/src/utils/generator/css.js @@ -0,0 +1,18 @@ +const styles = { + 'el-rate': '.el-rate{display: inline-block; vertical-align: text-top;}', + 'el-upload': '.el-upload__tip{line-height: 1.2;}' +} + +function addCss(cssList, el) { + const css = styles[el.tag] + css && cssList.indexOf(css) === -1 && cssList.push(css) + if (el.children) { + el.children.forEach(el2 => addCss(cssList, el2)) + } +} + +export function makeUpCss(conf) { + const cssList = [] + conf.fields.forEach(el => addCss(cssList, el)) + return cssList.join('\n') +} diff --git a/bs-ui/src/utils/generator/drawingDefault.js b/bs-ui/src/utils/generator/drawingDefault.js new file mode 100644 index 0000000..09f133c --- /dev/null +++ b/bs-ui/src/utils/generator/drawingDefault.js @@ -0,0 +1,29 @@ +export default [ + { + layout: 'colFormItem', + tagIcon: 'input', + label: '手机号', + vModel: 'mobile', + formId: 6, + tag: 'el-input', + placeholder: '请输入手机号', + defaultValue: '', + span: 24, + style: { width: '100%' }, + clearable: true, + prepend: '', + append: '', + 'prefix-icon': 'el-icon-mobile', + 'suffix-icon': '', + maxlength: 11, + 'show-word-limit': true, + readonly: false, + disabled: false, + required: true, + changeTag: true, + regList: [{ + pattern: '/^1(3|4|5|7|8|9)\\d{9}$/', + message: '手机号格式错误' + }] + } +] diff --git a/bs-ui/src/utils/generator/html.js b/bs-ui/src/utils/generator/html.js new file mode 100644 index 0000000..9bcc536 --- /dev/null +++ b/bs-ui/src/utils/generator/html.js @@ -0,0 +1,359 @@ +/* eslint-disable max-len */ +import { trigger } from './config' + +let confGlobal +let someSpanIsNot24 + +export function dialogWrapper(str) { + return ` + ${str} +